From 918dc9cffd30561ad2454dd53fe3b4a8323a1d9c Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Mon, 9 Jan 2023 18:59:13 +0530 Subject: [PATCH 01/10] Added logic to only update the repos in chart.yaml Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- pkg/downloader/manager.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 18b28dde1..2bd03503a 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -32,8 +32,6 @@ import ( "github.com/Masterminds/semver/v3" "github.com/pkg/errors" - "sigs.k8s.io/yaml" - "helm.sh/helm/v3/internal/resolver" "helm.sh/helm/v3/internal/third_party/dep/fs" "helm.sh/helm/v3/internal/urlutil" @@ -44,6 +42,7 @@ import ( "helm.sh/helm/v3/pkg/helmpath" "helm.sh/helm/v3/pkg/registry" "helm.sh/helm/v3/pkg/repo" + "sigs.k8s.io/yaml" ) // ErrRepoNotFound indicates that chart repositories can't be found in local repo cache. @@ -136,7 +135,7 @@ func (m *Manager) Build() error { if !m.SkipUpdate { // For each repo in the file, update the cached copy of that repo - if err := m.UpdateRepositories(); err != nil { + if err := m.UpdateRepositories(c); err != nil { return err } } @@ -185,7 +184,7 @@ func (m *Manager) Update() error { // For each of the repositories Helm is configured to know about, update // the index information locally. if !m.SkipUpdate { - if err := m.UpdateRepositories(); err != nil { + if err := m.UpdateRepositories(c); err != nil { return err } } @@ -643,12 +642,23 @@ repository, use "https://charts.example.com/" or "@example" instead of } // UpdateRepositories updates all of the local repos to the latest. -func (m *Manager) UpdateRepositories() error { +func (m *Manager) UpdateRepositories(c *chart.Chart) error { rf, err := loadRepoConfig(m.RepositoryConfig) if err != nil { return err } - repos := rf.Repositories + repos := []*repo.Entry{} + // Map of repos in the chart yaml file + reposRequired := map[string]bool{} + for _, d := range c.Metadata.Dependencies { + reposRequired[d.Repository] = true + } + //Only updating repos in chart yaml + for _, e := range rf.Repositories { + if _, isMapContainsKey := reposRequired[e.URL]; isMapContainsKey { + repos = append(repos, e) + } + } if len(repos) > 0 { fmt.Fprintln(m.Out, "Hang tight while we grab the latest from your chart repositories...") // This prints warnings straight to out. From 58700d7019d20cb8c7cfa397eee1cc1a69e40ffa Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Mon, 9 Jan 2023 19:08:11 +0530 Subject: [PATCH 02/10] Re ordering imports Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- pkg/downloader/manager.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 18b28dde1..f41a39c0e 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -136,7 +136,7 @@ func (m *Manager) Build() error { if !m.SkipUpdate { // For each repo in the file, update the cached copy of that repo - if err := m.UpdateRepositories(); err != nil { + if err := m.UpdateRepositories(c); err != nil { return err } } @@ -185,7 +185,7 @@ func (m *Manager) Update() error { // For each of the repositories Helm is configured to know about, update // the index information locally. if !m.SkipUpdate { - if err := m.UpdateRepositories(); err != nil { + if err := m.UpdateRepositories(c); err != nil { return err } } @@ -643,12 +643,23 @@ repository, use "https://charts.example.com/" or "@example" instead of } // UpdateRepositories updates all of the local repos to the latest. -func (m *Manager) UpdateRepositories() error { +func (m *Manager) UpdateRepositories(c *chart.Chart) error { rf, err := loadRepoConfig(m.RepositoryConfig) if err != nil { return err } - repos := rf.Repositories + repos := []*repo.Entry{} + // Map of repos in the chart yaml file + reposRequired := map[string]bool{} + for _, d := range c.Metadata.Dependencies { + reposRequired[d.Repository] = true + } + //Only updating repos in chart yaml + for _, e := range rf.Repositories { + if _, isMapContainsKey := reposRequired[e.URL]; isMapContainsKey { + repos = append(repos, e) + } + } if len(repos) > 0 { fmt.Fprintln(m.Out, "Hang tight while we grab the latest from your chart repositories...") // This prints warnings straight to out. From 75aa211a0a2394efa294e2970a1f537ef2e49f2a Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Mon, 9 Jan 2023 19:20:49 +0530 Subject: [PATCH 03/10] Fix formatting Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- pkg/downloader/manager.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 2bd03503a..f41a39c0e 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -32,6 +32,8 @@ import ( "github.com/Masterminds/semver/v3" "github.com/pkg/errors" + "sigs.k8s.io/yaml" + "helm.sh/helm/v3/internal/resolver" "helm.sh/helm/v3/internal/third_party/dep/fs" "helm.sh/helm/v3/internal/urlutil" @@ -42,7 +44,6 @@ import ( "helm.sh/helm/v3/pkg/helmpath" "helm.sh/helm/v3/pkg/registry" "helm.sh/helm/v3/pkg/repo" - "sigs.k8s.io/yaml" ) // ErrRepoNotFound indicates that chart repositories can't be found in local repo cache. 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 04/10] 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) +} From 5baebe19a701619cf74ccb7dfd93a35dcd9516cd Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Sat, 14 Jan 2023 16:01:19 +0530 Subject: [PATCH 05/10] Added test Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- pkg/downloader/manager.go | 4 ++-- pkg/downloader/manager_test.go | 18 +++--------------- pkg/repo/repotest/server.go | 14 -------------- 3 files changed, 5 insertions(+), 31 deletions(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index b57bd89be..f41a39c0e 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(rf.Repositories) > 0 { + if len(repos) > 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(rf.Repositories); err != nil { + if err := m.parallelRepoUpdate(repos); 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 c13d6cbef..2425894d6 100644 --- a/pkg/downloader/manager_test.go +++ b/pkg/downloader/manager_test.go @@ -576,8 +576,7 @@ 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*") + srv, err := repotest.NewTempServerWithCleanup(t, "testdata/*.tgz*") if err != nil { t.Fatal(err) @@ -590,17 +589,6 @@ func TestUpdateOnlyRequiredRepos(t *testing.T) { 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{ @@ -608,9 +596,9 @@ func TestUpdateOnlyRequiredRepos(t *testing.T) { Version: "0.1.0", APIVersion: "v2", Dependencies: []*chart.Dependency{{ - Name: d.Metadata.Name, + Name: "local-subchart", Version: ">=0.1.0", - Repository: "https://abc", + Repository: srv.URL(), }}, }, } diff --git a/pkg/repo/repotest/server.go b/pkg/repo/repotest/server.go index 31d4f9510..5690cc958 100644 --- a/pkg/repo/repotest/server.go +++ b/pkg/repo/repotest/server.go @@ -55,20 +55,6 @@ 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) From 6dfa9d7eed8b590f704eb828f777bde24aec41ad Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Sat, 14 Jan 2023 16:12:00 +0530 Subject: [PATCH 06/10] Removed unused function Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- pkg/repo/repotest/server.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/pkg/repo/repotest/server.go b/pkg/repo/repotest/server.go index 5690cc958..90ad3d856 100644 --- a/pkg/repo/repotest/server.go +++ b/pkg/repo/repotest/server.go @@ -400,7 +400,6 @@ func (s *Server) Stop() { // URL returns the URL of the server. // // Example: -// // http://localhost:1776 func (s *Server) URL() string { return s.srv.URL @@ -424,15 +423,3 @@ 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) -} From eaec64aa9203fe76d3751162900475e7f293f8dd Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Sat, 14 Jan 2023 20:59:42 +0530 Subject: [PATCH 07/10] Updated test Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- pkg/downloader/manager_test.go | 2 +- pkg/repo/repotest/server.go | 39 +++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/pkg/downloader/manager_test.go b/pkg/downloader/manager_test.go index 2425894d6..ad0faf671 100644 --- a/pkg/downloader/manager_test.go +++ b/pkg/downloader/manager_test.go @@ -576,7 +576,7 @@ 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.NewTempServerWithCleanup(t, "testdata/*.tgz*") + srv, err := repotest.NewTempServerWithCleanupAndMultipleRepos(t, "testdata/*.tgz*") if err != nil { t.Fatal(err) diff --git a/pkg/repo/repotest/server.go b/pkg/repo/repotest/server.go index 90ad3d856..1eaa31f26 100644 --- a/pkg/repo/repotest/server.go +++ b/pkg/repo/repotest/server.go @@ -50,7 +50,22 @@ import ( // The caller is responsible for stopping the server. // The temp dir will be removed by testing package automatically when test finished. func NewTempServerWithCleanup(t *testing.T, glob string) (*Server, error) { - srv, err := NewTempServer(glob) + srv, _, err := NewTempServer(glob) + t.Cleanup(func() { os.RemoveAll(srv.docroot) }) + return srv, err +} + +// Set up a server with multiple fake repo +func NewTempServerWithCleanupAndMultipleRepos(t *testing.T, glob string) (*Server, error) { + srv, tdir, err := NewTempServer(glob) + urls := []string{srv.URL(), "http://foobarbazz:9001"} + if err := setTestingRepositories(urls, filepath.Join(tdir, "repositories.yaml")); err != nil { + panic(err) + } + if _, err := srv.CopyCharts(glob); err != nil { + srv.Stop() + return srv, err + } t.Cleanup(func() { os.RemoveAll(srv.docroot) }) return srv, err } @@ -248,21 +263,21 @@ func (srv *OCIServer) Run(t *testing.T, opts ...OCIServerOpt) { // the server. // // Deprecated: use NewTempServerWithCleanup -func NewTempServer(glob string) (*Server, error) { +func NewTempServer(glob string) (*Server, string, error) { tdir, err := ioutil.TempDir("", "helm-repotest-") if err != nil { - return nil, err + return nil, tdir, err } srv := NewServer(tdir) if glob != "" { if _, err := srv.CopyCharts(glob); err != nil { srv.Stop() - return srv, err + return srv, tdir, err } } - return srv, nil + return srv, tdir, nil } // NewServer creates a repository server for testing. @@ -400,6 +415,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 +439,16 @@ func setTestingRepository(url, fname string) error { }) return r.WriteFile(fname, 0644) } + +// setTestingRepository sets up a testing repository.yaml with only the given URL. +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) +} From 680f8de6e70ba4e18d3c4cef44198b324c30fca2 Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Wed, 1 Feb 2023 21:19:15 +0530 Subject: [PATCH 08/10] Putting behind a flag Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- cmd/helm/dependency_build.go | 2 ++ cmd/helm/dependency_update.go | 2 ++ pkg/action/dependency.go | 9 +++--- pkg/downloader/manager.go | 55 ++++++++++++++++++++++++++-------- pkg/downloader/manager_test.go | 1 + 5 files changed, 53 insertions(+), 16 deletions(-) diff --git a/cmd/helm/dependency_build.go b/cmd/helm/dependency_build.go index 1ee46d3d2..2ad80df79 100644 --- a/cmd/helm/dependency_build.go +++ b/cmd/helm/dependency_build.go @@ -64,6 +64,7 @@ func newDependencyBuildCmd(cfg *action.Configuration, out io.Writer) *cobra.Comm RepositoryConfig: settings.RepositoryConfig, RepositoryCache: settings.RepositoryCache, Debug: settings.Debug, + OptimizedUpdate: client.OptimizedUpdate, } if client.Verify { man.Verify = downloader.VerifyIfPossible @@ -80,6 +81,7 @@ func newDependencyBuildCmd(cfg *action.Configuration, out io.Writer) *cobra.Comm f.BoolVar(&client.Verify, "verify", false, "verify the packages against signatures") f.StringVar(&client.Keyring, "keyring", defaultKeyring(), "keyring containing public keys") f.BoolVar(&client.SkipRefresh, "skip-refresh", false, "do not refresh the local repository cache") + f.BoolVar(&client.OptimizedUpdate, "optimized-update", false, "Refresh only the repos in chart.yaml") return cmd } diff --git a/cmd/helm/dependency_update.go b/cmd/helm/dependency_update.go index ad0188f17..e4109cad2 100644 --- a/cmd/helm/dependency_update.go +++ b/cmd/helm/dependency_update.go @@ -67,6 +67,7 @@ func newDependencyUpdateCmd(cfg *action.Configuration, out io.Writer) *cobra.Com RepositoryConfig: settings.RepositoryConfig, RepositoryCache: settings.RepositoryCache, Debug: settings.Debug, + OptimizedUpdate: client.OptimizedUpdate, } if client.Verify { man.Verify = downloader.VerifyAlways @@ -79,6 +80,7 @@ func newDependencyUpdateCmd(cfg *action.Configuration, out io.Writer) *cobra.Com f.BoolVar(&client.Verify, "verify", false, "verify the packages against signatures") f.StringVar(&client.Keyring, "keyring", defaultKeyring(), "keyring containing public keys") f.BoolVar(&client.SkipRefresh, "skip-refresh", false, "do not refresh the local repository cache") + f.BoolVar(&client.OptimizedUpdate, "optimized-update", false, "Refresh only the repos in chart.yaml") return cmd } diff --git a/pkg/action/dependency.go b/pkg/action/dependency.go index 3265f1f17..1ce340d25 100644 --- a/pkg/action/dependency.go +++ b/pkg/action/dependency.go @@ -34,10 +34,11 @@ import ( // // It provides the implementation of 'helm dependency' and its respective subcommands. type Dependency struct { - Verify bool - Keyring string - SkipRefresh bool - ColumnWidth uint + Verify bool + Keyring string + SkipRefresh bool + ColumnWidth uint + OptimizedUpdate bool } // NewDependency creates a new Dependency object with the given configuration. diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index f41a39c0e..3cc729af7 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -71,6 +71,8 @@ type Manager struct { Keyring string // SkipUpdate indicates that the repository should not be updated first. SkipUpdate bool + // Update repos only in the chart.yaml + OptimizedUpdate bool // Getter collection for the operation Getters []getter.Provider RegistryClient *registry.Client @@ -136,9 +138,16 @@ func (m *Manager) Build() error { if !m.SkipUpdate { // For each repo in the file, update the cached copy of that repo - if err := m.UpdateRepositories(c); err != nil { - return err + if !m.OptimizedUpdate { + if err := m.UpdateRepositories(); err != nil { + return err + } + } else { + if err := m.UpdateRepositoriesInChart(c); err != nil { + return err + } } + } // Now we need to fetch every package here into charts/ @@ -185,9 +194,17 @@ func (m *Manager) Update() error { // For each of the repositories Helm is configured to know about, update // the index information locally. if !m.SkipUpdate { - if err := m.UpdateRepositories(c); err != nil { - return err + // For each repo in the file, update the cached copy of that repo + if !m.OptimizedUpdate { + if err := m.UpdateRepositories(); err != nil { + return err + } + } else { + if err := m.UpdateRepositoriesInChart(c); err != nil { + return err + } } + } // Now we need to find out which version of a chart best satisfies the @@ -643,7 +660,20 @@ repository, use "https://charts.example.com/" or "@example" instead of } // UpdateRepositories updates all of the local repos to the latest. -func (m *Manager) UpdateRepositories(c *chart.Chart) error { +func (m *Manager) UpdateRepositories() error { + rf, err := loadRepoConfig(m.RepositoryConfig) + if err != nil { + return err + } + repos := rf.Repositories + if err := m.parallelRepoUpdate(repos); err != nil { + return err + } + return nil +} + +// UpdateRepositories updates only the local repos in the chart.yaml to the latest. +func (m *Manager) UpdateRepositoriesInChart(c *chart.Chart) error { rf, err := loadRepoConfig(m.RepositoryConfig) if err != nil { return err @@ -660,18 +690,18 @@ func (m *Manager) UpdateRepositories(c *chart.Chart) error { repos = append(repos, e) } } - if len(repos) > 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 { - return err - } - fmt.Fprintln(m.Out, "Update Complete. ⎈Happy Helming!⎈") + if err := m.parallelRepoUpdate(repos); err != nil { + return err } return nil } func (m *Manager) parallelRepoUpdate(repos []*repo.Entry) error { + if len(repos) <= 0 { + return nil + } + fmt.Fprintln(m.Out, "Hang tight while we grab the latest from your chart repositories...") + // This prints warnings straight to out. var wg sync.WaitGroup for _, c := range repos { @@ -703,6 +733,7 @@ func (m *Manager) parallelRepoUpdate(repos []*repo.Entry) error { } wg.Wait() + fmt.Fprintln(m.Out, "Update Complete. ⎈Happy Helming!⎈") return nil } diff --git a/pkg/downloader/manager_test.go b/pkg/downloader/manager_test.go index ad0faf671..d35474496 100644 --- a/pkg/downloader/manager_test.go +++ b/pkg/downloader/manager_test.go @@ -618,6 +618,7 @@ func TestUpdateOnlyRequiredRepos(t *testing.T) { Getters: g, RepositoryConfig: dir("repositories.yaml"), RepositoryCache: dir(), + OptimizedUpdate: true, } err = m.Update() From 58f45616552f053a70185663c2add2caed19ebe0 Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Wed, 1 Feb 2023 21:57:19 +0530 Subject: [PATCH 09/10] Updated comments Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- pkg/downloader/manager.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 3cc729af7..238a7372e 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -137,12 +137,12 @@ func (m *Manager) Build() error { } if !m.SkipUpdate { - // For each repo in the file, update the cached copy of that repo if !m.OptimizedUpdate { if err := m.UpdateRepositories(); err != nil { return err } } else { + // For each repo in the file, update the cached copy of that repo if err := m.UpdateRepositoriesInChart(c); err != nil { return err } @@ -194,12 +194,12 @@ func (m *Manager) Update() error { // For each of the repositories Helm is configured to know about, update // the index information locally. if !m.SkipUpdate { - // For each repo in the file, update the cached copy of that repo if !m.OptimizedUpdate { if err := m.UpdateRepositories(); err != nil { return err } } else { + // For each repo in the file, update the cached copy of that repo if err := m.UpdateRepositoriesInChart(c); err != nil { return err } @@ -672,7 +672,7 @@ func (m *Manager) UpdateRepositories() error { return nil } -// UpdateRepositories updates only the local repos in the chart.yaml to the latest. +// UpdateRepositoriesInChart updates only the local repos in the chart.yaml to the latest. func (m *Manager) UpdateRepositoriesInChart(c *chart.Chart) error { rf, err := loadRepoConfig(m.RepositoryConfig) if err != nil { From 6b2fc4d966af2027f2a8762bfe65e804ed17d433 Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Sun, 12 Feb 2023 12:58:27 +0530 Subject: [PATCH 10/10] Created new function Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- pkg/repo/repotest/server.go | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/pkg/repo/repotest/server.go b/pkg/repo/repotest/server.go index 1eaa31f26..febce702a 100644 --- a/pkg/repo/repotest/server.go +++ b/pkg/repo/repotest/server.go @@ -50,14 +50,14 @@ import ( // The caller is responsible for stopping the server. // The temp dir will be removed by testing package automatically when test finished. func NewTempServerWithCleanup(t *testing.T, glob string) (*Server, error) { - srv, _, err := NewTempServer(glob) + srv, err := NewTempServer(glob) t.Cleanup(func() { os.RemoveAll(srv.docroot) }) return srv, err } // Set up a server with multiple fake repo func NewTempServerWithCleanupAndMultipleRepos(t *testing.T, glob string) (*Server, error) { - srv, tdir, err := NewTempServer(glob) + srv, tdir, err := NewTempServerWithMultipleRepos(glob) urls := []string{srv.URL(), "http://foobarbazz:9001"} if err := setTestingRepositories(urls, filepath.Join(tdir, "repositories.yaml")); err != nil { panic(err) @@ -263,7 +263,24 @@ func (srv *OCIServer) Run(t *testing.T, opts ...OCIServerOpt) { // the server. // // Deprecated: use NewTempServerWithCleanup -func NewTempServer(glob string) (*Server, string, error) { +func NewTempServer(glob string) (*Server, error) { + tdir, err := ioutil.TempDir("", "helm-repotest-") + if err != nil { + return nil, err + } + srv := NewServer(tdir) + + if glob != "" { + if _, err := srv.CopyCharts(glob); err != nil { + srv.Stop() + return srv, err + } + } + + return srv, nil +} + +func NewTempServerWithMultipleRepos(glob string) (*Server, string, error) { tdir, err := ioutil.TempDir("", "helm-repotest-") if err != nil { return nil, tdir, err