feat: Allow to skip diff output on release base (#906)
* feat: Allow to skip diff output on release base Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de> * fix tests Signed-off-by: Jan-Otto Kröpke <joe@cloudeteer.de> * feat: Allow to skip diff output on release base Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de> * fix tests Signed-off-by: Jan-Otto Kröpke <joe@cloudeteer.de> * s/skipDiffOutput/suppressDiff Signed-off-by: Jan-Otto Kröpke <joe@cloudeteer.de> * s/skipDiffOutput/suppressDiff Signed-off-by: Jan-Otto Kröpke <joe@cloudeteer.de> * fix tests Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de> --------- Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de> Signed-off-by: Jan-Otto Kröpke <joe@cloudeteer.de>
This commit is contained in:
		
							parent
							
								
									b51842bb61
								
							
						
					
					
						commit
						d1c260af5f
					
				|  | @ -315,6 +315,9 @@ releases: | ||||||
|     cascade: "background" |     cascade: "background" | ||||||
|     # insecureSkipTLSVerify is true if the TLS verification should be skipped when fetching remote chart |     # insecureSkipTLSVerify is true if the TLS verification should be skipped when fetching remote chart | ||||||
|     insecureSkipTLSVerify: false |     insecureSkipTLSVerify: false | ||||||
|  |     # suppressDiff skip the helm diff output. Useful for charts which produces large not helpful diff, default: false | ||||||
|  |     suppressDiff: false | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|   # Local chart example |   # Local chart example | ||||||
|   - name: grafana                            # name of this release |   - name: grafana                            # name of this release | ||||||
|  |  | ||||||
|  | @ -365,6 +365,9 @@ type ReleaseSpec struct { | ||||||
| 
 | 
 | ||||||
| 	// Inherit is used to inherit a release template from a release or another release template
 | 	// Inherit is used to inherit a release template from a release or another release template
 | ||||||
| 	Inherit Inherits `yaml:"inherit,omitempty"` | 	Inherit Inherits `yaml:"inherit,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// SuppressDiff skip the helm diff output. Useful for charts which produces large not helpful diff.
 | ||||||
|  | 	SuppressDiff *bool `yaml:"suppressDiff,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *Inherits) UnmarshalYAML(unmarshal func(any) error) error { | func (r *Inherits) UnmarshalYAML(unmarshal func(any) error) error { | ||||||
|  | @ -1690,6 +1693,7 @@ type diffPrepareResult struct { | ||||||
| 	errors                  []*ReleaseError | 	errors                  []*ReleaseError | ||||||
| 	files                   []string | 	files                   []string | ||||||
| 	upgradeDueToSkippedDiff bool | 	upgradeDueToSkippedDiff bool | ||||||
|  | 	suppressDiff            bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (st *HelmState) commonDiffFlags(detailedExitCode bool, stripTrailingCR bool, includeTests bool, suppress []string, suppressSecrets bool, showSecrets bool, noHooks bool, opt *DiffOpts) []string { | func (st *HelmState) commonDiffFlags(detailedExitCode bool, stripTrailingCR bool, includeTests bool, suppress []string, suppressSecrets bool, showSecrets bool, noHooks bool, opt *DiffOpts) []string { | ||||||
|  | @ -1814,8 +1818,13 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu | ||||||
| 
 | 
 | ||||||
| 				st.ApplyOverrides(release) | 				st.ApplyOverrides(release) | ||||||
| 
 | 
 | ||||||
|  | 				suppressDiff := false | ||||||
|  | 				if release.SuppressDiff != nil && *release.SuppressDiff { | ||||||
|  | 					suppressDiff = true | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
| 				if opt.SkipDiffOnInstall && !isInstalled(release) { | 				if opt.SkipDiffOnInstall && !isInstalled(release) { | ||||||
| 					results <- diffPrepareResult{release: release, upgradeDueToSkippedDiff: true} | 					results <- diffPrepareResult{release: release, upgradeDueToSkippedDiff: true, suppressDiff: suppressDiff} | ||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
|  | @ -1849,9 +1858,9 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu | ||||||
| 					for i, e := range errs { | 					for i, e := range errs { | ||||||
| 						rsErrs[i] = newReleaseFailedError(release, e) | 						rsErrs[i] = newReleaseFailedError(release, e) | ||||||
| 					} | 					} | ||||||
| 					results <- diffPrepareResult{errors: rsErrs, files: files} | 					results <- diffPrepareResult{errors: rsErrs, files: files, suppressDiff: suppressDiff} | ||||||
| 				} else { | 				} else { | ||||||
| 					results <- diffPrepareResult{release: release, flags: flags, errors: []*ReleaseError{}, files: files} | 					results <- diffPrepareResult{release: release, flags: flags, errors: []*ReleaseError{}, files: files, suppressDiff: suppressDiff} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  | @ -1976,9 +1985,15 @@ func (st *HelmState) DiffReleases(helm helmexec.Interface, additionalValues []st | ||||||
| 				flags := prep.flags | 				flags := prep.flags | ||||||
| 				release := prep.release | 				release := prep.release | ||||||
| 				buf := &bytes.Buffer{} | 				buf := &bytes.Buffer{} | ||||||
|  | 
 | ||||||
|  | 				releaseSuppressDiff := suppressDiff | ||||||
|  | 				if prep.suppressDiff { | ||||||
|  | 					releaseSuppressDiff = true | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
| 				if prep.upgradeDueToSkippedDiff { | 				if prep.upgradeDueToSkippedDiff { | ||||||
| 					results <- diffResult{release, &ReleaseError{ReleaseSpec: release, err: nil, Code: HelmDiffExitCodeChanged}, buf} | 					results <- diffResult{release, &ReleaseError{ReleaseSpec: release, err: nil, Code: HelmDiffExitCodeChanged}, buf} | ||||||
| 				} else if err := helm.DiffRelease(st.createHelmContextWithWriter(release, buf), release.Name, normalizeChart(st.basePath, release.ChartPathOrName()), suppressDiff, flags...); err != nil { | 				} else if err := helm.DiffRelease(st.createHelmContextWithWriter(release, buf), release.Name, normalizeChart(st.basePath, release.ChartPathOrName()), releaseSuppressDiff, flags...); err != nil { | ||||||
| 					switch e := err.(type) { | 					switch e := err.(type) { | ||||||
| 					case helmexec.ExitError: | 					case helmexec.ExitError: | ||||||
| 						// Propagate any non-zero exit status from the external command like `helm` that is failed under the hood
 | 						// Propagate any non-zero exit status from the external command like `helm` that is failed under the hood
 | ||||||
|  |  | ||||||
|  | @ -38,39 +38,39 @@ func TestGenerateID(t *testing.T) { | ||||||
| 	run(testcase{ | 	run(testcase{ | ||||||
| 		subject: "baseline", | 		subject: "baseline", | ||||||
| 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, | 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, | ||||||
| 		want:    "foo-values-58d856f487", | 		want:    "foo-values-7884dc8d7c", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	run(testcase{ | 	run(testcase{ | ||||||
| 		subject: "different bytes content", | 		subject: "different bytes content", | ||||||
| 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, | 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, | ||||||
| 		data:    []byte(`{"k":"v"}`), | 		data:    []byte(`{"k":"v"}`), | ||||||
| 		want:    "foo-values-6d96d874f6", | 		want:    "foo-values-67d6bbf498", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	run(testcase{ | 	run(testcase{ | ||||||
| 		subject: "different map content", | 		subject: "different map content", | ||||||
| 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, | 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, | ||||||
| 		data:    map[string]any{"k": "v"}, | 		data:    map[string]any{"k": "v"}, | ||||||
| 		want:    "foo-values-77cdb7dbb6", | 		want:    "foo-values-5d86d867b", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	run(testcase{ | 	run(testcase{ | ||||||
| 		subject: "different chart", | 		subject: "different chart", | ||||||
| 		release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"}, | 		release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"}, | ||||||
| 		want:    "foo-values-66cd476bbb", | 		want:    "foo-values-5c47fc4b6d", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	run(testcase{ | 	run(testcase{ | ||||||
| 		subject: "different name", | 		subject: "different name", | ||||||
| 		release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"}, | 		release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"}, | ||||||
| 		want:    "bar-values-5d59565d5b", | 		want:    "bar-values-7c87d9b8b", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	run(testcase{ | 	run(testcase{ | ||||||
| 		subject: "specific ns", | 		subject: "specific ns", | ||||||
| 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"}, | 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"}, | ||||||
| 		want:    "myns-foo-values-644b7dfd78", | 		want:    "myns-foo-values-7fbc456bb4", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	for id, n := range ids { | 	for id, n := range ids { | ||||||
|  |  | ||||||
|  | @ -0,0 +1,36 @@ | ||||||
|  | releases: | ||||||
|  | - name: foo | ||||||
|  |   chart: ../../../charts/raw | ||||||
|  |   values: | ||||||
|  |   - templates: | ||||||
|  |     - | | ||||||
|  |       apiVersion: v1 | ||||||
|  |       kind: ConfigMap | ||||||
|  |       metadata: | ||||||
|  |         name: {{`{{ .Release.Name }}`}}-1 | ||||||
|  |         namespace: {{`{{ .Release.Namespace }}`}} | ||||||
|  |       data: | ||||||
|  |         foo: FOO | ||||||
|  |     dep: | ||||||
|  |       templates: | ||||||
|  |       - | | ||||||
|  |         apiVersion: v1 | ||||||
|  |         kind: ConfigMap | ||||||
|  |         metadata: | ||||||
|  |           name: {{`{{ .Release.Name }}`}}-2 | ||||||
|  |           namespace: {{`{{ .Release.Namespace }}`}} | ||||||
|  |         data: | ||||||
|  |           bar: BAR | ||||||
|  |   suppressDiff: true | ||||||
|  | - name: baz | ||||||
|  |   chart: ../../../charts/raw | ||||||
|  |   values: | ||||||
|  |   - templates: | ||||||
|  |     - | | ||||||
|  |       apiVersion: v1 | ||||||
|  |       kind: ConfigMap | ||||||
|  |       metadata: | ||||||
|  |         name: {{`{{ .Release.Name }}`}}-3 | ||||||
|  |         namespace: {{`{{ .Release.Namespace }}`}} | ||||||
|  |       data: | ||||||
|  |         baz: BAZ | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | Building dependency release=foo, chart=../../../charts/raw | ||||||
|  | Building dependency release=baz, chart=../../../charts/raw | ||||||
|  | Comparing release=foo, chart=../../../charts/raw | ||||||
|  | 
 | ||||||
|  | Comparing release=baz, chart=../../../charts/raw | ||||||
|  | ******************** | ||||||
|  | 
 | ||||||
|  | 	Release was not present in Helm.  Diff will show entire contents as new. | ||||||
|  | 
 | ||||||
|  | ******************** | ||||||
|  | helmfile-tests, baz-3, ConfigMap (v1) has been added: | ||||||
|  | - | ||||||
|  | + # Source: raw/templates/resources.yaml | ||||||
|  | + apiVersion: v1 | ||||||
|  | + kind: ConfigMap | ||||||
|  | + metadata: | ||||||
|  | +   name: baz-3 | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + data: | ||||||
|  | +   baz: BAZ | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | Live output is enabled | ||||||
|  | Building dependency release=foo, chart=../../../charts/raw | ||||||
|  | Building dependency release=baz, chart=../../../charts/raw | ||||||
|  | ******************** | ||||||
|  | 
 | ||||||
|  | 	Release was not present in Helm.  Diff will show entire contents as new. | ||||||
|  | 
 | ||||||
|  | ******************** | ||||||
|  | helmfile-tests, baz-3, ConfigMap (v1) has been added: | ||||||
|  | - | ||||||
|  | + # Source: raw/templates/resources.yaml | ||||||
|  | + apiVersion: v1 | ||||||
|  | + kind: ConfigMap | ||||||
|  | + metadata: | ||||||
|  | +   name: baz-3 | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + data: | ||||||
|  | +   baz: BAZ | ||||||
|  | Comparing release=foo, chart=../../../charts/raw | ||||||
|  | Comparing release=baz, chart=../../../charts/raw | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | Building dependency release=foo, chart=../../../charts/raw | ||||||
|  | Building dependency release=baz, chart=../../../charts/raw | ||||||
|  | Templating release=foo, chart=../../../charts/raw | ||||||
|  | --- | ||||||
|  | # Source: raw/templates/resources.yaml | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: ConfigMap | ||||||
|  | metadata: | ||||||
|  |   name: foo-1 | ||||||
|  |   namespace: helmfile-tests | ||||||
|  | data: | ||||||
|  |   foo: FOO | ||||||
|  | 
 | ||||||
|  | Templating release=baz, chart=../../../charts/raw | ||||||
|  | --- | ||||||
|  | # Source: raw/templates/resources.yaml | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: ConfigMap | ||||||
|  | metadata: | ||||||
|  |   name: baz-3 | ||||||
|  |   namespace: helmfile-tests | ||||||
|  | data: | ||||||
|  |   baz: BAZ | ||||||
|  | @ -0,0 +1,25 @@ | ||||||
|  | Live output is enabled | ||||||
|  | Building dependency release=foo, chart=../../../charts/raw | ||||||
|  | Building dependency release=baz, chart=../../../charts/raw | ||||||
|  | Templating release=foo, chart=../../../charts/raw | ||||||
|  | --- | ||||||
|  | # Source: raw/templates/resources.yaml | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: ConfigMap | ||||||
|  | metadata: | ||||||
|  |   name: foo-1 | ||||||
|  |   namespace: helmfile-tests | ||||||
|  | data: | ||||||
|  |   foo: FOO | ||||||
|  | 
 | ||||||
|  | Templating release=baz, chart=../../../charts/raw | ||||||
|  | --- | ||||||
|  | # Source: raw/templates/resources.yaml | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: ConfigMap | ||||||
|  | metadata: | ||||||
|  |   name: baz-3 | ||||||
|  |   namespace: helmfile-tests | ||||||
|  | data: | ||||||
|  |   baz: BAZ | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue