From 05add478c187c98015a95ef4b559a6784f22c696 Mon Sep 17 00:00:00 2001 From: Emil Date: Wed, 5 Feb 2020 13:29:55 +0100 Subject: [PATCH] Add option to suppress diff on apply (#1092) * Add option to suppress diff on apply Add --supress-diff option on apply. Usable for fresh installs when a lot of output is produces by diff. Resolves #458 * fix tests for suppress-diff --- main.go | 8 ++++++++ pkg/app/app.go | 2 +- pkg/app/app_test.go | 7 ++++++- pkg/app/config.go | 2 ++ pkg/app/run.go | 2 +- pkg/exectest/helm.go | 2 +- pkg/helmexec/exec.go | 8 +++++--- pkg/helmexec/exec_test.go | 6 +++--- pkg/helmexec/helmexec.go | 2 +- pkg/state/state.go | 4 ++-- pkg/state/state_test.go | 4 ++-- 11 files changed, 32 insertions(+), 15 deletions(-) diff --git a/main.go b/main.go index bfdb3eb2..5881fb0f 100644 --- a/main.go +++ b/main.go @@ -338,6 +338,10 @@ func main() { Name: "suppress-secrets", Usage: "suppress secrets in the diff output. highly recommended to specify on CI/CD use-cases", }, + cli.BoolFlag{ + Name: "suppress-diff", + Usage: "suppress diff in the output. Usable in new installs", + }, cli.BoolFlag{ Name: "skip-deps", Usage: "skip running `helm repo update` and `helm dependency build`", @@ -538,6 +542,10 @@ func (c configImpl) SuppressSecrets() bool { return c.c.Bool("suppress-secrets") } +func (c configImpl) SuppressDiff() bool { + return c.c.Bool("suppress-diff") +} + // DeleteConfig func (c configImpl) Purge() bool { diff --git a/pkg/app/app.go b/pkg/app/app.go index ebb6cc70..b42a7b1b 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -701,7 +701,7 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, []error) { // TODO Better way to detect diff on only filtered releases { - changedReleases, planningErrs = st.DiffReleases(helm, c.Values(), c.Concurrency(), detailedExitCode, c.SuppressSecrets(), false, diffOpts) + changedReleases, planningErrs = st.DiffReleases(helm, c.Values(), c.Concurrency(), detailedExitCode, c.SuppressSecrets(), c.SuppressDiff(), false, diffOpts) var err error deletingReleases, err = st.DetectReleasesToBeDeletedForSync(helm, st.Releases) diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index aeee1fe3..b74f9d33 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -1895,6 +1895,7 @@ type applyConfig struct { set []string skipDeps bool suppressSecrets bool + suppressDiff bool noColor bool context int concurrency int @@ -1922,6 +1923,10 @@ func (a applyConfig) SuppressSecrets() bool { return a.suppressSecrets } +func (a applyConfig) SuppressDiff() bool { + return a.suppressDiff +} + func (a applyConfig) NoColor() bool { return a.noColor } @@ -2004,7 +2009,7 @@ func (helm *mockHelmExec) UpdateRepo() error { func (helm *mockHelmExec) SyncRelease(context helmexec.HelmContext, name, chart string, flags ...string) error { return nil } -func (helm *mockHelmExec) DiffRelease(context helmexec.HelmContext, name, chart string, flags ...string) error { +func (helm *mockHelmExec) DiffRelease(context helmexec.HelmContext, name, chart string, suppressDiff bool, flags ...string) error { return nil } func (helm *mockHelmExec) ReleaseStatus(context helmexec.HelmContext, release string, flags ...string) error { diff --git a/pkg/app/config.go b/pkg/app/config.go index e6b8daa0..63e1c21f 100644 --- a/pkg/app/config.go +++ b/pkg/app/config.go @@ -41,6 +41,7 @@ type ApplyConfigProvider interface { SkipDeps() bool SuppressSecrets() bool + SuppressDiff() bool NoColor() bool Context() int @@ -69,6 +70,7 @@ type DiffConfigProvider interface { SkipDeps() bool SuppressSecrets() bool + SuppressDiff() bool DetailedExitcode() bool NoColor() bool diff --git a/pkg/app/run.go b/pkg/app/run.go index 6d13d33a..2ce267d8 100644 --- a/pkg/app/run.go +++ b/pkg/app/run.go @@ -85,7 +85,7 @@ func (r *Run) Diff(c DiffConfigProvider) []error { NoColor: c.NoColor(), Set: c.Set(), } - _, errs := st.DiffReleases(helm, c.Values(), c.Concurrency(), c.DetailedExitcode(), c.SuppressSecrets(), true, opts) + _, errs := st.DiffReleases(helm, c.Values(), c.Concurrency(), c.DetailedExitcode(), c.SuppressSecrets(), c.SuppressDiff(), true, opts) return errs } diff --git a/pkg/exectest/helm.go b/pkg/exectest/helm.go index 3a759c50..d7dbce7e 100644 --- a/pkg/exectest/helm.go +++ b/pkg/exectest/helm.go @@ -100,7 +100,7 @@ func (helm *Helm) SyncRelease(context helmexec.HelmContext, name, chart string, return nil } -func (helm *Helm) DiffRelease(context helmexec.HelmContext, name, chart string, flags ...string) error { +func (helm *Helm) DiffRelease(context helmexec.HelmContext, name, chart string, suppressDiff bool, flags ...string) error { if helm.DiffMutex != nil { helm.DiffMutex.Lock() } diff --git a/pkg/helmexec/exec.go b/pkg/helmexec/exec.go index 2940fc0d..4cdb15b2 100644 --- a/pkg/helmexec/exec.go +++ b/pkg/helmexec/exec.go @@ -255,7 +255,7 @@ func (helm *execer) TemplateRelease(name string, chart string, flags ...string) return err } -func (helm *execer) DiffRelease(context HelmContext, name, chart string, flags ...string) error { +func (helm *execer) DiffRelease(context HelmContext, name, chart string, suppressDiff bool, flags ...string) error { helm.logger.Infof("Comparing release=%v, chart=%v", name, chart) preArgs := context.GetTillerlessArgs(helm) env := context.getTillerlessEnv() @@ -273,11 +273,13 @@ func (helm *execer) DiffRelease(context HelmContext, name, chart string, flags . switch e := err.(type) { case ExitError: if e.ExitStatus() == 2 { - helm.write(out) + if !(suppressDiff) { + helm.write(out) + } return err } } - } else { + } else if !(suppressDiff) { helm.write(out) } return err diff --git a/pkg/helmexec/exec_test.go b/pkg/helmexec/exec_test.go index 91f4f642..ec96825d 100644 --- a/pkg/helmexec/exec_test.go +++ b/pkg/helmexec/exec_test.go @@ -246,7 +246,7 @@ func Test_DiffRelease(t *testing.T) { var buffer bytes.Buffer logger := NewLogger(&buffer, "debug") helm := MockExecer(logger, "dev") - helm.DiffRelease(HelmContext{}, "release", "chart", "--timeout 10", "--wait") + helm.DiffRelease(HelmContext{}, "release", "chart", false, "--timeout 10", "--wait") expected := `Comparing release=release, chart=chart exec: helm diff upgrade --reset-values --allow-unreleased release chart --timeout 10 --wait --kube-context dev exec: helm diff upgrade --reset-values --allow-unreleased release chart --timeout 10 --wait --kube-context dev: @@ -256,7 +256,7 @@ exec: helm diff upgrade --reset-values --allow-unreleased release chart --timeou } buffer.Reset() - helm.DiffRelease(HelmContext{}, "release", "chart") + helm.DiffRelease(HelmContext{}, "release", "chart", false) expected = `Comparing release=release, chart=chart exec: helm diff upgrade --reset-values --allow-unreleased release chart --kube-context dev exec: helm diff upgrade --reset-values --allow-unreleased release chart --kube-context dev: @@ -270,7 +270,7 @@ func Test_DiffReleaseTillerless(t *testing.T) { var buffer bytes.Buffer logger := NewLogger(&buffer, "debug") helm := MockExecer(logger, "dev") - helm.DiffRelease(HelmContext{Tillerless: true}, "release", "chart", "--timeout 10", "--wait") + helm.DiffRelease(HelmContext{Tillerless: true}, "release", "chart", false, "--timeout 10", "--wait") expected := `Comparing release=release, chart=chart exec: helm tiller run -- helm diff upgrade --reset-values --allow-unreleased release chart --timeout 10 --wait --kube-context dev exec: helm tiller run -- helm diff upgrade --reset-values --allow-unreleased release chart --timeout 10 --wait --kube-context dev: diff --git a/pkg/helmexec/helmexec.go b/pkg/helmexec/helmexec.go index 74a40d3b..b17d4fca 100644 --- a/pkg/helmexec/helmexec.go +++ b/pkg/helmexec/helmexec.go @@ -10,7 +10,7 @@ type Interface interface { BuildDeps(name, chart string) error UpdateDeps(chart string) error SyncRelease(context HelmContext, name, chart string, flags ...string) error - DiffRelease(context HelmContext, name, chart string, flags ...string) error + DiffRelease(context HelmContext, name, chart string, suppressDiff bool, flags ...string) error TemplateRelease(name, chart string, flags ...string) error Fetch(chart string, flags ...string) error Lint(name, chart string, flags ...string) error diff --git a/pkg/state/state.go b/pkg/state/state.go index b517a335..20685063 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -1094,7 +1094,7 @@ type DiffOpt interface{ Apply(*DiffOpts) } // DiffReleases wrapper for executing helm diff on the releases // It returns releases that had any changes -func (st *HelmState) DiffReleases(helm helmexec.Interface, additionalValues []string, workerLimit int, detailedExitCode, suppressSecrets bool, triggerCleanupEvents bool, opt ...DiffOpt) ([]ReleaseSpec, []error) { +func (st *HelmState) DiffReleases(helm helmexec.Interface, additionalValues []string, workerLimit int, detailedExitCode, suppressSecrets bool, suppressDiff bool, triggerCleanupEvents bool, opt ...DiffOpt) ([]ReleaseSpec, []error) { opts := &DiffOpts{} for _, o := range opt { o.Apply(opts) @@ -1124,7 +1124,7 @@ func (st *HelmState) DiffReleases(helm helmexec.Interface, additionalValues []st for prep := range jobQueue { flags := prep.flags release := prep.release - if err := helm.DiffRelease(st.createHelmContext(release, workerIndex), release.Name, normalizeChart(st.basePath, release.Chart), flags...); err != nil { + if err := helm.DiffRelease(st.createHelmContext(release, workerIndex), release.Name, normalizeChart(st.basePath, release.Chart), suppressDiff, 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/state_test.go b/pkg/state/state_test.go index 213d7adb..afadc5da 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -1391,7 +1391,7 @@ func TestHelmState_DiffReleases(t *testing.T) { logger: logger, valsRuntime: valsRuntime, } - _, errs := state.DiffReleases(tt.helm, []string{}, 1, false, false, false) + _, errs := state.DiffReleases(tt.helm, []string{}, 1, false, false, false, false) if errs != nil && len(errs) > 0 { t.Errorf("unexpected error: %v", errs) } @@ -1556,7 +1556,7 @@ func TestHelmState_DiffReleasesCleanup(t *testing.T) { `, }) state = injectFs(state, testfs) - if _, errs := state.DiffReleases(tt.helm, []string{}, 1, false, false, false); errs != nil && len(errs) > 0 { + if _, errs := state.DiffReleases(tt.helm, []string{}, 1, false, false, false, false); errs != nil && len(errs) > 0 { t.Errorf("unexpected errors: %v", errs) }