diff --git a/docs/index.md b/docs/index.md index ba1e7df8..66d43812 100644 --- a/docs/index.md +++ b/docs/index.md @@ -178,8 +178,6 @@ lockFilePath: path/to/lock.file # In other words, unset values results in no flags passed to helm. # See the helm usage (helm SUBCOMMAND -h) for more info on default values when those flags aren't provided. helmDefaults: - tillerNamespace: tiller-namespace #dedicated default key for tiller-namespace - tillerless: false #dedicated default key for tillerless kubeContext: kube-context #dedicated default key for kube-context (--kube-context) cleanupOnFail: false #dedicated default key for helm flag --cleanup-on-fail # additional and global args passed to helm (default "") @@ -289,10 +287,6 @@ releases: atomic: true # when true, cleans up any new resources created during a failed release (default false) cleanupOnFail: false - # name of the tiller namespace (default "") - tillerNamespace: vault - # if true, will use the helm-tiller plugin (default false) - tillerless: false # enable TLS for request to Tiller (default false) tls: true # path to TLS CA certificate file (default "$HELM_HOME/ca.pem") @@ -1008,13 +1002,6 @@ environments: - http://$HOSTNAME/artifactory/example-repo-local/test.tgz@environments/production.secret.yaml ``` -## Tillerless - -With the [helm-tiller](https://github.com/rimusz/helm-tiller) plugin installed, you can work without tiller installed. - -To enable this mode, you need to define `tillerless: true` and set the `tillerNamespace` in the `helmDefaults` section -or in the `releases` entries. - ## DAG-aware installation/deletion ordering with `needs` `needs` controls the order of the installation/deletion of the release: diff --git a/docs/writing-helmfile.md b/docs/writing-helmfile.md index 9ee4c992..eccc6f63 100644 --- a/docs/writing-helmfile.md +++ b/docs/writing-helmfile.md @@ -112,8 +112,8 @@ releases: Release Templating supports the following parts of release definition: - basic fields: `name`, `namespace`, `chart`, `version` -- boolean fields: `installed`, `wait`, `waitForJobs`, `tillerless`, `verify` by the means of additional text - fields designed for templating only: `installedTemplate`, `waitTemplate`, `tillerlessTemplate`, `verifyTemplate` +- boolean fields: `installed`, `wait`, `waitForJobs`, `verify` by the means of additional text + fields designed for templating only: `installedTemplate`, `waitTemplate`, `verifyTemplate` ```yaml # ... installedTemplate: '{{`{{ eq .Release.Namespace "kube-system" }}`}}' @@ -328,7 +328,6 @@ Where the gotmpl file loaded in the second part looks like: ```yaml helmDefaults: - tillerNamespace: kube-system kubeContext: {{ .Values.kubeContext }} verify: false {{ if .Values.wait }} @@ -347,7 +346,6 @@ So in `mydefaults.yaml.gotmpl`, both `.Values.kubeContext` and `.Values.wait` ar ```yaml helmDefaults: - tillerNamespace: kube-system kubeContext: test verify: false wait: false diff --git a/pkg/app/app.go b/pkg/app/app.go index 0473dca5..14bebff1 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -232,10 +232,7 @@ func (a *App) Template(c TemplateConfigProvider) error { // Live output should never be enabled for the "template" subcommand to avoid breaking `helmfile template | kubectl apply -f -` run.helm.SetEnableLiveOutput(false) - // `helm template` in helm v2 does not support local chart. - // So, we set forceDownload=true for helm v2 only prepErr := run.withPreparedCharts("template", state.ChartPrepareOptions{ - ForceDownload: !run.helm.IsHelm3(), SkipRepos: c.SkipDeps(), SkipDeps: c.SkipDeps(), IncludeCRDs: &includeCRDs, @@ -257,14 +254,11 @@ func (a *App) Template(c TemplateConfigProvider) error { func (a *App) WriteValues(c WriteValuesConfigProvider) error { return a.ForEachState(func(run *Run) (ok bool, errs []error) { - // `helm template` in helm v2 does not support local chart. - // So, we set forceDownload=true for helm v2 only prepErr := run.withPreparedCharts("write-values", state.ChartPrepareOptions{ - ForceDownload: !run.helm.IsHelm3(), - SkipRepos: c.SkipDeps(), - SkipDeps: c.SkipDeps(), - SkipCleanup: c.SkipCleanup(), - Concurrency: c.Concurrency(), + SkipRepos: c.SkipDeps(), + SkipDeps: c.SkipDeps(), + SkipCleanup: c.SkipCleanup(), + Concurrency: c.Concurrency(), }, func() { ok, errs = a.writeValues(run, c) }) @@ -497,7 +491,7 @@ func (a *App) Destroy(c DestroyConfigProvider) error { func (a *App) Test(c TestConfigProvider) error { return a.ForEachState(func(run *Run) (_ bool, errs []error) { - if c.Cleanup() && run.helm.IsHelm3() { + if c.Cleanup() { a.Logger.Warnf("warn: requested cleanup will not be applied. " + "To clean up test resources with Helm 3, you have to remove them manually " + "or set helm.sh/hook-delete-policy\n") @@ -1056,7 +1050,7 @@ func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converg f := converge if opts.Filter { f = func(st *state.HelmState) (bool, []error) { - return processFilteredReleases(st, a.getHelm(st), func(st *state.HelmState) []error { + return processFilteredReleases(st, func(st *state.HelmState) []error { _, err := converge(st) return err }, @@ -1073,7 +1067,7 @@ func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converg return a.visitStates(fileOrDir, opts, fHelmStatsWithOverrides) } -func processFilteredReleases(st *state.HelmState, helm helmexec.Interface, converge func(st *state.HelmState) []error, includeTransitiveNeeds bool) (bool, []error) { +func processFilteredReleases(st *state.HelmState, converge func(st *state.HelmState) []error, includeTransitiveNeeds bool) (bool, []error) { if len(st.Selectors) > 0 { err := st.FilterReleases(includeTransitiveNeeds) if err != nil { @@ -1081,7 +1075,7 @@ func processFilteredReleases(st *state.HelmState, helm helmexec.Interface, conve } } - if err := checkDuplicates(helm, st, st.Releases); err != nil { + if err := checkDuplicates(st.Releases); err != nil { return false, []error{err} } @@ -1092,7 +1086,7 @@ func processFilteredReleases(st *state.HelmState, helm helmexec.Interface, conve return processed, errs } -func checkDuplicates(helm helmexec.Interface, st *state.HelmState, releases []state.ReleaseSpec) error { +func checkDuplicates(releases []state.ReleaseSpec) error { type Key struct { TillerNamespace, Name, KubeContext string } @@ -1100,13 +1094,6 @@ func checkDuplicates(helm helmexec.Interface, st *state.HelmState, releases []st releaseNameCounts := map[Key]int{} for _, r := range releases { namespace := r.Namespace - if !helm.IsHelm3() { - if r.TillerNamespace != "" { - namespace = r.TillerNamespace - } else { - namespace = st.HelmDefaults.TillerNamespace - } - } releaseNameCounts[Key{namespace, r.Name, r.KubeContext}]++ } for name, c := range releaseNameCounts { @@ -1130,7 +1117,7 @@ func checkDuplicates(helm helmexec.Interface, st *state.HelmState, releases []st func (a *App) Wrap(converge func(*state.HelmState, helmexec.Interface) []error) func(st *state.HelmState, helm helmexec.Interface, includeTransitiveNeeds bool) (bool, []error) { return func(st *state.HelmState, helm helmexec.Interface, includeTransitiveNeeds bool) (bool, []error) { - return processFilteredReleases(st, helm, func(st *state.HelmState) []error { + return processFilteredReleases(st, func(st *state.HelmState) []error { return converge(st, helm) }, includeTransitiveNeeds) } @@ -1268,7 +1255,7 @@ func (a *App) getSelectedReleases(r *Run, includeTransitiveNeeds bool) ([]state. } } - if err := checkDuplicates(r.helm, r.state, deduplicated); err != nil { + if err := checkDuplicates(deduplicated); err != nil { return nil, nil, err } diff --git a/pkg/app/app_apply_hooks_test.go b/pkg/app/app_apply_hooks_test.go index 8466d2c4..9c6dfbc8 100644 --- a/pkg/app/app_apply_hooks_test.go +++ b/pkg/app/app_apply_hooks_test.go @@ -50,6 +50,7 @@ func TestApply_hooks(t *testing.T) { DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, tc.logLevel, func(t *testing.T, logger *zap.SugaredLogger) { @@ -387,10 +388,10 @@ releases: }, selectors: []string{"app=test"}, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -437,10 +438,10 @@ releases: }, selectors: []string{"app=test"}, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: ``, + {Filter: "^bar$", Flags: listFlags("default", "default")}: ``, }, upgraded: []exectest.Release{ {Name: "foo"}, diff --git a/pkg/app/app_apply_nokubectx_test.go b/pkg/app/app_apply_nokubectx_test.go index a7ced941..89d8eda9 100644 --- a/pkg/app/app_apply_nokubectx_test.go +++ b/pkg/app/app_apply_nokubectx_test.go @@ -50,6 +50,7 @@ func TestApply_3(t *testing.T) { DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { @@ -183,10 +184,10 @@ releases: {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -231,7 +232,7 @@ releases: {Name: "external-secrets", Flags: []string{"--namespace", "default"}}, }, lists: map[exectest.ListKey]string{ - {Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE ^external-secrets$ 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -285,13 +286,13 @@ releases: {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -341,10 +342,10 @@ releases: {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -390,13 +391,13 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, lists: map[exectest.ListKey]string{ - {Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -446,11 +447,11 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, lists: map[exectest.ListKey]string{ - {Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: ``, - {Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "")}: ``, + {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, diff --git a/pkg/app/app_apply_test.go b/pkg/app/app_apply_test.go index 1e6d5ea7..a56d907b 100644 --- a/pkg/app/app_apply_test.go +++ b/pkg/app/app_apply_test.go @@ -50,6 +50,7 @@ func TestApply_2(t *testing.T) { DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { @@ -183,10 +184,10 @@ releases: {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -231,7 +232,7 @@ releases: {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, }, lists: map[exectest.ListKey]string{ - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE ^external-secrets$ 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -285,13 +286,13 @@ releases: {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -341,10 +342,10 @@ releases: {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -390,13 +391,13 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, lists: map[exectest.ListKey]string{ - {Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -446,11 +447,11 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, lists: map[exectest.ListKey]string{ - {Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: ``, - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: ``, + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -501,13 +502,13 @@ releases: {Name: "serviceC", Chart: "my/chart", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^serviceA$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^serviceA$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE serviceA 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default `, - {Filter: "^serviceB$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^serviceB$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE serviceB 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default `, - {Filter: "^serviceC$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^serviceC$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE serviceC 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default `, }, @@ -646,7 +647,7 @@ releases: {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -712,7 +713,7 @@ releases: {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, diff --git a/pkg/app/app_diff_test.go b/pkg/app/app_diff_test.go index 4c3751db..51e7d8b0 100644 --- a/pkg/app/app_diff_test.go +++ b/pkg/app/app_diff_test.go @@ -42,6 +42,7 @@ func TestDiffWithNeeds(t *testing.T) { DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { @@ -316,6 +317,7 @@ func TestDiffWithInstalled(t *testing.T) { DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { @@ -385,7 +387,7 @@ releases: `, selectors: []string{"name=a"}, lists: map[exectest.ListKey]string{ - {Filter: "^a$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^a$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -409,7 +411,7 @@ releases: `, selectors: []string{"name=a"}, lists: map[exectest.ListKey]string{ - {Filter: "^a$", Flags: helmV2ListFlags}: ``, + {Filter: "^a$", Flags: listFlags("default", "default")}: ``, }, }) }) diff --git a/pkg/app/app_lint_test.go b/pkg/app/app_lint_test.go index 127e17ec..f2848b49 100644 --- a/pkg/app/app_lint_test.go +++ b/pkg/app/app_lint_test.go @@ -44,6 +44,7 @@ func TestLint(t *testing.T) { DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { diff --git a/pkg/app/app_sync_test.go b/pkg/app/app_sync_test.go index 3c522320..2e816a74 100644 --- a/pkg/app/app_sync_test.go +++ b/pkg/app/app_sync_test.go @@ -48,6 +48,7 @@ func TestSync(t *testing.T) { DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { @@ -175,10 +176,10 @@ releases: {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, }, lists: map[exectest.ListKey]string{ - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -306,13 +307,13 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, lists: map[exectest.ListKey]string{ - {Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -440,13 +441,13 @@ releases: selectors: []string{"name=serviceA"}, upgraded: []exectest.Release{}, lists: map[exectest.ListKey]string{ - {Filter: "^serviceC$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^serviceC$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE serviceC 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default `, - {Filter: "^serviceB$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^serviceB$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE serviceB 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default `, - {Filter: "^serviceA$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^serviceA$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE serviceA 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default `, }, @@ -572,13 +573,13 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, lists: map[exectest.ListKey]string{ - {Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -721,11 +722,11 @@ releases: upgraded: []exectest.Release{}, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 - {Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: ``, - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: ``, + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, diff --git a/pkg/app/app_template_test.go b/pkg/app/app_template_test.go index 37c97198..92483c79 100644 --- a/pkg/app/app_template_test.go +++ b/pkg/app/app_template_test.go @@ -45,6 +45,7 @@ func TestTemplate(t *testing.T) { DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { @@ -236,7 +237,7 @@ releases: }, selectors: []string{"name=test2"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string(nil)}, + {Name: "test2", Flags: []string{}}, }, }) }) @@ -249,8 +250,8 @@ releases: }, selectors: []string{"name=test3"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string(nil)}, - {Name: "test3", Flags: []string(nil)}, + {Name: "test2", Flags: []string{}}, + {Name: "test3", Flags: []string{}}, }, }) }) @@ -264,8 +265,8 @@ releases: }, selectors: []string{"name=test3"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string(nil)}, - {Name: "test3", Flags: []string(nil)}, + {Name: "test2", Flags: []string{}}, + {Name: "test3", Flags: []string{}}, }, }) }) @@ -279,7 +280,7 @@ releases: }, selectors: []string{"name=test2"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string(nil)}, + {Name: "test2", Flags: []string{}}, }, }) }) @@ -293,8 +294,8 @@ releases: }, selectors: []string{"name=test3"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string(nil)}, - {Name: "test3", Flags: []string(nil)}, + {Name: "test2", Flags: []string{}}, + {Name: "test3", Flags: []string{}}, }, }) }) @@ -330,6 +331,7 @@ func TestTemplate_StrictParsing(t *testing.T) { DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } _ = runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index ae0e8a67..36d1857c 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -48,16 +48,16 @@ func injectFs(app *App, fs *testhelper.TestFs) *App { } func expectNoCallsToHelm(app *App) { - expectNoCallsToHelmVersion(app, false) + expectNoCallsToHelmVersion(app) } -func expectNoCallsToHelmVersion(app *App, isHelm3 bool) { +func expectNoCallsToHelmVersion(app *App) { if app.helms != nil { panic("invalid call to expectNoCallsToHelm") } app.helms = map[helmKey]helmexec.Interface{ - createHelmKey(app.OverrideHelmBinary, app.OverrideKubeContext): &versionOnlyHelmExec{isHelm3: isHelm3}, + createHelmKey(app.OverrideHelmBinary, app.OverrideKubeContext): &versionOnlyHelmExec{isHelm3: true}, } } @@ -461,8 +461,6 @@ releases: chart: stable/prometheus `, "/path/to/helmfile.d/b.yaml": ` -helmDefaults: - tillerNamespace: zoo releases: - name: grafana chart: stable/grafana @@ -488,12 +486,12 @@ releases: duplicatedCtx: yes - name: bar chart: charts/foo - tillerNamespace: bar1 + namespace: bar1 labels: duplicatedOK: yes - name: bar chart: charts/foo - tillerNamespace: bar2 + namespace: bar2 labels: duplicatedOK: yes `, @@ -510,14 +508,11 @@ releases: {label: "name!=", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[0]: in /path/to/helmfile.d/a1.yaml: malformed label: name!=. Expected label in form k=v or k!=v"}, {label: "name", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[0]: in /path/to/helmfile.d/a1.yaml: malformed label: name. Expected label in form k=v or k!=v"}, // See https://github.com/roboll/helmfile/issues/193 - {label: "duplicatedNs=yes", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[2]: in /path/to/helmfile.d/b.yaml: duplicate release \"foo\" found in namespace \"zoo\" in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector"}, - {label: "duplicatedCtx=yes", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[2]: in /path/to/helmfile.d/b.yaml: duplicate release \"foo\" found in namespace \"zoo\" in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector"}, + {label: "duplicatedNs=yes", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[2]: in /path/to/helmfile.d/b.yaml: duplicate release \"foo\" found in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector"}, + {label: "duplicatedCtx=yes", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[2]: in /path/to/helmfile.d/b.yaml: duplicate release \"foo\" found in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector"}, {label: "duplicatedOK=yes", expectedCount: 2, expectErr: false}, } - - for i := range testcases { - testcase := testcases[i] - + for _, testcase := range testcases { t.Run(testcase.label, func(t *testing.T) { actual := []string{} @@ -594,12 +589,12 @@ releases: chart: stable/grafana - name: bar chart: charts/foo - tillerNamespace: bar1 + namespace: bar1 labels: duplicatedOK: yes - name: bar chart: charts/foo - tillerNamespace: bar2 + namespace: bar2 labels: duplicatedOK: yes `, @@ -812,46 +807,39 @@ helmfiles: - path: helmfile.d/c*.yaml values: - env.values.yaml - - tillerNs: INLINE_TILLER_NS_3 `, "/path/to/helmfile.d/a1.yaml": ` environments: default: values: - - tillerNs: INLINE_TILLER_NS - ns: INLINE_NS + - ns: INLINE_NS releases: - name: foo chart: stable/zipkin - tillerNamespace: {{ .Environment.Values.tillerNs }} namespace: {{ .Environment.Values.ns }} `, "/path/to/helmfile.d/b.yaml": ` environments: default: values: - - tillerNs: INLINE_TILLER_NS - ns: INLINE_NS + - ns: INLINE_NS releases: - name: bar chart: stable/grafana - tillerNamespace: {{ .Environment.Values.tillerNs }} namespace: {{ .Environment.Values.ns }} `, "/path/to/helmfile.d/c.yaml": ` environments: default: values: - - tillerNs: INLINE_TILLER_NS - ns: INLINE_NS + - ns: INLINE_NS releases: - name: baz chart: stable/envoy - tillerNamespace: {{ .Environment.Values.tillerNs }} namespace: {{ .Environment.Values.ns }} `, "/path/to/env.values.yaml": ` -tillerNs: INLINE_TILLER_NS_2 +ns: INLINE_NS `, } @@ -885,15 +873,14 @@ tillerNs: INLINE_TILLER_NS_2 } type release struct { - chart string - tillerNs string - ns string + chart string + ns string } expectedReleases := map[string]release{ - "foo": {"stable/zipkin", "INLINE_TILLER_NS_2", "INLINE_NS"}, - "bar": {"stable/grafana", "INLINE_TILLER_NS", "INLINE_NS"}, - "baz": {"stable/envoy", "INLINE_TILLER_NS_3", "INLINE_NS"}, + "foo": {"stable/zipkin", "INLINE_NS"}, + "bar": {"stable/grafana", "INLINE_NS"}, + "baz": {"stable/envoy", "INLINE_NS"}, } for name := range processed { @@ -908,10 +895,6 @@ tillerNs: INLINE_TILLER_NS_2 t.Errorf("unexpected chart: expected=%s, got=%s", expected.chart, actual.Chart) } - if expected.tillerNs != actual.TillerNamespace { - t.Errorf("unexpected tiller namespace: expected=%s, got=%s", expected.tillerNs, actual.TillerNamespace) - } - if expected.ns != actual.Namespace { t.Errorf("unexpected namespace: expected=%s, got=%s", expected.ns, actual.Namespace) } @@ -1288,95 +1271,6 @@ releases: } } -// See https://github.com/roboll/helmfile/issues/1213 -func TestVisitDesiredStatesWithReleases_DuplicateReleasesHelm2(t *testing.T) { - files := map[string]string{ - "/path/to/helmfile.yaml": ` -releases: -- name: foo - namespace: foo - chart: charts/foo -- name: foo - namespace: bar - chart: charts/foo -`, - } - - actual := []state.ReleaseSpec{} - - collectReleases := func(run *Run) (bool, []error) { - actual = append(actual, run.state.Releases...) - return false, []error{} - } - app := appWithFs(&App{ - OverrideHelmBinary: DefaultHelmBinary, - OverrideKubeContext: "default", - Logger: newAppTestLogger(), - Namespace: "", - Env: "default", - FileOrDir: "helmfile.yaml", - }, files) - - expectNoCallsToHelmVersion(app, false) - - err := app.ForEachState( - collectReleases, - false, - SetFilter(true), - ) - - expected := "in ./helmfile.yaml: duplicate release \"foo\" found in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector" - if err == nil { - t.Errorf("error expected but not happened") - } else if err.Error() != expected { - t.Errorf("unexpected error message: expected=\"%s\", actual=\"%s\"", expected, err.Error()) - } -} - -// See https://github.com/roboll/helmfile/issues/1213 -func TestVisitDesiredStatesWithReleases_NoDuplicateReleasesHelm2(t *testing.T) { - files := map[string]string{ - "/path/to/helmfile.yaml": ` -releases: -- name: foo - namespace: foo - tillerNamespace: tns1 - chart: charts/foo -- name: foo - namespace: bar - tillerNamespace: tns2 - chart: charts/foo -`, - } - - actual := []state.ReleaseSpec{} - - collectReleases := func(run *Run) (bool, []error) { - actual = append(actual, run.state.Releases...) - return false, []error{} - } - app := appWithFs(&App{ - OverrideHelmBinary: DefaultHelmBinary, - OverrideKubeContext: "default", - Logger: newAppTestLogger(), - Namespace: "", - Env: "default", - FileOrDir: "helmfile.yaml", - }, files) - - expectNoCallsToHelmVersion(app, false) - - err := app.ForEachState( - collectReleases, - false, - SetFilter(true), - ) - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } -} - // See https://github.com/roboll/helmfile/issues/1213 func TestVisitDesiredStatesWithReleases_NoDuplicateReleasesHelm3(t *testing.T) { files := map[string]string{ @@ -1406,7 +1300,7 @@ releases: FileOrDir: "helmfile.yaml", }, files) - expectNoCallsToHelmVersion(app, true) + expectNoCallsToHelmVersion(app) err := app.ForEachState( collectReleases, @@ -1448,7 +1342,7 @@ releases: FileOrDir: "helmfile.yaml", }, files) - expectNoCallsToHelmVersion(app, true) + expectNoCallsToHelmVersion(app) err := app.ForEachState( collectReleases, @@ -1494,7 +1388,7 @@ releases: FileOrDir: "helmfile.yaml", }, files) - expectNoCallsToHelmVersion(app, true) + expectNoCallsToHelmVersion(app) err := app.ForEachState( collectReleases, @@ -1580,7 +1474,6 @@ releases: - environments/default/2.yaml helmDefaults: - tillerNamespace: {{ .Environment.Values.tillerNs }} `, "/path/to/yaml/environments/default/2.yaml": `tillerNs: TILLER_NS`, "/path/to/yaml/templates.yaml": `templates: @@ -1605,10 +1498,6 @@ helmDefaults: t.Fatalf("unexpected error: %v", err) } - if st.HelmDefaults.TillerNamespace != "TILLER_NS" { - t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace) - } - if *st.Releases[1].MissingFileHandler != "Warn" { t.Errorf("unexpected releases[0].missingFileHandler: expected=Warn, got=%s", *st.Releases[1].MissingFileHandler) } @@ -1666,7 +1555,6 @@ releases: - environments/default/2.yaml helmDefaults: - tillerNamespace: {{ .Environment.Values.tillerNs }} `, "/path/to/yaml/environments/default/2.yaml": `tillerNs: TILLER_NS`, "/path/to/yaml/templates.yaml": `templates: @@ -1690,9 +1578,6 @@ helmDefaults: t.Errorf("unexpected error: %v", err) } - if st.HelmDefaults.TillerNamespace != "TILLER_NS" { - t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace) - } firstRelease := st.Releases[0] if firstRelease.Name != "myrelease1" { t.Errorf("unexpected releases[1].name: expected=myrelease1, got=%s", firstRelease.Name) @@ -1740,7 +1625,6 @@ releases: `, "/path/to/base.gotmpl": `helmDefaults: kubeContext: {{ .Environment.Values.foo }} - tillerNamespace: {{ .Environment.Values.tillerNs }} `, "/path/to/yaml/environments/default/1.yaml": `tillerNs: TILLER_NS foo: FOO @@ -1766,10 +1650,6 @@ foo: FOO t.Errorf("unexpected error: %v", err) } - if st.HelmDefaults.TillerNamespace != "TILLER_NS" { - t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace) - } - if st.Releases[0].Name != "myrelease0" { t.Errorf("unexpected releases[0].name: expected=myrelease0, got=%s", st.Releases[0].Name) } @@ -1803,7 +1683,6 @@ releases: `, "/path/to/base.gotmpl": `helmDefaults: kubeContext: {{ .Environment.Values.foo }} - tillerNamespace: {{ .Environment.Values.tillerNs }} `, "/path/to/yaml/environments/default/1.yaml": `tillerNs: TILLER_NS foo: FOO @@ -1829,10 +1708,6 @@ foo: FOO t.Errorf("unexpected error: %v", err) } - if st.HelmDefaults.TillerNamespace != "INLINE_TILLER_NS" { - t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace) - } - if st.Releases[0].Name != "myrelease0" { t.Errorf("unexpected releases[0].name: expected=myrelease0, got=%s", st.Releases[0].Name) } @@ -1886,7 +1761,6 @@ releases: - environments/default/2.yaml helmDefaults: - tillerNamespace: {{ .Environment.Values.tillerNs }} `, "/path/to/yaml/environments/default/2.yaml": `tillerNs: TILLER_NS`, "/path/to/yaml/templates.yaml": `templates: @@ -1910,10 +1784,6 @@ helmDefaults: t.Fatalf("unexpected error: %v", err) } - if st.HelmDefaults.TillerNamespace != "TILLER_NS" { - t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace) - } - firstRelease := st.Releases[0] if firstRelease.Name != "myrelease1" { t.Errorf("unexpected releases[1].name: expected=myrelease1, got=%s", firstRelease.Name) @@ -2614,7 +2484,7 @@ func (helm *mockHelmExec) Lint(name, chart string, flags ...string) error { return nil } func (helm *mockHelmExec) IsHelm3() bool { - return false + return true } func (helm *mockHelmExec) GetVersion() helmexec.Version { @@ -2880,31 +2750,31 @@ releases: }, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 - {Filter: "^logging$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^logging$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default `, - {Filter: "^front-proxy$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^front-proxy$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default `, - {Filter: "^database$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^database$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default `, - {Filter: "^servicemesh$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^servicemesh$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default `, - {Filter: "^anotherbackend$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^anotherbackend$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default `, - {Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^frontend-v3$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v3$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, - {Filter: "^backend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, }, @@ -2945,8 +2815,8 @@ releases: {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: ``, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: ``, + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -3014,11 +2884,11 @@ releases: {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: ``, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: ``, + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, - {Filter: "^baz$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^baz$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE baz 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart3-3.1.0 3.1.0 default `, }, @@ -3058,11 +2928,11 @@ releases: {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: ``, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: ``, + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, - {Filter: "^baz$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^baz$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE baz 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart3-3.1.0 3.1.0 default `, }, @@ -3221,71 +3091,6 @@ releases: {Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}}, }, }, - { - name: "helm2 upgrade when tns1/foo needs tns2/bar", - loc: location(), - - files: map[string]string{ - "/path/to/helmfile.yaml": ` -releases: -- name: foo - chart: stable/mychart1 - namespace: ns1 - tillerNamespace: tns1 - needs: - - tns2/bar -- name: bar - chart: stable/mychart2 - namespace: ns2 - tillerNamespace: tns2 -`, - }, - diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - }, - upgraded: []exectest.Release{ - {Name: "bar", Flags: []string{"--tiller-namespace", "tns2", "--kube-context", "default", "--namespace", "ns2"}}, - {Name: "foo", Flags: []string{"--tiller-namespace", "tns1", "--kube-context", "default", "--namespace", "ns1"}}, - }, - }, - { - name: "helm2 upgrade when tns2/bar needs tns1/foo", - loc: location(), - files: map[string]string{ - "/path/to/helmfile.yaml": ` -releases: -- name: bar - chart: stable/mychart2 - namespace: ns2 - tillerNamespace: tns2 - needs: - - tns1/foo -- name: foo - chart: stable/mychart1 - namespace: ns1 - tillerNamespace: tns1 -`, - }, - diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - }, - upgraded: []exectest.Release{ - {Name: "foo", Flags: []string{"--tiller-namespace", "tns1", "--kube-context", "default", "--namespace", "ns1"}}, - {Name: "bar", Flags: []string{"--tiller-namespace", "tns2", "--kube-context", "default", "--namespace", "ns2"}}, - }, - lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: "--tiller-namespacetns1" + helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE -foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default -`, - {Filter: "^bar$", Flags: "--tiller-namespacetns2" + helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE -bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default -`, - }, - // as we check for log output, set concurrency to 1 to avoid non-deterministic test result - concurrency: 1, - }, // // deletes: deleting all releases in the correct order // @@ -3310,10 +3115,10 @@ releases: {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -3343,10 +3148,10 @@ releases: {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -3378,10 +3183,10 @@ releases: {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -3412,10 +3217,10 @@ releases: {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -3446,10 +3251,10 @@ releases: {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -3480,10 +3285,10 @@ releases: {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -3540,10 +3345,10 @@ releases: {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, }, lists: map[exectest.ListKey]string{ - {Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, - {Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, @@ -3972,8 +3777,7 @@ changing working directory back to "/path/to" }, } - for i := range testcases { - tc := testcases[i] + for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { wantUpgrades := tc.upgraded wantDeletes := tc.deleted @@ -3986,6 +3790,7 @@ changing working directory back to "/path/to" DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { @@ -4142,13 +3947,13 @@ changing working directory back to "/path/to" }, } - for i := range testcases { - tc := testcases[i] + for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { var helm = &exectest.Helm{ DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { diff --git a/pkg/app/context.go b/pkg/app/context.go index c7ab1213..e211dd0b 100644 --- a/pkg/app/context.go +++ b/pkg/app/context.go @@ -5,28 +5,17 @@ import ( ) type Context struct { - updatedRepos map[string]bool - updatedReposV2 map[string]bool + updatedRepos map[string]bool } func NewContext() Context { return Context{ - updatedRepos: map[string]bool{}, - updatedReposV2: map[string]bool{}, + updatedRepos: map[string]bool{}, } } func (ctx Context) SyncReposOnce(st *state.HelmState, helm state.RepoUpdater) error { - var ( - updated []string - err error - ) - - if helm.IsHelm3() { - updated, err = st.SyncRepos(helm, ctx.updatedRepos) - } else { - updated, err = st.SyncRepos(helm, ctx.updatedReposV2) - } + updated, err := st.SyncRepos(helm, ctx.updatedRepos) for _, r := range updated { ctx.updatedRepos[r] = true diff --git a/pkg/app/destroy_nokubectx_test.go b/pkg/app/destroy_nokubectx_test.go index 8e1fb2e0..12e8fb21 100644 --- a/pkg/app/destroy_nokubectx_test.go +++ b/pkg/app/destroy_nokubectx_test.go @@ -15,7 +15,6 @@ import ( func TestDestroy_2(t *testing.T) { type testcase struct { - helm3 bool ns string concurrency int error string @@ -35,7 +34,7 @@ func TestDestroy_2(t *testing.T) { wantDeletes := tc.deleted var helm = &exectest.Helm{ - Helm3: tc.helm3, + Helm3: true, FailOnUnexpectedList: true, FailOnUnexpectedDiff: true, Lists: tc.lists, @@ -209,32 +208,32 @@ releases: files: files, diffs: map[exectest.DiffKey]error{}, lists: map[exectest.ListKey]string{ - {Filter: "^frontend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^frontend-v2$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v2$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^frontend-v3$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v3$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^backend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^backend-v2$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v2$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, - {Filter: "^logging$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^logging$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default `, - {Filter: "^front-proxy$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^front-proxy$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default `, - {Filter: "^servicemesh$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^servicemesh$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default `, - {Filter: "^database$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^database$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default `, - {Filter: "^anotherbackend$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^anotherbackend$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default `, }, @@ -426,32 +425,32 @@ changing working directory back to "/path/to" selectors: []string{"name=logging"}, diffs: map[exectest.DiffKey]error{}, lists: map[exectest.ListKey]string{ - {Filter: "^frontend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^frontend-v2$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v2$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^frontend-v3$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v3$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^backend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^backend-v2$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v2$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, - {Filter: "^logging$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^logging$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default `, - {Filter: "^front-proxy$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^front-proxy$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default `, - {Filter: "^servicemesh$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^servicemesh$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default `, - {Filter: "^database$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^database$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default `, - {Filter: "^anotherbackend$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^anotherbackend$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default `, }, @@ -607,9 +606,9 @@ changing working directory back to "/path/to" files: filesForTwoReleases, diffs: map[exectest.DiffKey]error{}, lists: map[exectest.ListKey]string{ - {Filter: "^frontend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^backend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, }, // Disable concurrency to avoid in-deterministic result @@ -675,7 +674,6 @@ changing working directory back to "/path/to" t.Run("helm3", func(t *testing.T) { check(t, testcase{ - helm3: true, files: filesForTwoReleases, diffs: map[exectest.DiffKey]error{}, lists: map[exectest.ListKey]string{ diff --git a/pkg/app/destroy_test.go b/pkg/app/destroy_test.go index da5faa78..13e290c4 100644 --- a/pkg/app/destroy_test.go +++ b/pkg/app/destroy_test.go @@ -1,6 +1,7 @@ package app import ( + "strings" "sync" "testing" @@ -14,12 +15,23 @@ import ( ) const ( - helmV2ListFlags = "--kube-contextdefault--deleting--deployed--failed--pending" - helmV2ListFlagsWithoutKubeContext = "--deleting--deployed--failed--pending" helmV3ListFlags = "--kube-contextdefault--uninstalling--deployed--failed--pending" helmV3ListFlagsWithoutKubeContext = "--uninstalling--deployed--failed--pending" ) +func listFlags(namespace, kubeContext string) string { + var flags []string + if kubeContext != "" { + flags = append(flags, "--kube-context", kubeContext) + } + if namespace != "" { + flags = append(flags, "--namespace", namespace) + } + flags = append(flags, "--uninstalling--deployed--failed--pending") + + return strings.Join(flags, "") +} + type destroyConfig struct { args string concurrency int @@ -55,7 +67,6 @@ func (d destroyConfig) IncludeTransitiveNeeds() bool { func TestDestroy(t *testing.T) { type testcase struct { - helm3 bool ns string concurrency int error string @@ -75,7 +86,7 @@ func TestDestroy(t *testing.T) { wantDeletes := tc.deleted var helm = &exectest.Helm{ - Helm3: tc.helm3, + Helm3: true, FailOnUnexpectedList: true, FailOnUnexpectedDiff: true, Lists: tc.lists, @@ -248,32 +259,32 @@ releases: files: files, diffs: map[exectest.DiffKey]error{}, lists: map[exectest.ListKey]string{ - {Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^frontend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^frontend-v3$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v3$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^backend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, - {Filter: "^logging$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^logging$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default `, - {Filter: "^front-proxy$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^front-proxy$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default `, - {Filter: "^servicemesh$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^servicemesh$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default `, - {Filter: "^database$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^database$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default `, - {Filter: "^anotherbackend$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^anotherbackend$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default `, }, @@ -465,32 +476,32 @@ changing working directory back to "/path/to" selectors: []string{"name=logging"}, diffs: map[exectest.DiffKey]error{}, lists: map[exectest.ListKey]string{ - {Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^frontend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^frontend-v3$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v3$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default `, - {Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^backend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, - {Filter: "^logging$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^logging$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default `, - {Filter: "^front-proxy$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^front-proxy$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default `, - {Filter: "^servicemesh$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^servicemesh$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default `, - {Filter: "^database$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^database$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default `, - {Filter: "^anotherbackend$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^anotherbackend$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default `, }, @@ -646,9 +657,9 @@ changing working directory back to "/path/to" files: filesForTwoReleases, diffs: map[exectest.DiffKey]error{}, lists: map[exectest.ListKey]string{ - {Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, }, // Disable concurrency to avoid in-deterministic result @@ -714,13 +725,12 @@ changing working directory back to "/path/to" t.Run("helm3", func(t *testing.T) { check(t, testcase{ - helm3: true, files: filesForTwoReleases, diffs: map[exectest.DiffKey]error{}, lists: map[exectest.ListKey]string{ - {Filter: "^frontend-v1$", Flags: helmV3ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, - {Filter: "^backend-v1$", Flags: helmV3ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE `, }, // Disable concurrency to avoid in-deterministic result diff --git a/pkg/app/diff_nokubectx_test.go b/pkg/app/diff_nokubectx_test.go index 41534864..e2ffd347 100644 --- a/pkg/app/diff_nokubectx_test.go +++ b/pkg/app/diff_nokubectx_test.go @@ -116,10 +116,10 @@ releases: }, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 - {Filter: "^frontend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, - {Filter: "^backend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, }, @@ -152,8 +152,8 @@ releases: {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: nil, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: ``, - {Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: ``, + {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -332,61 +332,6 @@ releases: }, upgraded: []exectest.Release{}, }, - { - name: "helm2 upgrade when tns1 foo needs tns2 bar", - loc: location(), - - files: map[string]string{ - "/path/to/helmfile.yaml": ` -releases: -- name: foo - chart: mychart1 - namespace: ns1 - tillerNamespace: tns1 - needs: - - tns2/bar -- name: bar - chart: mychart2 - namespace: ns2 - tillerNamespace: tns2 -`, - }, - detailedExitcode: true, - error: "Identified at least one change", - diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - }, - upgraded: []exectest.Release{}, - }, - { - name: "helm2 upgrade when tns2 bar needs tns1 foo", - loc: location(), - files: map[string]string{ - "/path/to/helmfile.yaml": ` -releases: -- name: bar - chart: mychart2 - namespace: ns2 - tillerNamespace: tns2 - needs: - - tns1/foo -- name: foo - chart: mychart1 - namespace: ns1 - tillerNamespace: tns1 -`, - }, - detailedExitcode: true, - error: "Identified at least one change", - diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - }, - upgraded: []exectest.Release{}, - // as we check for log output, set concurrency to 1 to avoid non-deterministic test result - concurrency: 1, - }, { name: "helm3 upgrade when ns2 bar needs ns1 foo", loc: location(), @@ -439,10 +384,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -471,10 +416,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -505,10 +450,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -537,10 +482,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -572,10 +517,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -607,10 +552,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -639,10 +584,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -671,10 +616,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -1008,8 +953,7 @@ changing working directory back to "/path/to" }, } - for i := range testcases { - tc := testcases[i] + for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { wantUpgrades := tc.upgraded wantDeletes := tc.deleted @@ -1022,6 +966,7 @@ changing working directory back to "/path/to" DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { diff --git a/pkg/app/diff_test.go b/pkg/app/diff_test.go index f2649129..41ce7503 100644 --- a/pkg/app/diff_test.go +++ b/pkg/app/diff_test.go @@ -251,10 +251,10 @@ releases: }, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 - {Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE frontend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, - {Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default `, }, @@ -287,8 +287,8 @@ releases: {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: ``, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: ``, + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -505,51 +505,21 @@ releases: - name: foo chart: mychart1 namespace: ns1 - tillerNamespace: tns1 needs: - - tns2/bar + - ns2/bar - name: bar chart: mychart2 namespace: ns2 - tillerNamespace: tns2 `, }, detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, - { - name: "helm2 upgrade when tns2 bar needs tns1 foo", - loc: location(), - files: map[string]string{ - "/path/to/helmfile.yaml": ` -releases: -- name: bar - chart: mychart2 - namespace: ns2 - tillerNamespace: tns2 - needs: - - tns1/foo -- name: foo - chart: mychart1 - namespace: ns1 - tillerNamespace: tns1 -`, - }, - detailedExitcode: true, - error: "Identified at least one change", - diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, - }, - upgraded: []exectest.Release{}, - // as we check for log output, set concurrency to 1 to avoid non-deterministic test result - concurrency: 1, - }, { name: "helm3 upgrade when ns2 bar needs ns1 foo", loc: location(), @@ -602,10 +572,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -634,10 +604,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -668,10 +638,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -700,10 +670,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -735,10 +705,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -770,10 +740,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -802,10 +772,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -837,10 +807,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -872,10 +842,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -904,10 +874,10 @@ releases: {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ - {Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default `, - {Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE + {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default `, }, @@ -1305,8 +1275,7 @@ changing working directory back to "/path/to" }, } - for i := range testcases { - tc := testcases[i] + for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { wantUpgrades := tc.upgraded wantDeletes := tc.deleted @@ -1319,6 +1288,7 @@ changing working directory back to "/path/to" DiffMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{}, + Helm3: true, } bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { diff --git a/pkg/app/run.go b/pkg/app/run.go index af44ac7b..61ac86f6 100644 --- a/pkg/app/run.go +++ b/pkg/app/run.go @@ -26,6 +26,10 @@ func NewRun(st *state.HelmState, helm helmexec.Interface, ctx Context) *Run { panic("Assertion failed: helmexec.Interface must not be nil") } + if !helm.IsHelm3() { + panic("helmfile has deprecated helm2 since v1.0") + } + return &Run{state: st, helm: helm, ctx: ctx} } diff --git a/pkg/app/testdata/app_diff_test_1/helm2_upgrade_when_tns2_bar_needs_tns1_foo b/pkg/app/testdata/app_diff_test_1/helm2_upgrade_when_tns2_bar_needs_tns1_foo deleted file mode 100644 index 2f789ce1..00000000 --- a/pkg/app/testdata/app_diff_test_1/helm2_upgrade_when_tns2_bar_needs_tns1_foo +++ /dev/null @@ -1,54 +0,0 @@ -processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: tillerNamespace: tns2 - 6: needs: - 7: - tns1/foo - 8: - name: foo - 9: chart: mychart1 -10: namespace: ns1 -11: tillerNamespace: tns1 -12: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: tillerNamespace: tns2 - 6: needs: - 7: - tns1/foo - 8: - name: foo - 9: chart: mychart1 -10: namespace: ns1 -11: tillerNamespace: tns1 -12: - -merged environment: &{default map[] map[]} -2 release(s) found in helmfile.yaml - -processing 2 groups of releases in this order: -GROUP RELEASES -1 default/tns1/foo -2 default/tns2/bar - -processing releases in group 1/2: default/tns1/foo -processing releases in group 2/2: default/tns2/bar -Affected releases are: - bar (mychart2) UPDATED - foo (mychart1) UPDATED - -changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar b/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar index 73716b24..98ca211b 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar @@ -8,14 +8,12 @@ first-pass rendering output of "helmfile.yaml.part.0": 2: - name: foo 3: chart: mychart1 4: namespace: ns1 - 5: tillerNamespace: tns1 - 6: needs: - 7: - tns2/bar - 8: - name: bar - 9: chart: mychart2 -10: namespace: ns2 -11: tillerNamespace: tns2 -12: + 5: needs: + 6: - ns2/bar + 7: - name: bar + 8: chart: mychart2 + 9: namespace: ns2 +10: first-pass produced: &{default map[] map[]} first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} @@ -28,25 +26,23 @@ second-pass rendering result of "helmfile.yaml.part.0": 2: - name: foo 3: chart: mychart1 4: namespace: ns1 - 5: tillerNamespace: tns1 - 6: needs: - 7: - tns2/bar - 8: - name: bar - 9: chart: mychart2 -10: namespace: ns2 -11: tillerNamespace: tns2 -12: + 5: needs: + 6: - ns2/bar + 7: - name: bar + 8: chart: mychart2 + 9: namespace: ns2 +10: merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: GROUP RELEASES -1 default/tns2/bar -2 default/tns1/foo +1 default/ns2/bar +2 default/ns1/foo -processing releases in group 1/2: default/tns2/bar -processing releases in group 2/2: default/tns1/foo +processing releases in group 1/2: default/ns2/bar +processing releases in group 2/2: default/ns1/foo Affected releases are: bar (mychart2) UPDATED foo (mychart1) UPDATED diff --git a/pkg/app/testdata/app_diff_test_2/helm2_upgrade_when_tns1_foo_needs_tns2_bar b/pkg/app/testdata/app_diff_test_2/helm2_upgrade_when_tns1_foo_needs_tns2_bar deleted file mode 100644 index aafaca09..00000000 --- a/pkg/app/testdata/app_diff_test_2/helm2_upgrade_when_tns1_foo_needs_tns2_bar +++ /dev/null @@ -1,54 +0,0 @@ -processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: namespace: ns1 - 5: tillerNamespace: tns1 - 6: needs: - 7: - tns2/bar - 8: - name: bar - 9: chart: mychart2 -10: namespace: ns2 -11: tillerNamespace: tns2 -12: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: namespace: ns1 - 5: tillerNamespace: tns1 - 6: needs: - 7: - tns2/bar - 8: - name: bar - 9: chart: mychart2 -10: namespace: ns2 -11: tillerNamespace: tns2 -12: - -merged environment: &{default map[] map[]} -2 release(s) found in helmfile.yaml - -processing 2 groups of releases in this order: -GROUP RELEASES -1 tns2/bar -2 tns1/foo - -processing releases in group 1/2: tns2/bar -processing releases in group 2/2: tns1/foo -Affected releases are: - bar (mychart2) UPDATED - foo (mychart1) UPDATED - -changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_2/helm2_upgrade_when_tns2_bar_needs_tns1_foo b/pkg/app/testdata/app_diff_test_2/helm2_upgrade_when_tns2_bar_needs_tns1_foo deleted file mode 100644 index 11dbaffb..00000000 --- a/pkg/app/testdata/app_diff_test_2/helm2_upgrade_when_tns2_bar_needs_tns1_foo +++ /dev/null @@ -1,54 +0,0 @@ -processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: tillerNamespace: tns2 - 6: needs: - 7: - tns1/foo - 8: - name: foo - 9: chart: mychart1 -10: namespace: ns1 -11: tillerNamespace: tns1 -12: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: tillerNamespace: tns2 - 6: needs: - 7: - tns1/foo - 8: - name: foo - 9: chart: mychart1 -10: namespace: ns1 -11: tillerNamespace: tns1 -12: - -merged environment: &{default map[] map[]} -2 release(s) found in helmfile.yaml - -processing 2 groups of releases in this order: -GROUP RELEASES -1 tns1/foo -2 tns2/bar - -processing releases in group 1/2: tns1/foo -processing releases in group 2/2: tns2/bar -Affected releases are: - bar (mychart2) UPDATED - foo (mychart1) UPDATED - -changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/helm2_upgrade_when_tns1/foo_needs_tns2/bar/log b/pkg/app/testdata/testapply/helm2_upgrade_when_tns1/foo_needs_tns2/bar/log deleted file mode 100644 index e954f517..00000000 --- a/pkg/app/testdata/testapply/helm2_upgrade_when_tns1/foo_needs_tns2/bar/log +++ /dev/null @@ -1,69 +0,0 @@ -processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: namespace: ns1 - 5: tillerNamespace: tns1 - 6: needs: - 7: - tns2/bar - 8: - name: bar - 9: chart: stable/mychart2 -10: namespace: ns2 -11: tillerNamespace: tns2 -12: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: namespace: ns1 - 5: tillerNamespace: tns1 - 6: needs: - 7: - tns2/bar - 8: - name: bar - 9: chart: stable/mychart2 -10: namespace: ns2 -11: tillerNamespace: tns2 -12: - -merged environment: &{default map[] map[]} -2 release(s) found in helmfile.yaml - -Affected releases are: - bar (stable/mychart2) UPDATED - foo (stable/mychart1) UPDATED - -invoking preapply hooks for 2 groups of releases in this order: -GROUP RELEASES -1 default/tns1/foo -2 default/tns2/bar - -invoking preapply hooks for releases in group 1/2: default/tns1/foo -invoking preapply hooks for releases in group 2/2: default/tns2/bar -processing 2 groups of releases in this order: -GROUP RELEASES -1 default/tns2/bar -2 default/tns1/foo - -processing releases in group 1/2: default/tns2/bar -getting deployed release version failed: Failed to get the version for: mychart2 -processing releases in group 2/2: default/tns1/foo -getting deployed release version failed: Failed to get the version for: mychart1 - -UPDATED RELEASES: -NAME CHART VERSION -bar stable/mychart2 -foo stable/mychart1 - -changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/helm2_upgrade_when_tns2/bar_needs_tns1/foo/log b/pkg/app/testdata/testapply/helm2_upgrade_when_tns2/bar_needs_tns1/foo/log deleted file mode 100644 index 8009ba64..00000000 --- a/pkg/app/testdata/testapply/helm2_upgrade_when_tns2/bar_needs_tns1/foo/log +++ /dev/null @@ -1,67 +0,0 @@ -processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: namespace: ns2 - 5: tillerNamespace: tns2 - 6: needs: - 7: - tns1/foo - 8: - name: foo - 9: chart: stable/mychart1 -10: namespace: ns1 -11: tillerNamespace: tns1 -12: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: namespace: ns2 - 5: tillerNamespace: tns2 - 6: needs: - 7: - tns1/foo - 8: - name: foo - 9: chart: stable/mychart1 -10: namespace: ns1 -11: tillerNamespace: tns1 -12: - -merged environment: &{default map[] map[]} -2 release(s) found in helmfile.yaml - -Affected releases are: - bar (stable/mychart2) UPDATED - foo (stable/mychart1) UPDATED - -invoking preapply hooks for 2 groups of releases in this order: -GROUP RELEASES -1 default/tns2/bar -2 default/tns1/foo - -invoking preapply hooks for releases in group 1/2: default/tns2/bar -invoking preapply hooks for releases in group 2/2: default/tns1/foo -processing 2 groups of releases in this order: -GROUP RELEASES -1 default/tns1/foo -2 default/tns2/bar - -processing releases in group 1/2: default/tns1/foo -processing releases in group 2/2: default/tns2/bar - -UPDATED RELEASES: -NAME CHART VERSION -foo stable/mychart1 3.1.0 -bar stable/mychart2 3.1.0 - -changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/install/log b/pkg/app/testdata/testapply/install/log index 431bbf69..19086fc2 100644 --- a/pkg/app/testdata/testapply/install/log +++ b/pkg/app/testdata/testapply/install/log @@ -54,10 +54,10 @@ GROUP RELEASES 2 default//foo processing releases in group 1/2: default//baz, default//bar -getting deployed release version failed: unexpected list key: listkey(filter=^baz$,flags=--kube-contextdefault--deleting--deployed--failed--pending) not found in -getting deployed release version failed: unexpected list key: listkey(filter=^bar$,flags=--kube-contextdefault--deleting--deployed--failed--pending) not found in +getting deployed release version failed: unexpected list key: listkey(filter=^baz$,flags=--kube-contextdefault--uninstalling--deployed--failed--pending) not found in +getting deployed release version failed: unexpected list key: listkey(filter=^bar$,flags=--kube-contextdefault--uninstalling--deployed--failed--pending) not found in processing releases in group 2/2: default//foo -getting deployed release version failed: unexpected list key: listkey(filter=^foo$,flags=--kube-contextdefault--deleting--deployed--failed--pending) not found in +getting deployed release version failed: unexpected list key: listkey(filter=^foo$,flags=--kube-contextdefault--uninstalling--deployed--failed--pending) not found in UPDATED RELEASES: NAME CHART VERSION diff --git a/pkg/argparser/args_test.go b/pkg/argparser/args_test.go index ed7b7482..8ebfdcb5 100644 --- a/pkg/argparser/args_test.go +++ b/pkg/argparser/args_test.go @@ -27,17 +27,17 @@ func TestGetArgs(t *testing.T) { expected: "-e a.yaml -d b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false -q www -w", }, { - args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false --tiller-namespace ns", - expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false --tiller-namespace ns", + args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false", + expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false", }, { - args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --tiller-namespace ns", + args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true", defaultArgs: []string{"--recreate-pods", "--force"}, - expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --tiller-namespace ns --recreate-pods --force", + expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --recreate-pods --force", }, } for _, test := range tests { - Helmdefaults := state.HelmSpec{KubeContext: "test", TillerNamespace: "test-namespace", Args: test.defaultArgs} + Helmdefaults := state.HelmSpec{KubeContext: "test", Args: test.defaultArgs} testState := &state.HelmState{ ReleaseSetSpec: state.ReleaseSetSpec{ HelmDefaults: Helmdefaults, diff --git a/pkg/helmexec/context.go b/pkg/helmexec/context.go index c0e2f44e..55df302b 100644 --- a/pkg/helmexec/context.go +++ b/pkg/helmexec/context.go @@ -2,43 +2,10 @@ package helmexec import ( "io" - "os" - "path/filepath" ) type HelmContext struct { - Tillerless bool - TillerNamespace string - HistoryMax int - WorkerIndex int - Writer io.Writer -} - -func (context *HelmContext) GetTillerlessArgs(helm *execer) []string { - if context.Tillerless && !helm.IsHelm3() { - if context.TillerNamespace != "" { - return []string{"tiller", "run", context.TillerNamespace, "--", helm.helmBinary} - } - return []string{"tiller", "run", "--", helm.helmBinary} - } - return []string{} -} - -func (context *HelmContext) getTillerlessEnv() map[string]string { - if context.Tillerless { - result := map[string]string{ - "HELM_TILLER_SILENT": "true", - // Changing the TILLER port doesn't really work: https://github.com/helm/helm/issues/3159 - // So this is not used for the moment. - // "HELM_TILLER_PORT": strconv.Itoa(44134 + context.WorkerIndex), - } - if config := os.Getenv("KUBECONFIG"); config != "" { - absConfig, err := filepath.Abs(config) - if err == nil { - result["KUBECONFIG"] = absConfig - } - } - return result - } - return map[string]string{} + HistoryMax int + WorkerIndex int + Writer io.Writer } diff --git a/pkg/helmexec/context_test.go b/pkg/helmexec/context_test.go deleted file mode 100644 index 80b2cf9f..00000000 --- a/pkg/helmexec/context_test.go +++ /dev/null @@ -1,100 +0,0 @@ -package helmexec - -import ( - "os" - "path/filepath" - "testing" - - "github.com/Masterminds/semver/v3" - "github.com/stretchr/testify/require" -) - -// TestGetTillerlessArgs tests the GetTillerlessArgs function -func TestGetTillerlessArgs(t *testing.T) { - helmBinary := "helm" - - tests := []struct { - tillerless bool - helmMajorVersion string - tillerNamespace string - expected []string - }{ - { - tillerless: true, - helmMajorVersion: "2.0.0", - expected: []string{"tiller", "run", "--", helmBinary}, - }, - { - tillerless: true, - helmMajorVersion: "2.0.0", - tillerNamespace: "test-namespace", - expected: []string{"tiller", "run", "test-namespace", "--", helmBinary}, - }, - { - tillerless: false, - helmMajorVersion: "2.0.0", - expected: []string{}, - }, - { - tillerless: true, - helmMajorVersion: "3.0.0", - expected: []string{}, - }, - } - for _, test := range tests { - hc := &HelmContext{ - Tillerless: test.tillerless, - TillerNamespace: test.tillerNamespace, - } - sr, _ := semver.NewVersion(test.helmMajorVersion) - he := &execer{ - helmBinary: helmBinary, - version: *sr, - } - require.Equalf(t, test.expected, hc.GetTillerlessArgs(he), "expected result %s, received result %s", test.expected, hc.GetTillerlessArgs(he)) - } -} - -func pwd() string { - pwd, _ := os.Getwd() - return pwd -} - -// TestGetTillerlessEnv tests the getTillerlessEnv function -func TestGetTillerlessEnv(t *testing.T) { - kubeconfigEnv := "KUBECONFIG" - - tests := []struct { - tillerless bool - kubeconfig string - expected map[string]string - }{ - { - tillerless: true, - kubeconfig: "", - expected: map[string]string{"HELM_TILLER_SILENT": "true"}, - }, - { - tillerless: true, - kubeconfig: "abc", - expected: map[string]string{"HELM_TILLER_SILENT": "true", kubeconfigEnv: filepath.Join(pwd(), "abc")}, - }, - { - tillerless: true, - kubeconfig: "/path/to/kubeconfig", - expected: map[string]string{"HELM_TILLER_SILENT": "true", kubeconfigEnv: "/path/to/kubeconfig"}, - }, - { - tillerless: false, - expected: map[string]string{}, - }, - } - for _, test := range tests { - hc := &HelmContext{ - Tillerless: test.tillerless, - } - t.Setenv(kubeconfigEnv, test.kubeconfig) - result := hc.getTillerlessEnv() - require.Equalf(t, test.expected, result, "expected result %s, received result %s", test.expected, result) - } -} diff --git a/pkg/helmexec/exec.go b/pkg/helmexec/exec.go index 328ef392..a5095ad6 100644 --- a/pkg/helmexec/exec.go +++ b/pkg/helmexec/exec.go @@ -248,14 +248,10 @@ func (helm *execer) UpdateDeps(chart string) error { func (helm *execer) SyncRelease(context HelmContext, name, chart string, flags ...string) error { helm.logger.Infof("Upgrading release=%v, chart=%v", name, redactedURL(chart)) - preArgs := context.GetTillerlessArgs(helm) - env := context.getTillerlessEnv() + preArgs := make([]string, 0) + env := make(map[string]string) - if helm.IsHelm3() { - flags = append(flags, "--history-max", strconv.Itoa(context.HistoryMax)) - } else { - env["HELM_TILLER_HISTORY_MAX"] = strconv.Itoa(context.HistoryMax) - } + flags = append(flags, "--history-max", strconv.Itoa(context.HistoryMax)) out, err := helm.exec(append(append(preArgs, "upgrade", "--install", name, chart), flags...), env, nil) helm.write(nil, out) @@ -264,8 +260,8 @@ func (helm *execer) SyncRelease(context HelmContext, name, chart string, flags . func (helm *execer) ReleaseStatus(context HelmContext, name string, flags ...string) error { helm.logger.Infof("Getting status %v", name) - preArgs := context.GetTillerlessArgs(helm) - env := context.getTillerlessEnv() + preArgs := make([]string, 0) + env := make(map[string]string) out, err := helm.exec(append(append(preArgs, "status", name), flags...), env, nil) helm.write(nil, out) return err @@ -273,14 +269,9 @@ func (helm *execer) ReleaseStatus(context HelmContext, name string, flags ...str func (helm *execer) List(context HelmContext, filter string, flags ...string) (string, error) { helm.logger.Infof("Listing releases matching %v", filter) - preArgs := context.GetTillerlessArgs(helm) - env := context.getTillerlessEnv() - var args []string - if helm.IsHelm3() { - args = []string{"list", "--filter", filter} - } else { - args = []string{"list", filter} - } + preArgs := make([]string, 0) + env := make(map[string]string) + args := []string{"list", "--filter", filter} enableLiveOutput := false out, err := helm.exec(append(append(preArgs, args...), flags...), env, &enableLiveOutput) @@ -290,11 +281,9 @@ func (helm *execer) List(context HelmContext, filter string, flags ...string) (s // of the release to exist. // // This fixes it by removing the header from the v3 output, so that the output is formatted the same as that of v2. - if helm.IsHelm3() { - lines := strings.Split(string(out), "\n") - lines = lines[1:] - out = []byte(strings.Join(lines, "\n")) - } + lines := strings.Split(string(out), "\n") + lines = lines[1:] + out = []byte(strings.Join(lines, "\n")) helm.write(nil, out) return string(out), err } @@ -320,8 +309,8 @@ func (helm *execer) DecryptSecret(context HelmContext, name string, flags ...str helm.decryptedSecretMutex.Unlock() helm.logger.Infof("Decrypting secret %v", absPath) - preArgs := context.GetTillerlessArgs(helm) - env := context.getTillerlessEnv() + preArgs := make([]string, 0) + env := make(map[string]string) settings := cli.New() pluginVersion, err := GetPluginVersion("secrets", settings.PluginsDirectory) if err != nil { @@ -389,12 +378,7 @@ func (helm *execer) DecryptSecret(context HelmContext, name string, flags ...str func (helm *execer) TemplateRelease(name string, chart string, flags ...string) error { helm.logger.Infof("Templating release=%v, chart=%v", name, redactedURL(chart)) - var args []string - if helm.IsHelm3() { - args = []string{"template", name, chart} - } else { - args = []string{"template", chart, "--name", name} - } + args := []string{"template", name, chart} out, err := helm.exec(append(args, flags...), map[string]string{}, nil) @@ -431,8 +415,8 @@ func (helm *execer) DiffRelease(context HelmContext, name, chart string, suppres } else { helm.logger.Infof("Comparing release=%v, chart=%v", name, redactedURL(chart)) } - preArgs := context.GetTillerlessArgs(helm) - env := context.getTillerlessEnv() + preArgs := make([]string, 0) + env := make(map[string]string) var overrideEnableLiveOutput *bool = nil if suppressDiff { enableLiveOutput := false @@ -511,8 +495,8 @@ func (helm *execer) ChartExport(chart string, path string, flags ...string) erro func (helm *execer) DeleteRelease(context HelmContext, name string, flags ...string) error { helm.logger.Infof("Deleting %v", name) - preArgs := context.GetTillerlessArgs(helm) - env := context.getTillerlessEnv() + preArgs := make([]string, 0) + env := make(map[string]string) out, err := helm.exec(append(append(preArgs, "delete", name), flags...), env, nil) helm.write(nil, out) return err @@ -520,8 +504,8 @@ func (helm *execer) DeleteRelease(context HelmContext, name string, flags ...str func (helm *execer) TestRelease(context HelmContext, name string, flags ...string) error { helm.logger.Infof("Testing %v", name) - preArgs := context.GetTillerlessArgs(helm) - env := context.getTillerlessEnv() + preArgs := make([]string, 0) + env := make(map[string]string) args := []string{"test", name} out, err := helm.exec(append(append(preArgs, args...), flags...), env, nil) helm.write(nil, out) @@ -634,10 +618,6 @@ func resolveOciChart(ociChart string) (ociChartURL, ociChartTag string) { } func (helm *execer) ShowChart(chartPath string) (chart.Metadata, error) { - if !helm.IsHelm3() { - // show chart command isn't supported in helm2 - return chart.Metadata{}, fmt.Errorf("helm show isn't supported in helm2") - } var helmArgs = []string{"show", "chart", chartPath} out, error := helm.exec(helmArgs, map[string]string{}, nil) if error != nil { diff --git a/pkg/helmexec/exec_test.go b/pkg/helmexec/exec_test.go index d1e88df6..4a2ce848 100644 --- a/pkg/helmexec/exec_test.go +++ b/pkg/helmexec/exec_test.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "os" - "path" "path/filepath" "reflect" "regexp" @@ -277,7 +276,7 @@ func Test_SyncRelease(t *testing.T) { helm := MockExecer(logger, "dev") err := helm.SyncRelease(HelmContext{}, "release", "chart", "--timeout 10", "--wait", "--wait-for-jobs") expected := `Upgrading release=release, chart=chart -exec: helm --kube-context dev upgrade --install release chart --timeout 10 --wait --wait-for-jobs +exec: helm --kube-context dev upgrade --install release chart --timeout 10 --wait --wait-for-jobs --history-max 0 ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -289,7 +288,7 @@ exec: helm --kube-context dev upgrade --install release chart --timeout 10 --wai buffer.Reset() err = helm.SyncRelease(HelmContext{}, "release", "chart") expected = `Upgrading release=release, chart=chart -exec: helm --kube-context dev upgrade --install release chart +exec: helm --kube-context dev upgrade --install release chart --history-max 0 ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -301,24 +300,7 @@ exec: helm --kube-context dev upgrade --install release chart buffer.Reset() err = helm.SyncRelease(HelmContext{}, "release", "https://example_user:example_password@repo.example.com/chart.tgz") expected = `Upgrading release=release, chart=https://example_user:xxxxx@repo.example.com/chart.tgz -exec: helm --kube-context dev upgrade --install release https://example_user:example_password@repo.example.com/chart.tgz -` - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if buffer.String() != expected { - t.Errorf("helmexec.SyncRelease()\nactual = %v\nexpect = %v", buffer.String(), expected) - } -} - -func Test_SyncReleaseTillerless(t *testing.T) { - var buffer bytes.Buffer - logger := NewLogger(&buffer, "debug") - helm := MockExecer(logger, "dev") - err := helm.SyncRelease(HelmContext{Tillerless: true, TillerNamespace: "foo"}, "release", "chart", - "--timeout 10", "--wait", "--wait-for-jobs") - expected := `Upgrading release=release, chart=chart -exec: helm --kube-context dev tiller run foo -- helm upgrade --install release chart --timeout 10 --wait --wait-for-jobs +exec: helm --kube-context dev upgrade --install release https://example_user:example_password@repo.example.com/chart.tgz --history-max 0 ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -548,22 +530,6 @@ exec: helm --kube-context dev diff upgrade --allow-unreleased release https://ex } } -func Test_DiffReleaseTillerless(t *testing.T) { - var buffer bytes.Buffer - logger := NewLogger(&buffer, "debug") - helm := MockExecer(logger, "dev") - err := helm.DiffRelease(HelmContext{Tillerless: true}, "release", "chart", false, "--timeout 10", "--wait", "--wait-for-jobs") - expected := `Comparing release=release, chart=chart -exec: helm --kube-context dev tiller run -- helm diff upgrade --allow-unreleased release chart --timeout 10 --wait --wait-for-jobs -` - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if buffer.String() != expected { - t.Errorf("helmexec.DiffRelease()\nactual = %v\nexpect = %v", buffer.String(), expected) - } -} - func Test_DeleteRelease(t *testing.T) { var buffer bytes.Buffer logger := NewLogger(&buffer, "debug") @@ -887,31 +853,6 @@ func Test_LogLevels(t *testing.T) { } } -func Test_getTillerlessEnv(t *testing.T) { - context := HelmContext{Tillerless: true, TillerNamespace: "foo", WorkerIndex: 1} - - os.Unsetenv("KUBECONFIG") - actual := context.getTillerlessEnv() - if val, found := actual["HELM_TILLER_SILENT"]; !found || val != "true" { - t.Errorf("getTillerlessEnv() HELM_TILLER_SILENT\nactual = %s\nexpect = true", val) - } - // This feature is disabled until it is fixed in helm - /*if val, found := actual["HELM_TILLER_PORT"]; !found || val != "44135" { - t.Errorf("getTillerlessEnv() HELM_TILLER_PORT\nactual = %s\nexpect = 44135", val) - }*/ - if val, found := actual["KUBECONFIG"]; found { - t.Errorf("getTillerlessEnv() KUBECONFIG\nactual = %s\nexpect = nil", val) - } - - t.Setenv("KUBECONFIG", "toto") - actual = context.getTillerlessEnv() - cwd, _ := os.Getwd() - expected := path.Join(cwd, "toto") - if val, found := actual["KUBECONFIG"]; !found || val != expected { - t.Errorf("getTillerlessEnv() KUBECONFIG\nactual = %s\nexpect = %s", val, expected) - } -} - func Test_mergeEnv(t *testing.T) { actual := env2map(mergeEnv([]string{"A=1", "B=c=d", "E=2"}, map[string]string{"B": "3", "F": "4"})) expected := map[string]string{"A": "1", "B": "3", "E": "2", "F": "4"} @@ -926,7 +867,7 @@ func Test_Template(t *testing.T) { helm := MockExecer(logger, "dev") err := helm.TemplateRelease("release", "path/to/chart", "--values", "file.yml") expected := `Templating release=release, chart=path/to/chart -exec: helm --kube-context dev template path/to/chart --name release --values file.yml +exec: helm --kube-context dev template release path/to/chart --values file.yml ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -938,7 +879,7 @@ exec: helm --kube-context dev template path/to/chart --name release --values fil buffer.Reset() err = helm.TemplateRelease("release", "https://example_user:example_password@repo.example.com/chart.tgz", "--values", "file.yml") expected = `Templating release=release, chart=https://example_user:xxxxx@repo.example.com/chart.tgz -exec: helm --kube-context dev template https://example_user:example_password@repo.example.com/chart.tgz --name release --values file.yml +exec: helm --kube-context dev template release https://example_user:example_password@repo.example.com/chart.tgz --values file.yml ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -1064,15 +1005,8 @@ func Test_resolveOciChart(t *testing.T) { } func Test_ShowChart(t *testing.T) { - helm2Runner := mockRunner{output: []byte("Client: v2.16.1+ge13bc94\n")} - helm := New("helm", false, NewLogger(os.Stdout, "info"), "dev", &helm2Runner) - _, err := helm.ShowChart("fake-chart") - if err == nil { - t.Error("helmexec.ShowChart() - helm show isn't supported in helm2") - } - showChartRunner := mockRunner{output: []byte("name: my-chart\nversion: 3.2.0\n")} - helm = &execer{ + helm := &execer{ helmBinary: "helm", version: *semver.MustParse("3.3.2"), logger: NewLogger(os.Stdout, "info"), diff --git a/pkg/state/chart_dependency.go b/pkg/state/chart_dependency.go index 72872c6b..59704a96 100644 --- a/pkg/state/chart_dependency.go +++ b/pkg/state/chart_dependency.go @@ -9,7 +9,6 @@ import ( "github.com/Masterminds/semver/v3" goversion "github.com/hashicorp/go-version" - "github.com/r3labs/diff" "go.uber.org/zap" "github.com/helmfile/helmfile/pkg/app/version" @@ -297,10 +296,7 @@ func (m *chartDependencyManager) lockFileName() string { } func (m *chartDependencyManager) Update(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) { - if shell.IsHelm3() { - return m.updateHelm3(shell, wd, unresolved) - } - return m.updateHelm2(shell, wd, unresolved) + return m.updateHelm3(shell, wd, unresolved) } func (m *chartDependencyManager) updateHelm3(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) { @@ -319,24 +315,6 @@ func (m *chartDependencyManager) updateHelm3(shell helmexec.DependencyUpdater, w return m.doUpdate("Chart.lock", unresolved, shell, wd) } -func (m *chartDependencyManager) updateHelm2(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) { - // Generate `Chart.yaml` of the temporary local chart - if err := m.writeBytes(filepath.Join(wd, "Chart.yaml"), []byte(fmt.Sprintf("name: %s\nversion: 1.0.0\n", m.Name))); err != nil { - return nil, err - } - - // Generate `requirements.yaml` of the temporary local chart from the helmfile state - reqsContent, err := yaml.Marshal(unresolved.ToChartRequirements()) - if err != nil { - return nil, err - } - if err := m.writeBytes(filepath.Join(wd, "requirements.yaml"), reqsContent); err != nil { - return nil, err - } - - return m.doUpdate("requirements.lock", unresolved, shell, wd) -} - func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *UnresolvedDependencies, shell helmexec.DependencyUpdater, wd string) (*ResolvedDependencies, error) { // Generate `requirements.lock` of the temporary local chart by coping `.lock` lockFilePath := m.lockFileName() @@ -346,7 +324,7 @@ func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *Unre return nil, err } - if shell.IsHelm3() && originalLockFileContent != nil { + if originalLockFileContent != nil { if err := m.writeBytes(filepath.Join(wd, chartLockFile), originalLockFileContent); err != nil { return nil, err } @@ -372,24 +350,6 @@ func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *Unre return lockedReqs.ResolvedDependencies[i].ChartName < lockedReqs.ResolvedDependencies[j].ChartName }) - // Don't update lock file if no dependency updated. - if !shell.IsHelm3() && originalLockFileContent != nil { - originalLockedReqs := &ChartLockedRequirements{} - if err := yaml.Unmarshal(originalLockFileContent, originalLockedReqs); err != nil { - return nil, err - } - - changes, err := diff.Diff(originalLockedReqs.ResolvedDependencies, lockedReqs.ResolvedDependencies) - - if err != nil { - return nil, err - } - - if len(changes) == 0 { - lockedReqs.Generated = originalLockedReqs.Generated - } - } - lockedReqs.Version = version.Version() updatedLockFileContent, err = yaml.Marshal(lockedReqs) diff --git a/pkg/state/create.go b/pkg/state/create.go index 51074ce3..7f466951 100644 --- a/pkg/state/create.go +++ b/pkg/state/create.go @@ -298,7 +298,7 @@ func (c *StateCreator) scatterGatherEnvSecretFiles(st *HelmState, envSecretFiles } release := &ReleaseSpec{} - flags := st.appendConnectionFlags([]string{}, helm, release) + flags := st.appendConnectionFlags([]string{}, release) decFile, err := helm.DecryptSecret(st.createHelmContext(release, 0), urlOrPath, flags...) if err != nil { results <- secretResult{secret.id, nil, err, secret.path} diff --git a/pkg/state/helmx.go b/pkg/state/helmx.go index 9bb30912..c96bb8ce 100644 --- a/pkg/state/helmx.go +++ b/pkg/state/helmx.go @@ -27,16 +27,14 @@ func (st *HelmState) appendHelmXFlags(flags []string, release *ReleaseSpec) []st // append post-renderer flags to helm flags func (st *HelmState) appendPostRenderFlags(flags []string, release *ReleaseSpec, helm helmexec.Interface) []string { - if helm.IsHelm3() { - switch { - // helm.GetPostRenderer() comes from cmd flag. - case helm.GetPostRenderer() != "": - flags = append(flags, "--post-renderer", helm.GetPostRenderer()) - case release.PostRenderer != nil && *release.PostRenderer != "": - flags = append(flags, "--post-renderer", *release.PostRenderer) - case st.HelmDefaults.PostRenderer != nil && *st.HelmDefaults.PostRenderer != "": - flags = append(flags, "--post-renderer", *st.HelmDefaults.PostRenderer) - } + switch { + // helm.GetPostRenderer() comes from cmd flag. + case helm.GetPostRenderer() != "": + flags = append(flags, "--post-renderer", helm.GetPostRenderer()) + case release.PostRenderer != nil && *release.PostRenderer != "": + flags = append(flags, "--post-renderer", *release.PostRenderer) + case st.HelmDefaults.PostRenderer != nil && *st.HelmDefaults.PostRenderer != "": + flags = append(flags, "--post-renderer", *st.HelmDefaults.PostRenderer) } return flags } diff --git a/pkg/state/release.go b/pkg/state/release.go index 74b0c644..149f1e77 100644 --- a/pkg/state/release.go +++ b/pkg/state/release.go @@ -67,15 +67,6 @@ func (r ReleaseSpec) ExecuteTemplateExpressions(renderer *tmpl.FileRenderer) (*R result.InstalledTemplate = &resultTmpl } - if result.TillerlessTemplate != nil { - ts := *result.TillerlessTemplate - resultTmpl, err := renderer.RenderTemplateContentToString([]byte(ts)) - if err != nil { - return nil, fmt.Errorf("failed executing template expressions in release \"%s\".version = \"%s\": %v", r.Name, ts, err) - } - result.TillerlessTemplate = &resultTmpl - } - if result.VerifyTemplate != nil { ts := *result.VerifyTemplate resultTmpl, err := renderer.RenderTemplateContentToString([]byte(ts)) diff --git a/pkg/state/state.go b/pkg/state/state.go index ee908c52..d39ad534 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -144,11 +144,9 @@ type SubhelmfileEnvironmentSpec struct { // HelmSpec to defines helmDefault values type HelmSpec struct { - KubeContext string `yaml:"kubeContext,omitempty"` - TillerNamespace string `yaml:"tillerNamespace,omitempty"` - Tillerless bool `yaml:"tillerless"` - Args []string `yaml:"args,omitempty"` - Verify bool `yaml:"verify"` + KubeContext string `yaml:"kubeContext,omitempty"` + Args []string `yaml:"args,omitempty"` + Verify bool `yaml:"verify"` // Devel, when set to true, use development versions, too. Equivalent to version '>0.0.0-0' Devel bool `yaml:"devel"` // Wait, if set to true, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful @@ -295,9 +293,6 @@ type ReleaseSpec struct { ValuesPathPrefix string `yaml:"valuesPathPrefix,omitempty"` - TillerNamespace string `yaml:"tillerNamespace,omitempty"` - Tillerless *bool `yaml:"tillerless,omitempty"` - KubeContext string `yaml:"kubeContext,omitempty"` TLS *bool `yaml:"tls,omitempty"` @@ -306,10 +301,9 @@ type ReleaseSpec struct { TLSCert string `yaml:"tlsCert,omitempty"` // These values are used in templating - TillerlessTemplate *string `yaml:"tillerlessTemplate,omitempty"` - VerifyTemplate *string `yaml:"verifyTemplate,omitempty"` - WaitTemplate *string `yaml:"waitTemplate,omitempty"` - InstalledTemplate *string `yaml:"installedTemplate,omitempty"` + VerifyTemplate *string `yaml:"verifyTemplate,omitempty"` + WaitTemplate *string `yaml:"waitTemplate,omitempty"` + InstalledTemplate *string `yaml:"installedTemplate,omitempty"` // These settings requires helm-x integration to work Dependencies []Dependency `yaml:"dependencies,omitempty"` @@ -400,8 +394,7 @@ const MissingFileHandlerWarn = "Warn" const MissingFileHandlerDebug = "Debug" var DefaultFetchOutputDirTemplate = path.Join( - "{{ .OutputDir }}{{ if .Release.TillerNamespace }}", - "{{ .Release.TillerNamespace }}{{ end }}{{ if .Release.Namespace }}", + "{{ .OutputDir }}{{ if .Release.Namespace }}", "{{ .Release.Namespace }}{{ end }}{{ if .Release.KubeContext }}", "{{ .Release.KubeContext }}{{ end }}", "{{ .Release.Name }}", @@ -432,8 +425,6 @@ func (st *HelmState) ApplyOverrides(spec *ReleaseSpec) { if len(components) > 1 { ns = components[len(components)-2] - } else if spec.TillerNamespace != "" { - ns = spec.TillerNamespace } else { ns = spec.Namespace } @@ -721,17 +712,14 @@ func ReleaseToID(r *ReleaseSpec) string { id += kc + "/" } - tns := r.TillerNamespace ns := r.Namespace - if tns != "" { - id += tns + "/" - } else if ns != "" { + if ns != "" { id += ns + "/" } if kc != "" { - if tns == "" && ns == "" { + if ns == "" { // This is intentional to avoid conflating kc=,ns=foo,name=bar and kc=foo,ns=,name=bar. // Before https://github.com/roboll/helmfile/pull/1823 they were both `foo/bar` which turned out to break `needs` in many ways. // @@ -780,15 +768,10 @@ func (st *HelmState) DeleteReleasesForSync(affectedReleases *AffectedReleases, h relErr = newReleaseFailedError(release, err) } else { var args []string - if helm.IsHelm3() { - args = []string{} - if release.Namespace != "" { - args = append(args, "--namespace", release.Namespace) - } - } else { - args = []string{"--purge"} + if release.Namespace != "" { + args = append(args, "--namespace", release.Namespace) } - deletionFlags := st.appendConnectionFlags(args, helm, release) + deletionFlags := st.appendConnectionFlags(args, release) m.Lock() if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil { affectedReleases.Failed = append(affectedReleases.Failed, release) @@ -893,12 +876,7 @@ func (st *HelmState) SyncReleases(affectedReleases *AffectedReleases, helm helme relErr = newReleaseFailedError(release, err) } else if installed { var args []string - if helm.IsHelm3() { - args = []string{} - } else { - args = []string{"--purge"} - } - deletionFlags := st.appendConnectionFlags(args, helm, release) + deletionFlags := st.appendConnectionFlags(args, release) m.Lock() if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil { affectedReleases.Failed = append(affectedReleases.Failed, release) @@ -973,15 +951,11 @@ func (st *HelmState) SyncReleases(affectedReleases *AffectedReleases, helm helme } func (st *HelmState) listReleases(context helmexec.HelmContext, helm helmexec.Interface, release *ReleaseSpec) (string, error) { - flags := st.connectionFlags(helm, release) - if helm.IsHelm3() { - if release.Namespace != "" { - flags = append(flags, "--namespace", release.Namespace) - } - flags = append(flags, "--uninstalling") - } else { - flags = append(flags, "--deleting") + flags := st.connectionFlags(release) + if release.Namespace != "" { + flags = append(flags, "--namespace", release.Namespace) } + flags = append(flags, "--uninstalling") flags = append(flags, "--deployed", "--failed", "--pending") return helm.List(context, "^"+release.Name+"$", flags...) } @@ -1107,12 +1081,6 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre jobQueue := make(chan *ReleaseSpec, len(releases)) results := make(chan *chartPrepareResult, len(releases)) - var helm3 bool - - if helm != nil { - helm3 = helm.IsHelm3() - } - if !opts.SkipResolve { updated, err := st.ResolveDeps() if err != nil { @@ -1193,7 +1161,7 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre if chartification != nil && helmfileCommand != "pull" { c := chartify.New( chartify.HelmBin(st.DefaultHelmBinary), - chartify.UseHelm3(helm3), + chartify.UseHelm3(true), chartify.WithLogf(st.logger.Debugf), ) @@ -1348,7 +1316,7 @@ func (st *HelmState) runHelmDepBuilds(helm helmexec.Interface, concurrency int, // // See https://github.com/roboll/helmfile/issues/1521 for _, r := range builds { - buildDepsFlags := getBuildDepsFlags(helm, r) + buildDepsFlags := getBuildDepsFlags(r) if err := helm.BuildDeps(r.releaseName, r.chartPath, buildDepsFlags...); err != nil { if r.chartFetchedByGoGetter { diagnostic := fmt.Sprintf( @@ -1855,14 +1823,6 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu } func (st *HelmState) createHelmContext(spec *ReleaseSpec, workerIndex int) helmexec.HelmContext { - namespace := st.HelmDefaults.TillerNamespace - if spec.TillerNamespace != "" { - namespace = spec.TillerNamespace - } - tillerless := st.HelmDefaults.Tillerless - if spec.Tillerless != nil { - tillerless = *spec.Tillerless - } historyMax := 10 if st.HelmDefaults.HistoryMax != nil { historyMax = *st.HelmDefaults.HistoryMax @@ -1872,10 +1832,8 @@ func (st *HelmState) createHelmContext(spec *ReleaseSpec, workerIndex int) helme } return helmexec.HelmContext{ - Tillerless: tillerless, - TillerNamespace: namespace, - WorkerIndex: workerIndex, - HistoryMax: historyMax, + WorkerIndex: workerIndex, + HistoryMax: historyMax, } } @@ -2018,10 +1976,10 @@ func (st *HelmState) ReleaseStatuses(helm helmexec.Interface, workerLimit int) [ st.ApplyOverrides(&release) flags := []string{} - if helm.IsHelm3() && release.Namespace != "" { + if release.Namespace != "" { flags = append(flags, "--namespace", release.Namespace) } - flags = st.appendConnectionFlags(flags, helm, &release) + flags = st.appendConnectionFlags(flags, &release) return helm.ReleaseStatus(st.createHelmContext(&release, workerIndex), release.Name, flags...) }) @@ -2032,12 +1990,9 @@ func (st *HelmState) DeleteReleases(affectedReleases *AffectedReleases, helm hel return st.scatterGatherReleases(helm, concurrency, func(release ReleaseSpec, workerIndex int) error { st.ApplyOverrides(&release) - flags := []string{} - if purge && !helm.IsHelm3() { - flags = append(flags, "--purge") - } - flags = st.appendConnectionFlags(flags, helm, &release) - if helm.IsHelm3() && release.Namespace != "" { + flags := make([]string, 0) + flags = st.appendConnectionFlags(flags, &release) + if release.Namespace != "" { flags = append(flags, "--namespace", release.Namespace) } context := st.createHelmContext(&release, workerIndex) @@ -2089,27 +2044,22 @@ func (st *HelmState) TestReleases(helm helmexec.Interface, cleanup bool, timeout } flags := []string{} - if helm.IsHelm3() && release.Namespace != "" { + if release.Namespace != "" { flags = append(flags, "--namespace", release.Namespace) } - if cleanup && !helm.IsHelm3() { - flags = append(flags, "--cleanup") - } if opts.Logs { flags = append(flags, "--logs") } if timeout == EmptyTimeout { - flags = append(flags, st.timeoutFlags(helm, &release)...) + flags = append(flags, st.timeoutFlags(&release)...) } else { duration := strconv.Itoa(timeout) - if helm.IsHelm3() { - duration += "s" - } + duration += "s" flags = append(flags, "--timeout", duration) } - flags = st.appendConnectionFlags(flags, helm, &release) + flags = st.appendConnectionFlags(flags, &release) return helm.TestRelease(st.createHelmContext(&release, workerIndex), release.Name, flags...) }) @@ -2424,62 +2374,48 @@ func findChartDirectory(topLevelDir string) (string, error) { } // appendConnectionFlags append all the helm command-line flags related to K8s API and Tiller connection including the kubecontext -func (st *HelmState) appendConnectionFlags(flags []string, helm helmexec.Interface, release *ReleaseSpec) []string { - adds := st.connectionFlags(helm, release) +func (st *HelmState) appendConnectionFlags(flags []string, release *ReleaseSpec) []string { + adds := st.connectionFlags(release) flags = append(flags, adds...) return flags } -func (st *HelmState) connectionFlags(helm helmexec.Interface, release *ReleaseSpec) []string { +func (st *HelmState) connectionFlags(release *ReleaseSpec) []string { flags := []string{} - tillerless := st.HelmDefaults.Tillerless - if release.Tillerless != nil { - tillerless = *release.Tillerless + if release.TLS != nil && *release.TLS || release.TLS == nil && st.HelmDefaults.TLS { + flags = append(flags, "--tls") } - if !tillerless { - if !helm.IsHelm3() { - if release.TillerNamespace != "" { - flags = append(flags, "--tiller-namespace", release.TillerNamespace) - } else if st.HelmDefaults.TillerNamespace != "" { - flags = append(flags, "--tiller-namespace", st.HelmDefaults.TillerNamespace) - } - } - if release.TLS != nil && *release.TLS || release.TLS == nil && st.HelmDefaults.TLS { - flags = append(flags, "--tls") - } + if release.TLSKey != "" { + flags = append(flags, "--tls-key", release.TLSKey) + } else if st.HelmDefaults.TLSKey != "" { + flags = append(flags, "--tls-key", st.HelmDefaults.TLSKey) + } - if release.TLSKey != "" { - flags = append(flags, "--tls-key", release.TLSKey) - } else if st.HelmDefaults.TLSKey != "" { - flags = append(flags, "--tls-key", st.HelmDefaults.TLSKey) - } + if release.TLSCert != "" { + flags = append(flags, "--tls-cert", release.TLSCert) + } else if st.HelmDefaults.TLSCert != "" { + flags = append(flags, "--tls-cert", st.HelmDefaults.TLSCert) + } - if release.TLSCert != "" { - flags = append(flags, "--tls-cert", release.TLSCert) - } else if st.HelmDefaults.TLSCert != "" { - flags = append(flags, "--tls-cert", st.HelmDefaults.TLSCert) - } + if release.TLSCACert != "" { + flags = append(flags, "--tls-ca-cert", release.TLSCACert) + } else if st.HelmDefaults.TLSCACert != "" { + flags = append(flags, "--tls-ca-cert", st.HelmDefaults.TLSCACert) + } - if release.TLSCACert != "" { - flags = append(flags, "--tls-ca-cert", release.TLSCACert) - } else if st.HelmDefaults.TLSCACert != "" { - flags = append(flags, "--tls-ca-cert", st.HelmDefaults.TLSCACert) - } - - if release.KubeContext != "" { - flags = append(flags, "--kube-context", release.KubeContext) - } else if st.Environments[st.Env.Name].KubeContext != "" { - flags = append(flags, "--kube-context", st.Environments[st.Env.Name].KubeContext) - } else if st.HelmDefaults.KubeContext != "" { - flags = append(flags, "--kube-context", st.HelmDefaults.KubeContext) - } + if release.KubeContext != "" { + flags = append(flags, "--kube-context", release.KubeContext) + } else if st.Environments[st.Env.Name].KubeContext != "" { + flags = append(flags, "--kube-context", st.Environments[st.Env.Name].KubeContext) + } else if st.HelmDefaults.KubeContext != "" { + flags = append(flags, "--kube-context", st.HelmDefaults.KubeContext) } return flags } -func (st *HelmState) timeoutFlags(helm helmexec.Interface, release *ReleaseSpec) []string { +func (st *HelmState) timeoutFlags(release *ReleaseSpec) []string { var flags []string timeout := st.HelmDefaults.Timeout @@ -2488,9 +2424,7 @@ func (st *HelmState) timeoutFlags(helm helmexec.Interface, release *ReleaseSpec) } if timeout != 0 { duration := strconv.Itoa(timeout) - if helm.IsHelm3() { - duration += "s" - } + duration += "s" flags = append(flags, "--timeout", duration) } @@ -2512,7 +2446,7 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp flags = append(flags, "--wait-for-jobs") } - flags = append(flags, st.timeoutFlags(helm, release)...) + flags = append(flags, st.timeoutFlags(release)...) if release.Force != nil && *release.Force || release.Force == nil && st.HelmDefaults.Force { flags = append(flags, "--force") @@ -2545,7 +2479,7 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp flags = append(flags, "--disable-openapi-validation") } - flags = st.appendConnectionFlags(flags, helm, release) + flags = st.appendConnectionFlags(flags, release) flags = st.appendHelmXFlags(flags, release) @@ -2561,14 +2495,7 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp func (st *HelmState) flagsForTemplate(helm helmexec.Interface, release *ReleaseSpec, workerIndex int) ([]string, []string, error) { var flags []string - // `helm template` in helm v2 does not support `--version` flag. So we fetch with the version flag and then template - // without the flag. See PrepareCharts function to see the Helmfile implementation of chart fetching. - // - // `helm template` in helm v3 supports `--version` and it automatically fetches the remote chart to template, - // so we skip fetching on helmfile-side and let helm fetch it. - if helm.IsHelm3() { - flags = st.chartVersionFlags(release) - } + flags = st.chartVersionFlags(release) flags = st.appendHelmXFlags(flags, release) @@ -2609,7 +2536,7 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, flags = st.appendApiVersionsFlags(flags, release) - flags = st.appendConnectionFlags(flags, helm, release) + flags = st.appendConnectionFlags(flags, release) flags = st.appendHelmXFlags(flags, release) @@ -2932,7 +2859,7 @@ func (st *HelmState) generateSecretValuesFiles(helm helmexec.Interface, release } path := paths[0] - decryptFlags := st.appendConnectionFlags([]string{}, helm, release) + decryptFlags := st.appendConnectionFlags([]string{}, release) valfile, err := helm.DecryptSecret(st.createHelmContext(release, workerIndex), path, decryptFlags...) if err != nil { return nil, err diff --git a/pkg/state/state_exec_tmpl.go b/pkg/state/state_exec_tmpl.go index 666674a3..d9d3a17b 100644 --- a/pkg/state/state_exec_tmpl.go +++ b/pkg/state/state_exec_tmpl.go @@ -66,15 +66,6 @@ func updateBoolTemplatedValues(r *ReleaseSpec) error { } } - if r.TillerlessTemplate != nil { - if tillerless, err := getBoolRefFromStringTemplate(*r.TillerlessTemplate); err != nil { - return fmt.Errorf("tillerlessTemplate: %v", err) - } else { - r.TillerlessTemplate = nil - r.Tillerless = tillerless - } - } - if r.VerifyTemplate != nil { if verify, err := getBoolRefFromStringTemplate(*r.VerifyTemplate); err != nil { return fmt.Errorf("verifyTemplate: %v", err) diff --git a/pkg/state/state_exec_tmpl_test.go b/pkg/state/state_exec_tmpl_test.go index 5a70467b..2d5ee575 100644 --- a/pkg/state/state_exec_tmpl_test.go +++ b/pkg/state/state_exec_tmpl_test.go @@ -63,25 +63,23 @@ func TestHelmState_executeTemplates(t *testing.T) { { name: "Has template expressions in boolean values", input: ReleaseSpec{ - Chart: "test-chart", - Name: "app-dev", - Namespace: "dev", - Labels: map[string]string{"id": "app"}, - InstalledTemplate: func(i string) *string { return &i }(`{{ eq .Release.Labels.id "app" | ternary "true" "false" }}`), - VerifyTemplate: func(i string) *string { return &i }(`{{ true }}`), - Verify: func(i bool) *bool { return &i }(false), - WaitTemplate: func(i string) *string { return &i }(`{{ false }}`), - TillerlessTemplate: func(i string) *string { return &i }(`true`), + Chart: "test-chart", + Name: "app-dev", + Namespace: "dev", + Labels: map[string]string{"id": "app"}, + InstalledTemplate: func(i string) *string { return &i }(`{{ eq .Release.Labels.id "app" | ternary "true" "false" }}`), + VerifyTemplate: func(i string) *string { return &i }(`{{ true }}`), + Verify: func(i bool) *bool { return &i }(false), + WaitTemplate: func(i string) *string { return &i }(`{{ false }}`), }, want: ReleaseSpec{ - Chart: "test-chart", - Name: "app-dev", - Namespace: "dev", - Labels: map[string]string{"id": "app"}, - Installed: func(i bool) *bool { return &i }(true), - Verify: func(i bool) *bool { return &i }(true), - Wait: func(i bool) *bool { return &i }(false), - Tillerless: func(i bool) *bool { return &i }(true), + Chart: "test-chart", + Name: "app-dev", + Namespace: "dev", + Labels: map[string]string{"id": "app"}, + Installed: func(i bool) *bool { return &i }(true), + Verify: func(i bool) *bool { return &i }(true), + Wait: func(i bool) *bool { return &i }(false), }, }, { @@ -182,11 +180,6 @@ func TestHelmState_executeTemplates(t *testing.T) { boolPtrToString(tt.want.Installed), boolPtrToString(actual.Installed), ) } - if !reflect.DeepEqual(actual.Tillerless, tt.want.Tillerless) { - t.Errorf("expected actual.Tillerless %+v, got %+v", - boolPtrToString(tt.want.Tillerless), boolPtrToString(actual.Tillerless), - ) - } if !reflect.DeepEqual(actual.Verify, tt.want.Verify) { t.Errorf("expected actual.Verify %+v, got %+v", boolPtrToString(tt.want.Verify), boolPtrToString(actual.Verify), diff --git a/pkg/state/state_run.go b/pkg/state/state_run.go index 814d4fd0..53646bc9 100644 --- a/pkg/state/state_run.go +++ b/pkg/state/state_run.go @@ -22,16 +22,6 @@ func (st *HelmState) scatterGather(concurrency int, items int, produceInputs fun concurrency = items } - for _, r := range st.Releases { - if r.Tillerless != nil { - if *r.Tillerless { - concurrency = 1 - } - } else if st.HelmDefaults.Tillerless { - concurrency = 1 - } - } - // WaitGroup is required to wait until goroutine per job in job queue cleanly stops. var waitGroup sync.WaitGroup waitGroup.Add(concurrency) diff --git a/pkg/state/state_test.go b/pkg/state/state_test.go index 9326c490..418cf1bf 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -408,7 +408,7 @@ func TestHelmState_flagsForUpgrade(t *testing.T) { }, want: []string{ "--version", "0.1", - "--timeout", "123", + "--timeout", "123s", "--namespace", "test-namespace", }, }, @@ -426,7 +426,7 @@ func TestHelmState_flagsForUpgrade(t *testing.T) { }, want: []string{ "--version", "0.1", - "--timeout", "123", + "--timeout", "123s", "--namespace", "test-namespace", }, }, @@ -534,79 +534,6 @@ func TestHelmState_flagsForUpgrade(t *testing.T) { "--namespace", "test-namespace", }, }, - { - name: "tiller", - defaults: HelmSpec{}, - release: &ReleaseSpec{ - Chart: "test/chart", - Version: "0.1", - Name: "test-charts", - TLS: boolValue(true), - TillerNamespace: "tiller-system", - TLSKey: "key.pem", - TLSCert: "cert.pem", - TLSCACert: "ca.pem", - }, - want: []string{ - "--version", "0.1", - "--tiller-namespace", "tiller-system", - "--tls", - "--tls-key", "key.pem", - "--tls-cert", "cert.pem", - "--tls-ca-cert", "ca.pem", - }, - }, - { - name: "tiller-override-defaults", - defaults: HelmSpec{ - TLS: false, - TillerNamespace: "a", - TLSKey: "b.pem", - TLSCert: "c.pem", - TLSCACert: "d.pem", - }, - release: &ReleaseSpec{ - Chart: "test/chart", - Version: "0.1", - Name: "test-charts", - TLS: boolValue(true), - TillerNamespace: "tiller-system", - TLSKey: "key.pem", - TLSCert: "cert.pem", - TLSCACert: "ca.pem", - }, - want: []string{ - "--version", "0.1", - "--tiller-namespace", "tiller-system", - "--tls", - "--tls-key", "key.pem", - "--tls-cert", "cert.pem", - "--tls-ca-cert", "ca.pem", - }, - }, - { - name: "tiller-from-defaults", - defaults: HelmSpec{ - TLS: true, - TillerNamespace: "tiller-system", - TLSKey: "key.pem", - TLSCert: "cert.pem", - TLSCACert: "ca.pem", - }, - release: &ReleaseSpec{ - Chart: "test/chart", - Version: "0.1", - Name: "test-charts", - }, - want: []string{ - "--version", "0.1", - "--tiller-namespace", "tiller-system", - "--tls", - "--tls-key", "key.pem", - "--tls-cert", "cert.pem", - "--tls-ca-cert", "ca.pem", - }, - }, { name: "create-namespace-default-helm3.2", defaults: HelmSpec{ @@ -1263,18 +1190,6 @@ func TestHelmState_SyncReleases(t *testing.T) { helm: &exectest.Helm{}, wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}}, }, - { - name: "with tiller args", - releases: []ReleaseSpec{ - { - Name: "releaseName", - Chart: "foo", - TillerNamespace: "tillerns", - }, - }, - helm: &exectest.Helm{}, - wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--tiller-namespace", "tillerns", "--reset-values"}}}, - }, { name: "escaped values", releases: []ReleaseSpec{ @@ -1478,6 +1393,7 @@ func TestHelmState_SyncReleases_MissingValuesFileForUndesiredRelease(t *testing. state = injectFs(state, fs) helm := &exectest.Helm{ Lists: map[exectest.ListKey]string{}, + Helm3: true, } //simulate the helm.list call result helm.Lists[exectest.ListKey{Filter: "^" + tt.release.Name + "$"}] = tt.listResult @@ -1610,8 +1526,7 @@ func TestHelmState_SyncReleasesAffectedRealeases(t *testing.T) { }, }, } - for i := range tests { - tt := tests[i] + for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { state := &HelmState{ ReleaseSetSpec: ReleaseSetSpec{ @@ -1627,7 +1542,7 @@ func TestHelmState_SyncReleasesAffectedRealeases(t *testing.T) { //simulate the release is already installed for i, release := range tt.releases { if tt.installed != nil && tt.installed[i] { - helm.Lists[exectest.ListKey{Filter: "^" + release.Name + "$", Flags: "--deleting--deployed--failed--pending"}] = release.Name + helm.Lists[exectest.ListKey{Filter: "^" + release.Name + "$", Flags: "--uninstalling--deployed--failed--pending"}] = release.Name } } @@ -1724,8 +1639,7 @@ func TestGetDeployedVersion(t *testing.T) { installedVersion: "3.2.0", }, } - for i := range tests { - tt := tests[i] + for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { state := &HelmState{ ReleaseSetSpec: ReleaseSetSpec{ @@ -1740,7 +1654,7 @@ func TestGetDeployedVersion(t *testing.T) { Lists: map[exectest.ListKey]string{}, } // simulate the helm.list call result - helm.Lists[exectest.ListKey{Filter: "^" + tt.release.Name + "$", Flags: "--deleting--deployed--failed--pending"}] = tt.listResult + helm.Lists[exectest.ListKey{Filter: "^" + tt.release.Name + "$", Flags: "--uninstalling--deployed--failed--pending"}] = tt.listResult affectedReleases := AffectedReleases{} state.SyncReleases(&affectedReleases, helm, []string{}, 1) @@ -1770,18 +1684,6 @@ func TestHelmState_DiffReleases(t *testing.T) { helm: &exectest.Helm{}, wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}}, }, - { - name: "with tiller args", - releases: []ReleaseSpec{ - { - Name: "releaseName", - Chart: "foo", - TillerNamespace: "tillerns", - }, - }, - helm: &exectest.Helm{}, - wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--tiller-namespace", "tillerns", "--reset-values"}}}, - }, { name: "escaped values", releases: []ReleaseSpec{ @@ -2100,6 +2002,7 @@ func TestHelmState_DiffReleasesCleanup(t *testing.T) { func TestHelmState_UpdateDeps(t *testing.T) { helm := &exectest.Helm{ UpdateDepsCallbacks: map[string]func(string) error{}, + Helm3: true, } var generatedDir string @@ -2121,7 +2024,7 @@ func TestHelmState_UpdateDeps(t *testing.T) { digest: sha256:8194b597c85bb3d1fee8476d4a486e952681d5c65f185ad5809f2118bc4079b5 generated: 2019-05-16T15:42:45.50486+09:00 `) - filename := filepath.Join(generatedDir, "requirements.lock") + filename := filepath.Join(generatedDir, "Chart.lock") logger.Debugf("test: writing %s: %s", filename, content) return os.WriteFile(filename, content, 0644) } @@ -2350,19 +2253,6 @@ func TestHelmState_ReleaseStatuses(t *testing.T) { helm: &exectest.Helm{}, wantErr: false, }, - { - name: "with tiller args", - releases: []ReleaseSpec{ - { - Name: "releaseA", - TillerNamespace: "tillerns", - }, - }, - helm: &exectest.Helm{}, - want: []exectest.Release{ - {Name: "releaseA", Flags: []string{"--tiller-namespace", "tillerns"}}, - }, - }, } for i := range tests { tt := tests[i] @@ -2402,13 +2292,12 @@ func TestHelmState_ReleaseStatuses(t *testing.T) { func TestHelmState_TestReleasesNoCleanUp(t *testing.T) { tests := []struct { - name string - cleanup bool - releases []ReleaseSpec - helm *exectest.Helm - want []exectest.Release - wantErr bool - tillerNamespace string + name string + cleanup bool + releases []ReleaseSpec + helm *exectest.Helm + want []exectest.Release + wantErr bool }{ { name: "happy path", @@ -2418,7 +2307,7 @@ func TestHelmState_TestReleasesNoCleanUp(t *testing.T) { }, }, helm: &exectest.Helm{}, - want: []exectest.Release{{Name: "releaseA", Flags: []string{"--timeout", "1"}}}, + want: []exectest.Release{{Name: "releaseA", Flags: []string{"--timeout", "1s"}}}, }, { name: "do cleanup", @@ -2429,7 +2318,7 @@ func TestHelmState_TestReleasesNoCleanUp(t *testing.T) { }, }, helm: &exectest.Helm{}, - want: []exectest.Release{{Name: "releaseB", Flags: []string{"--cleanup", "--timeout", "1"}}}, + want: []exectest.Release{{Name: "releaseB", Flags: []string{"--timeout", "1s"}}}, }, { name: "happy path", @@ -2441,21 +2330,9 @@ func TestHelmState_TestReleasesNoCleanUp(t *testing.T) { helm: &exectest.Helm{}, wantErr: true, }, - { - name: "with tiller args", - releases: []ReleaseSpec{ - { - Name: "releaseA", - TillerNamespace: "tillerns", - }, - }, - helm: &exectest.Helm{}, - want: []exectest.Release{{Name: "releaseA", Flags: []string{"--timeout", "1", "--tiller-namespace", "tillerns"}}}, - }, } - for i := range tests { - tt := tests[i] - f := func(t *testing.T) { + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { state := &HelmState{ ReleaseSetSpec: ReleaseSetSpec{ Releases: tt.releases, @@ -2470,8 +2347,7 @@ func TestHelmState_TestReleasesNoCleanUp(t *testing.T) { if !reflect.DeepEqual(tt.helm.Releases, tt.want) { t.Errorf("HelmState.TestReleases() for [%s] = %v, want %v", tt.name, tt.helm.Releases, tt.want) } - } - t.Run(tt.name, f) + }) } } @@ -2529,16 +2405,16 @@ func TestHelmState_NoReleaseMatched(t *testing.T) { func TestHelmState_Delete(t *testing.T) { tests := []struct { - name string - deleted []exectest.Release - wantErr bool - desired *bool - installed bool - purge bool - flags string - tillerNamespace string - kubeContext string - defKubeContext string + name string + deleted []exectest.Release + wantErr bool + desired *bool + installed bool + purge bool + flags string + namespace string + kubeContext string + defKubeContext string }{ { name: "desired and installed (purge=false)", @@ -2570,7 +2446,7 @@ func TestHelmState_Delete(t *testing.T) { desired: boolValue(true), installed: true, purge: true, - deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge"}}}, + deleted: []exectest.Release{{Name: "releaseA", Flags: []string{}}}, }, { name: "desired but not installed (purge=false)", @@ -2586,7 +2462,7 @@ func TestHelmState_Delete(t *testing.T) { desired: boolValue(true), installed: false, purge: true, - deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge"}}}, + deleted: []exectest.Release{{Name: "releaseA", Flags: []string{}}}, }, { name: "installed but filtered (purge=false)", @@ -2602,7 +2478,7 @@ func TestHelmState_Delete(t *testing.T) { desired: boolValue(false), installed: true, purge: true, - deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge"}}}, + deleted: []exectest.Release{{Name: "releaseA", Flags: []string{}}}, }, { name: "not installed, and filtered (purge=false)", @@ -2618,17 +2494,7 @@ func TestHelmState_Delete(t *testing.T) { desired: boolValue(false), installed: false, purge: true, - deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge"}}}, - }, - { - name: "with tiller args", - wantErr: false, - desired: nil, - installed: true, - purge: true, - tillerNamespace: "tillerns", - flags: "--tiller-namespacetillerns", - deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge", "--tiller-namespace", "tillerns"}}}, + deleted: []exectest.Release{{Name: "releaseA", Flags: []string{}}}, }, { name: "with kubecontext", @@ -2638,7 +2504,7 @@ func TestHelmState_Delete(t *testing.T) { purge: true, kubeContext: "ctx", flags: "--kube-contextctx", - deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge", "--kube-context", "ctx"}}}, + deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--kube-context", "ctx"}}}, }, { name: "with default kubecontext", @@ -2648,7 +2514,7 @@ func TestHelmState_Delete(t *testing.T) { purge: true, defKubeContext: "defctx", flags: "--kube-contextdefctx", - deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge", "--kube-context", "defctx"}}}, + deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--kube-context", "defctx"}}}, }, { name: "with non-default and default kubecontexts", @@ -2659,21 +2525,20 @@ func TestHelmState_Delete(t *testing.T) { kubeContext: "ctx", defKubeContext: "defctx", flags: "--kube-contextctx", - deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge", "--kube-context", "ctx"}}}, + deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--kube-context", "ctx"}}}, }, } - for i := range tests { - tt := tests[i] - f := func(t *testing.T) { + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { name := "releaseA" if tt.wantErr { name = "releaseA-error" } release := ReleaseSpec{ - Name: name, - Installed: tt.desired, - TillerNamespace: tt.tillerNamespace, - KubeContext: tt.kubeContext, + Name: name, + Installed: tt.desired, + Namespace: tt.namespace, + KubeContext: tt.kubeContext, } releases := []ReleaseSpec{ release, @@ -2691,6 +2556,7 @@ func TestHelmState_Delete(t *testing.T) { helm := &exectest.Helm{ Lists: map[exectest.ListKey]string{}, Deleted: []exectest.Release{}, + Helm3: true, } if tt.installed { helm.Lists[exectest.ListKey{Filter: "^" + name + "$", Flags: tt.flags}] = name @@ -2705,8 +2571,7 @@ func TestHelmState_Delete(t *testing.T) { } else if !(reflect.DeepEqual(tt.deleted, helm.Deleted) && (len(affectedReleases.Deleted) == len(tt.deleted))) { t.Errorf("unexpected deletions happened: expected %v, got %v", tt.deleted, helm.Deleted) } - } - t.Run(tt.name, f) + }) } } @@ -2758,6 +2623,7 @@ func TestDiffpareSyncReleases(t *testing.T) { } helm := &exectest.Helm{ Lists: map[exectest.ListKey]string{}, + Helm3: true, } results, es := state.prepareDiffReleases(helm, []string{}, 1, false, false, []string{}, false, false, false, tt.diffOptions) @@ -2818,6 +2684,7 @@ func TestPrepareSyncReleases(t *testing.T) { } helm := &exectest.Helm{ Lists: map[exectest.ListKey]string{}, + Helm3: true, } results, es := state.prepareSyncReleases(helm, []string{}, 1, tt.syncOptions) @@ -3126,14 +2993,6 @@ func TestGenerateChartPath(t *testing.T) { wantErr: false, expected: "/output-dir/release-name/chart-name/0.0.0", }, - { - testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseTillerNamespace", - chartName: "chart-name", - release: &ReleaseSpec{Name: "release-name", TillerNamespace: "tiller-namespace"}, - outputDir: "/output-dir", - wantErr: false, - expected: "/output-dir/tiller-namespace/release-name/chart-name/latest", - }, { testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseNamespace", chartName: "chart-name", @@ -3142,14 +3001,6 @@ func TestGenerateChartPath(t *testing.T) { wantErr: false, expected: "/output-dir/release-namespace/release-name/chart-name/latest", }, - { - testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseTillerNamespaceAndGivenReleaseNamespace", - chartName: "chart-name", - release: &ReleaseSpec{Name: "release-name", TillerNamespace: "tiller-namespace", Namespace: "release-namespace"}, - outputDir: "/output-dir", - wantErr: false, - expected: "/output-dir/tiller-namespace/release-namespace/release-name/chart-name/latest", - }, { testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseKubeContext", chartName: "chart-name", @@ -3166,22 +3017,6 @@ func TestGenerateChartPath(t *testing.T) { wantErr: false, expected: "/output-dir/release-namespace/kube-context/release-name/chart-name/latest", }, - { - testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseTillerNamespaceAndGivenReleaseKubeContext", - chartName: "chart-name", - release: &ReleaseSpec{Name: "release-name", TillerNamespace: "tiller-namespace", KubeContext: "kube-context"}, - outputDir: "/output-dir", - wantErr: false, - expected: "/output-dir/tiller-namespace/kube-context/release-name/chart-name/latest", - }, - { - testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseTillerNamespaceAndGivenReleaseNamespaceAndGivenReleaseKubeContext", - chartName: "chart-name", - release: &ReleaseSpec{Name: "release-name", TillerNamespace: "tiller-namespace", Namespace: "release-namespace", KubeContext: "kube-context"}, - outputDir: "/output-dir", - wantErr: false, - expected: "/output-dir/tiller-namespace/release-namespace/kube-context/release-name/chart-name/latest", - }, { testName: "PathGeneratedWithGivenOutputDirAndGivenOutputDirTemplateWithFieldNameOutputDir", chartName: "chart-name", diff --git a/pkg/state/temp_test.go b/pkg/state/temp_test.go index 9bb3d434..bcfc3c64 100644 --- a/pkg/state/temp_test.go +++ b/pkg/state/temp_test.go @@ -38,39 +38,39 @@ func TestGenerateID(t *testing.T) { run(testcase{ subject: "baseline", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, - want: "foo-values-648b77cdd4", + want: "foo-values-5d85cdbb5d", }) run(testcase{ subject: "different bytes content", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, data: []byte(`{"k":"v"}`), - want: "foo-values-5dfbf8fdb7", + want: "foo-values-9548bdcd9", }) run(testcase{ subject: "different map content", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, data: map[string]interface{}{"k": "v"}, - want: "foo-values-7565d47dd9", + want: "foo-values-5db884fb87", }) run(testcase{ subject: "different chart", release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"}, - want: "foo-values-7c4f76c445", + want: "foo-values-6596c997cc", }) run(testcase{ subject: "different name", release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"}, - want: "bar-values-644fb47865", + want: "bar-values-5ccfd9f8b5", }) run(testcase{ subject: "specific ns", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"}, - want: "myns-foo-values-c5ddcc795", + want: "myns-foo-values-bc7cd5b87", }) for id, n := range ids { diff --git a/pkg/state/util.go b/pkg/state/util.go index 002cae84..de6aecc2 100644 --- a/pkg/state/util.go +++ b/pkg/state/util.go @@ -5,8 +5,6 @@ import ( "os" "path/filepath" "strings" - - "github.com/helmfile/helmfile/pkg/helmexec" ) var ( @@ -65,9 +63,9 @@ func normalizeChart(basePath, chart string) string { return filepath.Join(basePath, chart) } -func getBuildDepsFlags(helm helmexec.Interface, cpr *chartPrepareResult) []string { +func getBuildDepsFlags(cpr *chartPrepareResult) []string { flags := []string{} - if helm.IsHelm3() && cpr.skipRefresh { + if cpr.skipRefresh { flags = append(flags, "--skip-refresh") }