diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index ee30a9b73..75b636ca1 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -29,12 +29,9 @@ import ( "strings" "github.com/pkg/errors" - "sigs.k8s.io/yaml" - "helm.sh/helm/v4/pkg/chart/loader" "helm.sh/helm/v4/pkg/getter" "helm.sh/helm/v4/pkg/helmpath" - "helm.sh/helm/v4/pkg/provenance" ) // Entry represents a collection of parameters for chart repository @@ -52,11 +49,10 @@ type Entry struct { // ChartRepository represents a chart repository type ChartRepository struct { - Config *Entry - ChartPaths []string - IndexFile *IndexFile - Client getter.Getter - CachePath string + Config *Entry + IndexFile *IndexFile + Client getter.Getter + CachePath string } // NewChartRepository constructs ChartRepository @@ -122,46 +118,6 @@ func (r *ChartRepository) DownloadIndexFile() (string, error) { return fname, os.WriteFile(fname, index, 0644) } -// Index generates an index for the chart repository and writes an index.yaml file. -func (r *ChartRepository) Index() error { - err := r.generateIndex() - if err != nil { - return err - } - return r.saveIndexFile() -} - -func (r *ChartRepository) saveIndexFile() error { - index, err := yaml.Marshal(r.IndexFile) - if err != nil { - return err - } - return os.WriteFile(filepath.Join(r.Config.Name, indexPath), index, 0644) -} - -func (r *ChartRepository) generateIndex() error { - for _, path := range r.ChartPaths { - ch, err := loader.Load(path) - if err != nil { - return err - } - - digest, err := provenance.DigestFile(path) - if err != nil { - return err - } - - if !r.IndexFile.Has(ch.Name(), ch.Metadata.Version) { - if err := r.IndexFile.MustAdd(ch.Metadata, path, r.Config.URL, digest); err != nil { - return errors.Wrapf(err, "failed adding to %s to index", path) - } - } - // TODO: If a chart exists, but has a different Digest, should we error? - } - r.IndexFile.SortEntries() - return nil -} - type findChartInRepoURLOptions struct { Username string Password string diff --git a/pkg/repo/chartrepo_test.go b/pkg/repo/chartrepo_test.go index 97f98f7e6..41bac9827 100644 --- a/pkg/repo/chartrepo_test.go +++ b/pkg/repo/chartrepo_test.go @@ -21,79 +21,17 @@ import ( "net/http" "net/http/httptest" "os" - "path/filepath" "runtime" "strings" "testing" "time" - "github.com/stretchr/testify/require" "sigs.k8s.io/yaml" - "helm.sh/helm/v4/pkg/chart" "helm.sh/helm/v4/pkg/cli" "helm.sh/helm/v4/pkg/getter" ) -const ( - testRepository = "testdata/repository" - testURL = "http://example-charts.com" -) - -// loadFromDir a directory of charts archives (including sub-directories), -// appending to the repositores ChartPath -func loadFromDir(t *testing.T, r *ChartRepository, dir string) { - dirInfo, err := os.Stat(dir) - require.Nil(t, err) - require.True(t, dirInfo.IsDir()) - - globArchives := func(pattern string) []string { - archives, err := filepath.Glob(filepath.Join(dir, pattern)) - require.Nil(t, err) - - return archives - } - - r.ChartPaths = append(r.ChartPaths, globArchives("*.tgz")...) - r.ChartPaths = append(r.ChartPaths, globArchives("**/*.tgz")...) -} - -func TestIndex(t *testing.T) { - r, err := NewChartRepository(&Entry{ - Name: testRepository, - URL: testURL, - }, getter.All(&cli.EnvSettings{})) - if err != nil { - t.Errorf("Problem creating chart repository from %s: %v", testRepository, err) - } - - loadFromDir(t, r, testRepository) - - err = r.Index() - if err != nil { - t.Errorf("Error performing index: %v\n", err) - } - - tempIndexPath := filepath.Join(testRepository, indexPath) - actual, err := LoadIndexFile(tempIndexPath) - defer os.Remove(tempIndexPath) // clean up - if err != nil { - t.Errorf("Error loading index file %v", err) - } - verifyIndex(t, actual) - - // Re-index and test again. - err = r.Index() - if err != nil { - t.Errorf("Error performing re-index: %s\n", err) - } - second, err := LoadIndexFile(tempIndexPath) - if err != nil { - t.Errorf("Error re-loading index file %v", err) - } - verifyIndex(t, second) -} - type CustomGetter struct { repoUrls []string } @@ -152,97 +90,6 @@ func TestIndexCustomSchemeDownload(t *testing.T) { } } -func verifyIndex(t *testing.T, actual *IndexFile) { - var empty time.Time - if actual.Generated.Equal(empty) { - t.Errorf("Generated should be greater than 0: %s", actual.Generated) - } - - if actual.APIVersion != APIVersionV1 { - t.Error("Expected v1 API") - } - - entries := actual.Entries - if numEntries := len(entries); numEntries != 3 { - t.Errorf("Expected 3 charts to be listed in index file but got %v", numEntries) - } - - expects := map[string]ChartVersions{ - "frobnitz": { - { - Metadata: &chart.Metadata{ - Name: "frobnitz", - Version: "1.2.3", - }, - }, - }, - "sprocket": { - { - Metadata: &chart.Metadata{ - Name: "sprocket", - Version: "1.2.0", - }, - }, - { - Metadata: &chart.Metadata{ - Name: "sprocket", - Version: "1.1.0", - }, - }, - }, - "zarthal": { - { - Metadata: &chart.Metadata{ - Name: "zarthal", - Version: "1.0.0", - }, - }, - }, - } - - for name, versions := range expects { - got, ok := entries[name] - if !ok { - t.Errorf("Could not find %q entry", name) - continue - } - if len(versions) != len(got) { - t.Errorf("Expected %d versions, got %d", len(versions), len(got)) - continue - } - for i, e := range versions { - g := got[i] - if e.Name != g.Name { - t.Errorf("Expected %q, got %q", e.Name, g.Name) - } - if e.Version != g.Version { - t.Errorf("Expected %q, got %q", e.Version, g.Version) - } - if len(g.Keywords) != 3 { - t.Error("Expected 3 keywords.") - } - if len(g.Maintainers) != 2 { - t.Error("Expected 2 maintainers.") - } - if g.Created.Equal(empty) { - t.Error("Expected created to be non-empty") - } - if g.Description == "" { - t.Error("Expected description to be non-empty") - } - if g.Home == "" { - t.Error("Expected home to be non-empty") - } - if g.Digest == "" { - t.Error("Expected digest to be non-empty") - } - if len(g.URLs) != 1 { - t.Error("Expected exactly 1 URL") - } - } - } -} - // startLocalServerForTests Start the local helm server func startLocalServerForTests(handler http.Handler) (*httptest.Server, error) { if handler == nil { diff --git a/pkg/repo/index.go b/pkg/repo/index.go index 2526cba1b..5f74ded1a 100644 --- a/pkg/repo/index.go +++ b/pkg/repo/index.go @@ -38,8 +38,6 @@ import ( "helm.sh/helm/v4/pkg/provenance" ) -var indexPath = "index.yaml" - // APIVersionV1 is the v1 API version for index and repository files. const APIVersionV1 = "v1"