From 430a825b1256275f8576ebdfb2f2050cb37501f3 Mon Sep 17 00:00:00 2001 From: Yuuki Takahashi <20282867+yktakaha4@users.noreply.github.com> Date: Thu, 14 Sep 2023 11:23:41 +0900 Subject: [PATCH] Add diffArgs to helmDefaults (#1019) * Add diffArgs to helmDefaults Signed-off-by: Yuuki Takahashi <20282867+yktakaha4@users.noreply.github.com> --- docs/index.md | 2 ++ pkg/app/app.go | 22 ++++++++++++---------- pkg/app/run.go | 4 ++-- pkg/argparser/args.go | 9 ++++++++- pkg/argparser/args_test.go | 35 +++++++++++++++++++++-------------- pkg/state/state.go | 1 + 6 files changed, 46 insertions(+), 27 deletions(-) diff --git a/docs/index.md b/docs/index.md index 7b486c9f..36e2d171 100644 --- a/docs/index.md +++ b/docs/index.md @@ -182,6 +182,8 @@ helmDefaults: # additional and global args passed to helm (default "") args: - "--set k=v" + diffArgs: + - "--suppress-secrets" # verify the chart before upgrading (only works with packaged charts not directories) (default false) verify: true keyring: path/to/keyring.gpg diff --git a/pkg/app/app.go b/pkg/app/app.go index 606c5b5f..6a7ffd36 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -1323,7 +1323,7 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) { st := r.state helm := r.helm - helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) + helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) selectedReleases, selectedAndNeededReleases, err := a.getSelectedReleases(r, c.IncludeTransitiveNeeds()) if err != nil { @@ -1374,7 +1374,8 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) { // join --args and --diff-args together to one string. args := strings.Join([]string{c.Args(), c.DiffArgs()}, " ") - helm.SetExtraArgs(argparser.GetArgs(args, r.state)...) + argsOpts := &argparser.GetArgsOptions{WithDiffArgs: true} + helm.SetExtraArgs(argparser.GetArgs(args, r.state, argsOpts)...) infoMsg, releasesToBeUpdated, releasesToBeDeleted, errs := r.diff(false, detailedExitCode, c, diffOpts) if len(errs) > 0 { @@ -1570,7 +1571,7 @@ Do you really want to delete? `, strings.Join(names, "\n")) interactive := c.Interactive() if !interactive || interactive && r.askForConfirmation(msg) { - r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) + r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) if len(releasesToDelete) > 0 { _, deletionErrs := withDAG(st, helm, a.Logger, state.PlanOptions{SelectedReleases: toDelete, Reverse: true, SkipNeeds: true}, a.WrapWithoutSelector(func(subst *state.HelmState, helm helmexec.Interface) []error { @@ -1596,7 +1597,8 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) helm := r.helm args := strings.Join([]string{c.Args(), c.DiffArgs()}, " ") - helm.SetExtraArgs(argparser.GetArgs(args, r.state)...) + argsOpts := &argparser.GetArgsOptions{WithDiffArgs: true} + helm.SetExtraArgs(argparser.GetArgs(args, r.state, argsOpts)...) var errs []error @@ -1620,7 +1622,7 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) } infoMsg, updated, deleted, errs = filtered.diff(true, c.DetailedExitcode(), c, opts) - helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) + helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, argsOpts)...) return errs }) @@ -1633,7 +1635,7 @@ func (a *App) lint(r *Run, c LintConfigProvider) (bool, []error, []error) { ok, errs := a.withNeeds(r, c, false, func(st *state.HelmState) []error { helm := r.helm - args := argparser.GetArgs(c.Args(), st) + args := argparser.GetArgs(c.Args(), st, nil) // Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint` helm.SetExtraArgs() @@ -1694,7 +1696,7 @@ func (a *App) status(r *Run, c StatusesConfigProvider) (bool, []error) { // Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies st.Releases = allReleases - args := argparser.GetArgs(c.Args(), st) + args := argparser.GetArgs(c.Args(), st, nil) // Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint` helm.SetExtraArgs() @@ -1827,7 +1829,7 @@ Do you really want to sync? var errs []error - r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) + r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) // Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies st.Releases = selectedAndNeededReleases @@ -1894,7 +1896,7 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) { return a.withNeeds(r, c, false, func(st *state.HelmState) []error { helm := r.helm - args := argparser.GetArgs(c.Args(), st) + args := argparser.GetArgs(c.Args(), st, nil) // Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint` helm.SetExtraArgs() @@ -2017,7 +2019,7 @@ func (a *App) test(r *Run, c TestConfigProvider) []error { // with conditions and selectors st.Releases = toTest - r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) + r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) return st.TestReleases(r.helm, cleanup, timeout, concurrency, state.Logs(c.Logs())) } diff --git a/pkg/app/run.go b/pkg/app/run.go index 72e80ae9..e9c277ca 100644 --- a/pkg/app/run.go +++ b/pkg/app/run.go @@ -105,13 +105,13 @@ func (r *Run) withPreparedCharts(helmfileCommand string, opts state.ChartPrepare } func (r *Run) Deps(c DepsConfigProvider) []error { - r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) + r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) return r.state.UpdateDeps(r.helm, c.IncludeTransitiveNeeds()) } func (r *Run) Repos(c ReposConfigProvider) error { - r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) + r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) return r.ctx.SyncReposOnce(r.state, r.helm) } diff --git a/pkg/argparser/args.go b/pkg/argparser/args.go index f2fc36e6..ca10bc86 100644 --- a/pkg/argparser/args.go +++ b/pkg/argparser/args.go @@ -16,6 +16,9 @@ type argMap struct { m map[string][]*keyVal flags []string } +type GetArgsOptions struct { + WithDiffArgs bool +} // isNewFlag checks if the given arg is a new flag func isNewFlag(flag string) bool { @@ -83,7 +86,7 @@ func analyzeArgs(am *argMap, args string) { } } -func GetArgs(args string, state *state.HelmState) []string { +func GetArgs(args string, state *state.HelmState, opts *GetArgsOptions) []string { argsMap := newArgMap() if len(args) > 0 { @@ -94,6 +97,10 @@ func GetArgs(args string, state *state.HelmState) []string { analyzeArgs(argsMap, strings.Join(state.HelmDefaults.Args, " ")) } + if len(state.HelmDefaults.DiffArgs) > 0 && opts != nil && opts.WithDiffArgs { + analyzeArgs(argsMap, strings.Join(state.HelmDefaults.DiffArgs, " ")) + } + var argArr []string for _, flag := range argsMap.flags { diff --git a/pkg/argparser/args_test.go b/pkg/argparser/args_test.go index 8ebfdcb5..ec55de4c 100644 --- a/pkg/argparser/args_test.go +++ b/pkg/argparser/args_test.go @@ -12,38 +12,45 @@ import ( // TestGetArgs tests the GetArgs function func TestGetArgs(t *testing.T) { tests := []struct { - args string - expected string - defaultArgs []string + args string + expected string + defaultArgs []string + defaultDiffArgs []string + opts *GetArgsOptions }{ { - args: "-f a.yaml -f b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false", - defaultArgs: []string{"--recreate-pods", "--force"}, - expected: "-f a.yaml -f b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false --recreate-pods --force", + args: "-f a.yaml -f b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false", + defaultArgs: []string{"--recreate-pods", "--force"}, + defaultDiffArgs: []string{"--suppress", "Deployment"}, + opts: &GetArgsOptions{WithDiffArgs: true}, + expected: "-f a.yaml -f b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false --recreate-pods --force --suppress Deployment", }, { - args: "-e a.yaml -d b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false", - defaultArgs: []string{"-q www", "-w"}, - expected: "-e a.yaml -d b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false -q www -w", + args: "-e a.yaml -d b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false", + defaultArgs: []string{"-q www", "-w"}, + defaultDiffArgs: []string{}, + expected: "-e a.yaml -d b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false -q www -w", }, { args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false", expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false", }, { - args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true", - defaultArgs: []string{"--recreate-pods", "--force"}, - expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --recreate-pods --force", + args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true", + defaultArgs: []string{"--recreate-pods", "--force"}, + defaultDiffArgs: []string{"--suppress", "Deployment"}, + opts: &GetArgsOptions{}, + expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --recreate-pods --force", }, } for _, test := range tests { - Helmdefaults := state.HelmSpec{KubeContext: "test", Args: test.defaultArgs} + Helmdefaults := state.HelmSpec{KubeContext: "test", Args: test.defaultArgs, DiffArgs: test.defaultDiffArgs} testState := &state.HelmState{ ReleaseSetSpec: state.ReleaseSetSpec{ HelmDefaults: Helmdefaults, }, } - receivedArgs := GetArgs(test.args, testState) + receivedArgs := GetArgs(test.args, testState, test.opts) require.Equalf(t, test.expected, strings.Join(receivedArgs, " "), "expected args %s, received args %s", test.expected, strings.Join(receivedArgs, " ")) } diff --git a/pkg/state/state.go b/pkg/state/state.go index 02e15fad..3c284851 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -149,6 +149,7 @@ type SubhelmfileEnvironmentSpec struct { type HelmSpec struct { KubeContext string `yaml:"kubeContext,omitempty"` Args []string `yaml:"args,omitempty"` + DiffArgs []string `yaml:"diffArgs,omitempty"` Verify bool `yaml:"verify"` Keyring string `yaml:"keyring,omitempty"` // EnableDNS, when set to true, enable DNS lookups when rendering templates