// Reindex adds an entry to the index file at the given path func Reindex(ch *chart.Chart, path string) error { name := ch.Metadata.Name + "-" + ch.Metadata.Version y, err := LoadIndexFile(path) if err != nil { return err } found := false for k := range y.Entries { if k == name { found = true break } } if !found { dig, err := provenance.DigestFile(path) if err != nil { return err } y.Add(ch.Metadata, name+".tgz", "http://localhost:8879/charts", "sha256:"+dig) out, err := yaml.Marshal(y) if err != nil { return err } ioutil.WriteFile(path, out, 0644) } return nil }
// IndexDirectory reads a (flat) directory and generates an index. // // It indexes only charts that have been packaged (*.tgz). // // It writes the results to dir/index.yaml. func IndexDirectory(dir, baseURL string) (*IndexFile, error) { archives, err := filepath.Glob(filepath.Join(dir, "*.tgz")) if err != nil { return nil, err } index := NewIndexFile() for _, arch := range archives { fname := filepath.Base(arch) c, err := chartutil.Load(arch) if err != nil { // Assume this is not a chart. continue } hash, err := provenance.DigestFile(arch) if err != nil { return index, err } index.Add(c.Metadata, fname, baseURL, hash) } return index, nil }
func (r *ChartRepository) generateIndex() error { if r.IndexFile == nil { r.IndexFile = NewIndexFile() } for _, path := range r.ChartPaths { ch, err := chartutil.Load(path) if err != nil { return err } digest, err := provenance.DigestFile(path) if err != nil { return err } if !r.IndexFile.Has(ch.Metadata.Name, ch.Metadata.Version) { r.IndexFile.Add(ch.Metadata, path, r.URL, digest) } // TODO: If a chart exists, but has a different Digest, should we error? } r.IndexFile.SortEntries() return nil }
func TestDependencyUpdateCmd(t *testing.T) { // Set up a testing helm home oldhome := helmHome hh, err := tempHelmHome() if err != nil { t.Fatal(err) } helmHome = hh defer func() { os.RemoveAll(hh) helmHome = oldhome }() srv := repotest.NewServer(hh) defer srv.Stop() copied, err := srv.CopyCharts("testdata/testcharts/*.tgz") t.Logf("Copied charts:\n%s", strings.Join(copied, "\n")) t.Logf("Listening on directory %s", srv.Root()) chartname := "depup" if err := createTestingChart(hh, chartname, srv.URL()); err != nil { t.Fatal(err) } out := bytes.NewBuffer(nil) duc := &dependencyUpdateCmd{out: out} duc.helmhome = helmpath.Home(hh) duc.chartpath = filepath.Join(hh, chartname) if err := duc.run(); err != nil { output := out.String() t.Logf("Output: %s", output) t.Fatal(err) } output := out.String() // This is written directly to stdout, so we have to capture as is. if !strings.Contains(output, `update from the "test" chart repository`) { t.Errorf("Repo did not get updated\n%s", output) } // Make sure the actual file got downloaded. expect := filepath.Join(hh, chartname, "charts/reqtest-0.1.0.tgz") if _, err := os.Stat(expect); err != nil { t.Fatal(err) } hash, err := provenance.DigestFile(expect) if err != nil { t.Fatal(err) } i, err := repo.LoadIndexFile(cacheIndexFile("test")) if err != nil { t.Fatal(err) } if h := i.Entries["reqtest-0.1.0"].Digest; h != hash { t.Errorf("Failed hash match: expected %s, got %s", hash, h) } t.Logf("Results: %s", out.String()) }
func TestDependencyBuildCmd(t *testing.T) { oldhome := helmHome hh, err := tempHelmHome(t) if err != nil { t.Fatal(err) } helmHome = hh defer func() { os.RemoveAll(hh) helmHome = oldhome }() srv := repotest.NewServer(hh) defer srv.Stop() _, err = srv.CopyCharts("testdata/testcharts/*.tgz") if err != nil { t.Fatal(err) } chartname := "depbuild" if err := createTestingChart(hh, chartname, srv.URL()); err != nil { t.Fatal(err) } out := bytes.NewBuffer(nil) dbc := &dependencyBuildCmd{out: out} dbc.helmhome = helmpath.Home(hh) dbc.chartpath = filepath.Join(hh, chartname) // In the first pass, we basically want the same results as an update. if err := dbc.run(); err != nil { output := out.String() t.Logf("Output: %s", output) t.Fatal(err) } output := out.String() if !strings.Contains(output, `update from the "test" chart repository`) { t.Errorf("Repo did not get updated\n%s", output) } // Make sure the actual file got downloaded. expect := filepath.Join(hh, chartname, "charts/reqtest-0.1.0.tgz") if _, err := os.Stat(expect); err != nil { t.Fatal(err) } // In the second pass, we want to remove the chart's request dependency, // then see if it restores from the lock. lockfile := filepath.Join(hh, chartname, "requirements.lock") if _, err := os.Stat(lockfile); err != nil { t.Fatal(err) } if err := os.RemoveAll(expect); err != nil { t.Fatal(err) } if err := dbc.run(); err != nil { output := out.String() t.Logf("Output: %s", output) t.Fatal(err) } // Now repeat the test that the dependency exists. expect = filepath.Join(hh, chartname, "charts/reqtest-0.1.0.tgz") if _, err := os.Stat(expect); err != nil { t.Fatal(err) } // Make sure that build is also fetching the correct version. hash, err := provenance.DigestFile(expect) if err != nil { t.Fatal(err) } i, err := repo.LoadIndexFile(dbc.helmhome.CacheIndex("test")) if err != nil { t.Fatal(err) } reqver := i.Entries["reqtest"][0] if h := reqver.Digest; h != hash { t.Errorf("Failed hash match: expected %s, got %s", hash, h) } if v := reqver.Version; v != "0.1.0" { t.Errorf("mismatched versions. Expected %q, got %q", "0.1.0", v) } }