From a3a756eced997e8640f1f2a7ba406429fce32639 Mon Sep 17 00:00:00 2001 From: Suleiman Dibirov Date: Sun, 28 Jul 2024 19:29:51 +0300 Subject: [PATCH] feat(chart_downloader): Use cached chart if possible in chart_downloader.go Signed-off-by: Suleiman Dibirov --- pkg/downloader/chart_downloader.go | 19 +++++++++----- pkg/downloader/chart_downloader_test.go | 35 +++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index dde6a1057..60c316417 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -99,20 +99,25 @@ func (c *ChartDownloader) DownloadTo(ref, version, dest string) (string, *proven c.Options = append(c.Options, getter.WithAcceptHeader("application/gzip,application/octet-stream")) - data, err := g.Get(u.String(), c.Options...) - if err != nil { - return "", nil, err - } - name := filepath.Base(u.Path) + if u.Scheme == registry.OCIScheme { idx := strings.LastIndexByte(name, ':') name = fmt.Sprintf("%s-%s.tgz", name[:idx], name[idx+1:]) } destfile := filepath.Join(dest, name) - if err := fileutil.AtomicWriteFile(destfile, data, 0644); err != nil { - return destfile, nil, err + + // If the file does not exist locally, fetch it from the remote source. + if _, err := os.Stat(destfile); err != nil { + data, err := g.Get(u.String(), c.Options...) + if err != nil { + return "", nil, err + } + + if err := fileutil.AtomicWriteFile(destfile, data, 0644); err != nil { + return destfile, nil, err + } } // If provenance is requested, verify it. diff --git a/pkg/downloader/chart_downloader_test.go b/pkg/downloader/chart_downloader_test.go index 131e21306..f98a1de45 100644 --- a/pkg/downloader/chart_downloader_test.go +++ b/pkg/downloader/chart_downloader_test.go @@ -197,7 +197,8 @@ func TestDownloadTo(t *testing.T) { }, } cname := "/signtest-0.1.0.tgz" - dest := srv.Root() + dest := filepath.Join(srv.Root(), "signtest") + os.MkdirAll(dest, 0755) where, v, err := c.DownloadTo(srv.URL()+cname, "", dest) if err != nil { t.Fatal(err) @@ -216,6 +217,35 @@ func TestDownloadTo(t *testing.T) { } } +func TestDownloadToWithCachedChart(t *testing.T) { + c := ChartDownloader{ + Out: os.Stderr, + Verify: VerifyNever, + Keyring: "testdata/helm-test-key.pub", + RepositoryConfig: repoConfig, + RepositoryCache: repoCache, + Getters: getter.All(&cli.EnvSettings{ + RepositoryConfig: repoConfig, + RepositoryCache: repoCache, + }), + } + dest := t.TempDir() + cname := "signtest-0.1.0.tgz" + os.Create(filepath.Join(dest, cname)) + where, _, err := c.DownloadTo("https://localhost/"+cname, "", dest) + if err != nil { + t.Fatal(err) + } + + if expect := filepath.Join(dest, cname); where != expect { + t.Errorf("Expected download to %s, got %s", expect, where) + } + + if _, err := os.Stat(filepath.Join(dest, cname)); err != nil { + t.Error(err) + } +} + func TestDownloadTo_TLS(t *testing.T) { // Set up mock server w/ tls enabled srv, err := repotest.NewTempServerWithCleanup(t, "testdata/*.tgz*") @@ -248,7 +278,8 @@ func TestDownloadTo_TLS(t *testing.T) { Options: []getter.Option{}, } cname := "test/signtest" - dest := srv.Root() + dest := filepath.Join(srv.Root(), "signtest") + os.MkdirAll(dest, 0755) where, v, err := c.DownloadTo(cname, "", dest) if err != nil { t.Fatal(err)