From d1c260af5fe6514819bfd35713847e63ba8894f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Otto=20Kr=C3=B6pke?= Date: Sun, 2 Jul 2023 01:50:59 +0200 Subject: [PATCH] feat: Allow to skip diff output on release base (#906) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Allow to skip diff output on release base Signed-off-by: Jan-Otto Kröpke * fix tests Signed-off-by: Jan-Otto Kröpke * feat: Allow to skip diff output on release base Signed-off-by: Jan-Otto Kröpke * fix tests Signed-off-by: Jan-Otto Kröpke * s/skipDiffOutput/suppressDiff Signed-off-by: Jan-Otto Kröpke * s/skipDiffOutput/suppressDiff Signed-off-by: Jan-Otto Kröpke * fix tests Signed-off-by: Jan-Otto Kröpke --------- Signed-off-by: Jan-Otto Kröpke Signed-off-by: Jan-Otto Kröpke --- docs/index.md | 3 ++ pkg/state/state.go | 23 +++++++++--- pkg/state/temp_test.go | 12 +++---- .../skip-diff-output/input/helmfile.yaml | 36 +++++++++++++++++++ .../skip-diff-output/output/diff-result | 20 +++++++++++ .../skip-diff-output/output/diff-result-live | 20 +++++++++++ .../skip-diff-output/output/template-result | 23 ++++++++++++ .../output/template-result-live | 25 +++++++++++++ 8 files changed, 152 insertions(+), 10 deletions(-) create mode 100644 test/integration/test-cases/skip-diff-output/input/helmfile.yaml create mode 100644 test/integration/test-cases/skip-diff-output/output/diff-result create mode 100644 test/integration/test-cases/skip-diff-output/output/diff-result-live create mode 100644 test/integration/test-cases/skip-diff-output/output/template-result create mode 100644 test/integration/test-cases/skip-diff-output/output/template-result-live diff --git a/docs/index.md b/docs/index.md index a24cccb9..f6314246 100644 --- a/docs/index.md +++ b/docs/index.md @@ -315,6 +315,9 @@ releases: cascade: "background" # insecureSkipTLSVerify is true if the TLS verification should be skipped when fetching remote chart insecureSkipTLSVerify: false + # suppressDiff skip the helm diff output. Useful for charts which produces large not helpful diff, default: false + suppressDiff: false + # Local chart example - name: grafana # name of this release diff --git a/pkg/state/state.go b/pkg/state/state.go index 8bb778d6..24c6b5dd 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -365,6 +365,9 @@ type ReleaseSpec struct { // Inherit is used to inherit a release template from a release or another release template 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 { @@ -1690,6 +1693,7 @@ type diffPrepareResult struct { errors []*ReleaseError files []string 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 { @@ -1814,8 +1818,13 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu st.ApplyOverrides(release) + suppressDiff := false + if release.SuppressDiff != nil && *release.SuppressDiff { + suppressDiff = true + } + if opt.SkipDiffOnInstall && !isInstalled(release) { - results <- diffPrepareResult{release: release, upgradeDueToSkippedDiff: true} + results <- diffPrepareResult{release: release, upgradeDueToSkippedDiff: true, suppressDiff: suppressDiff} continue } @@ -1849,9 +1858,9 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu for i, e := range errs { rsErrs[i] = newReleaseFailedError(release, e) } - results <- diffPrepareResult{errors: rsErrs, files: files} + results <- diffPrepareResult{errors: rsErrs, files: files, suppressDiff: suppressDiff} } 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 release := prep.release buf := &bytes.Buffer{} + + releaseSuppressDiff := suppressDiff + if prep.suppressDiff { + releaseSuppressDiff = true + } + if prep.upgradeDueToSkippedDiff { 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) { case helmexec.ExitError: // Propagate any non-zero exit status from the external command like `helm` that is failed under the hood diff --git a/pkg/state/temp_test.go b/pkg/state/temp_test.go index dc54adca..283d95e6 100644 --- a/pkg/state/temp_test.go +++ b/pkg/state/temp_test.go @@ -38,39 +38,39 @@ func TestGenerateID(t *testing.T) { run(testcase{ subject: "baseline", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, - want: "foo-values-58d856f487", + want: "foo-values-7884dc8d7c", }) run(testcase{ subject: "different bytes content", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, data: []byte(`{"k":"v"}`), - want: "foo-values-6d96d874f6", + want: "foo-values-67d6bbf498", }) run(testcase{ subject: "different map content", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, data: map[string]any{"k": "v"}, - want: "foo-values-77cdb7dbb6", + want: "foo-values-5d86d867b", }) run(testcase{ subject: "different chart", release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"}, - want: "foo-values-66cd476bbb", + want: "foo-values-5c47fc4b6d", }) run(testcase{ subject: "different name", release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"}, - want: "bar-values-5d59565d5b", + want: "bar-values-7c87d9b8b", }) run(testcase{ subject: "specific ns", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"}, - want: "myns-foo-values-644b7dfd78", + want: "myns-foo-values-7fbc456bb4", }) for id, n := range ids { diff --git a/test/integration/test-cases/skip-diff-output/input/helmfile.yaml b/test/integration/test-cases/skip-diff-output/input/helmfile.yaml new file mode 100644 index 00000000..37240246 --- /dev/null +++ b/test/integration/test-cases/skip-diff-output/input/helmfile.yaml @@ -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 diff --git a/test/integration/test-cases/skip-diff-output/output/diff-result b/test/integration/test-cases/skip-diff-output/output/diff-result new file mode 100644 index 00000000..5b5f1171 --- /dev/null +++ b/test/integration/test-cases/skip-diff-output/output/diff-result @@ -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 diff --git a/test/integration/test-cases/skip-diff-output/output/diff-result-live b/test/integration/test-cases/skip-diff-output/output/diff-result-live new file mode 100644 index 00000000..b4434b9d --- /dev/null +++ b/test/integration/test-cases/skip-diff-output/output/diff-result-live @@ -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 diff --git a/test/integration/test-cases/skip-diff-output/output/template-result b/test/integration/test-cases/skip-diff-output/output/template-result new file mode 100644 index 00000000..fd83a14e --- /dev/null +++ b/test/integration/test-cases/skip-diff-output/output/template-result @@ -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 diff --git a/test/integration/test-cases/skip-diff-output/output/template-result-live b/test/integration/test-cases/skip-diff-output/output/template-result-live new file mode 100644 index 00000000..62819544 --- /dev/null +++ b/test/integration/test-cases/skip-diff-output/output/template-result-live @@ -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 +