From 1781ac6a8ce8eb8069d84a02130476488f0ca3f0 Mon Sep 17 00:00:00 2001 From: yxxhero Date: Sat, 22 Apr 2023 20:52:05 +0800 Subject: [PATCH] feat: add go-getter suppport for ad-hoc Signed-off-by: yxxhero --- pkg/state/helmx.go | 32 ++++------------------ pkg/state/release.go | 18 +++++++++++++ pkg/state/release_test.go | 57 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 27 deletions(-) diff --git a/pkg/state/helmx.go b/pkg/state/helmx.go index 56f7809c..7f3a314f 100644 --- a/pkg/state/helmx.go +++ b/pkg/state/helmx.go @@ -45,21 +45,7 @@ type Chartify struct { } func (st *HelmState) downloadChartWithGoGetter(r *ReleaseSpec) (string, error) { - var pathElems []string - - if r.Namespace != "" { - pathElems = append(pathElems, r.Namespace) - } - - if r.KubeContext != "" { - pathElems = append(pathElems, r.KubeContext) - } - - pathElems = append(pathElems, r.Name) - - cacheDir := filepath.Join(pathElems...) - - return st.goGetterChart(r.Chart, r.Directory, cacheDir, r.ForceGoGetter) + return st.goGetterChart(r.Chart, r.Directory, r.CacheDir(), r.ForceGoGetter) } func (st *HelmState) goGetterChart(chart, dir, cacheDir string, force bool) (string, error) { @@ -116,23 +102,15 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp } for _, d := range release.Dependencies { - chart := d.Chart - if st.fs.DirectoryExistsAt(chart) { - var err error + dependenceChart, err := st.goGetterChart(d.Chart, "", release.CacheDir(), release.ForceGoGetter) - // Otherwise helm-dependency-up on the temporary chart generated by chartify ends up errors like: - // Error: directory /tmp/chartify945964195/myapp-57fb4495cf/test/integration/charts/httpbin not found] - // which is due to that the temporary chart is generated outside of the current working directory/basePath, - // and therefore the relative path in `chart` points to somewhere inexistent. - chart, err = filepath.Abs(filepath.Join(st.basePath, chart)) - if err != nil { - return nil, clean, err - } + if err != nil { + return nil, clean, err } c.Opts.AdhocChartDependencies = append(c.Opts.AdhocChartDependencies, chartify.ChartDependency{ Alias: d.Alias, - Chart: chart, + Chart: dependenceChart, Version: d.Version, }) diff --git a/pkg/state/release.go b/pkg/state/release.go index 149f1e77..e20e9cba 100644 --- a/pkg/state/release.go +++ b/pkg/state/release.go @@ -2,6 +2,7 @@ package state import ( "fmt" + "path/filepath" "github.com/helmfile/helmfile/pkg/maputil" "github.com/helmfile/helmfile/pkg/tmpl" @@ -220,3 +221,20 @@ func (r ReleaseSpec) Clone() (*ReleaseSpec, error) { func (r ReleaseSpec) Desired() bool { return r.Installed == nil || *r.Installed } + +// CacheDir returns the cache directory for the release. +func (r ReleaseSpec) CacheDir() string { + var pathElems []string + + if r.Namespace != "" { + pathElems = append(pathElems, r.Namespace) + } + + if r.KubeContext != "" { + pathElems = append(pathElems, r.KubeContext) + } + + pathElems = append(pathElems, r.Name) + + return filepath.Join(pathElems...) +} diff --git a/pkg/state/release_test.go b/pkg/state/release_test.go index c209144d..adf3356b 100644 --- a/pkg/state/release_test.go +++ b/pkg/state/release_test.go @@ -43,3 +43,60 @@ func TestExecuteTemplateExpressions(t *testing.T) { require.NoErrorf(t, err, "failed to execute template expressions: %v", err) require.Equalf(t, result.ValuesTemplate[0].(map[string]interface{})["fullnameOverride"], "foo", "failed to execute template expressions") } + +func TestCacheDir(t *testing.T) { + tests := []struct { + name string + rs ReleaseSpec + want string + }{ + { + name: "empty", + rs: ReleaseSpec{}, + want: "", + }, + { + name: "namespace", + rs: ReleaseSpec{Namespace: "baz"}, + want: "baz", + }, + { + name: "kubeContext", + rs: ReleaseSpec{KubeContext: "qux"}, + want: "qux", + }, + { + name: "name", + rs: ReleaseSpec{Name: "foo"}, + want: "foo", + }, + { + name: "namespace and kubeContext", + rs: ReleaseSpec{Namespace: "baz", KubeContext: "qux"}, + want: "baz/qux", + }, + { + name: "namespace and name", + rs: ReleaseSpec{Namespace: "baz", Name: "foo"}, + want: "baz/foo", + }, + { + name: "kubeContext and name", + rs: ReleaseSpec{KubeContext: "qux", Name: "foo"}, + want: "qux/foo", + }, + { + name: "namespace and kubeContext and name", + rs: ReleaseSpec{Namespace: "baz", KubeContext: "qux", Name: "foo"}, + want: "baz/qux/foo", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.rs.CacheDir(); got != tt.want { + t.Errorf("ReleaseSpec.CacheDir() = %v, want %v", got, tt.want) + } + }) + } +}