diff --git a/pkg/kagent/install/helm.go b/pkg/kagent/install/helm.go index ee1e501cd1..d5a4a1e5d5 100644 --- a/pkg/kagent/install/helm.go +++ b/pkg/kagent/install/helm.go @@ -34,8 +34,6 @@ import ( releasev1 "helm.sh/helm/v4/pkg/release/v1" "helm.sh/helm/v4/pkg/storage/driver" "k8s.io/cli-runtime/pkg/genericclioptions" - - "go.ate.dev/substrate/internal/version" ) // release names a Helm release and the chart it installs. @@ -219,7 +217,7 @@ func asV1(rel any, err error) (*releasev1.Release, error) { } // loadChart reads the chart in directory name of charts. -func loadChart(charts fs.FS, name string) (*chart.Chart, error) { +func loadChart(charts fs.FS, name, tag string) (*chart.Chart, error) { var files []*archive.BufferedFile err := fs.WalkDir(charts, name, func(p string, d fs.DirEntry, err error) error { if err != nil || d.IsDir() { @@ -239,7 +237,7 @@ func loadChart(charts fs.FS, name string) (*chart.Chart, error) { if err != nil { return nil, fmt.Errorf("while loading chart %s: %w", path.Base(name), err) } - stampVersion(ch, version.Version) + stampVersion(ch, tag) return ch, nil } diff --git a/pkg/kagent/install/install_test.go b/pkg/kagent/install/install_test.go index 245cca59f8..9cf3842494 100644 --- a/pkg/kagent/install/install_test.go +++ b/pkg/kagent/install/install_test.go @@ -90,6 +90,7 @@ func TestStampVersion(t *testing.T) { {"v1.2.3-rc.1", "1.2.3-rc.1", "v1.2.3-rc.1"}, {"dev", "0.1.0", "0.1.0"}, {"v1.2.3-4-gabcdef-dirty+meta", "0.1.0", "0.1.0"}, + {"", "0.1.0", "0.1.0"}, } for _, tc := range tests { t.Run(tc.tag, func(t *testing.T) { @@ -105,10 +106,13 @@ func TestStampVersion(t *testing.T) { func TestLoadEmbeddedCharts(t *testing.T) { for _, r := range allReleases { t.Run(r.chart, func(t *testing.T) { - ch, err := loadChart(chartsfs.FS, r.chart) + ch, err := loadChart(chartsfs.FS, r.chart, "v1.2.3") if err != nil { t.Fatal(err) } + if ch.Metadata.Version != "1.2.3" || ch.Metadata.AppVersion != "v1.2.3" { + t.Errorf("got version %q app %q, want 1.2.3 v1.2.3", ch.Metadata.Version, ch.Metadata.AppVersion) + } if ch.Name() != r.chart { t.Errorf("chart name = %q, want %q", ch.Name(), r.chart) } diff --git a/pkg/kagent/install/installer.go b/pkg/kagent/install/installer.go index 45ec7df55c..2694346e69 100644 --- a/pkg/kagent/install/installer.go +++ b/pkg/kagent/install/installer.go @@ -30,6 +30,7 @@ import ( chartsfs "go.ate.dev/substrate/charts" "go.ate.dev/substrate/internal/ateclient" "go.ate.dev/substrate/internal/installdefaults" + "go.ate.dev/substrate/internal/version" ) const ( @@ -71,6 +72,10 @@ type Options struct { Charts fs.FS // HelmLog receives Helm's debug log. Nil discards it. HelmLog io.Writer + // Version is the release tag, like v1.0.1, stamped on the charts. Their + // images default to it. Empty uses version.Version, which kubectl-ate sets + // at build time. + Version string } // Installer runs install steps against one cluster. @@ -107,6 +112,9 @@ func New(opts Options, r Reporter) (*Installer, error) { if err != nil { return nil, fmt.Errorf("while creating Kubernetes client: %w", err) } + if opts.Version == "" { + opts.Version = version.Version + } charts := opts.Charts if charts == nil { charts = chartsfs.FS diff --git a/pkg/kagent/install/steps.go b/pkg/kagent/install/steps.go index 481255ef75..6041430d39 100644 --- a/pkg/kagent/install/steps.go +++ b/pkg/kagent/install/steps.go @@ -96,7 +96,7 @@ func noValues(context.Context) (map[string]any, map[string]any, error) { return // real upgrade. func (in *Installer) helmStep(r release, vf valuesFunc) func(context.Context, func(string)) (string, error) { return func(ctx context.Context, progress func(string)) (string, error) { - ch, err := loadChart(in.charts, r.chart) + ch, err := loadChart(in.charts, r.chart, in.opts.Version) if err != nil { return "", err } diff --git a/pkg/kagent/install/upgrade.go b/pkg/kagent/install/upgrade.go index e57eaf01d8..f19a9010c8 100644 --- a/pkg/kagent/install/upgrade.go +++ b/pkg/kagent/install/upgrade.go @@ -126,7 +126,7 @@ func (in *Installer) checkVersions(_ context.Context, progress func(string)) (st if st := cur.Info.Status; st.IsPending() { return "", fmt.Errorf("release %s is %s; run helm rollback or helm uninstall on it, then retry", r.name, st) } - ch, err := loadChart(in.charts, r.chart) + ch, err := loadChart(in.charts, r.chart, in.opts.Version) if err != nil { return "", err } @@ -171,7 +171,7 @@ func checkSkew(from, to string) error { // checkCRDStorage refuses to drop a CRD version that objects are still // stored in, which would make them unreadable. func (in *Installer) checkCRDStorage(ctx context.Context, _ func(string)) (string, error) { - ch, err := loadChart(in.charts, crdsRelease.chart) + ch, err := loadChart(in.charts, crdsRelease.chart, in.opts.Version) if err != nil { return "", err } @@ -234,7 +234,7 @@ func checkStoredVersions(ctx context.Context, c apiextclient.Interface, crds []a // out. func (in *Installer) diffStep(r release, vf valuesFunc, out io.Writer) func(context.Context, func(string)) (string, error) { return func(ctx context.Context, _ func(string)) (string, error) { - ch, err := loadChart(in.charts, r.chart) + ch, err := loadChart(in.charts, r.chart, in.opts.Version) if err != nil { return "", err }