From f77dc3d5b29b52b65ee7f5ace19c09d91cc8886e Mon Sep 17 00:00:00 2001 From: Thomas Loubiou Date: Fri, 12 Jul 2024 16:28:20 +0200 Subject: [PATCH] fix: inject KubeVersion and ApiVersions in Chartify rendering (#1624) * fix: inject KubeVersion and ApiVersions in Chartify rendering fixes #1623 Signed-off-by: Thomas Loubiou * test: appendApiVersionsFlags Signed-off-by: Thomas Loubiou * test: add case for appendApiVersionsFlags Signed-off-by: Thomas Loubiou --------- Signed-off-by: Thomas Loubiou --- pkg/app/app.go | 1 + pkg/state/state.go | 35 ++++++++----- pkg/state/state_test.go | 111 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 13 deletions(-) diff --git a/pkg/app/app.go b/pkg/app/app.go index fbb35ce2..b77cad90 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -248,6 +248,7 @@ func (a *App) Template(c TemplateConfigProvider) error { Concurrency: c.Concurrency(), IncludeTransitiveNeeds: c.IncludeNeeds(), Set: c.Set(), + KubeVersion: c.KubeVersion(), }, func() { ok, errs = a.template(run, c) }) diff --git a/pkg/state/state.go b/pkg/state/state.go index a7085610..40895d0a 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -1256,8 +1256,9 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre chartifyOpts.Validate = opts.Validate - chartifyOpts.KubeVersion = release.KubeVersion - chartifyOpts.ApiVersions = release.ApiVersions + chartifyOpts.KubeVersion = st.getKubeVersion(release, opts.KubeVersion) + chartifyOpts.ApiVersions = st.getApiVersions(release) + // https://github.com/helmfile/helmfile/pull/867 // https://github.com/helmfile/helmfile/issues/895 var flags []string @@ -2822,24 +2823,32 @@ func (st *HelmState) appendValuesControlModeFlag(flags []string, reuseValues boo return flags } -func (st *HelmState) appendApiVersionsFlags(flags []string, r *ReleaseSpec, kubeVersion string) []string { +func (st *HelmState) getApiVersions(r *ReleaseSpec) []string { if len(r.ApiVersions) != 0 { - for _, a := range r.ApiVersions { - flags = append(flags, "--api-versions", a) - } - } else { - for _, a := range st.ApiVersions { - flags = append(flags, "--api-versions", a) - } + return r.ApiVersions } + return st.ApiVersions +} +func (st *HelmState) getKubeVersion(r *ReleaseSpec, kubeVersion string) string { switch { case kubeVersion != "": - flags = append(flags, "--kube-version", kubeVersion) + return kubeVersion case r.KubeVersion != "": - flags = append(flags, "--kube-version", r.KubeVersion) + return r.KubeVersion case st.KubeVersion != "": - flags = append(flags, "--kube-version", st.KubeVersion) + return st.KubeVersion + } + return "" +} + +func (st *HelmState) appendApiVersionsFlags(flags []string, r *ReleaseSpec, kubeVersion string) []string { + for _, a := range st.getApiVersions(r) { + flags = append(flags, "--api-versions", a) + } + + if version := st.getKubeVersion(r, kubeVersion); version != "" { + flags = append(flags, "--kube-version", version) } return flags diff --git a/pkg/state/state_test.go b/pkg/state/state_test.go index 0504fb8a..e835bc45 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -10,6 +10,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/helmfile/vals" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/helmfile/helmfile/pkg/environment" @@ -3613,3 +3614,113 @@ func Test_appendExtraSyncFlags(t *testing.T) { }) } } + +func TestHelmState_appendApiVersionsFlags(t *testing.T) { + tests := []struct { + name string + kubeVersion string + flags []string + expectedFlags []string + releaseKubeVersion string + releaseApiVersion []string + stateKubeVersion string + stateApiVersion []string + }{ + { + name: "no kubeVersion is set", + expectedFlags: []string{}, + }, + { + name: "flags are kept", + flags: []string{"--flag1", "--flag2"}, + expectedFlags: []string{"--flag1", "--flag2"}, + }, + { + name: "kubeVersion is set", + kubeVersion: "1.18.0", + expectedFlags: []string{"--kube-version", "1.18.0"}, + }, + { + name: "kubeVersion is set from release", + releaseKubeVersion: "1.19.0", + expectedFlags: []string{"--kube-version", "1.19.0"}, + }, + { + name: "kubeVersion from release hasn't priority", + kubeVersion: "1.18.0", + releaseKubeVersion: "1.19.0", + expectedFlags: []string{"--kube-version", "1.18.0"}, + }, + { + name: "kubeVersion is set from state", + stateKubeVersion: "1.18.0", + expectedFlags: []string{"--kube-version", "1.18.0"}, + }, + { + name: "kubeVersion from state hasn't priority", + stateKubeVersion: "1.18.0", + releaseKubeVersion: "1.19.0", + expectedFlags: []string{"--kube-version", "1.19.0"}, + }, + { + name: "kubeVersion priority", + stateKubeVersion: "1.18.0", + releaseKubeVersion: "1.19.0", + kubeVersion: "1.20.0", + expectedFlags: []string{"--kube-version", "1.20.0"}, + }, + { + name: "api-version are set from state", + stateApiVersion: []string{"v1,v2"}, + expectedFlags: []string{"--api-versions", "v1,v2"}, + }, + { + name: "api-version are set from release", + releaseApiVersion: []string{"v1,v2"}, + expectedFlags: []string{"--api-versions", "v1,v2"}, + }, + { + name: "api-version priority", + stateApiVersion: []string{"v1"}, + releaseApiVersion: []string{"v2"}, + expectedFlags: []string{"--api-versions", "v2"}, + }, + { + name: "api-version multiple values", + stateApiVersion: []string{"v1", "v2"}, + expectedFlags: []string{"--api-versions", "v1", "--api-versions", "v2"}, + }, + { + name: "All kubeVersion and api-version are set", + kubeVersion: "1.18.0", + stateKubeVersion: "1.19.0", + releaseKubeVersion: "1.20.0", + stateApiVersion: []string{"v1"}, + releaseApiVersion: []string{"v2"}, + flags: []string{"--previous-flag-1", "--previous-flag-2"}, + expectedFlags: []string{"--previous-flag-1", "--previous-flag-2", "--api-versions", "v2", "--kube-version", "1.18.0"}, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + if test.expectedFlags == nil { + test.expectedFlags = []string{} + } + if test.flags == nil { + test.flags = []string{} + } + state := &HelmState{ + ReleaseSetSpec: ReleaseSetSpec{ + KubeVersion: test.stateKubeVersion, + ApiVersions: test.stateApiVersion, + }, + } + r := &ReleaseSpec{ + KubeVersion: test.releaseKubeVersion, + ApiVersions: test.releaseApiVersion, + } + result := state.appendApiVersionsFlags(test.flags, r, test.kubeVersion) + assert.Equal(t, test.expectedFlags, result) + }) + } +}