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:
Jan-Otto Kröpke 2023-07-02 01:50:59 +02:00 committed by GitHub
parent b51842bb61
commit d1c260af5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 152 additions and 10 deletions

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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