From 74fa125f0f2b0b7cdf114a80f30f4ebc028ca23d Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Tue, 27 Aug 2019 16:12:15 +0100 Subject: [PATCH] Enable lazy create of repo file for repo commannds Adding Lazy create of repository file for `helm repo` commands in addition to `repo update`. Signed-off-by: Martin Hickey --- cmd/helm/repo_add_test.go | 2 +- cmd/helm/repo_list.go | 2 +- cmd/helm/repo_remove.go | 2 +- cmd/helm/repo_remove_test.go | 2 +- cmd/helm/repo_update.go | 2 +- cmd/helm/search_repo.go | 2 +- pkg/downloader/chart_downloader.go | 2 +- pkg/downloader/chart_downloader_test.go | 2 +- pkg/downloader/manager.go | 8 ++++---- pkg/repo/repo.go | 12 +++++++++++- pkg/repo/repo_test.go | 18 +++++++++++++++--- 11 files changed, 38 insertions(+), 16 deletions(-) diff --git a/cmd/helm/repo_add_test.go b/cmd/helm/repo_add_test.go index 217a8124c..a48846ed1 100644 --- a/cmd/helm/repo_add_test.go +++ b/cmd/helm/repo_add_test.go @@ -67,7 +67,7 @@ func TestRepoAdd(t *testing.T) { t.Error(err) } - f, err := repo.LoadFile(repoFile) + f, err := repo.LoadFile(repoFile, false) if err != nil { t.Fatal(err) } diff --git a/cmd/helm/repo_list.go b/cmd/helm/repo_list.go index 3228dbb1e..f9535cf41 100644 --- a/cmd/helm/repo_list.go +++ b/cmd/helm/repo_list.go @@ -34,7 +34,7 @@ func newRepoListCmd(out io.Writer) *cobra.Command { Short: "list chart repositories", Args: require.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - f, err := repo.LoadFile(settings.RepositoryConfig) + f, err := repo.LoadFile(settings.RepositoryConfig, true) if err != nil { return err } diff --git a/cmd/helm/repo_remove.go b/cmd/helm/repo_remove.go index 006908cd0..5509c6e26 100644 --- a/cmd/helm/repo_remove.go +++ b/cmd/helm/repo_remove.go @@ -55,7 +55,7 @@ func newRepoRemoveCmd(out io.Writer) *cobra.Command { } func (o *repoRemoveOptions) run(out io.Writer) error { - r, err := repo.LoadFile(o.repoFile) + r, err := repo.LoadFile(o.repoFile, true) if err != nil { return err } diff --git a/cmd/helm/repo_remove_test.go b/cmd/helm/repo_remove_test.go index 5e8ddd209..9ebfd7562 100644 --- a/cmd/helm/repo_remove_test.go +++ b/cmd/helm/repo_remove_test.go @@ -80,7 +80,7 @@ func TestRepoRemove(t *testing.T) { t.Errorf("Error cache file was not removed for repository %s", testRepoName) } - f, err := repo.LoadFile(repoFile) + f, err := repo.LoadFile(repoFile, false) if err != nil { t.Error(err) } diff --git a/cmd/helm/repo_update.go b/cmd/helm/repo_update.go index 1d647366a..ab8909fdf 100644 --- a/cmd/helm/repo_update.go +++ b/cmd/helm/repo_update.go @@ -59,7 +59,7 @@ func newRepoUpdateCmd(out io.Writer) *cobra.Command { } func (o *repoUpdateOptions) run(out io.Writer) error { - f, err := repo.LoadFile(o.repoFile) + f, err := repo.LoadFile(o.repoFile, true) if err != nil { return err } diff --git a/cmd/helm/search_repo.go b/cmd/helm/search_repo.go index 0399490aa..d954a1b3c 100644 --- a/cmd/helm/search_repo.go +++ b/cmd/helm/search_repo.go @@ -146,7 +146,7 @@ func (o *searchRepoOptions) formatSearchResults(res []*search.Result) string { func (o *searchRepoOptions) buildIndex(out io.Writer) (*search.Index, error) { // Load the repositories.yaml - rf, err := repo.LoadFile(o.repoFile) + rf, err := repo.LoadFile(o.repoFile, true) if err != nil { return nil, errors.Wrap(err, "loading repository config") } diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index cdb146e79..134751f51 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -154,7 +154,7 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, er } c.Options = append(c.Options, getter.WithURL(ref)) - rf, err := repo.LoadFile(c.RepositoryConfig) + rf, err := repo.LoadFile(c.RepositoryConfig, false) if err != nil { return u, err } diff --git a/pkg/downloader/chart_downloader_test.go b/pkg/downloader/chart_downloader_test.go index 26d19343f..55828b942 100644 --- a/pkg/downloader/chart_downloader_test.go +++ b/pkg/downloader/chart_downloader_test.go @@ -222,7 +222,7 @@ func TestScanReposForURL(t *testing.T) { } u := "http://example.com/alpine-0.2.0.tgz" - rf, err := repo.LoadFile(repoConfig) + rf, err := repo.LoadFile(repoConfig, false) if err != nil { t.Fatal(err) } diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 4bfa1e670..5dd761597 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -311,7 +311,7 @@ func (m *Manager) safeDeleteDep(name, dir string) error { // hasAllRepos ensures that all of the referenced deps are in the local repo cache. func (m *Manager) hasAllRepos(deps []*chart.Dependency) error { - rf, err := repo.LoadFile(m.RepositoryConfig) + rf, err := repo.LoadFile(m.RepositoryConfig, false) if err != nil { return err } @@ -345,7 +345,7 @@ Loop: // getRepoNames returns the repo names of the referenced deps which can be used to fetch the cahced index file. func (m *Manager) getRepoNames(deps []*chart.Dependency) (map[string]string, error) { - rf, err := repo.LoadFile(m.RepositoryConfig) + rf, err := repo.LoadFile(m.RepositoryConfig, false) if err != nil { if os.IsNotExist(err) { return make(map[string]string), nil @@ -415,7 +415,7 @@ 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 { - rf, err := repo.LoadFile(m.RepositoryConfig) + rf, err := repo.LoadFile(m.RepositoryConfig, false) if err != nil { return err } @@ -553,7 +553,7 @@ func (m *Manager) loadChartRepositories() (map[string]*repo.ChartRepository, err indices := map[string]*repo.ChartRepository{} // Load repositories.yaml file - rf, err := repo.LoadFile(m.RepositoryConfig) + rf, err := repo.LoadFile(m.RepositoryConfig, false) if err != nil { return indices, errors.Wrapf(err, "failed to load %s", m.RepositoryConfig) } diff --git a/pkg/repo/repo.go b/pkg/repo/repo.go index 70f026dcf..7e913fae5 100644 --- a/pkg/repo/repo.go +++ b/pkg/repo/repo.go @@ -45,9 +45,19 @@ func NewFile() *File { } // LoadFile takes a file at the given path and returns a File object -func LoadFile(path string) (*File, error) { +// createRepoFile parameter when set to true, will create repo file if +// it doesn't exist. The parameter is useful for lazy create when +// running some commands. +func LoadFile(path string, createRepoFile bool) (*File, error) { b, err := ioutil.ReadFile(path) if err != nil { + if os.IsNotExist(err) && createRepoFile { + f := &File{} + if err := f.WriteFile(path, 0644); err != nil { + return nil, errors.Wrapf(err, "couldn't load repositories file (%s)", path) + } + return f, nil + } if os.IsNotExist(err) { return nil, errors.Wrapf(err, "couldn't load repositories file (%s)", path) } diff --git a/pkg/repo/repo_test.go b/pkg/repo/repo_test.go index 1ed3fb298..897173230 100644 --- a/pkg/repo/repo_test.go +++ b/pkg/repo/repo_test.go @@ -71,7 +71,7 @@ func TestNewFile(t *testing.T) { }, ) - file, err := LoadFile(testRepositoriesFile) + file, err := LoadFile(testRepositoriesFile, false) if err != nil { t.Errorf("%q could not be loaded: %s", testRepositoriesFile, err) } @@ -169,7 +169,7 @@ func TestWriteFile(t *testing.T) { t.Errorf("failed to write file (%v)", err) } - repos, err := LoadFile(file.Name()) + repos, err := LoadFile(file.Name(), false) if err != nil { t.Errorf("failed to load file (%v)", err) } @@ -181,9 +181,21 @@ func TestWriteFile(t *testing.T) { } func TestRepoNotExists(t *testing.T) { - if _, err := LoadFile("/this/path/does/not/exist.yaml"); err == nil { + if _, err := LoadFile("/this/path/does/not/exist.yaml", false); err == nil { t.Errorf("expected err to be non-nil when path does not exist") } else if !strings.Contains(err.Error(), "couldn't load repositories file") { t.Errorf("expected prompt `couldn't load repositories file`") } } + +func TestRepoLazyCreate(t *testing.T) { + f, err := LoadFile("testdata/helm-repo-lazy-tst.yaml", true) + if err != nil { + t.Errorf("expected err to be nil when path does not exist and create repo file flag set") + } + if len(f.Repositories) != 0 { + os.Remove("testdata/helm-repo-lazy-tst.yaml") + t.Errorf("expected no rep[ositories to be returned") + } + os.Remove("testdata/helm-repo-lazy-tst.yaml") +}