diff --git a/pkg/state/helmx.go b/pkg/state/helmx.go index fdc9bb3b..1a46b1d5 100644 --- a/pkg/state/helmx.go +++ b/pkg/state/helmx.go @@ -54,7 +54,22 @@ func formatLabels(labels map[string]string) string { // append labels flags to helm flags, starting from helm v3.13.0 func (st *HelmState) appendLabelsFlags(flags []string, helm helmexec.Interface, release *ReleaseSpec, syncReleaseLabels bool) []string { - if helm.IsVersionAtLeast("3.13.0") && (syncReleaseLabels || st.HelmDefaults.SyncReleaseLabels || release.SyncReleaseLabels) { + if !helm.IsVersionAtLeast("3.13.0") { + return flags + } + isSyncReleaseLabels := false + switch { + // Check if SyncReleaseLabels is true in the release spec. + case release.SyncReleaseLabels != nil && *release.SyncReleaseLabels: + isSyncReleaseLabels = true + // Check if syncReleaseLabels argument is true. + case syncReleaseLabels: + isSyncReleaseLabels = true + // Check if SyncReleaseLabels is true in HelmDefaults. + case st.HelmDefaults.SyncReleaseLabels != nil && *st.HelmDefaults.SyncReleaseLabels: + isSyncReleaseLabels = true + } + if isSyncReleaseLabels { labels := formatLabels(release.Labels) if labels != "" { flags = append(flags, "--labels", labels) @@ -203,13 +218,17 @@ func (st *HelmState) appendHideNotesFlags(flags []string, helm helmexec.Interfac } // append take-ownership flags to helm flags -func (st *HelmState) appendTakeOwnershipFlags(flags []string, helm helmexec.Interface, ops *SyncOpts) []string { +func (st *HelmState) appendTakeOwnershipFlagsForUpgrade(flags []string, helm helmexec.Interface, release *ReleaseSpec, takeOwnership bool) []string { // see https://github.com/helm/helm/releases/tag/v3.17.0 if !helm.IsVersionAtLeast("3.17.0") { return flags } switch { - case ops.TakeOwnership: + case release.TakeOwnership != nil && *release.TakeOwnership: + flags = append(flags, "--take-ownership") + case takeOwnership: + flags = append(flags, "--take-ownership") + case st.HelmDefaults.TakeOwnership != nil && *st.HelmDefaults.TakeOwnership: flags = append(flags, "--take-ownership") } return flags diff --git a/pkg/state/helmx_test.go b/pkg/state/helmx_test.go index 76f4300d..cec23f3a 100644 --- a/pkg/state/helmx_test.go +++ b/pkg/state/helmx_test.go @@ -387,12 +387,13 @@ func TestAppendHideNotesFlags(t *testing.T) { } } -func TestAppendTakeOwnershipFlags(t *testing.T) { +func TestAppendTakeOwnershipFlagsForUpgrade(t *testing.T) { type args struct { flags []string helm helmexec.Interface helmSpec HelmSpec opt *SyncOpts + release *ReleaseSpec expected []string } tests := []struct { @@ -402,8 +403,9 @@ func TestAppendTakeOwnershipFlags(t *testing.T) { { name: "no take-ownership when helm less than 3.17.0", args: args{ - flags: []string{}, - helm: testutil.NewVersionHelmExec("3.16.0"), + flags: []string{}, + release: &ReleaseSpec{}, + helm: testutil.NewVersionHelmExec("3.16.0"), opt: &SyncOpts{ TakeOwnership: true, }, @@ -413,8 +415,9 @@ func TestAppendTakeOwnershipFlags(t *testing.T) { { name: "take-ownership from cmd flag", args: args{ - flags: []string{}, - helm: testutil.NewVersionHelmExec("3.17.0"), + flags: []string{}, + helm: testutil.NewVersionHelmExec("3.17.0"), + release: &ReleaseSpec{}, opt: &SyncOpts{ TakeOwnership: true, }, @@ -426,8 +429,8 @@ func TestAppendTakeOwnershipFlags(t *testing.T) { t.Run(tt.name, func(t *testing.T) { st := &HelmState{} st.HelmDefaults = tt.args.helmSpec - got := st.appendTakeOwnershipFlags(tt.args.flags, tt.args.helm, tt.args.opt) - require.Equalf(t, tt.args.expected, got, "appendTakeOwnershipFlags() = %v, want %v", got, tt.args.expected) + got := st.appendTakeOwnershipFlagsForUpgrade(tt.args.flags, tt.args.helm, tt.args.release, tt.args.opt.TakeOwnership) + require.Equalf(t, tt.args.expected, got, "appendTakeOwnershipFlagsForUpgrade() = %v, want %v", got, tt.args.expected) }) } } diff --git a/pkg/state/state.go b/pkg/state/state.go index babd0d35..e72ad360 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -208,9 +208,9 @@ type HelmSpec struct { // Timeout is the time in seconds to wait for helmfile delete command (default 300) DeleteTimeout int `yaml:"deleteTimeout"` // SyncReleaseLabels is true if the release labels should be synced with the helmfile labels - SyncReleaseLabels bool `yaml:"syncReleaseLabels"` + SyncReleaseLabels *bool `yaml:"syncReleaseLabels"` // TakeOwnership is true if the helmfile should take ownership of the release - TakeOwnership bool `yaml:"takeOwnership"` + TakeOwnership *bool `yaml:"takeOwnership"` } // RepositorySpec that defines values for a helm repo @@ -414,9 +414,9 @@ type ReleaseSpec struct { // Timeout is the time in seconds to wait for helmfile delete command (default 300) DeleteTimeout *int `yaml:"deleteTimeout,omitempty"` // SyncReleaseLabels is true if the release labels should be synced with the helmfile labels - SyncReleaseLabels bool `yaml:"syncReleaseLabels"` + SyncReleaseLabels *bool `yaml:"syncReleaseLabels"` // TakeOwnership is true if the release should take ownership of the resources - TakeOwnership bool `yaml:"takeOwnership"` + TakeOwnership *bool `yaml:"takeOwnership"` } func (r *Inherits) UnmarshalYAML(unmarshal func(any) error) error { @@ -2802,9 +2802,11 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp postRenderer := "" syncReleaseLabels := false + takeOwnership := false if opt != nil { postRenderer = opt.PostRenderer syncReleaseLabels = opt.SyncReleaseLabels + takeOwnership = opt.TakeOwnership } flags = st.appendConnectionFlags(flags, release) @@ -2833,7 +2835,7 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp flags = st.appendHideNotesFlags(flags, helm, opt) // append take-ownership flag - flags = st.appendTakeOwnershipFlags(flags, helm, opt) + flags = st.appendTakeOwnershipFlagsForUpgrade(flags, helm, release, takeOwnership) flags = st.appendExtraSyncFlags(flags, opt) @@ -2978,17 +2980,11 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, if opt != nil { takeOwnership = opt.TakeOwnership } - if takeOwnership || st.HelmDefaults.TakeOwnership || release.TakeOwnership { - diffVersion, err := helmexec.GetPluginVersion("diff", settings.PluginsDirectory) - if err != nil { - return nil, nil, err - } - dv, _ := semver.NewVersion("v3.11.0") - if diffVersion.LessThan(dv) { - return nil, nil, fmt.Errorf("take-ownership is not supported by helm-diff plugin version %s, please use at least v3.11.0", diffVersion) - } - flags = append(flags, "--take-ownership") + var err error + flags, err = st.appendTakeOwnershipFlagsForDiff(flags, release, takeOwnership) + if err != nil { + return nil, nil, err } common, files, err := st.namespaceAndValuesFlags(helm, release, workerIndex) @@ -2999,6 +2995,33 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, return append(flags, common...), files, nil } +func (st *HelmState) appendTakeOwnershipFlagsForDiff(flags []string, release *ReleaseSpec, takeOwnership bool) ([]string, error) { + settings := cli.New() + isAppendTakeOwnership := false + + switch { + case release.TakeOwnership != nil && *release.TakeOwnership: + isAppendTakeOwnership = true + case takeOwnership: + isAppendTakeOwnership = true + case st.HelmDefaults.TakeOwnership != nil && *st.HelmDefaults.TakeOwnership: + isAppendTakeOwnership = true + } + if isAppendTakeOwnership { + diffVersion, err := helmexec.GetPluginVersion("diff", settings.PluginsDirectory) + if err != nil { + return flags, err + } + dv, _ := semver.NewVersion("v3.11.0") + + if diffVersion.LessThan(dv) { + return flags, fmt.Errorf("take-ownership is not supported by helm-diff plugin version %s, please use at least v3.11.0", diffVersion) + } + flags = append(flags, "--take-ownership") + } + return flags, nil +} + func (st *HelmState) appendChartVersionFlags(flags []string, release *ReleaseSpec) []string { if release.Version != "" { flags = append(flags, "--version", release.Version)