diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index 6ac78a78..67e6f8a2 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -3219,6 +3219,35 @@ releases: {Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}}, }, }, + { + name: "upgrade when ns1/foo needs ns1/bar and ns2/bar is disabled", + loc: location(), + files: map[string]string{ + "/path/to/helmfile.yaml": ` +releases: +- name: bar + chart: stable/mychart2 + namespace: ns1 +- name: bar + chart: stable/mychart2 + namespace: ns2 + installed: false +- name: foo + chart: stable/mychart1 + namespace: ns1 + needs: + - ns1/bar +`, + }, + diffs: map[exectest.DiffKey]error{ + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + }, + upgraded: []exectest.Release{ + {Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns1"}}, + {Name: "foo", Flags: []string{"--kube-context", "default", "--namespace", "ns1"}}, + }, + }, // // deletes: deleting all releases in the correct order // diff --git a/pkg/app/diff_test.go b/pkg/app/diff_test.go index 372badff..4dd63f94 100644 --- a/pkg/app/diff_test.go +++ b/pkg/app/diff_test.go @@ -533,6 +533,34 @@ releases: }, upgraded: []exectest.Release{}, }, + { + name: "upgrade when ns1/foo needs ns1/bar and ns2/bar is disabled", + loc: location(), + files: map[string]string{ + "/path/to/helmfile.yaml": ` +releases: +- name: bar + chart: mychart2 + namespace: ns1 +- name: bar + chart: mychart2 + namespace: ns2 + installed: false +- name: foo + chart: mychart1 + namespace: ns1 + needs: + - ns1/bar +`, + }, + detailedExitcode: true, + error: "Identified at least one change", + diffs: map[exectest.DiffKey]error{ + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + }, + upgraded: []exectest.Release{}, + }, { name: "upgrade when tns1 ns1 foo needs tns2 ns2 bar", loc: location(), diff --git a/pkg/app/testdata/app_diff_test_1/bar_is_disabled b/pkg/app/testdata/app_diff_test_1/bar_is_disabled new file mode 100644 index 00000000..219f70e2 --- /dev/null +++ b/pkg/app/testdata/app_diff_test_1/bar_is_disabled @@ -0,0 +1,18 @@ +processing file "helmfile.yaml" in directory "." +changing working directory to "/path/to" +merged environment: &{default map[] map[]} +3 release(s) found in helmfile.yaml + +processing 2 groups of releases in this order: +GROUP RELEASES +1 default/ns1/bar +2 default/ns1/foo + +processing releases in group 1/2: default/ns1/bar +processing releases in group 2/2: default/ns1/foo +Affected releases are: + bar (mychart2) DELETED + bar (mychart2) UPDATED + foo (mychart1) UPDATED + +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log new file mode 100644 index 00000000..36eb250f --- /dev/null +++ b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log @@ -0,0 +1,43 @@ +processing file "helmfile.yaml" in directory "." +changing working directory to "/path/to" +merged environment: &{default map[] map[]} +3 release(s) found in helmfile.yaml + +Affected releases are: + bar (stable/mychart2) DELETED + bar (stable/mychart2) UPDATED + foo (stable/mychart1) UPDATED + +invoking preapply hooks for 2 groups of releases in this order: +GROUP RELEASES +1 default/ns1/foo +2 default/ns1/bar, default/ns2/bar + +invoking preapply hooks for releases in group 1/2: default/ns1/foo +invoking preapply hooks for releases in group 2/2: default/ns1/bar, default/ns2/bar +processing 1 groups of releases in this order: +GROUP RELEASES +1 default/ns2/bar + +processing releases in group 1/1: default/ns2/bar +processing 2 groups of releases in this order: +GROUP RELEASES +1 default/ns1/bar +2 default/ns1/foo + +processing releases in group 1/2: default/ns1/bar +getting deployed release version failed: Failed to get the version for: mychart2 +processing releases in group 2/2: default/ns1/foo +getting deployed release version failed: Failed to get the version for: mychart1 + +UPDATED RELEASES: +NAME NAMESPACE CHART VERSION DURATION +bar ns1 stable/mychart2 0s +foo ns1 stable/mychart1 0s + + +DELETED RELEASES: +NAME NAMESPACE DURATION +bar ns2 0s + +changing working directory back to "/path/to" diff --git a/pkg/state/state.go b/pkg/state/state.go index 8d090723..47cdde12 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -488,7 +488,17 @@ func (st *HelmState) reformat(spec *ReleaseSpec) []string { var needs []string releaseInstalledInfo := make(map[string]bool) for _, r := range st.OrginReleases { - releaseInstalledInfo[r.Name] = r.Desired() + kubecontext := r.KubeContext + namespace := r.Namespace + + if st.OverrideKubeContext != "" { + kubecontext = st.OverrideKubeContext + } + if st.OverrideNamespace != "" { + namespace = st.OverrideNamespace + } + + releaseInstalledInfo[fmt.Sprintf("%s/%s/%s", kubecontext, namespace, r.Name)] = r.Desired() } // Since the representation differs between needs and id, @@ -501,9 +511,6 @@ func (st *HelmState) reformat(spec *ReleaseSpec) []string { components := strings.Split(n, "/") name = components[len(components)-1] - if spec.Desired() && !releaseInstalledInfo[name] { - st.logger.Warnf("WARNING: %s", fmt.Sprintf("release %s needs %s, but %s is not installed due to installed: false. Either mark %s as installed or remove %s from %s's needs", spec.Name, name, name, name, name, spec.Name)) - } if len(components) > 1 { ns = components[len(components)-2] @@ -519,6 +526,10 @@ func (st *HelmState) reformat(spec *ReleaseSpec) []string { kubecontext = spec.KubeContext } + if spec.Desired() && !releaseInstalledInfo[fmt.Sprintf("%s/%s/%s", kubecontext, ns, name)] { + st.logger.Warnf("WARNING: %s", fmt.Sprintf("release %s needs %s, but %s is not installed due to installed: false. Either mark %s as installed or remove %s from %s's needs", spec.Name, name, name, name, name, spec.Name)) + } + var componentsAfterOverride []string if kubecontext != "" {