Add the SyncArgs option and --sync-args flag (#1375)
* add the SyncArgs option Signed-off-by: Tim Ramlot <42113979+inteon@users.noreply.github.com> * add syncArgs to helmDefaults and update index.md Signed-off-by: Tim Ramlot <42113979+inteon@users.noreply.github.com> * add --sync-args flags to helmfile sync Signed-off-by: Tim Ramlot <42113979+inteon@users.noreply.github.com> * add tests for appendExtraDiffFlags and appendExtraSyncFlags Signed-off-by: Tim Ramlot <42113979+inteon@users.noreply.github.com> --------- Signed-off-by: Tim Ramlot <42113979+inteon@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									dc2ccd6e67
								
							
						
					
					
						commit
						7ccacb7ee5
					
				|  | @ -42,6 +42,7 @@ func NewApplyCmd(globalCfg *config.GlobalImpl) *cobra.Command { | |||
| 	f.BoolVar(&applyOptions.DetailedExitcode, "detailed-exitcode", false, "return a non-zero exit code 2 instead of 0 when there were changes detected AND the changes are synced successfully") | ||||
| 	f.BoolVar(&applyOptions.StripTrailingCR, "strip-trailing-cr", false, "strip trailing carriage return on input") | ||||
| 	f.StringVar(&applyOptions.DiffArgs, "diff-args", "", `pass args to helm helm-diff`) | ||||
| 	f.StringVar(&applyOptions.SyncArgs, "sync-args", "", `pass args to helm upgrade`) | ||||
| 	f.StringVar(&globalCfg.GlobalOptions.Args, "args", "", "pass args to helm exec") | ||||
| 	if !runtime.V1Mode { | ||||
| 		// TODO: Remove this function once Helmfile v0.x
 | ||||
|  |  | |||
|  | @ -32,6 +32,7 @@ func NewSyncCmd(globalCfg *config.GlobalImpl) *cobra.Command { | |||
| 
 | ||||
| 	f := cmd.Flags() | ||||
| 	f.StringVar(&globalCfg.GlobalOptions.Args, "args", "", "pass args to helm sync") | ||||
| 	f.StringVar(&syncOptions.SyncArgs, "sync-args", "", "pass args to helm upgrade") | ||||
| 	f.StringArrayVar(&syncOptions.Set, "set", nil, "additional values to be merged into the helm command --set flag") | ||||
| 	f.StringArrayVar(&syncOptions.Values, "values", nil, "additional value files to be merged into the helm command --values flag") | ||||
| 	f.IntVar(&syncOptions.Concurrency, "concurrency", 0, "maximum number of concurrent helm processes to run, 0 is unlimited") | ||||
|  |  | |||
|  | @ -184,6 +184,8 @@ helmDefaults: | |||
|     - "--set k=v" | ||||
|   diffArgs: | ||||
|     - "--suppress-secrets" | ||||
|   syncArgs: | ||||
|     - "--labels=app.kubernetes.io/managed-by=helmfile" | ||||
|   # verify the chart before upgrading (only works with packaged charts not directories) (default false) | ||||
|   verify: true | ||||
|   keyring: path/to/keyring.gpg | ||||
|  |  | |||
|  | @ -1476,6 +1476,7 @@ Do you really want to apply? | |||
| 					ResetValues:      c.ResetValues(), | ||||
| 					PostRenderer:     c.PostRenderer(), | ||||
| 					PostRendererArgs: c.PostRendererArgs(), | ||||
| 					SyncArgs:         c.SyncArgs(), | ||||
| 				} | ||||
| 				return subst.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency(), syncOpts) | ||||
| 			})) | ||||
|  | @ -1869,6 +1870,7 @@ Do you really want to sync? | |||
| 					ResetValues:      c.ResetValues(), | ||||
| 					PostRenderer:     c.PostRenderer(), | ||||
| 					PostRendererArgs: c.PostRendererArgs(), | ||||
| 					SyncArgs:         c.SyncArgs(), | ||||
| 				} | ||||
| 				return subst.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency(), opts) | ||||
| 			})) | ||||
|  |  | |||
|  | @ -2220,6 +2220,7 @@ type applyConfig struct { | |||
| 	stripTrailingCR         bool | ||||
| 	interactive             bool | ||||
| 	skipDiffOnInstall       bool | ||||
| 	syncArgs                string | ||||
| 	diffArgs                string | ||||
| 	logger                  *zap.SugaredLogger | ||||
| 	wait                    bool | ||||
|  | @ -2356,6 +2357,10 @@ func (a applyConfig) SkipDiffOnInstall() bool { | |||
| 	return a.skipDiffOnInstall | ||||
| } | ||||
| 
 | ||||
| func (a applyConfig) SyncArgs() string { | ||||
| 	return a.syncArgs | ||||
| } | ||||
| 
 | ||||
| func (a applyConfig) DiffArgs() string { | ||||
| 	return a.diffArgs | ||||
| } | ||||
|  |  | |||
|  | @ -83,6 +83,7 @@ type ApplyConfigProvider interface { | |||
| 	SkipDiffOnInstall() bool | ||||
| 
 | ||||
| 	DiffArgs() string | ||||
| 	SyncArgs() string | ||||
| 
 | ||||
| 	DAGConfig | ||||
| 
 | ||||
|  | @ -104,6 +105,7 @@ type SyncConfigProvider interface { | |||
| 	SkipDeps() bool | ||||
| 	Wait() bool | ||||
| 	WaitForJobs() bool | ||||
| 	SyncArgs() string | ||||
| 
 | ||||
| 	Validate() bool | ||||
| 
 | ||||
|  |  | |||
|  | @ -64,6 +64,8 @@ type ApplyOptions struct { | |||
| 	Cascade string | ||||
| 	// SuppressOutputLineRegex is a list of regexes to suppress output lines
 | ||||
| 	SuppressOutputLineRegex []string | ||||
| 	// SyncArgs is the list of arguments to pass to helm upgrade.
 | ||||
| 	SyncArgs string | ||||
| } | ||||
| 
 | ||||
| // NewApply creates a new Apply
 | ||||
|  | @ -240,3 +242,8 @@ func (a *ApplyImpl) Cascade() string { | |||
| func (a *ApplyImpl) SuppressOutputLineRegex() []string { | ||||
| 	return a.ApplyOptions.SuppressOutputLineRegex | ||||
| } | ||||
| 
 | ||||
| // SyncArgs returns the SyncArgs.
 | ||||
| func (a *ApplyImpl) SyncArgs() string { | ||||
| 	return a.ApplyOptions.SyncArgs | ||||
| } | ||||
|  |  | |||
|  | @ -32,6 +32,8 @@ type SyncOptions struct { | |||
| 	PostRendererArgs []string | ||||
| 	// Cascade '--cascade' to helmv3 delete, available values: background, foreground, or orphan, default: background
 | ||||
| 	Cascade string | ||||
| 	// SyncArgs is the list of arguments to pass to the helm upgrade command.
 | ||||
| 	SyncArgs string | ||||
| } | ||||
| 
 | ||||
| // NewSyncOptions creates a new Apply
 | ||||
|  | @ -132,3 +134,8 @@ func (t *SyncImpl) PostRendererArgs() []string { | |||
| func (t *SyncImpl) Cascade() string { | ||||
| 	return t.SyncOptions.Cascade | ||||
| } | ||||
| 
 | ||||
| // SyncArgs returns the sync args
 | ||||
| func (t *SyncImpl) SyncArgs() string { | ||||
| 	return t.SyncOptions.SyncArgs | ||||
| } | ||||
|  |  | |||
|  | @ -152,6 +152,7 @@ type HelmSpec struct { | |||
| 	KubeContext string   `yaml:"kubeContext,omitempty"` | ||||
| 	Args        []string `yaml:"args,omitempty"` | ||||
| 	DiffArgs    []string `yaml:"diffArgs,omitempty"` | ||||
| 	SyncArgs    []string `yaml:"syncArgs,omitempty"` | ||||
| 	Verify      bool     `yaml:"verify"` | ||||
| 	Keyring     string   `yaml:"keyring,omitempty"` | ||||
| 	// EnableDNS, when set to true, enable DNS lookups when rendering templates
 | ||||
|  | @ -740,6 +741,7 @@ type SyncOpts struct { | |||
| 	ResetValues      bool | ||||
| 	PostRenderer     string | ||||
| 	PostRendererArgs []string | ||||
| 	SyncArgs         string | ||||
| } | ||||
| 
 | ||||
| type SyncOpt interface{ Apply(*SyncOpts) } | ||||
|  | @ -2517,6 +2519,20 @@ func (st *HelmState) appendExtraDiffFlags(flags []string, opt *DiffOpts) []strin | |||
| 	return flags | ||||
| } | ||||
| 
 | ||||
| // appendExtraSyncFlags appends extra diff flags to the given flags slice based on the provided options.
 | ||||
| // If opt is not nil and opt.SyncArgs is not empty, it collects the arguments from opt.SyncArgs and appends them to flags.
 | ||||
| // If st.HelmDefaults.SyncArgs is not nil, it joins the arguments with a space and appends them to flags.
 | ||||
| // The updated flags slice is returned.
 | ||||
| func (st *HelmState) appendExtraSyncFlags(flags []string, opt *SyncOpts) []string { | ||||
| 	switch { | ||||
| 	case opt != nil && opt.SyncArgs != "": | ||||
| 		flags = append(flags, argparser.CollectArgs(opt.SyncArgs)...) | ||||
| 	case st.HelmDefaults.SyncArgs != nil: | ||||
| 		flags = append(flags, argparser.CollectArgs(strings.Join(st.HelmDefaults.SyncArgs, " "))...) | ||||
| 	} | ||||
| 	return flags | ||||
| } | ||||
| 
 | ||||
| // appendKeyringFlags append all the helm command-line flags related to keyring
 | ||||
| func (st *HelmState) appendKeyringFlags(flags []string, release *ReleaseSpec) []string { | ||||
| 	switch { | ||||
|  | @ -2633,6 +2649,8 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp | |||
| 	} | ||||
| 	flags = st.appendPostRenderArgsFlags(flags, release, postRendererArgs) | ||||
| 
 | ||||
| 	flags = st.appendExtraSyncFlags(flags, opt) | ||||
| 
 | ||||
| 	common, clean, err := st.namespaceAndValuesFlags(helm, release, workerIndex) | ||||
| 	if err != nil { | ||||
| 		return nil, clean, err | ||||
|  |  | |||
|  | @ -3477,3 +3477,99 @@ func TestHideChartURL(t *testing.T) { | |||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func Test_appendExtraDiffFlags(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		name          string | ||||
| 		inputFlags    []string | ||||
| 		inputOpts     *DiffOpts | ||||
| 		inputDefaults []string | ||||
| 
 | ||||
| 		expected []string | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name:       "Skipping default flags, because diffOpts is provided", | ||||
| 			inputFlags: []string{"aaaaa"}, | ||||
| 			inputOpts: &DiffOpts{ | ||||
| 				DiffArgs: "-bbbb --cccc", | ||||
| 			}, | ||||
| 			inputDefaults: []string{"-dddd", "--eeee"}, | ||||
| 			expected:      []string{"aaaaa", "-bbbb", "--cccc"}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:          "Use default flags, because diffOpts is not provided", | ||||
| 			inputFlags:    []string{"aaaaa"}, | ||||
| 			inputDefaults: []string{"-dddd", "--eeee"}, | ||||
| 			expected:      []string{"aaaaa", "-dddd", "--eeee"}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:          "Don't add non-flag arguments", | ||||
| 			inputFlags:    []string{"aaaaa"}, | ||||
| 			inputDefaults: []string{"-d=ddd", "non-flag", "--eeee"}, | ||||
| 			expected:      []string{"aaaaa", "-d=ddd", "--eeee"}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, test := range tests { | ||||
| 		t.Run(test.name, func(t *testing.T) { | ||||
| 			result := (&HelmState{ | ||||
| 				ReleaseSetSpec: ReleaseSetSpec{ | ||||
| 					HelmDefaults: HelmSpec{ | ||||
| 						DiffArgs: test.inputDefaults, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}).appendExtraDiffFlags(test.inputFlags, test.inputOpts) | ||||
| 			if !reflect.DeepEqual(result, test.expected) { | ||||
| 				t.Errorf("For input %v %v, expected %v, but got %v", test.inputFlags, test.inputOpts, test.expected, result) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func Test_appendExtraSyncFlags(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		name          string | ||||
| 		inputFlags    []string | ||||
| 		inputOpts     *SyncOpts | ||||
| 		inputDefaults []string | ||||
| 
 | ||||
| 		expected []string | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name:       "Skipping default flags, because diffOpts is provided", | ||||
| 			inputFlags: []string{"aaaaa"}, | ||||
| 			inputOpts: &SyncOpts{ | ||||
| 				SyncArgs: "-bbbb --cccc", | ||||
| 			}, | ||||
| 			inputDefaults: []string{"-dddd", "--eeee"}, | ||||
| 			expected:      []string{"aaaaa", "-bbbb", "--cccc"}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:          "Use default flags, because diffOpts is not provided", | ||||
| 			inputFlags:    []string{"aaaaa"}, | ||||
| 			inputDefaults: []string{"-dddd", "--eeee"}, | ||||
| 			expected:      []string{"aaaaa", "-dddd", "--eeee"}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:          "Don't add non-flag arguments", | ||||
| 			inputFlags:    []string{"aaaaa"}, | ||||
| 			inputDefaults: []string{"-d=ddd", "non-flag", "--eeee"}, | ||||
| 			expected:      []string{"aaaaa", "-d=ddd", "--eeee"}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, test := range tests { | ||||
| 		t.Run(test.name, func(t *testing.T) { | ||||
| 			result := (&HelmState{ | ||||
| 				ReleaseSetSpec: ReleaseSetSpec{ | ||||
| 					HelmDefaults: HelmSpec{ | ||||
| 						SyncArgs: test.inputDefaults, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}).appendExtraSyncFlags(test.inputFlags, test.inputOpts) | ||||
| 			if !reflect.DeepEqual(result, test.expected) { | ||||
| 				t.Errorf("For input %v %v, expected %v, but got %v", test.inputFlags, test.inputOpts, test.expected, result) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue