feat: add reuse-values args for diff apply and sync (#411)
Signed-off-by: yxxhero <aiopsclub@163.com> Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
		
							parent
							
								
									8f7796b260
								
							
						
					
					
						commit
						21c28ca6d0
					
				|  | @ -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.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.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.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 | 	return cmd | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -49,6 +49,7 @@ func NewDiffCmd(globalCfg *config.GlobalImpl) *cobra.Command { | ||||||
| 	f.StringVar(&diffOptions.Output, "output", "", "output format for diff plugin") | 	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.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.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 | 	return cmd | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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.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.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.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 | 	return cmd | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1288,6 +1288,7 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) { | ||||||
| 		Set:               c.Set(), | 		Set:               c.Set(), | ||||||
| 		SkipCleanup:       c.RetainValuesFiles() || c.SkipCleanup(), | 		SkipCleanup:       c.RetainValuesFiles() || c.SkipCleanup(), | ||||||
| 		SkipDiffOnInstall: c.SkipDiffOnInstall(), | 		SkipDiffOnInstall: c.SkipDiffOnInstall(), | ||||||
|  | 		ReuseValues:       c.ReuseValues(), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	infoMsg, releasesToBeUpdated, releasesToBeDeleted, errs := r.diff(false, detailedExitCode, c, diffOpts) | 	infoMsg, releasesToBeUpdated, releasesToBeDeleted, errs := r.diff(false, detailedExitCode, c, diffOpts) | ||||||
|  | @ -1412,14 +1413,15 @@ Do you really want to apply? | ||||||
| 
 | 
 | ||||||
| 				subst.Releases = rs | 				subst.Releases = rs | ||||||
| 
 | 
 | ||||||
| 				syncOpts := state.SyncOpts{ | 				syncOpts := &state.SyncOpts{ | ||||||
| 					Set:         c.Set(), | 					Set:         c.Set(), | ||||||
| 					SkipCleanup: c.RetainValuesFiles() || c.SkipCleanup(), | 					SkipCleanup: c.RetainValuesFiles() || c.SkipCleanup(), | ||||||
| 					SkipCRDs:    c.SkipCRDs(), | 					SkipCRDs:    c.SkipCRDs(), | ||||||
| 					Wait:        c.Wait(), | 					Wait:        c.Wait(), | ||||||
| 					WaitForJobs: c.WaitForJobs(), | 					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 { | 			if len(updateErrs) > 0 { | ||||||
|  | @ -1529,6 +1531,7 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) | ||||||
| 			NoColor:           c.NoColor(), | 			NoColor:           c.NoColor(), | ||||||
| 			Set:               c.Set(), | 			Set:               c.Set(), | ||||||
| 			SkipDiffOnInstall: c.SkipDiffOnInstall(), | 			SkipDiffOnInstall: c.SkipDiffOnInstall(), | ||||||
|  | 			ReuseValues:       c.ReuseValues(), | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		filtered := &Run{ | 		filtered := &Run{ | ||||||
|  | @ -1792,6 +1795,7 @@ Do you really want to sync? | ||||||
| 					SkipCRDs:    c.SkipCRDs(), | 					SkipCRDs:    c.SkipCRDs(), | ||||||
| 					Wait:        c.Wait(), | 					Wait:        c.Wait(), | ||||||
| 					WaitForJobs: c.WaitForJobs(), | 					WaitForJobs: c.WaitForJobs(), | ||||||
|  | 					ReuseValues: c.ReuseValues(), | ||||||
| 				} | 				} | ||||||
| 				return subst.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency(), opts) | 				return subst.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency(), opts) | ||||||
| 			})) | 			})) | ||||||
|  |  | ||||||
|  | @ -191,7 +191,7 @@ releases: | ||||||
| 				{Name: "foo"}, | 				{Name: "foo"}, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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: "", | 			error: "", | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -222,7 +222,7 @@ releases: | ||||||
| 				{Name: "foo"}, | 				{Name: "foo"}, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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: "", | 			error: "", | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -253,7 +253,7 @@ releases: | ||||||
| 				{Name: "foo"}, | 				{Name: "foo"}, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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: "", | 			error: "", | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// 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"}, | 			selectors: []string{"app=test"}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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: "", | 			error: "", | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -329,8 +329,8 @@ releases: | ||||||
| 				{Name: "bar"}, | 				{Name: "bar"}, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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}, | ||||||
| 				{Name: "bar", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, | 				{Name: "bar", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			error: "", | 			error: "", | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -376,7 +376,7 @@ releases: | ||||||
| 				{Name: "foo"}, | 				{Name: "foo"}, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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: "", | 			error: "", | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// 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"}, | 				{Name: "foo"}, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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: "", | 			error: "", | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// 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"}, | 				{Name: "foo"}, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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: "", | 			error: "", | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  |  | ||||||
|  | @ -205,8 +205,8 @@ releases: | ||||||
| 				{Name: "my-release", Flags: []string{"--namespace", "default"}}, | 				{Name: "my-release", Flags: []string{"--namespace", "default"}}, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -345,8 +345,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       nil, | 				{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
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
| 			concurrency: 1, | 			concurrency: 1, | ||||||
|  | @ -468,9 +468,9 @@ releases: | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			upgraded:  []exectest.Release{}, | 			upgraded:  []exectest.Release{}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespacekube-system--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"}:                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"}:                      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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -611,9 +611,9 @@ releases: | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			upgraded:  []exectest.Release{}, | 			upgraded:  []exectest.Release{}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespacekube-system--detailed-exitcode"}: nil, | 				{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"}:                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"}:                      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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{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{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
| 			concurrency: 1, | 			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{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
| 			concurrency: 1, | 			concurrency: 1, | ||||||
|  |  | ||||||
|  | @ -207,8 +207,8 @@ releases: | ||||||
| 				{Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, | 				{Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -347,8 +347,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       nil, | 				{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
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
| 			concurrency: 1, | 			concurrency: 1, | ||||||
|  | @ -470,9 +470,9 @@ releases: | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			upgraded:  []exectest.Release{}, | 			upgraded:  []exectest.Release{}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacekube-system--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"}:                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"}:                      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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -613,9 +613,9 @@ releases: | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			upgraded:  []exectest.Release{}, | 			upgraded:  []exectest.Release{}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacekube-system--detailed-exitcode"}: nil, | 				{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"}:                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"}:                      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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{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{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
| 			concurrency: 1, | 			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{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
| 			concurrency: 1, | 			concurrency: 1, | ||||||
|  | @ -1036,9 +1036,9 @@ releases: | ||||||
| 			selectors: []string{"name=serviceA"}, | 			selectors: []string{"name=serviceA"}, | ||||||
| 			upgraded:  []exectest.Release{}, | 			upgraded:  []exectest.Release{}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "serviceA", 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"}: 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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^serviceA$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^serviceA$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -1262,7 +1262,7 @@ releases: | ||||||
| 			selectors: []string{"index=1"}, | 			selectors: []string{"index=1"}, | ||||||
| 			upgraded:  []exectest.Release{}, | 			upgraded:  []exectest.Release{}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -1328,7 +1328,7 @@ releases: | ||||||
| 			selectors: []string{"name=foo"}, | 			selectors: []string{"name=foo"}, | ||||||
| 			upgraded:  []exectest.Release{}, | 			upgraded:  []exectest.Release{}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  |  | ||||||
|  | @ -187,8 +187,8 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			diffed: []exectest.Release{ | 			diffed: []exectest.Release{ | ||||||
| 				{Name: "external-secrets", 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"}}, | 				{Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, | ||||||
| 			}, | 			}, | ||||||
| 		}) | 		}) | ||||||
| 	}) | 	}) | ||||||
|  | @ -203,10 +203,10 @@ releases: | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			diffed: []exectest.Release{ | 			diffed: []exectest.Release{ | ||||||
| 				// TODO: Turned out we can't differentiate needs vs transitive needs in this case :thinking:
 | 				// 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: "logging", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}}, | ||||||
| 				{Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system"}}, | 				{Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}}, | ||||||
| 				{Name: "external-secrets", 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"}}, | 				{Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, | ||||||
| 			}, | 			}, | ||||||
| 		}) | 		}) | ||||||
| 	}) | 	}) | ||||||
|  | @ -220,10 +220,10 @@ releases: | ||||||
| 			error:     ``, | 			error:     ``, | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			diffed: []exectest.Release{ | 			diffed: []exectest.Release{ | ||||||
| 				{Name: "logging", Flags: []string{"--kube-context", "default", "--namespace", "kube-system"}}, | 				{Name: "logging", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}}, | ||||||
| 				{Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system"}}, | 				{Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}}, | ||||||
| 				{Name: "external-secrets", 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"}}, | 				{Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, | ||||||
| 			}, | 			}, | ||||||
| 		}) | 		}) | ||||||
| 	}) | 	}) | ||||||
|  | @ -236,7 +236,7 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			selectors: []string{"name=test2"}, | 			selectors: []string{"name=test2"}, | ||||||
| 			diffed: []exectest.Release{ | 			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"}, | 			selectors: []string{"name=test3"}, | ||||||
| 			diffed: []exectest.Release{ | 			diffed: []exectest.Release{ | ||||||
| 				{Name: "test2", Flags: []string{"--kube-context", "default"}}, | 				{Name: "test2", Flags: []string{"--kube-context", "default", "--reset-values"}}, | ||||||
| 				{Name: "test3", Flags: []string{"--kube-context", "default"}}, | 				{Name: "test3", Flags: []string{"--kube-context", "default", "--reset-values"}}, | ||||||
| 			}, | 			}, | ||||||
| 		}) | 		}) | ||||||
| 	}) | 	}) | ||||||
|  | @ -264,8 +264,8 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			selectors: []string{"name=test3"}, | 			selectors: []string{"name=test3"}, | ||||||
| 			diffed: []exectest.Release{ | 			diffed: []exectest.Release{ | ||||||
| 				{Name: "test2", Flags: []string{"--kube-context", "default"}}, | 				{Name: "test2", Flags: []string{"--kube-context", "default", "--reset-values"}}, | ||||||
| 				{Name: "test3", Flags: []string{"--kube-context", "default"}}, | 				{Name: "test3", Flags: []string{"--kube-context", "default", "--reset-values"}}, | ||||||
| 			}, | 			}, | ||||||
| 		}) | 		}) | ||||||
| 	}) | 	}) | ||||||
|  | @ -279,7 +279,7 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			selectors: []string{"name=test2"}, | 			selectors: []string{"name=test2"}, | ||||||
| 			diffed: []exectest.Release{ | 			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"}, | 			selectors: []string{"name=test3"}, | ||||||
| 			diffed: []exectest.Release{ | 			diffed: []exectest.Release{ | ||||||
| 				{Name: "test2", Flags: []string{"--kube-context", "default"}}, | 				{Name: "test2", Flags: []string{"--kube-context", "default", "--reset-values"}}, | ||||||
| 				{Name: "test3", Flags: []string{"--kube-context", "default"}}, | 				{Name: "test3", Flags: []string{"--kube-context", "default", "--reset-values"}}, | ||||||
| 			}, | 			}, | ||||||
| 		}) | 		}) | ||||||
| 	}) | 	}) | ||||||
|  | @ -307,8 +307,8 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			diffed: []exectest.Release{ | 			diffed: []exectest.Release{ | ||||||
| 				{Name: "external-secrets", 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"}}, | 				{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{ | 			diffed: []exectest.Release{ | ||||||
| 				{Name: "a", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, | 				{Name: "a", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}}, | ||||||
| 			}, | 			}, | ||||||
| 		}) | 		}) | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
|  | @ -2330,6 +2330,7 @@ type applyConfig struct { | ||||||
| 	logger                 *zap.SugaredLogger | 	logger                 *zap.SugaredLogger | ||||||
| 	wait                   bool | 	wait                   bool | ||||||
| 	waitForJobs            bool | 	waitForJobs            bool | ||||||
|  | 	reuseValues            bool | ||||||
| 
 | 
 | ||||||
| 	// template-only options
 | 	// template-only options
 | ||||||
| 	includeCRDs, skipTests       bool | 	includeCRDs, skipTests       bool | ||||||
|  | @ -2465,6 +2466,10 @@ func (a applyConfig) OutputDirTemplate() string { | ||||||
| 	return a.outputDirTemplate | 	return a.outputDirTemplate | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (a applyConfig) ReuseValues() bool { | ||||||
|  | 	return a.reuseValues | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type depsConfig struct { | type depsConfig struct { | ||||||
| 	skipRepos              bool | 	skipRepos              bool | ||||||
| 	includeTransitiveNeeds bool | 	includeTransitiveNeeds bool | ||||||
|  | @ -2840,16 +2845,16 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				// noop on frontend-v2
 | 				// 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
 | 				// 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
 | 				// upgrades
 | ||||||
| 				{Name: "logging", Chart: "charts/fluent-bit", 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"}:             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"}:             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"}:                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"}:            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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				// delete frontend-v1 and backend-v1
 | 				// delete frontend-v1 and backend-v1
 | ||||||
|  | @ -2915,7 +2920,7 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: ``, | 				{Filter: "^foo$", Flags: helmV2ListFlags}: ``, | ||||||
|  | @ -2946,9 +2951,9 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "foo", Chart: "stable/mychart1", 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"}: 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"}: 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{}, | 			lists: map[exectest.ListKey]string{}, | ||||||
| 			upgraded: []exectest.Release{ | 			upgraded: []exectest.Release{ | ||||||
|  | @ -2982,9 +2987,9 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "baz", Chart: "stable/mychart3", Flags: "--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"}: 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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: ``, | 				{Filter: "^foo$", Flags: helmV2ListFlags}: ``, | ||||||
|  | @ -3093,8 +3098,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "baz", Chart: "stable/mychart3", Flags: "--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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: ``, | 				{Filter: "^foo$", Flags: helmV2ListFlags}: ``, | ||||||
|  | @ -3197,8 +3202,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{ | 			upgraded: []exectest.Release{ | ||||||
| 				{Name: "bar", Flags: []string{}}, | 				{Name: "bar", Flags: []string{}}, | ||||||
|  | @ -3220,8 +3225,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{ | 			upgraded: []exectest.Release{ | ||||||
| 				{Name: "foo", Flags: []string{}}, | 				{Name: "foo", Flags: []string{}}, | ||||||
|  | @ -3244,8 +3249,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{ | 			upgraded: []exectest.Release{ | ||||||
| 				{Name: "bar", Flags: []string{}}, | 				{Name: "bar", Flags: []string{}}, | ||||||
|  | @ -3268,8 +3273,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{ | 			upgraded: []exectest.Release{ | ||||||
| 				{Name: "foo", Flags: []string{}}, | 				{Name: "foo", Flags: []string{}}, | ||||||
|  | @ -3293,8 +3298,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacens2--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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{ | 			upgraded: []exectest.Release{ | ||||||
| 				{Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}}, | 				{Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}}, | ||||||
|  | @ -3318,8 +3323,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--namespacens2--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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{ | 			upgraded: []exectest.Release{ | ||||||
| 				{Name: "foo", Flags: []string{"--kube-context", "default", "--namespace", "ns1"}}, | 				{Name: "foo", Flags: []string{"--kube-context", "default", "--namespace", "ns1"}}, | ||||||
|  | @ -3346,8 +3351,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--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"}: 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{ | 			upgraded: []exectest.Release{ | ||||||
| 				{Name: "bar", Flags: []string{"--tiller-namespace", "tns2", "--kube-context", "default", "--namespace", "ns2"}}, | 				{Name: "bar", Flags: []string{"--tiller-namespace", "tns2", "--kube-context", "default", "--namespace", "ns2"}}, | ||||||
|  | @ -3373,8 +3378,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--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"}: 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{ | 			upgraded: []exectest.Release{ | ||||||
| 				{Name: "foo", Flags: []string{"--tiller-namespace", "tns1", "--kube-context", "default", "--namespace", "ns1"}}, | 				{Name: "foo", Flags: []string{"--tiller-namespace", "tns1", "--kube-context", "default", "--namespace", "ns1"}}, | ||||||
|  | @ -3472,8 +3477,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -3505,8 +3510,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -3540,8 +3545,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -3574,8 +3579,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -3608,8 +3613,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -3642,8 +3647,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "stable/mychart2", 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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -3698,8 +3703,8 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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{ | 			upgraded: []exectest.Release{ | ||||||
| 				{Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, | 				{Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, | ||||||
|  | @ -3836,8 +3841,8 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			selectors: []string{"app=test"}, | 			selectors: []string{"app=test"}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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{}, | 			upgraded: []exectest.Release{}, | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// 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{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--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"}:               helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}:               helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists:       map[exectest.ListKey]string{}, | 			lists:       map[exectest.ListKey]string{}, | ||||||
| 			upgraded:    []exectest.Release{}, | 			upgraded:    []exectest.Release{}, | ||||||
|  | @ -4097,8 +4102,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--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"}:               helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}:               helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists:       map[exectest.ListKey]string{}, | 			lists:       map[exectest.ListKey]string{}, | ||||||
| 			upgraded:    []exectest.Release{}, | 			upgraded:    []exectest.Release{}, | ||||||
|  | @ -4165,8 +4170,8 @@ releases: | ||||||
| `, | `, | ||||||
| 			}, | 			}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--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"}:               helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}:               helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists:       map[exectest.ListKey]string{}, | 			lists:       map[exectest.ListKey]string{}, | ||||||
| 			upgraded:    []exectest.Release{}, | 			upgraded:    []exectest.Release{}, | ||||||
|  |  | ||||||
|  | @ -75,6 +75,7 @@ type ApplyConfigProvider interface { | ||||||
| 	concurrencyConfig | 	concurrencyConfig | ||||||
| 	interactive | 	interactive | ||||||
| 	loggingConfig | 	loggingConfig | ||||||
|  | 	valuesControlMode | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type SyncConfigProvider interface { | type SyncConfigProvider interface { | ||||||
|  | @ -97,6 +98,7 @@ type SyncConfigProvider interface { | ||||||
| 	concurrencyConfig | 	concurrencyConfig | ||||||
| 	interactive | 	interactive | ||||||
| 	loggingConfig | 	loggingConfig | ||||||
|  | 	valuesControlMode | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type DiffConfigProvider interface { | type DiffConfigProvider interface { | ||||||
|  | @ -126,6 +128,7 @@ type DiffConfigProvider interface { | ||||||
| 	DiffOutput() string | 	DiffOutput() string | ||||||
| 
 | 
 | ||||||
| 	concurrencyConfig | 	concurrencyConfig | ||||||
|  | 	valuesControlMode | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type DeleteConfigProvider interface { | type DeleteConfigProvider interface { | ||||||
|  | @ -243,3 +246,8 @@ type ListConfigProvider interface { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type CacheConfigProvider 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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -105,16 +105,16 @@ releases: | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				// noop on frontend-v2
 | 				// 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
 | 				// 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
 | 				// upgrades
 | ||||||
| 				{Name: "logging", Chart: "charts/fluent-bit", 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"}:             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"}:             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"}:                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"}:            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"}: helmexec.ExitError{Code: 2}, | 				{Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				// delete frontend-v1 and backend-v1
 | 				// delete frontend-v1 and backend-v1
 | ||||||
|  | @ -151,7 +151,7 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "", | 			error:            "", | ||||||
| 			diffs: map[exectest.DiffKey]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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: ``, | 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: ``, | ||||||
|  | @ -184,9 +184,9 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "foo", Chart: "mychart1", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 				{Name: "baz", Chart: "mychart3", Flags: "--detailed-exitcode"}: helmexec.ExitError{Code: 2}, | 				{Name: "baz", Chart: "mychart3", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists:       map[exectest.ListKey]string{}, | 			lists:       map[exectest.ListKey]string{}, | ||||||
| 			upgraded:    []exectest.Release{}, | 			upgraded:    []exectest.Release{}, | ||||||
|  | @ -213,8 +213,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -235,8 +235,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -258,8 +258,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -281,8 +281,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -305,8 +305,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", Flags: "--namespacens2--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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -329,8 +329,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", Flags: "--namespacens2--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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -356,8 +356,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--namespacens2--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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -382,8 +382,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--namespacens2--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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -408,8 +408,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", Flags: "--namespacens2--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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -437,8 +437,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -469,8 +469,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -503,8 +503,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -535,8 +535,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			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`, | 			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{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -570,8 +570,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -605,8 +605,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -637,8 +637,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			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`, | 			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{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -669,8 +669,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -720,8 +720,8 @@ releases: | ||||||
| 			selectors:        []string{"app=test"}, | 			selectors:        []string{"app=test"}, | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       helmexec.ExitError{Code: 2}, | 				{Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}:       helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// 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"}, | 			selectors:        []string{"app=test"}, | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       helmexec.ExitError{Code: 2}, | 				{Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}:       helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -960,8 +960,8 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "baz", Chart: "mychart3", Flags: "--namespacens1--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"}:               helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}:               helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists:       map[exectest.ListKey]string{}, | 			lists:       map[exectest.ListKey]string{}, | ||||||
| 			upgraded:    []exectest.Release{}, | 			upgraded:    []exectest.Release{}, | ||||||
|  |  | ||||||
|  | @ -41,6 +41,7 @@ type diffConfig struct { | ||||||
| 	detailedExitcode       bool | 	detailedExitcode       bool | ||||||
| 	interactive            bool | 	interactive            bool | ||||||
| 	skipDiffOnInstall      bool | 	skipDiffOnInstall      bool | ||||||
|  | 	reuseValues            bool | ||||||
| 	logger                 *zap.SugaredLogger | 	logger                 *zap.SugaredLogger | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -144,6 +145,10 @@ func (a diffConfig) RetainValuesFiles() bool { | ||||||
| 	return a.retainValuesFiles | 	return a.retainValuesFiles | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (a diffConfig) ReuseValues() bool { | ||||||
|  | 	return a.reuseValues | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestDiff(t *testing.T) { | func TestDiff(t *testing.T) { | ||||||
| 	type flags struct { | 	type flags struct { | ||||||
| 		skipNeeds    bool | 		skipNeeds    bool | ||||||
|  | @ -236,16 +241,16 @@ releases: | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				// noop on frontend-v2
 | 				// 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
 | 				// 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
 | 				// upgrades
 | ||||||
| 				{Name: "logging", Chart: "charts/fluent-bit", 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"}:             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"}:             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"}:                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"}:            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"}: 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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				// delete frontend-v1 and backend-v1
 | 				// delete frontend-v1 and backend-v1
 | ||||||
|  | @ -282,7 +287,7 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "", | 			error:            "", | ||||||
| 			diffs: map[exectest.DiffKey]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{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: ``, | 				{Filter: "^foo$", Flags: helmV2ListFlags}: ``, | ||||||
|  | @ -315,9 +320,9 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "foo", Chart: "mychart1", 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"}: 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists:       map[exectest.ListKey]string{}, | 			lists:       map[exectest.ListKey]string{}, | ||||||
| 			upgraded:    []exectest.Release{}, | 			upgraded:    []exectest.Release{}, | ||||||
|  | @ -344,8 +349,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -369,8 +374,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contexthello/world--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -396,8 +401,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			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: "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"}: 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{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -418,8 +423,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -441,8 +446,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -464,8 +469,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -488,8 +493,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacens2--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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -515,8 +520,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--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"}: 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{}, | 			upgraded: []exectest.Release{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -541,8 +546,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--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"}: 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{}, | 			upgraded: []exectest.Release{}, | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -567,8 +572,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacens2--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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			upgraded: []exectest.Release{}, | 			upgraded: []exectest.Release{}, | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -596,8 +601,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -628,8 +633,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -662,8 +667,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -694,8 +699,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			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`, | 			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{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -729,8 +734,8 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			error: "Identified at least one change", | 			error: "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -764,8 +769,8 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			error: "Identified at least one change", | 			error: "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -796,8 +801,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			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`, | 			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{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -831,8 +836,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -866,8 +871,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -898,8 +903,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			error:            "Identified at least one change", | 			error:            "Identified at least one change", | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart2", 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"}: helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists: map[exectest.ListKey]string{ | 			lists: map[exectest.ListKey]string{ | ||||||
| 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | 				{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME	REVISION	UPDATED                 	STATUS  	CHART        	APP VERSION	NAMESPACE | ||||||
|  | @ -949,8 +954,8 @@ releases: | ||||||
| 			selectors:        []string{"app=test"}, | 			selectors:        []string{"app=test"}, | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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{}, | 			upgraded: []exectest.Release{}, | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// 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"}, | 			selectors:        []string{"app=test"}, | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "external-secrets", 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"}:       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{}, | 			upgraded: []exectest.Release{}, | ||||||
| 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | 			// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
 | ||||||
|  | @ -1190,8 +1195,8 @@ releases: | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			selectors:        []string{"name=foo"}, | 			selectors:        []string{"name=foo"}, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "bar", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--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"}:               helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}:               helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists:       map[exectest.ListKey]string{}, | 			lists:       map[exectest.ListKey]string{}, | ||||||
| 			upgraded:    []exectest.Release{}, | 			upgraded:    []exectest.Release{}, | ||||||
|  | @ -1253,8 +1258,8 @@ releases: | ||||||
| 			}, | 			}, | ||||||
| 			detailedExitcode: true, | 			detailedExitcode: true, | ||||||
| 			diffs: map[exectest.DiffKey]error{ | 			diffs: map[exectest.DiffKey]error{ | ||||||
| 				{Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--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"}:               helmexec.ExitError{Code: 2}, | 				{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}:               helmexec.ExitError{Code: 2}, | ||||||
| 			}, | 			}, | ||||||
| 			lists:       map[exectest.ListKey]string{}, | 			lists:       map[exectest.ListKey]string{}, | ||||||
| 			upgraded:    []exectest.Release{}, | 			upgraded:    []exectest.Release{}, | ||||||
|  |  | ||||||
|  | @ -52,6 +52,8 @@ type ApplyOptions struct { | ||||||
| 	Wait bool | 	Wait bool | ||||||
| 	// WaitForJobs is true if the helm command should wait for the jobs to be completed
 | 	// WaitForJobs is true if the helm command should wait for the jobs to be completed
 | ||||||
| 	WaitForJobs bool | 	WaitForJobs bool | ||||||
|  | 	// ReuseValues is true if the helm command should reuse the values
 | ||||||
|  | 	ReuseValues bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewApply creates a new Apply
 | // NewApply creates a new Apply
 | ||||||
|  | @ -202,3 +204,8 @@ func (a *ApplyImpl) Wait() bool { | ||||||
| func (a *ApplyImpl) WaitForJobs() bool { | func (a *ApplyImpl) WaitForJobs() bool { | ||||||
| 	return a.ApplyOptions.WaitForJobs | 	return a.ApplyOptions.WaitForJobs | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // ReuseValues returns the ReuseValues.
 | ||||||
|  | func (a *ApplyImpl) ReuseValues() bool { | ||||||
|  | 	return a.ApplyOptions.ReuseValues | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -38,6 +38,8 @@ type DiffOptions struct { | ||||||
| 	Context int | 	Context int | ||||||
| 	// Output is output flag
 | 	// Output is output flag
 | ||||||
| 	Output string | 	Output string | ||||||
|  | 	// ReuseValues is true if the helm command should reuse the values
 | ||||||
|  | 	ReuseValues bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewDiffOptions creates a new Apply
 | // NewDiffOptions creates a new Apply
 | ||||||
|  | @ -162,3 +164,8 @@ func (t *DiffImpl) SuppressDiff() bool { | ||||||
| func (t *DiffImpl) SuppressSecrets() bool { | func (t *DiffImpl) SuppressSecrets() bool { | ||||||
| 	return t.DiffOptions.SuppressSecrets | 	return t.DiffOptions.SuppressSecrets | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // ReuseValues returns the ReuseValues.
 | ||||||
|  | func (t *DiffImpl) ReuseValues() bool { | ||||||
|  | 	return t.DiffOptions.ReuseValues | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -26,6 +26,8 @@ type SyncOptions struct { | ||||||
| 	Wait bool | 	Wait bool | ||||||
| 	// WaitForJobs is the wait for jobs flag
 | 	// WaitForJobs is the wait for jobs flag
 | ||||||
| 	WaitForJobs bool | 	WaitForJobs bool | ||||||
|  | 	// ReuseValues is true if the helm command should reuse the values
 | ||||||
|  | 	ReuseValues bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewSyncOptions creates a new Apply
 | // NewSyncOptions creates a new Apply
 | ||||||
|  | @ -110,3 +112,8 @@ func (t *SyncImpl) Wait() bool { | ||||||
| func (t *SyncImpl) WaitForJobs() bool { | func (t *SyncImpl) WaitForJobs() bool { | ||||||
| 	return t.SyncOptions.WaitForJobs | 	return t.SyncOptions.WaitForJobs | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // ReuseValues returns the ReuseValues.
 | ||||||
|  | func (t *SyncImpl) ReuseValues() bool { | ||||||
|  | 	return t.SyncOptions.ReuseValues | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -241,7 +241,7 @@ func (helm *execer) SyncRelease(context HelmContext, name, chart string, flags . | ||||||
| 		env["HELM_TILLER_HISTORY_MAX"] = strconv.Itoa(context.HistoryMax) | 		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) | 	helm.write(nil, out) | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|  | @ -422,7 +422,7 @@ func (helm *execer) DiffRelease(context HelmContext, name, chart string, suppres | ||||||
| 		enableLiveOutput := false | 		enableLiveOutput := false | ||||||
| 		overrideEnableLiveOutput = &enableLiveOutput | 		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
 | 	// Do our best to write STDOUT only when diff existed
 | ||||||
| 	// Unfortunately, this works only when you run helmfile with `--detailed-exitcode`
 | 	// Unfortunately, this works only when you run helmfile with `--detailed-exitcode`
 | ||||||
| 	detailedExitcodeEnabled := false | 	detailedExitcodeEnabled := false | ||||||
|  |  | ||||||
|  | @ -254,7 +254,7 @@ func Test_SyncRelease(t *testing.T) { | ||||||
| 	helm := MockExecer(logger, "dev") | 	helm := MockExecer(logger, "dev") | ||||||
| 	err := helm.SyncRelease(HelmContext{}, "release", "chart", "--timeout 10", "--wait", "--wait-for-jobs") | 	err := helm.SyncRelease(HelmContext{}, "release", "chart", "--timeout 10", "--wait", "--wait-for-jobs") | ||||||
| 	expected := `Upgrading release=release, chart=chart | 	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 { | 	if err != nil { | ||||||
| 		t.Errorf("unexpected error: %v", err) | 		t.Errorf("unexpected error: %v", err) | ||||||
|  | @ -266,7 +266,7 @@ exec: helm --kube-context dev upgrade --install --reset-values release chart --t | ||||||
| 	buffer.Reset() | 	buffer.Reset() | ||||||
| 	err = helm.SyncRelease(HelmContext{}, "release", "chart") | 	err = helm.SyncRelease(HelmContext{}, "release", "chart") | ||||||
| 	expected = `Upgrading release=release, chart=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 { | 	if err != nil { | ||||||
| 		t.Errorf("unexpected error: %v", err) | 		t.Errorf("unexpected error: %v", err) | ||||||
|  | @ -278,7 +278,7 @@ exec: helm --kube-context dev upgrade --install --reset-values release chart | ||||||
| 	buffer.Reset() | 	buffer.Reset() | ||||||
| 	err = helm.SyncRelease(HelmContext{}, "release", "https://example_user:example_password@repo.example.com/chart.tgz") | 	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
 | 	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 { | 	if err != nil { | ||||||
| 		t.Errorf("unexpected error: %v", err) | 		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", | 	err := helm.SyncRelease(HelmContext{Tillerless: true, TillerNamespace: "foo"}, "release", "chart", | ||||||
| 		"--timeout 10", "--wait", "--wait-for-jobs") | 		"--timeout 10", "--wait", "--wait-for-jobs") | ||||||
| 	expected := `Upgrading release=release, chart=chart | 	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 { | 	if err != nil { | ||||||
| 		t.Errorf("unexpected error: %v", err) | 		t.Errorf("unexpected error: %v", err) | ||||||
|  | @ -460,7 +460,7 @@ func Test_DiffRelease(t *testing.T) { | ||||||
| 	helm := MockExecer(logger, "dev") | 	helm := MockExecer(logger, "dev") | ||||||
| 	err := helm.DiffRelease(HelmContext{}, "release", "chart", false, "--timeout 10", "--wait", "--wait-for-jobs") | 	err := helm.DiffRelease(HelmContext{}, "release", "chart", false, "--timeout 10", "--wait", "--wait-for-jobs") | ||||||
| 	expected := `Comparing release=release, chart=chart | 	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 { | 	if err != nil { | ||||||
| 		t.Errorf("unexpected error: %v", err) | 		t.Errorf("unexpected error: %v", err) | ||||||
|  | @ -472,7 +472,7 @@ exec: helm --kube-context dev diff upgrade --reset-values --allow-unreleased rel | ||||||
| 	buffer.Reset() | 	buffer.Reset() | ||||||
| 	err = helm.DiffRelease(HelmContext{}, "release", "chart", false) | 	err = helm.DiffRelease(HelmContext{}, "release", "chart", false) | ||||||
| 	expected = `Comparing release=release, chart=chart | 	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 { | 	if err != nil { | ||||||
| 		t.Errorf("unexpected error: %v", err) | 		t.Errorf("unexpected error: %v", err) | ||||||
|  | @ -484,7 +484,7 @@ exec: helm --kube-context dev diff upgrade --reset-values --allow-unreleased rel | ||||||
| 	buffer.Reset() | 	buffer.Reset() | ||||||
| 	err = helm.DiffRelease(HelmContext{}, "release", "https://example_user:example_password@repo.example.com/chart.tgz", false) | 	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
 | 	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 { | 	if err != nil { | ||||||
| 		t.Errorf("unexpected error: %v", err) | 		t.Errorf("unexpected error: %v", err) | ||||||
|  | @ -500,7 +500,7 @@ func Test_DiffReleaseTillerless(t *testing.T) { | ||||||
| 	helm := MockExecer(logger, "dev") | 	helm := MockExecer(logger, "dev") | ||||||
| 	err := helm.DiffRelease(HelmContext{Tillerless: true}, "release", "chart", false, "--timeout 10", "--wait", "--wait-for-jobs") | 	err := helm.DiffRelease(HelmContext{Tillerless: true}, "release", "chart", false, "--timeout 10", "--wait", "--wait-for-jobs") | ||||||
| 	expected := `Comparing release=release, chart=chart | 	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 { | 	if err != nil { | ||||||
| 		t.Errorf("unexpected error: %v", err) | 		t.Errorf("unexpected error: %v", err) | ||||||
|  |  | ||||||
|  | @ -572,6 +572,12 @@ func (st *HelmState) prepareSyncReleases(helm helmexec.Interface, additionalValu | ||||||
| 					flags = append(flags, "--wait-for-jobs") | 					flags = append(flags, "--wait-for-jobs") | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
|  | 				if opts.ReuseValues { | ||||||
|  | 					flags = append(flags, "--reuse-values") | ||||||
|  | 				} else { | ||||||
|  | 					flags = append(flags, "--reset-values") | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
| 				if len(errs) > 0 { | 				if len(errs) > 0 { | ||||||
| 					results <- syncPrepareResult{errors: errs, files: files} | 					results <- syncPrepareResult{errors: errs, files: files} | ||||||
| 					continue | 					continue | ||||||
|  | @ -648,6 +654,7 @@ type SyncOpts struct { | ||||||
| 	SkipCRDs    bool | 	SkipCRDs    bool | ||||||
| 	Wait        bool | 	Wait        bool | ||||||
| 	WaitForJobs bool | 	WaitForJobs bool | ||||||
|  | 	ReuseValues bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type SyncOpt interface{ Apply(*SyncOpts) } | type SyncOpt interface{ Apply(*SyncOpts) } | ||||||
|  | @ -1623,10 +1630,10 @@ type diffPrepareResult struct { | ||||||
| 	upgradeDueToSkippedDiff bool | 	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) { | 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) { | ||||||
| 	opts := &DiffOpts{} | 	opt := &DiffOpts{} | ||||||
| 	for _, o := range opt { | 	for _, o := range opts { | ||||||
| 		o.Apply(opts) | 		o.Apply(opt) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mu := &sync.Mutex{} | 	mu := &sync.Mutex{} | ||||||
|  | @ -1688,7 +1695,7 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu | ||||||
| 
 | 
 | ||||||
| 				st.ApplyOverrides(release) | 				st.ApplyOverrides(release) | ||||||
| 
 | 
 | ||||||
| 				if opts.SkipDiffOnInstall && !isInstalled(release) { | 				if opt.SkipDiffOnInstall && !isInstalled(release) { | ||||||
| 					results <- diffPrepareResult{release: release, upgradeDueToSkippedDiff: true} | 					results <- diffPrepareResult{release: release, upgradeDueToSkippedDiff: true} | ||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
|  | @ -1740,22 +1747,28 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu | ||||||
| 					flags = append(flags, "--no-hooks") | 					flags = append(flags, "--no-hooks") | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				if opts.NoColor { | 				if opt.NoColor { | ||||||
| 					flags = append(flags, "--no-color") | 					flags = append(flags, "--no-color") | ||||||
| 				} else if opts.Color { | 				} else if opt.Color { | ||||||
| 					flags = append(flags, "--color") | 					flags = append(flags, "--color") | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				if opts.Context > 0 { | 				if opt.Context > 0 { | ||||||
| 					flags = append(flags, "--context", fmt.Sprintf("%d", opts.Context)) | 					flags = append(flags, "--context", fmt.Sprintf("%d", opt.Context)) | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				if opts.Output != "" { | 				if opt.Output != "" { | ||||||
| 					flags = append(flags, "--output", opts.Output) | 					flags = append(flags, "--output", opt.Output) | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				if opts.Set != nil { | 				if opt.ReuseValues { | ||||||
| 					for _, s := range opts.Set { | 					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) | 						flags = append(flags, "--set", s) | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
|  | @ -1839,6 +1852,7 @@ type DiffOpts struct { | ||||||
| 	Set               []string | 	Set               []string | ||||||
| 	SkipCleanup       bool | 	SkipCleanup       bool | ||||||
| 	SkipDiffOnInstall bool | 	SkipDiffOnInstall bool | ||||||
|  | 	ReuseValues       bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (o *DiffOpts) Apply(opts *DiffOpts) { | func (o *DiffOpts) Apply(opts *DiffOpts) { | ||||||
|  |  | ||||||
|  | @ -1061,7 +1061,7 @@ func TestHelmState_SyncReleases(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm:         &exectest.Helm{}, | 			helm:         &exectest.Helm{}, | ||||||
| 			wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{}}}, | 			wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name: "with tiller args", | 			name: "with tiller args", | ||||||
|  | @ -1073,7 +1073,7 @@ func TestHelmState_SyncReleases(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm:         &exectest.Helm{}, | 			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", | 			name: "escaped values", | ||||||
|  | @ -1094,7 +1094,7 @@ func TestHelmState_SyncReleases(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm:         &exectest.Helm{}, | 			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", | 			name: "set single value from file", | ||||||
|  | @ -1119,7 +1119,7 @@ func TestHelmState_SyncReleases(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm:         &exectest.Helm{}, | 			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", | 			name: "set single array value in an array", | ||||||
|  | @ -1139,7 +1139,7 @@ func TestHelmState_SyncReleases(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm:         &exectest.Helm{}, | 			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 { | 	for i := range tests { | ||||||
|  | @ -1554,7 +1554,7 @@ func TestHelmState_DiffReleases(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm:         &exectest.Helm{}, | 			helm:         &exectest.Helm{}, | ||||||
| 			wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{}}}, | 			wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name: "with tiller args", | 			name: "with tiller args", | ||||||
|  | @ -1566,7 +1566,7 @@ func TestHelmState_DiffReleases(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			helm:         &exectest.Helm{}, | 			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", | 			name: "escaped values", | ||||||
|  | @ -1588,7 +1588,7 @@ func TestHelmState_DiffReleases(t *testing.T) { | ||||||
| 			}, | 			}, | ||||||
| 			helm: &exectest.Helm{}, | 			helm: &exectest.Helm{}, | ||||||
| 			wantReleases: []exectest.Release{ | 			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{}, | 			helm: &exectest.Helm{}, | ||||||
| 			wantReleases: []exectest.Release{ | 			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{}, | 			helm: &exectest.Helm{}, | ||||||
| 			wantReleases: []exectest.Release{ | 			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) { | func TestReverse(t *testing.T) { | ||||||
| 	num := 8 | 	num := 8 | ||||||
| 	st := &HelmState{} | 	st := &HelmState{} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue