From 21c28ca6d0683d93aa57bf15863b0f544d3537c1 Mon Sep 17 00:00:00 2001 From: yxxhero <11087727+yxxhero@users.noreply.github.com> Date: Sat, 8 Oct 2022 13:27:39 +0800 Subject: [PATCH] feat: add reuse-values args for diff apply and sync (#411) Signed-off-by: yxxhero Signed-off-by: yxxhero --- cmd/apply.go | 1 + cmd/diff.go | 1 + cmd/sync.go | 1 + pkg/app/app.go | 8 +- pkg/app/app_apply_hooks_test.go | 18 ++-- pkg/app/app_apply_nokubectx_test.go | 28 +++---- pkg/app/app_apply_test.go | 38 ++++----- pkg/app/app_diff_test.go | 42 +++++----- pkg/app/app_test.go | 115 +++++++++++++------------ pkg/app/config.go | 8 ++ pkg/app/diff_nokubectx_test.go | 104 +++++++++++------------ pkg/app/diff_test.go | 125 +++++++++++++++------------- pkg/config/apply.go | 7 ++ pkg/config/diff.go | 7 ++ pkg/config/sync.go | 7 ++ pkg/helmexec/exec.go | 4 +- pkg/helmexec/exec_test.go | 16 ++-- pkg/state/state.go | 40 ++++++--- pkg/state/state_test.go | 116 +++++++++++++++++++++++--- 19 files changed, 421 insertions(+), 265 deletions(-) diff --git a/cmd/apply.go b/cmd/apply.go index ef46d69b..98fa28e2 100644 --- a/cmd/apply.go +++ b/cmd/apply.go @@ -59,6 +59,7 @@ func NewApplyCmd(globalCfg *config.GlobalImpl) *cobra.Command { f.BoolVar(&applyOptions.SkipDeps, "skip-deps", false, `skip running "helm repo update" and "helm dependency build"`) f.BoolVar(&applyOptions.Wait, "wait", false, `Override helmDefaults.wait setting "helm upgrade --install --wait"`) f.BoolVar(&applyOptions.WaitForJobs, "wait-for-jobs", false, `Override helmDefaults.waitForJobs setting "helm upgrade --install --wait-for-jobs"`) + f.BoolVar(&applyOptions.ReuseValues, "reuse-values", false, "reuse the last release's values and merge in any overrides from other sources") return cmd } diff --git a/cmd/diff.go b/cmd/diff.go index 85c8cea6..99a4d155 100644 --- a/cmd/diff.go +++ b/cmd/diff.go @@ -49,6 +49,7 @@ func NewDiffCmd(globalCfg *config.GlobalImpl) *cobra.Command { f.StringVar(&diffOptions.Output, "output", "", "output format for diff plugin") f.BoolVar(&diffOptions.SuppressSecrets, "suppress-secrets", false, "suppress secrets in the output. highly recommended to specify on CI/CD use-cases") f.StringArrayVar(&diffOptions.Suppress, "suppress", nil, "suppress specified Kubernetes objects in the output. Can be provided multiple times. For example: --suppress KeycloakClient --suppress VaultSecret") + f.BoolVar(&diffOptions.ReuseValues, "reuse-values", false, "reuse the last release's values and merge in any overrides from other sources") return cmd } diff --git a/cmd/sync.go b/cmd/sync.go index 60ad1a99..2dab8476 100644 --- a/cmd/sync.go +++ b/cmd/sync.go @@ -43,6 +43,7 @@ func NewSyncCmd(globalCfg *config.GlobalImpl) *cobra.Command { f.BoolVar(&syncOptions.SkipDeps, "skip-deps", false, `skip running "helm repo update" and "helm dependency build"`) f.BoolVar(&syncOptions.Wait, "wait", false, `Override helmDefaults.wait setting "helm upgrade --install --wait"`) f.BoolVar(&syncOptions.WaitForJobs, "wait-for-jobs", false, `Override helmDefaults.waitForJobs setting "helm upgrade --install --wait-for-jobs"`) + f.BoolVar(&syncOptions.ReuseValues, "reuse-values", false, "reuse the last release's values and merge in any overrides from other sources") return cmd } diff --git a/pkg/app/app.go b/pkg/app/app.go index 8123fd3d..2ef6f1ee 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -1288,6 +1288,7 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) { Set: c.Set(), SkipCleanup: c.RetainValuesFiles() || c.SkipCleanup(), SkipDiffOnInstall: c.SkipDiffOnInstall(), + ReuseValues: c.ReuseValues(), } infoMsg, releasesToBeUpdated, releasesToBeDeleted, errs := r.diff(false, detailedExitCode, c, diffOpts) @@ -1412,14 +1413,15 @@ Do you really want to apply? subst.Releases = rs - syncOpts := state.SyncOpts{ + syncOpts := &state.SyncOpts{ Set: c.Set(), SkipCleanup: c.RetainValuesFiles() || c.SkipCleanup(), SkipCRDs: c.SkipCRDs(), Wait: c.Wait(), WaitForJobs: c.WaitForJobs(), + ReuseValues: c.ReuseValues(), } - return subst.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency(), &syncOpts) + return subst.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency(), syncOpts) })) if len(updateErrs) > 0 { @@ -1529,6 +1531,7 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) NoColor: c.NoColor(), Set: c.Set(), SkipDiffOnInstall: c.SkipDiffOnInstall(), + ReuseValues: c.ReuseValues(), } filtered := &Run{ @@ -1792,6 +1795,7 @@ Do you really want to sync? SkipCRDs: c.SkipCRDs(), Wait: c.Wait(), WaitForJobs: c.WaitForJobs(), + ReuseValues: c.ReuseValues(), } return subst.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency(), opts) })) diff --git a/pkg/app/app_apply_hooks_test.go b/pkg/app/app_apply_hooks_test.go index 846efdad..3fff1f86 100644 --- a/pkg/app/app_apply_hooks_test.go +++ b/pkg/app/app_apply_hooks_test.go @@ -191,7 +191,7 @@ releases: {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -222,7 +222,7 @@ releases: {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -253,7 +253,7 @@ releases: {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -282,7 +282,7 @@ releases: }, selectors: []string{"app=test"}, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: nil, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: nil, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -329,8 +329,8 @@ releases: {Name: "bar"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -376,7 +376,7 @@ releases: {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -426,7 +426,7 @@ bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -474,7 +474,7 @@ foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result diff --git a/pkg/app/app_apply_nokubectx_test.go b/pkg/app/app_apply_nokubectx_test.go index dfedac3c..c4526d28 100644 --- a/pkg/app/app_apply_nokubectx_test.go +++ b/pkg/app/app_apply_nokubectx_test.go @@ -205,8 +205,8 @@ releases: {Name: "my-release", Flags: []string{"--namespace", "default"}}, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -345,8 +345,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: nil, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: nil, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -468,9 +468,9 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespacekube-system--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespacekube-system--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -611,9 +611,9 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespacekube-system--detailed-exitcode"}: nil, - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespacekube-system--detailed-exitcode--reset-values"}: nil, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -759,8 +759,8 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -908,8 +908,8 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, diff --git a/pkg/app/app_apply_test.go b/pkg/app/app_apply_test.go index e1e07827..b927f9f0 100644 --- a/pkg/app/app_apply_test.go +++ b/pkg/app/app_apply_test.go @@ -207,8 +207,8 @@ releases: {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -347,8 +347,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: nil, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: nil, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -470,9 +470,9 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacekube-system--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacekube-system--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -613,9 +613,9 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacekube-system--detailed-exitcode"}: nil, - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacekube-system--detailed-exitcode--reset-values"}: nil, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -761,8 +761,8 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -910,8 +910,8 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -1036,9 +1036,9 @@ releases: selectors: []string{"name=serviceA"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "serviceA", Chart: "my/chart", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "serviceB", Chart: "my/chart", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "serviceC", Chart: "my/chart", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "serviceA", Chart: "my/chart", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "serviceB", Chart: "my/chart", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -1262,7 +1262,7 @@ releases: selectors: []string{"index=1"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {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 @@ -1328,7 +1328,7 @@ releases: selectors: []string{"name=foo"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {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 diff --git a/pkg/app/app_diff_test.go b/pkg/app/app_diff_test.go index cee33363..d9e06f70 100644 --- a/pkg/app/app_diff_test.go +++ b/pkg/app/app_diff_test.go @@ -187,8 +187,8 @@ releases: }, selectors: []string{"app=test"}, diffed: []exectest.Release{ - {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, - {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, + {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, + {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, }, }) }) @@ -203,10 +203,10 @@ releases: selectors: []string{"app=test"}, diffed: []exectest.Release{ // TODO: Turned out we can't differentiate needs vs transitive needs in this case :thinking: - {Name: "logging", Flags: []string{"--kube-context", "default", "--namespace", "kube-system"}}, - {Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system"}}, - {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, - {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, + {Name: "logging", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}}, + {Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}}, + {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, + {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, }, }) }) @@ -220,10 +220,10 @@ releases: error: ``, selectors: []string{"app=test"}, diffed: []exectest.Release{ - {Name: "logging", Flags: []string{"--kube-context", "default", "--namespace", "kube-system"}}, - {Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system"}}, - {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, - {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, + {Name: "logging", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}}, + {Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}}, + {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, + {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, }, }) }) @@ -236,7 +236,7 @@ releases: }, selectors: []string{"name=test2"}, diffed: []exectest.Release{ - {Name: "test2", Flags: []string{"--kube-context", "default"}}, + {Name: "test2", Flags: []string{"--kube-context", "default", "--reset-values"}}, }, }) }) @@ -249,8 +249,8 @@ releases: }, selectors: []string{"name=test3"}, diffed: []exectest.Release{ - {Name: "test2", Flags: []string{"--kube-context", "default"}}, - {Name: "test3", Flags: []string{"--kube-context", "default"}}, + {Name: "test2", Flags: []string{"--kube-context", "default", "--reset-values"}}, + {Name: "test3", Flags: []string{"--kube-context", "default", "--reset-values"}}, }, }) }) @@ -264,8 +264,8 @@ releases: }, selectors: []string{"name=test3"}, diffed: []exectest.Release{ - {Name: "test2", Flags: []string{"--kube-context", "default"}}, - {Name: "test3", Flags: []string{"--kube-context", "default"}}, + {Name: "test2", Flags: []string{"--kube-context", "default", "--reset-values"}}, + {Name: "test3", Flags: []string{"--kube-context", "default", "--reset-values"}}, }, }) }) @@ -279,7 +279,7 @@ releases: }, selectors: []string{"name=test2"}, diffed: []exectest.Release{ - {Name: "test2", Flags: []string{"--kube-context", "default"}}, + {Name: "test2", Flags: []string{"--kube-context", "default", "--reset-values"}}, }, }) }) @@ -293,8 +293,8 @@ releases: }, selectors: []string{"name=test3"}, diffed: []exectest.Release{ - {Name: "test2", Flags: []string{"--kube-context", "default"}}, - {Name: "test3", Flags: []string{"--kube-context", "default"}}, + {Name: "test2", Flags: []string{"--kube-context", "default", "--reset-values"}}, + {Name: "test3", Flags: []string{"--kube-context", "default", "--reset-values"}}, }, }) }) @@ -307,8 +307,8 @@ releases: }, selectors: []string{"app=test"}, diffed: []exectest.Release{ - {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default", "--no-hooks"}}, - {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--no-hooks"}}, + {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default", "--no-hooks", "--reset-values"}}, + {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--no-hooks", "--reset-values"}}, }, }) }) @@ -444,7 +444,7 @@ foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default `, }, diffed: []exectest.Release{ - {Name: "a", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, + {Name: "a", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, }, }) }) diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index 0a88965e..bdc26997 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -2330,6 +2330,7 @@ type applyConfig struct { logger *zap.SugaredLogger wait bool waitForJobs bool + reuseValues bool // template-only options includeCRDs, skipTests bool @@ -2465,6 +2466,10 @@ func (a applyConfig) OutputDirTemplate() string { return a.outputDirTemplate } +func (a applyConfig) ReuseValues() bool { + return a.reuseValues +} + type depsConfig struct { skipRepos bool includeTransitiveNeeds bool @@ -2840,16 +2845,16 @@ releases: }, diffs: map[exectest.DiffKey]error{ // noop on frontend-v2 - {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--kube-contextdefault--detailed-exitcode"}: nil, + {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil, // install frontend-v3 - {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, // upgrades - {Name: "logging", Chart: "charts/fluent-bit", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "front-proxy", Chart: "stable/envoy", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "servicemesh", Chart: "charts/istio", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "database", Chart: "charts/mysql", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "backend-v2", Chart: "charts/backend", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "logging", Chart: "charts/fluent-bit", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "front-proxy", Chart: "stable/envoy", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "servicemesh", Chart: "charts/istio", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "database", Chart: "charts/mysql", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "backend-v2", Chart: "charts/backend", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 @@ -2915,7 +2920,7 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: nil, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV2ListFlags}: ``, @@ -2946,9 +2951,9 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{ @@ -2982,9 +2987,9 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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}: ``, @@ -3093,8 +3098,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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}: ``, @@ -3197,8 +3202,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{}}, @@ -3220,8 +3225,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{}}, @@ -3244,8 +3249,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{}}, @@ -3268,8 +3273,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{}}, @@ -3293,8 +3298,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}}, @@ -3318,8 +3323,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{"--kube-context", "default", "--namespace", "ns1"}}, @@ -3346,8 +3351,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {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"}}, @@ -3373,8 +3378,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {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"}}, @@ -3472,8 +3477,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -3505,8 +3510,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -3540,8 +3545,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -3574,8 +3579,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -3608,8 +3613,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -3642,8 +3647,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -3698,8 +3703,8 @@ releases: }, selectors: []string{"app=test"}, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, @@ -3836,8 +3841,8 @@ releases: }, selectors: []string{"app=test"}, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--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 @@ -4033,8 +4038,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -4097,8 +4102,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -4165,8 +4170,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, diff --git a/pkg/app/config.go b/pkg/app/config.go index 265aebb0..583c42ad 100644 --- a/pkg/app/config.go +++ b/pkg/app/config.go @@ -75,6 +75,7 @@ type ApplyConfigProvider interface { concurrencyConfig interactive loggingConfig + valuesControlMode } type SyncConfigProvider interface { @@ -97,6 +98,7 @@ type SyncConfigProvider interface { concurrencyConfig interactive loggingConfig + valuesControlMode } type DiffConfigProvider interface { @@ -126,6 +128,7 @@ type DiffConfigProvider interface { DiffOutput() string concurrencyConfig + valuesControlMode } type DeleteConfigProvider interface { @@ -243,3 +246,8 @@ type ListConfigProvider interface { } type CacheConfigProvider interface{} + +// when enable reuse-values, reuse the last release's values and merge in any overrides values. +type valuesControlMode interface { + ReuseValues() bool +} diff --git a/pkg/app/diff_nokubectx_test.go b/pkg/app/diff_nokubectx_test.go index 87809c3b..e48dfad4 100644 --- a/pkg/app/diff_nokubectx_test.go +++ b/pkg/app/diff_nokubectx_test.go @@ -105,16 +105,16 @@ releases: error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ // noop on frontend-v2 - {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--detailed-exitcode"}: nil, + {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--detailed-exitcode--reset-values"}: nil, // install frontend-v3 - {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, // upgrades - {Name: "logging", Chart: "charts/fluent-bit", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "front-proxy", Chart: "stable/envoy", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "servicemesh", Chart: "charts/istio", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "database", Chart: "charts/mysql", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "backend-v2", Chart: "charts/backend", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "logging", Chart: "charts/fluent-bit", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "front-proxy", Chart: "stable/envoy", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "servicemesh", Chart: "charts/istio", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "database", Chart: "charts/mysql", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "backend-v2", Chart: "charts/backend", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 @@ -151,7 +151,7 @@ releases: detailedExitcode: true, error: "", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: nil, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: nil, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: ``, @@ -184,9 +184,9 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "baz", Chart: "mychart3", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -213,8 +213,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -235,8 +235,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -258,8 +258,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -281,8 +281,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -305,8 +305,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -329,8 +329,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -356,8 +356,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {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{}, }, @@ -382,8 +382,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {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 @@ -408,8 +408,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--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 @@ -437,8 +437,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -469,8 +469,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -503,8 +503,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -535,8 +535,8 @@ releases: detailedExitcode: true, error: `in ./helmfile.yaml: release "foo" depends on "bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -570,8 +570,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -605,8 +605,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -637,8 +637,8 @@ releases: detailedExitcode: true, error: `in ./helmfile.yaml: release "bar" depends on "foo" which does not match the selectors. Please add a selector like "--selector name=foo", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -669,8 +669,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -720,8 +720,8 @@ releases: selectors: []string{"app=test"}, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--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 @@ -761,8 +761,8 @@ releases: selectors: []string{"app=test"}, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--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 @@ -960,8 +960,8 @@ releases: }, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "mychart3", Flags: "--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, diff --git a/pkg/app/diff_test.go b/pkg/app/diff_test.go index aa8c3472..b01ea9bc 100644 --- a/pkg/app/diff_test.go +++ b/pkg/app/diff_test.go @@ -41,6 +41,7 @@ type diffConfig struct { detailedExitcode bool interactive bool skipDiffOnInstall bool + reuseValues bool logger *zap.SugaredLogger } @@ -144,6 +145,10 @@ func (a diffConfig) RetainValuesFiles() bool { return a.retainValuesFiles } +func (a diffConfig) ReuseValues() bool { + return a.reuseValues +} + func TestDiff(t *testing.T) { type flags struct { skipNeeds bool @@ -236,16 +241,16 @@ releases: error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ // noop on frontend-v2 - {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--kube-contextdefault--detailed-exitcode"}: nil, + {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil, // install frontend-v3 - {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, // upgrades - {Name: "logging", Chart: "charts/fluent-bit", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "front-proxy", Chart: "stable/envoy", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "servicemesh", Chart: "charts/istio", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "database", Chart: "charts/mysql", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "backend-v2", Chart: "charts/backend", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "logging", Chart: "charts/fluent-bit", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "front-proxy", Chart: "stable/envoy", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "servicemesh", Chart: "charts/istio", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "database", Chart: "charts/mysql", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "backend-v2", Chart: "charts/backend", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 @@ -282,7 +287,7 @@ releases: detailedExitcode: true, error: "", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: nil, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV2ListFlags}: ``, @@ -315,9 +320,9 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -344,8 +349,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -369,8 +374,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contexthello/world--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contexthello/world--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contexthello/world--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contexthello/world--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -396,8 +401,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "releaseB", Chart: "mychart2", Flags: "--kube-contextarn:aws:eks:us-east-1:1234567890:cluster/myekscluster--namespacenamespaceA--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "releaseA", Chart: "mychart1", Flags: "--kube-contextarn:aws:eks:us-east-1:1234567890:cluster/myekscluster--namespacenamespaceA--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "releaseB", Chart: "mychart2", Flags: "--kube-contextarn:aws:eks:us-east-1:1234567890:cluster/myekscluster--namespacenamespaceA--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "releaseA", Chart: "mychart1", Flags: "--kube-contextarn:aws:eks:us-east-1:1234567890:cluster/myekscluster--namespacenamespaceA--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -418,8 +423,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -441,8 +446,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -464,8 +469,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -488,8 +493,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: 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{}, }, @@ -515,8 +520,8 @@ releases: 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"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {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{}, }, @@ -541,8 +546,8 @@ releases: 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"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {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 @@ -567,8 +572,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: 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{}, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -596,8 +601,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -628,8 +633,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -662,8 +667,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -694,8 +699,8 @@ releases: detailedExitcode: true, error: `in ./helmfile.yaml: release "default//foo" depends on "default//bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -729,8 +734,8 @@ releases: }, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -764,8 +769,8 @@ releases: }, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -796,8 +801,8 @@ releases: detailedExitcode: true, error: `in ./helmfile.yaml: release "default//bar" depends on "default//foo" which does not match the selectors. Please add a selector like "--selector name=foo", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -831,8 +836,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -866,8 +871,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -898,8 +903,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {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 @@ -949,8 +954,8 @@ releases: selectors: []string{"app=test"}, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--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 @@ -990,8 +995,8 @@ releases: selectors: []string{"app=test"}, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--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 @@ -1190,8 +1195,8 @@ releases: detailedExitcode: true, selectors: []string{"name=foo"}, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -1253,8 +1258,8 @@ releases: }, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, diff --git a/pkg/config/apply.go b/pkg/config/apply.go index a3a48106..2f6fc3da 100644 --- a/pkg/config/apply.go +++ b/pkg/config/apply.go @@ -52,6 +52,8 @@ type ApplyOptions struct { Wait bool // WaitForJobs is true if the helm command should wait for the jobs to be completed WaitForJobs bool + // ReuseValues is true if the helm command should reuse the values + ReuseValues bool } // NewApply creates a new Apply @@ -202,3 +204,8 @@ func (a *ApplyImpl) Wait() bool { func (a *ApplyImpl) WaitForJobs() bool { return a.ApplyOptions.WaitForJobs } + +// ReuseValues returns the ReuseValues. +func (a *ApplyImpl) ReuseValues() bool { + return a.ApplyOptions.ReuseValues +} diff --git a/pkg/config/diff.go b/pkg/config/diff.go index 211ad062..b84909ca 100644 --- a/pkg/config/diff.go +++ b/pkg/config/diff.go @@ -38,6 +38,8 @@ type DiffOptions struct { Context int // Output is output flag Output string + // ReuseValues is true if the helm command should reuse the values + ReuseValues bool } // NewDiffOptions creates a new Apply @@ -162,3 +164,8 @@ func (t *DiffImpl) SuppressDiff() bool { func (t *DiffImpl) SuppressSecrets() bool { return t.DiffOptions.SuppressSecrets } + +// ReuseValues returns the ReuseValues. +func (t *DiffImpl) ReuseValues() bool { + return t.DiffOptions.ReuseValues +} diff --git a/pkg/config/sync.go b/pkg/config/sync.go index bf228877..b849442e 100644 --- a/pkg/config/sync.go +++ b/pkg/config/sync.go @@ -26,6 +26,8 @@ type SyncOptions struct { Wait bool // WaitForJobs is the wait for jobs flag WaitForJobs bool + // ReuseValues is true if the helm command should reuse the values + ReuseValues bool } // NewSyncOptions creates a new Apply @@ -110,3 +112,8 @@ func (t *SyncImpl) Wait() bool { func (t *SyncImpl) WaitForJobs() bool { return t.SyncOptions.WaitForJobs } + +// ReuseValues returns the ReuseValues. +func (t *SyncImpl) ReuseValues() bool { + return t.SyncOptions.ReuseValues +} diff --git a/pkg/helmexec/exec.go b/pkg/helmexec/exec.go index 2221eb26..6c4d1332 100644 --- a/pkg/helmexec/exec.go +++ b/pkg/helmexec/exec.go @@ -241,7 +241,7 @@ func (helm *execer) SyncRelease(context HelmContext, name, chart string, flags . env["HELM_TILLER_HISTORY_MAX"] = strconv.Itoa(context.HistoryMax) } - out, err := helm.exec(append(append(preArgs, "upgrade", "--install", "--reset-values", name, chart), flags...), env, nil) + out, err := helm.exec(append(append(preArgs, "upgrade", "--install", name, chart), flags...), env, nil) helm.write(nil, out) return err } @@ -422,7 +422,7 @@ func (helm *execer) DiffRelease(context HelmContext, name, chart string, suppres enableLiveOutput := false overrideEnableLiveOutput = &enableLiveOutput } - out, err := helm.exec(append(append(preArgs, "diff", "upgrade", "--reset-values", "--allow-unreleased", name, chart), flags...), env, overrideEnableLiveOutput) + out, err := helm.exec(append(append(preArgs, "diff", "upgrade", "--allow-unreleased", name, chart), flags...), env, overrideEnableLiveOutput) // Do our best to write STDOUT only when diff existed // Unfortunately, this works only when you run helmfile with `--detailed-exitcode` detailedExitcodeEnabled := false diff --git a/pkg/helmexec/exec_test.go b/pkg/helmexec/exec_test.go index 116e5b04..fa711f79 100644 --- a/pkg/helmexec/exec_test.go +++ b/pkg/helmexec/exec_test.go @@ -254,7 +254,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 --reset-values release chart --timeout 10 --wait --wait-for-jobs +exec: helm --kube-context dev upgrade --install release chart --timeout 10 --wait --wait-for-jobs ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -266,7 +266,7 @@ exec: helm --kube-context dev upgrade --install --reset-values release chart --t buffer.Reset() err = helm.SyncRelease(HelmContext{}, "release", "chart") expected = `Upgrading release=release, chart=chart -exec: helm --kube-context dev upgrade --install --reset-values release chart +exec: helm --kube-context dev upgrade --install release chart ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -278,7 +278,7 @@ exec: helm --kube-context dev upgrade --install --reset-values 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 --reset-values release https://example_user:example_password@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) @@ -295,7 +295,7 @@ func Test_SyncReleaseTillerless(t *testing.T) { 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 --reset-values release chart --timeout 10 --wait --wait-for-jobs +exec: helm --kube-context dev tiller run foo -- helm upgrade --install release chart --timeout 10 --wait --wait-for-jobs ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -460,7 +460,7 @@ func Test_DiffRelease(t *testing.T) { helm := MockExecer(logger, "dev") err := helm.DiffRelease(HelmContext{}, "release", "chart", false, "--timeout 10", "--wait", "--wait-for-jobs") expected := `Comparing release=release, chart=chart -exec: helm --kube-context dev diff upgrade --reset-values --allow-unreleased release chart --timeout 10 --wait --wait-for-jobs +exec: helm --kube-context dev diff upgrade --allow-unreleased release chart --timeout 10 --wait --wait-for-jobs ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -472,7 +472,7 @@ exec: helm --kube-context dev diff upgrade --reset-values --allow-unreleased rel buffer.Reset() err = helm.DiffRelease(HelmContext{}, "release", "chart", false) expected = `Comparing release=release, chart=chart -exec: helm --kube-context dev diff upgrade --reset-values --allow-unreleased release chart +exec: helm --kube-context dev diff upgrade --allow-unreleased release chart ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -484,7 +484,7 @@ exec: helm --kube-context dev diff upgrade --reset-values --allow-unreleased rel buffer.Reset() err = helm.DiffRelease(HelmContext{}, "release", "https://example_user:example_password@repo.example.com/chart.tgz", false) expected = `Comparing release=release, chart=https://example_user:xxxxx@repo.example.com/chart.tgz -exec: helm --kube-context dev diff upgrade --reset-values --allow-unreleased release https://example_user:example_password@repo.example.com/chart.tgz +exec: helm --kube-context dev diff upgrade --allow-unreleased release https://example_user:example_password@repo.example.com/chart.tgz ` if err != nil { t.Errorf("unexpected error: %v", err) @@ -500,7 +500,7 @@ func Test_DiffReleaseTillerless(t *testing.T) { 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 --reset-values --allow-unreleased release chart --timeout 10 --wait --wait-for-jobs +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) diff --git a/pkg/state/state.go b/pkg/state/state.go index bc8bef13..15a2faf5 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -572,6 +572,12 @@ func (st *HelmState) prepareSyncReleases(helm helmexec.Interface, additionalValu flags = append(flags, "--wait-for-jobs") } + if opts.ReuseValues { + flags = append(flags, "--reuse-values") + } else { + flags = append(flags, "--reset-values") + } + if len(errs) > 0 { results <- syncPrepareResult{errors: errs, files: files} continue @@ -648,6 +654,7 @@ type SyncOpts struct { SkipCRDs bool Wait bool WaitForJobs bool + ReuseValues bool } type SyncOpt interface{ Apply(*SyncOpts) } @@ -1623,10 +1630,10 @@ type diffPrepareResult struct { upgradeDueToSkippedDiff bool } -func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValues []string, concurrency int, detailedExitCode bool, includeTests bool, suppress []string, suppressSecrets bool, showSecrets bool, noHooks bool, opt ...DiffOpt) ([]diffPrepareResult, []error) { - opts := &DiffOpts{} - for _, o := range opt { - o.Apply(opts) +func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValues []string, concurrency int, detailedExitCode bool, includeTests bool, suppress []string, suppressSecrets bool, showSecrets bool, noHooks bool, opts ...DiffOpt) ([]diffPrepareResult, []error) { + opt := &DiffOpts{} + for _, o := range opts { + o.Apply(opt) } mu := &sync.Mutex{} @@ -1688,7 +1695,7 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu st.ApplyOverrides(release) - if opts.SkipDiffOnInstall && !isInstalled(release) { + if opt.SkipDiffOnInstall && !isInstalled(release) { results <- diffPrepareResult{release: release, upgradeDueToSkippedDiff: true} continue } @@ -1740,22 +1747,28 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu flags = append(flags, "--no-hooks") } - if opts.NoColor { + if opt.NoColor { flags = append(flags, "--no-color") - } else if opts.Color { + } else if opt.Color { flags = append(flags, "--color") } - if opts.Context > 0 { - flags = append(flags, "--context", fmt.Sprintf("%d", opts.Context)) + if opt.Context > 0 { + flags = append(flags, "--context", fmt.Sprintf("%d", opt.Context)) } - if opts.Output != "" { - flags = append(flags, "--output", opts.Output) + if opt.Output != "" { + flags = append(flags, "--output", opt.Output) } - if opts.Set != nil { - for _, s := range opts.Set { + if opt.ReuseValues { + flags = append(flags, "--reuse-values") + } else { + flags = append(flags, "--reset-values") + } + + if opt.Set != nil { + for _, s := range opt.Set { flags = append(flags, "--set", s) } } @@ -1839,6 +1852,7 @@ type DiffOpts struct { Set []string SkipCleanup bool SkipDiffOnInstall bool + ReuseValues bool } func (o *DiffOpts) Apply(opts *DiffOpts) { diff --git a/pkg/state/state_test.go b/pkg/state/state_test.go index bef732f1..0ff073c4 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -1061,7 +1061,7 @@ func TestHelmState_SyncReleases(t *testing.T) { }, }, helm: &exectest.Helm{}, - wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{}}}, + wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}}, }, { name: "with tiller args", @@ -1073,7 +1073,7 @@ func TestHelmState_SyncReleases(t *testing.T) { }, }, helm: &exectest.Helm{}, - wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--tiller-namespace", "tillerns"}}}, + wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--tiller-namespace", "tillerns", "--reset-values"}}}, }, { name: "escaped values", @@ -1094,7 +1094,7 @@ func TestHelmState_SyncReleases(t *testing.T) { }, }, helm: &exectest.Helm{}, - wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--set", "someList=a\\,b\\,c", "--set", "json=\\{\"name\": \"john\"\\}"}}}, + wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--set", "someList=a\\,b\\,c", "--set", "json=\\{\"name\": \"john\"\\}", "--reset-values"}}}, }, { name: "set single value from file", @@ -1119,7 +1119,7 @@ func TestHelmState_SyncReleases(t *testing.T) { }, }, helm: &exectest.Helm{}, - wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--set", "foo=FOO", "--set-file", "bar=path/to/bar", "--set", "baz=BAZ"}}}, + wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--set", "foo=FOO", "--set-file", "bar=path/to/bar", "--set", "baz=BAZ", "--reset-values"}}}, }, { name: "set single array value in an array", @@ -1139,7 +1139,7 @@ func TestHelmState_SyncReleases(t *testing.T) { }, }, helm: &exectest.Helm{}, - wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--set", "foo.bar[0]={A,B}"}}}, + wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--set", "foo.bar[0]={A,B}", "--reset-values"}}}, }, } for i := range tests { @@ -1554,7 +1554,7 @@ func TestHelmState_DiffReleases(t *testing.T) { }, }, helm: &exectest.Helm{}, - wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{}}}, + wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}}, }, { name: "with tiller args", @@ -1566,7 +1566,7 @@ func TestHelmState_DiffReleases(t *testing.T) { }, }, helm: &exectest.Helm{}, - wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--tiller-namespace", "tillerns"}}}, + wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--tiller-namespace", "tillerns", "--reset-values"}}}, }, { name: "escaped values", @@ -1588,7 +1588,7 @@ func TestHelmState_DiffReleases(t *testing.T) { }, helm: &exectest.Helm{}, wantReleases: []exectest.Release{ - {Name: "releaseName", Flags: []string{"--set", "someList=a\\,b\\,c", "--set", "json=\\{\"name\": \"john\"\\}"}}, + {Name: "releaseName", Flags: []string{"--set", "someList=a\\,b\\,c", "--set", "json=\\{\"name\": \"john\"\\}", "--reset-values"}}, }, }, { @@ -1615,7 +1615,7 @@ func TestHelmState_DiffReleases(t *testing.T) { }, helm: &exectest.Helm{}, wantReleases: []exectest.Release{ - {Name: "releaseName", Flags: []string{"--set", "foo=FOO", "--set-file", "bar=path/to/bar", "--set", "baz=BAZ"}}, + {Name: "releaseName", Flags: []string{"--set", "foo=FOO", "--set-file", "bar=path/to/bar", "--set", "baz=BAZ", "--reset-values"}}, }, }, { @@ -1637,7 +1637,7 @@ func TestHelmState_DiffReleases(t *testing.T) { }, helm: &exectest.Helm{}, wantReleases: []exectest.Release{ - {Name: "releaseName", Flags: []string{"--set", "foo.bar[0]={A,B}"}}, + {Name: "releaseName", Flags: []string{"--set", "foo.bar[0]={A,B}", "--reset-values"}}, }, }, } @@ -2446,6 +2446,102 @@ func TestHelmState_Delete(t *testing.T) { } } +func TestDiffpareSyncReleases(t *testing.T) { + tests := []struct { + name string + flags []string + diffOptions *DiffOpts + }{ + { + name: "reuse-values", + flags: []string{"--reuse-values"}, + diffOptions: &DiffOpts{ + ReuseValues: true, + }, + }, + { + name: "reset-values", + flags: []string{"--reset-values"}, + diffOptions: &DiffOpts{}, + }, + } + + for _, tt := range tests { + release := ReleaseSpec{ + Name: tt.name, + } + releases := []ReleaseSpec{ + release, + } + state := &HelmState{ + ReleaseSetSpec: ReleaseSetSpec{ + Releases: releases, + }, + logger: logger, + valsRuntime: valsRuntime, + } + helm := &exectest.Helm{ + Lists: map[exectest.ListKey]string{}, + } + results, es := state.prepareDiffReleases(helm, []string{}, 1, false, false, []string{}, false, false, false, tt.diffOptions) + + require.Len(t, es, 0) + require.Len(t, results, 1) + + r := results[0] + + require.Equal(t, tt.flags, r.flags) + } +} + +func TestPrepareSyncReleases(t *testing.T) { + tests := []struct { + name string + flags []string + syncOptions *SyncOpts + }{ + { + name: "reuse-values", + flags: []string{"--reuse-values"}, + syncOptions: &SyncOpts{ + ReuseValues: true, + }, + }, + { + name: "reset-values", + flags: []string{"--reset-values"}, + syncOptions: &SyncOpts{}, + }, + } + + for _, tt := range tests { + release := ReleaseSpec{ + Name: tt.name, + } + releases := []ReleaseSpec{ + release, + } + state := &HelmState{ + ReleaseSetSpec: ReleaseSetSpec{ + Releases: releases, + }, + logger: logger, + valsRuntime: valsRuntime, + } + helm := &exectest.Helm{ + Lists: map[exectest.ListKey]string{}, + } + results, es := state.prepareSyncReleases(helm, []string{}, 1, tt.syncOptions) + + require.Len(t, es, 0) + require.Len(t, results, 1) + + r := results[0] + + require.Equal(t, tt.flags, r.flags) + } +} + func TestReverse(t *testing.T) { num := 8 st := &HelmState{}