diff --git a/pkg/state/state.go b/pkg/state/state.go index e2991f91..ddb95ec5 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -2536,6 +2536,8 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, flags = append(flags, "--disable-validation") } + flags = st.appendApiVersionsFlags(flags, release) + flags = st.appendConnectionFlags(flags, helm, release) var err error @@ -2566,11 +2568,20 @@ func (st *HelmState) chartVersionFlags(release *ReleaseSpec) []string { } func (st *HelmState) appendApiVersionsFlags(flags []string, r *ReleaseSpec) []string { - for _, a := range r.ApiVersions { - flags = append(flags, "--api-versions", a) + + 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) + } } if r.KubeVersion != "" { + flags = append(flags, "--kube-version", r.KubeVersion) + } else if st.KubeVersion != "" { flags = append(flags, "--kube-version", st.KubeVersion) } diff --git a/pkg/state/state_test.go b/pkg/state/state_test.go index 4fdf9b86..bd12d676 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -1614,6 +1614,53 @@ func TestHelmState_DiffReleases(t *testing.T) { } } +func TestHelmState_DiffFlags(t *testing.T) { + tests := []struct { + name string + releases []ReleaseSpec + helm *exectest.Helm + wantDiffFlags []string + }{ + { + name: "release with api version and kubeversion", + releases: []ReleaseSpec{ + { + Name: "releaseName", + Chart: "foo", + KubeVersion: "1.21", + ApiVersions: []string{"helmfile.test/v1", "helmfile.test/v2"}, + }, + }, + helm: &exectest.Helm{}, + wantDiffFlags: []string{"--api-versions", "helmfile.test/v1", "--api-versions", "helmfile.test/v2", "--kube-version", "1.21"}, + }, + } + for i := range tests { + tt := tests[i] + t.Run(tt.name, func(t *testing.T) { + state := &HelmState{ + ReleaseSetSpec: ReleaseSetSpec{ + Releases: tt.releases, + }, + logger: logger, + valsRuntime: valsRuntime, + RenderedValues: map[string]interface{}{}, + } + for j := range tt.releases { + flags, _, errs := state.flagsForDiff(tt.helm, &tt.releases[j], false, 1) + if errs != nil { + t.Errorf("unexpected error: %v", errs) + } + if !reflect.DeepEqual(flags, tt.wantDiffFlags) { + t.Errorf("HelmState.flagsForDiff() for [%s][%s] = %v, want %v", tt.name, tt.releases[j].Name, flags, tt.wantDiffFlags) + } + } + + }) + } + +} + func TestHelmState_SyncReleasesCleanup(t *testing.T) { tests := []struct { name string