From c336914b4bc50b24f2b98c5f3be5d2d4b26678bb Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Fri, 13 Jan 2023 00:36:43 +0530 Subject: [PATCH] Wip Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- pkg/downloader/manager.go | 4 +-- pkg/downloader/manager_test.go | 65 ++++++++++++++++++++++++++++++++++ pkg/repo/repotest/server.go | 27 ++++++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index f41a39c0e..b57bd89be 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -660,10 +660,10 @@ func (m *Manager) UpdateRepositories(c *chart.Chart) error { repos = append(repos, e) } } - if len(repos) > 0 { + if len(rf.Repositories) > 0 { fmt.Fprintln(m.Out, "Hang tight while we grab the latest from your chart repositories...") // This prints warnings straight to out. - if err := m.parallelRepoUpdate(repos); err != nil { + if err := m.parallelRepoUpdate(rf.Repositories); err != nil { return err } fmt.Fprintln(m.Out, "Update Complete. ⎈Happy Helming!⎈") diff --git a/pkg/downloader/manager_test.go b/pkg/downloader/manager_test.go index f7ab1a568..c13d6cbef 100644 --- a/pkg/downloader/manager_test.go +++ b/pkg/downloader/manager_test.go @@ -572,3 +572,68 @@ func TestKey(t *testing.T) { } } } + +// See issue https://github.com/helm/helm/issues/11509 +func TestUpdateOnlyRequiredRepos(t *testing.T) { + // Set up a fake repo + srv, err := repotest.NewTempServerWithCleanupAndMultipleRepos(t, "testdata/*.tgz*", []string{"https://abc", "https://xyz"}) + //srv, err := repotest.NewTempServerWithCleanup(t, "testdata/*.tgz*") + + if err != nil { + t.Fatal(err) + } + defer srv.Stop() + if err := srv.LinkIndices(); err != nil { + t.Fatal(err) + } + dir := func(p ...string) string { + return filepath.Join(append([]string{srv.Root()}, p...)...) + } + + // Save dep + d := &chart.Chart{ + Metadata: &chart.Metadata{ + Name: "dep-chart", + Version: "0.1.0", + APIVersion: "v1", + }, + } + if err := chartutil.SaveDir(d, dir()); err != nil { + t.Fatal(err) + } + // Save a chart + c := &chart.Chart{ + Metadata: &chart.Metadata{ + Name: "with-dependency", + Version: "0.1.0", + APIVersion: "v2", + Dependencies: []*chart.Dependency{{ + Name: d.Metadata.Name, + Version: ">=0.1.0", + Repository: "https://abc", + }}, + }, + } + if err := chartutil.SaveDir(c, dir()); err != nil { + t.Fatal(err) + } + + // Set-up a manager + b := bytes.NewBuffer(nil) + g := getter.Providers{getter.Provider{ + Schemes: []string{"http", "https"}, + New: getter.NewHTTPGetter, + }} + m := &Manager{ + ChartPath: dir(c.Metadata.Name), + Out: b, + Getters: g, + RepositoryConfig: dir("repositories.yaml"), + RepositoryCache: dir(), + } + + err = m.Update() + if err != nil { + t.Fatal(err) + } +} diff --git a/pkg/repo/repotest/server.go b/pkg/repo/repotest/server.go index 90ad3d856..31d4f9510 100644 --- a/pkg/repo/repotest/server.go +++ b/pkg/repo/repotest/server.go @@ -55,6 +55,20 @@ func NewTempServerWithCleanup(t *testing.T, glob string) (*Server, error) { return srv, err } +// Setup mutliple fake repos +func NewTempServerWithCleanupAndMultipleRepos(t *testing.T, glob string, repoUrls []string) (*Server, error) { + srv, err := NewTempServer(glob) + srv.Stop() + // Add the testing repository as the only repo. + if err := setTestingRepositories(repoUrls, filepath.Join(srv.docroot, "repositories.yaml")); err != nil { + panic(err) + } + srv.CopyCharts() + srv.Start() + t.Cleanup(func() { os.RemoveAll(srv.docroot) }) + return srv, err +} + // Set up a fake repo with basic auth enabled func NewTempServerWithCleanupAndBasicAuth(t *testing.T, glob string) *Server { srv, err := NewTempServerWithCleanup(t, glob) @@ -400,6 +414,7 @@ func (s *Server) Stop() { // URL returns the URL of the server. // // Example: +// // http://localhost:1776 func (s *Server) URL() string { return s.srv.URL @@ -423,3 +438,15 @@ func setTestingRepository(url, fname string) error { }) return r.WriteFile(fname, 0644) } + +// setTestingRepository sets up a testing repository.yaml with the given URLs. +func setTestingRepositories(urls []string, fname string) error { + r := repo.NewFile() + for _, url := range urls { + r.Add(&repo.Entry{ + Name: "test", + URL: url, + }) + } + return r.WriteFile(fname, 0644) +}