feat: add go-getter suppport for ad-hoc

Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero 2023-04-22 20:52:05 +08:00 committed by yxxhero
parent b7233d1238
commit 1781ac6a8c
3 changed files with 80 additions and 27 deletions

View File

@ -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,
})

View File

@ -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...)
}

View File

@ -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)
}
})
}
}