* fix #1095 Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
		
							parent
							
								
									1fb1da270f
								
							
						
					
					
						commit
						0c3951097e
					
				|  | @ -1322,7 +1322,7 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) { | ||||||
| 	st := r.state | 	st := r.state | ||||||
| 	helm := r.helm | 	helm := r.helm | ||||||
| 
 | 
 | ||||||
| 	helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) | 	helm.SetExtraArgs(GetArgs(c.Args(), r.state)...) | ||||||
| 
 | 
 | ||||||
| 	selectedReleases, selectedAndNeededReleases, err := a.getSelectedReleases(r, c.IncludeTransitiveNeeds()) | 	selectedReleases, selectedAndNeededReleases, err := a.getSelectedReleases(r, c.IncludeTransitiveNeeds()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -1368,21 +1368,15 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) { | ||||||
| 		SkipDiffOnInstall: c.SkipDiffOnInstall(), | 		SkipDiffOnInstall: c.SkipDiffOnInstall(), | ||||||
| 		ReuseValues:       c.ReuseValues(), | 		ReuseValues:       c.ReuseValues(), | ||||||
| 		ResetValues:       c.ResetValues(), | 		ResetValues:       c.ResetValues(), | ||||||
|  | 		DiffArgs:          c.DiffArgs(), | ||||||
| 		PostRenderer:      c.PostRenderer(), | 		PostRenderer:      c.PostRenderer(), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// join --args and --diff-args together to one string.
 |  | ||||||
| 	args := strings.Join([]string{c.Args(), c.DiffArgs()}, " ") |  | ||||||
| 	argsOpts := &argparser.GetArgsOptions{WithDiffArgs: true} |  | ||||||
| 	helm.SetExtraArgs(argparser.GetArgs(args, r.state, argsOpts)...) |  | ||||||
| 
 |  | ||||||
| 	infoMsg, releasesToBeUpdated, releasesToBeDeleted, errs := r.diff(false, detailedExitCode, c, diffOpts) | 	infoMsg, releasesToBeUpdated, releasesToBeDeleted, errs := r.diff(false, detailedExitCode, c, diffOpts) | ||||||
| 	if len(errs) > 0 { | 	if len(errs) > 0 { | ||||||
| 		return false, false, errs | 		return false, false, errs | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	helm.SetExtraArgs() |  | ||||||
| 
 |  | ||||||
| 	var toDelete []state.ReleaseSpec | 	var toDelete []state.ReleaseSpec | ||||||
| 	for _, r := range releasesToBeDeleted { | 	for _, r := range releasesToBeDeleted { | ||||||
| 		toDelete = append(toDelete, r) | 		toDelete = append(toDelete, r) | ||||||
|  | @ -1570,7 +1564,7 @@ Do you really want to delete? | ||||||
| `, strings.Join(names, "\n")) | `, strings.Join(names, "\n")) | ||||||
| 	interactive := c.Interactive() | 	interactive := c.Interactive() | ||||||
| 	if !interactive || interactive && r.askForConfirmation(msg) { | 	if !interactive || interactive && r.askForConfirmation(msg) { | ||||||
| 		r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) | 		r.helm.SetExtraArgs(GetArgs(c.Args(), r.state)...) | ||||||
| 
 | 
 | ||||||
| 		if len(releasesToDelete) > 0 { | 		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 { | 			_, deletionErrs := withDAG(st, helm, a.Logger, state.PlanOptions{SelectedReleases: toDelete, Reverse: true, SkipNeeds: true}, a.WrapWithoutSelector(func(subst *state.HelmState, helm helmexec.Interface) []error { | ||||||
|  | @ -1595,10 +1589,6 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) | ||||||
| 	ok, errs := a.withNeeds(r, c, true, func(st *state.HelmState) []error { | 	ok, errs := a.withNeeds(r, c, true, func(st *state.HelmState) []error { | ||||||
| 		helm := r.helm | 		helm := r.helm | ||||||
| 
 | 
 | ||||||
| 		args := strings.Join([]string{c.Args(), c.DiffArgs()}, " ") |  | ||||||
| 		argsOpts := &argparser.GetArgsOptions{WithDiffArgs: true} |  | ||||||
| 		helm.SetExtraArgs(argparser.GetArgs(args, r.state, argsOpts)...) |  | ||||||
| 
 |  | ||||||
| 		var errs []error | 		var errs []error | ||||||
| 
 | 
 | ||||||
| 		opts := &state.DiffOpts{ | 		opts := &state.DiffOpts{ | ||||||
|  | @ -1607,6 +1597,7 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) | ||||||
| 			Color:             c.Color(), | 			Color:             c.Color(), | ||||||
| 			NoColor:           c.NoColor(), | 			NoColor:           c.NoColor(), | ||||||
| 			Set:               c.Set(), | 			Set:               c.Set(), | ||||||
|  | 			DiffArgs:          c.DiffArgs(), | ||||||
| 			SkipDiffOnInstall: c.SkipDiffOnInstall(), | 			SkipDiffOnInstall: c.SkipDiffOnInstall(), | ||||||
| 			ReuseValues:       c.ReuseValues(), | 			ReuseValues:       c.ReuseValues(), | ||||||
| 			ResetValues:       c.ResetValues(), | 			ResetValues:       c.ResetValues(), | ||||||
|  | @ -1621,7 +1612,6 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) | ||||||
| 		} | 		} | ||||||
| 		infoMsg, updated, deleted, errs = filtered.diff(true, c.DetailedExitcode(), c, opts) | 		infoMsg, updated, deleted, errs = filtered.diff(true, c.DetailedExitcode(), c, opts) | ||||||
| 
 | 
 | ||||||
| 		helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, argsOpts)...) |  | ||||||
| 		return errs | 		return errs | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
|  | @ -1634,7 +1624,7 @@ func (a *App) lint(r *Run, c LintConfigProvider) (bool, []error, []error) { | ||||||
| 	ok, errs := a.withNeeds(r, c, false, func(st *state.HelmState) []error { | 	ok, errs := a.withNeeds(r, c, false, func(st *state.HelmState) []error { | ||||||
| 		helm := r.helm | 		helm := r.helm | ||||||
| 
 | 
 | ||||||
| 		args := argparser.GetArgs(c.Args(), st, nil) | 		args := GetArgs(c.Args(), st) | ||||||
| 
 | 
 | ||||||
| 		// Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint`
 | 		// Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint`
 | ||||||
| 		helm.SetExtraArgs() | 		helm.SetExtraArgs() | ||||||
|  | @ -1695,7 +1685,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
 | 	// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | ||||||
| 	st.Releases = allReleases | 	st.Releases = allReleases | ||||||
| 
 | 
 | ||||||
| 	args := argparser.GetArgs(c.Args(), st, nil) | 	args := GetArgs(c.Args(), st) | ||||||
| 
 | 
 | ||||||
| 	// Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint`
 | 	// Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint`
 | ||||||
| 	helm.SetExtraArgs() | 	helm.SetExtraArgs() | ||||||
|  | @ -1828,7 +1818,7 @@ Do you really want to sync? | ||||||
| 
 | 
 | ||||||
| 	var errs []error | 	var errs []error | ||||||
| 
 | 
 | ||||||
| 	r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) | 	r.helm.SetExtraArgs(GetArgs(c.Args(), r.state)...) | ||||||
| 
 | 
 | ||||||
| 	// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | 	// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | ||||||
| 	st.Releases = selectedAndNeededReleases | 	st.Releases = selectedAndNeededReleases | ||||||
|  | @ -1895,7 +1885,7 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) { | ||||||
| 	return a.withNeeds(r, c, false, func(st *state.HelmState) []error { | 	return a.withNeeds(r, c, false, func(st *state.HelmState) []error { | ||||||
| 		helm := r.helm | 		helm := r.helm | ||||||
| 
 | 
 | ||||||
| 		args := argparser.GetArgs(c.Args(), st, nil) | 		args := GetArgs(c.Args(), st) | ||||||
| 
 | 
 | ||||||
| 		// Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint`
 | 		// Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint`
 | ||||||
| 		helm.SetExtraArgs() | 		helm.SetExtraArgs() | ||||||
|  | @ -2018,7 +2008,7 @@ func (a *App) test(r *Run, c TestConfigProvider) []error { | ||||||
| 	// with conditions and selectors
 | 	// with conditions and selectors
 | ||||||
| 	st.Releases = toTest | 	st.Releases = toTest | ||||||
| 
 | 
 | ||||||
| 	r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) | 	r.helm.SetExtraArgs(GetArgs(c.Args(), r.state)...) | ||||||
| 
 | 
 | ||||||
| 	return st.TestReleases(r.helm, cleanup, timeout, concurrency, state.Logs(c.Logs())) | 	return st.TestReleases(r.helm, cleanup, timeout, concurrency, state.Logs(c.Logs())) | ||||||
| } | } | ||||||
|  | @ -2223,3 +2213,18 @@ func (a *App) CleanCacheDir(c CacheConfigProvider) error { | ||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func GetArgs(args string, state *state.HelmState) []string { | ||||||
|  | 	baseArgs := []string{} | ||||||
|  | 	stateArgs := []string{} | ||||||
|  | 	if len(args) > 0 { | ||||||
|  | 		baseArgs = argparser.CollectArgs(args) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(state.HelmDefaults.Args) > 0 { | ||||||
|  | 		stateArgs = argparser.CollectArgs(strings.Join(state.HelmDefaults.Args, " ")) | ||||||
|  | 	} | ||||||
|  | 	state.HelmDefaults.Args = append(baseArgs, stateArgs...) | ||||||
|  | 
 | ||||||
|  | 	return state.HelmDefaults.Args | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -17,6 +17,7 @@ import ( | ||||||
| 	"github.com/google/go-cmp/cmp" | 	"github.com/google/go-cmp/cmp" | ||||||
| 	"github.com/helmfile/vals" | 	"github.com/helmfile/vals" | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
|  | 	"github.com/stretchr/testify/require" | ||||||
| 	"go.uber.org/zap" | 	"go.uber.org/zap" | ||||||
| 	"helm.sh/helm/v3/pkg/chart" | 	"helm.sh/helm/v3/pkg/chart" | ||||||
| 
 | 
 | ||||||
|  | @ -4269,3 +4270,42 @@ func location() string { | ||||||
| 	_, fn, line, _ := goruntime.Caller(1) | 	_, fn, line, _ := goruntime.Caller(1) | ||||||
| 	return fmt.Sprintf("%s:%d", filepath.Base(fn), line) | 	return fmt.Sprintf("%s:%d", filepath.Base(fn), line) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func TestGetArgs(t *testing.T) { | ||||||
|  | 	tests := []struct { | ||||||
|  | 		args        string | ||||||
|  | 		expected    string | ||||||
|  | 		defaultArgs []string | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			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:        "-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:     "--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", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range tests { | ||||||
|  | 		Helmdefaults := state.HelmSpec{KubeContext: "test", Args: test.defaultArgs} | ||||||
|  | 		testState := &state.HelmState{ | ||||||
|  | 			ReleaseSetSpec: state.ReleaseSetSpec{ | ||||||
|  | 				HelmDefaults: Helmdefaults, | ||||||
|  | 			}, | ||||||
|  | 		} | ||||||
|  | 		receivedArgs := GetArgs(test.args, testState) | ||||||
|  | 
 | ||||||
|  | 		require.Equalf(t, test.expected, strings.Join(receivedArgs, " "), "expected args %s, received args %s", test.expected, strings.Join(receivedArgs, " ")) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -6,7 +6,6 @@ import ( | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/helmfile/helmfile/pkg/argparser" |  | ||||||
| 	"github.com/helmfile/helmfile/pkg/helmexec" | 	"github.com/helmfile/helmfile/pkg/helmexec" | ||||||
| 	"github.com/helmfile/helmfile/pkg/state" | 	"github.com/helmfile/helmfile/pkg/state" | ||||||
| ) | ) | ||||||
|  | @ -105,13 +104,13 @@ func (r *Run) withPreparedCharts(helmfileCommand string, opts state.ChartPrepare | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *Run) Deps(c DepsConfigProvider) []error { | func (r *Run) Deps(c DepsConfigProvider) []error { | ||||||
| 	r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) | 	r.helm.SetExtraArgs(GetArgs(c.Args(), r.state)...) | ||||||
| 
 | 
 | ||||||
| 	return r.state.UpdateDeps(r.helm, c.IncludeTransitiveNeeds()) | 	return r.state.UpdateDeps(r.helm, c.IncludeTransitiveNeeds()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *Run) Repos(c ReposConfigProvider) error { | func (r *Run) Repos(c ReposConfigProvider) error { | ||||||
| 	r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) | 	r.helm.SetExtraArgs(GetArgs(c.Args(), r.state)...) | ||||||
| 
 | 
 | ||||||
| 	return r.ctx.SyncReposOnce(r.state, r.helm) | 	return r.ctx.SyncReposOnce(r.state, r.helm) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -3,8 +3,6 @@ package argparser | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 |  | ||||||
| 	"github.com/helmfile/helmfile/pkg/state" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type keyVal struct { | type keyVal struct { | ||||||
|  | @ -16,9 +14,6 @@ type argMap struct { | ||||||
| 	m     map[string][]*keyVal | 	m     map[string][]*keyVal | ||||||
| 	flags []string | 	flags []string | ||||||
| } | } | ||||||
| type GetArgsOptions struct { |  | ||||||
| 	WithDiffArgs bool |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| // isNewFlag checks if the given arg is a new flag
 | // isNewFlag checks if the given arg is a new flag
 | ||||||
| func isNewFlag(flag string) bool { | func isNewFlag(flag string) bool { | ||||||
|  | @ -86,23 +81,10 @@ func analyzeArgs(am *argMap, args string) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func GetArgs(args string, state *state.HelmState, opts *GetArgsOptions) []string { | func CollectArgs(args string) []string { | ||||||
| 	argsMap := newArgMap() | 	argsMap := newArgMap() | ||||||
| 
 |  | ||||||
| 	if len(args) > 0 { |  | ||||||
| 	analyzeArgs(argsMap, args) | 	analyzeArgs(argsMap, args) | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if len(state.HelmDefaults.Args) > 0 { |  | ||||||
| 		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 | 	var argArr []string | ||||||
| 
 |  | ||||||
| 	for _, flag := range argsMap.flags { | 	for _, flag := range argsMap.flags { | ||||||
| 		val := argsMap.m[flag] | 		val := argsMap.m[flag] | ||||||
| 
 | 
 | ||||||
|  | @ -118,8 +100,5 @@ func GetArgs(args string, state *state.HelmState, opts *GetArgsOptions) []string | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 	return argArr | ||||||
| 	state.HelmDefaults.Args = argArr |  | ||||||
| 
 |  | ||||||
| 	return state.HelmDefaults.Args |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,61 +1,11 @@ | ||||||
| package argparser | package argparser | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"strings" |  | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
| 	"github.com/stretchr/testify/require" | 	"github.com/stretchr/testify/require" | ||||||
| 
 |  | ||||||
| 	"github.com/helmfile/helmfile/pkg/state" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // TestGetArgs tests the GetArgs function
 |  | ||||||
| func TestGetArgs(t *testing.T) { |  | ||||||
| 	tests := []struct { |  | ||||||
| 		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"}, |  | ||||||
| 			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"}, |  | ||||||
| 			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"}, |  | ||||||
| 			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, DiffArgs: test.defaultDiffArgs} |  | ||||||
| 		testState := &state.HelmState{ |  | ||||||
| 			ReleaseSetSpec: state.ReleaseSetSpec{ |  | ||||||
| 				HelmDefaults: Helmdefaults, |  | ||||||
| 			}, |  | ||||||
| 		} |  | ||||||
| 		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, " ")) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // TestIsNewFlag tests the isNewFlag function
 | // TestIsNewFlag tests the isNewFlag function
 | ||||||
| func TestIsNewFlag(t *testing.T) { | func TestIsNewFlag(t *testing.T) { | ||||||
| 	tests := []struct { | 	tests := []struct { | ||||||
|  |  | ||||||
|  | @ -25,6 +25,7 @@ import ( | ||||||
| 	"go.uber.org/zap" | 	"go.uber.org/zap" | ||||||
| 	"helm.sh/helm/v3/pkg/cli" | 	"helm.sh/helm/v3/pkg/cli" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/helmfile/helmfile/pkg/argparser" | ||||||
| 	"github.com/helmfile/helmfile/pkg/environment" | 	"github.com/helmfile/helmfile/pkg/environment" | ||||||
| 	"github.com/helmfile/helmfile/pkg/event" | 	"github.com/helmfile/helmfile/pkg/event" | ||||||
| 	"github.com/helmfile/helmfile/pkg/filesystem" | 	"github.com/helmfile/helmfile/pkg/filesystem" | ||||||
|  | @ -2446,6 +2447,16 @@ func (st *HelmState) appendConnectionFlags(flags []string, release *ReleaseSpec) | ||||||
| 	return flags | 	return flags | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (st *HelmState) appendExtraDiffFlags(flags []string, opt *DiffOpts) []string { | ||||||
|  | 	switch { | ||||||
|  | 	case opt != nil && opt.DiffArgs != "": | ||||||
|  | 		flags = append(flags, argparser.CollectArgs(opt.DiffArgs)...) | ||||||
|  | 	case st.HelmDefaults.DiffArgs != nil: | ||||||
|  | 		flags = append(flags, argparser.CollectArgs(strings.Join(st.HelmDefaults.DiffArgs, " "))...) | ||||||
|  | 	} | ||||||
|  | 	return flags | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // appendKeyringFlags append all the helm command-line flags related to keyring
 | // appendKeyringFlags append all the helm command-line flags related to keyring
 | ||||||
| func (st *HelmState) appendKeyringFlags(flags []string, release *ReleaseSpec) []string { | func (st *HelmState) appendKeyringFlags(flags []string, release *ReleaseSpec) []string { | ||||||
| 	switch { | 	switch { | ||||||
|  | @ -2646,6 +2657,8 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, files, err | 		return nil, files, err | ||||||
| 	} | 	} | ||||||
|  | 	flags = st.appendExtraDiffFlags(flags, opt) | ||||||
|  | 
 | ||||||
| 	return append(flags, common...), files, nil | 	return append(flags, common...), files, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -76,12 +76,13 @@ ${kubectl} create namespace ${test_ns} || fail "Could not create namespace ${tes | ||||||
| 
 | 
 | ||||||
| # TEST CASES---------------------------------------------------------------------------------------------------------- | # TEST CASES---------------------------------------------------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
|  | . ${dir}/test-cases/happypath.sh | ||||||
| . ${dir}/test-cases/chartify-with-non-chart-dir.sh | . ${dir}/test-cases/chartify-with-non-chart-dir.sh | ||||||
|  | . ${dir}/test-cases/diff-args.sh | ||||||
| . ${dir}/test-cases/helmfile-double-fetch.sh | . ${dir}/test-cases/helmfile-double-fetch.sh | ||||||
| . ${dir}/test-cases/skip-diff-output.sh | . ${dir}/test-cases/skip-diff-output.sh | ||||||
| . ${dir}/test-cases/v1-subhelmfile-multi-bases-with-array-values.sh | . ${dir}/test-cases/v1-subhelmfile-multi-bases-with-array-values.sh | ||||||
| . ${dir}/test-cases/kustomized-fetch.sh | . ${dir}/test-cases/kustomized-fetch.sh | ||||||
| . ${dir}/test-cases/happypath.sh |  | ||||||
| . ${dir}/test-cases/regression.sh | . ${dir}/test-cases/regression.sh | ||||||
| . ${dir}/test-cases/secretssops.sh | . ${dir}/test-cases/secretssops.sh | ||||||
| . ${dir}/test-cases/yaml-overwrite.sh | . ${dir}/test-cases/yaml-overwrite.sh | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| cli-overwrite-environment-values_input_dir="${cases_dir}/cli-overwrite-environment-values/input" | cli_overwrite_environment_values_input_dir="${cases_dir}/cli-overwrite-environment-values/input" | ||||||
| cli-overwrite-environment-values_output_dir="${cases_dir}/cli-overwrite-environment-values/output" | cli_overwrite_environment_values_output_dir="${cases_dir}/cli-overwrite-environment-values/output" | ||||||
| 
 | 
 | ||||||
| cli_overwrite_environment_values_tmp=$(mktemp -d) | cli_overwrite_environment_values_tmp=$(mktemp -d) | ||||||
| cli_overwrite_environment_values_reverse=${cli_overwrite_environment_values_tmp}/cli.environment.override.build.yaml | cli_overwrite_environment_values_reverse=${cli_overwrite_environment_values_tmp}/cli.environment.override.build.yaml | ||||||
|  | @ -8,21 +8,21 @@ case_title="cli overwrite environment values" | ||||||
| 
 | 
 | ||||||
| if [[ ${HELMFILE_V1MODE} = true ]]; then | if [[ ${HELMFILE_V1MODE} = true ]]; then | ||||||
|   test_start "$case_title for v1" |   test_start "$case_title for v1" | ||||||
|   info "Comparing ${case_title} for v1 output ${cli_overwrite_environment_values_reverse} with ${cli-overwrite-environment-values_output_dir}/overwritten.yaml" |   info "Comparing ${case_title} for v1 output ${cli_overwrite_environment_values_reverse} with ${cli_overwrite_environment_values_output_dir}/overwritten.yaml" | ||||||
|   for i in $(seq 10); do |   for i in $(seq 10); do | ||||||
|       info "Comparing build/cli-overwrite-environment-values #$i" |       info "Comparing build/cli-overwrite-environment-values #$i" | ||||||
|       ${helmfile} -f ${cli-overwrite-environment-values_input_dir}/input_v1.yaml.gotmpl template --state-values-set ns=test3 > ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" shouldn't fail" |       ${helmfile} -f ${cli_overwrite_environment_values_input_dir}/input_v1.yaml.gotmpl template --state-values-set ns=test3 > ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" shouldn't fail" | ||||||
|       diff -u ${cli-overwrite-environment-values_output_dir}/output_v1.yaml ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" should be consistent" |       diff -u ${cli_overwrite_environment_values_output_dir}/output_v1.yaml ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" should be consistent" | ||||||
|       echo code=$? |       echo code=$? | ||||||
|   done |   done | ||||||
|   test_pass "cli overwrite environment values for v1" |   test_pass "cli overwrite environment values for v1" | ||||||
| else | else | ||||||
|   test_start "${case_title}"  |   test_start "${case_title}"  | ||||||
|   info "Comparing ${case_title} output ${cli_overwrite_environment_values_reverse} with ${cli-overwrite-environment-values_output_dir}/overwritten.yaml" |   info "Comparing ${case_title} output ${cli_overwrite_environment_values_reverse} with ${cli_overwrite_environment_values_output_dir}/overwritten.yaml" | ||||||
|   for i in $(seq 10); do |   for i in $(seq 10); do | ||||||
|       info "Comparing build/cli-overwrite-environment-values #$i" |       info "Comparing build/cli-overwrite-environment-values #$i" | ||||||
|       ${helmfile} -f ${cli-overwrite-environment-values_input_dir}/input_v1.yaml.gotmpl template --state-values-set ns=test3 > ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" shouldn't fail" |       ${helmfile} -f ${cli_overwrite_environment_values_input_dir}/input_v1.yaml.gotmpl template --state-values-set ns=test3 > ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" shouldn't fail" | ||||||
|       diff -u ${cli-overwrite-environment-values_output_dir}/output_v1.yaml ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" should be consistent" |       diff -u ${cli_overwrite_environment_values_output_dir}/output_v1.yaml ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" should be consistent" | ||||||
|       echo code=$? |       echo code=$? | ||||||
|   done |   done | ||||||
|   test_pass "${case_title}" |   test_pass "${case_title}" | ||||||
|  |  | ||||||
|  | @ -1,5 +0,0 @@ | ||||||
| chartifyTempDir: environment_overwrite_values |  | ||||||
| helmfileArgs: |  | ||||||
| - template |  | ||||||
| - --state-values-set |  | ||||||
| - ns=test3 |  | ||||||
|  | @ -0,0 +1,28 @@ | ||||||
|  | diff_args_input_dir="${cases_dir}/diff-args/input" | ||||||
|  | diff_args_output_dir="${cases_dir}/diff-args/output" | ||||||
|  | 
 | ||||||
|  | diff_args_tmp=$(mktemp -d) | ||||||
|  | diff_args_reverse=${diff_args_tmp}/diff.args.build.yaml | ||||||
|  | 
 | ||||||
|  | case_title="diff args" | ||||||
|  | diff_out_file=${diff_args_output_dir}/diff | ||||||
|  | apply_out_file=${diff_args_output_dir}/apply | ||||||
|  | if [[ $EXTRA_HELMFILE_FLAGS == *--enable-live-output* ]]; then | ||||||
|  |     apply_out_file=${diff_args_output_dir}/apply-live | ||||||
|  |     diff_out_file=${diff_args_output_dir}/diff-live | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | test_start "$case_title" | ||||||
|  | info "Comparing ${case_title} diff for output ${diff_args_reverse} with ${diff_out_file}" | ||||||
|  | for i in $(seq 10); do | ||||||
|  |     info "Comparing diff-args diff log #$i" | ||||||
|  |     ${helmfile} -f ${diff_args_input_dir}/helmfile.yaml diff > ${diff_args_reverse} || fail "\"helmfile diff\" shouldn't fail" | ||||||
|  |     diff -u ${diff_out_file} ${diff_args_reverse} || fail "\"helmfile diff\" should be consistent" | ||||||
|  |     echo code=$? | ||||||
|  | done | ||||||
|  | info "Comparing ${case_title} apply for output ${diff_args_reverse} with ${apply_out_file}" | ||||||
|  | ${helmfile} -f ${diff_args_input_dir}/helmfile.yaml apply | grep -vE "^(LAST DEPLOYED|installed)"  > ${diff_args_reverse} || fail "\"helmfile apply\" shouldn't fail" | ||||||
|  | diff -u ${apply_out_file} ${diff_args_reverse} || fail "\"helmfile apply\" should be consistent" | ||||||
|  | echo "clean up diff args resources" | ||||||
|  | ${helmfile} -f ${diff_args_input_dir}/helmfile.yaml destroy || fail "\"helmfile destroy\" shouldn't fail" | ||||||
|  | test_pass "$case_title" | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | helmDefaults: | ||||||
|  |   diffArgs: | ||||||
|  |    - "--three-way-merge" | ||||||
|  | releases: | ||||||
|  |   - name: uninstalled  | ||||||
|  |     chart: ../../../charts/httpbin | ||||||
|  |     installed: false  | ||||||
|  |   - name: installed  | ||||||
|  |     chart: ../../../charts/httpbin | ||||||
|  |     installed: true  | ||||||
|  | @ -0,0 +1,77 @@ | ||||||
|  | Comparing release=installed, chart=../../../charts/httpbin | ||||||
|  | ******************** | ||||||
|  | 
 | ||||||
|  | 	Release was not present in Helm.  Diff will show entire contents as new. | ||||||
|  | 
 | ||||||
|  | ******************** | ||||||
|  | helmfile-tests, installed-httpbin, Deployment (apps) has been added: | ||||||
|  | -  | ||||||
|  | + apiVersion: apps/v1 | ||||||
|  | + kind: Deployment | ||||||
|  | + metadata: | ||||||
|  | +   labels: | ||||||
|  | +     app: httpbin | ||||||
|  | +     chart: httpbin-0.1.0 | ||||||
|  | +     heritage: Helm | ||||||
|  | +     release: installed | ||||||
|  | +   name: installed-httpbin | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + spec: | ||||||
|  | +   replicas: 1 | ||||||
|  | +   selector: | ||||||
|  | +     matchLabels: | ||||||
|  | +       app: httpbin | ||||||
|  | +   strategy: {} | ||||||
|  | +   template: | ||||||
|  | +     metadata: | ||||||
|  | +       labels: | ||||||
|  | +         app: httpbin | ||||||
|  | +         release: installed | ||||||
|  | +     spec: | ||||||
|  | +       containers: | ||||||
|  | +       - image: docker.io/citizenstig/httpbin:latest | ||||||
|  | +         imagePullPolicy: IfNotPresent | ||||||
|  | +         livenessProbe: | ||||||
|  | +           httpGet: | ||||||
|  | +             path: / | ||||||
|  | +             port: 8000 | ||||||
|  | +         name: httpbin | ||||||
|  | +         ports: | ||||||
|  | +         - containerPort: 8000 | ||||||
|  | +         readinessProbe: | ||||||
|  | +           httpGet: | ||||||
|  | +             path: / | ||||||
|  | +             port: 8000 | ||||||
|  | +         resources: {} | ||||||
|  | + status: {} | ||||||
|  | helmfile-tests, installed-httpbin, Service (v1) has been added: | ||||||
|  | -  | ||||||
|  | + apiVersion: v1 | ||||||
|  | + kind: Service | ||||||
|  | + metadata: | ||||||
|  | +   labels: | ||||||
|  | +     app: httpbin | ||||||
|  | +     chart: httpbin-0.1.0 | ||||||
|  | +     heritage: Helm | ||||||
|  | +     release: installed | ||||||
|  | +   name: installed-httpbin | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + spec: | ||||||
|  | +   ports: | ||||||
|  | +   - name: httpbin | ||||||
|  | +     port: 8000 | ||||||
|  | +     protocol: TCP | ||||||
|  | +     targetPort: 8000 | ||||||
|  | +   selector: | ||||||
|  | +     app: httpbin | ||||||
|  | +     release: installed | ||||||
|  | +   type: LoadBalancer | ||||||
|  | 
 | ||||||
|  | Release "installed" does not exist. Installing it now. | ||||||
|  | NAME: installed | ||||||
|  | NAMESPACE: helmfile-tests | ||||||
|  | STATUS: deployed | ||||||
|  | REVISION: 1 | ||||||
|  | TEST SUITE: None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,77 @@ | ||||||
|  | ******************** | ||||||
|  | 
 | ||||||
|  | 	Release was not present in Helm.  Diff will show entire contents as new. | ||||||
|  | 
 | ||||||
|  | ******************** | ||||||
|  | helmfile-tests, installed-httpbin, Deployment (apps) has been added: | ||||||
|  | -  | ||||||
|  | + apiVersion: apps/v1 | ||||||
|  | + kind: Deployment | ||||||
|  | + metadata: | ||||||
|  | +   labels: | ||||||
|  | +     app: httpbin | ||||||
|  | +     chart: httpbin-0.1.0 | ||||||
|  | +     heritage: Helm | ||||||
|  | +     release: installed | ||||||
|  | +   name: installed-httpbin | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + spec: | ||||||
|  | +   replicas: 1 | ||||||
|  | +   selector: | ||||||
|  | +     matchLabels: | ||||||
|  | +       app: httpbin | ||||||
|  | +   strategy: {} | ||||||
|  | +   template: | ||||||
|  | +     metadata: | ||||||
|  | +       labels: | ||||||
|  | +         app: httpbin | ||||||
|  | +         release: installed | ||||||
|  | +     spec: | ||||||
|  | +       containers: | ||||||
|  | +       - image: docker.io/citizenstig/httpbin:latest | ||||||
|  | +         imagePullPolicy: IfNotPresent | ||||||
|  | +         livenessProbe: | ||||||
|  | +           httpGet: | ||||||
|  | +             path: / | ||||||
|  | +             port: 8000 | ||||||
|  | +         name: httpbin | ||||||
|  | +         ports: | ||||||
|  | +         - containerPort: 8000 | ||||||
|  | +         readinessProbe: | ||||||
|  | +           httpGet: | ||||||
|  | +             path: / | ||||||
|  | +             port: 8000 | ||||||
|  | +         resources: {} | ||||||
|  | + status: {} | ||||||
|  | helmfile-tests, installed-httpbin, Service (v1) has been added: | ||||||
|  | -  | ||||||
|  | + apiVersion: v1 | ||||||
|  | + kind: Service | ||||||
|  | + metadata: | ||||||
|  | +   labels: | ||||||
|  | +     app: httpbin | ||||||
|  | +     chart: httpbin-0.1.0 | ||||||
|  | +     heritage: Helm | ||||||
|  | +     release: installed | ||||||
|  | +   name: installed-httpbin | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + spec: | ||||||
|  | +   ports: | ||||||
|  | +   - name: httpbin | ||||||
|  | +     port: 8000 | ||||||
|  | +     protocol: TCP | ||||||
|  | +     targetPort: 8000 | ||||||
|  | +   selector: | ||||||
|  | +     app: httpbin | ||||||
|  | +     release: installed | ||||||
|  | +   type: LoadBalancer | ||||||
|  | Error: identified at least one change, exiting with non-zero exit code (detailed-exitcode parameter enabled) | ||||||
|  | Error: plugin "diff" exited with error | ||||||
|  | Comparing release=installed, chart=../../../charts/httpbin | ||||||
|  | Release "installed" does not exist. Installing it now. | ||||||
|  | NAME: installed | ||||||
|  | NAMESPACE: helmfile-tests | ||||||
|  | STATUS: deployed | ||||||
|  | REVISION: 1 | ||||||
|  | TEST SUITE: None | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,69 @@ | ||||||
|  | Comparing release=installed, chart=../../../charts/httpbin | ||||||
|  | ******************** | ||||||
|  | 
 | ||||||
|  | 	Release was not present in Helm.  Diff will show entire contents as new. | ||||||
|  | 
 | ||||||
|  | ******************** | ||||||
|  | helmfile-tests, installed-httpbin, Deployment (apps) has been added: | ||||||
|  | -  | ||||||
|  | + apiVersion: apps/v1 | ||||||
|  | + kind: Deployment | ||||||
|  | + metadata: | ||||||
|  | +   labels: | ||||||
|  | +     app: httpbin | ||||||
|  | +     chart: httpbin-0.1.0 | ||||||
|  | +     heritage: Helm | ||||||
|  | +     release: installed | ||||||
|  | +   name: installed-httpbin | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + spec: | ||||||
|  | +   replicas: 1 | ||||||
|  | +   selector: | ||||||
|  | +     matchLabels: | ||||||
|  | +       app: httpbin | ||||||
|  | +   strategy: {} | ||||||
|  | +   template: | ||||||
|  | +     metadata: | ||||||
|  | +       labels: | ||||||
|  | +         app: httpbin | ||||||
|  | +         release: installed | ||||||
|  | +     spec: | ||||||
|  | +       containers: | ||||||
|  | +       - image: docker.io/citizenstig/httpbin:latest | ||||||
|  | +         imagePullPolicy: IfNotPresent | ||||||
|  | +         livenessProbe: | ||||||
|  | +           httpGet: | ||||||
|  | +             path: / | ||||||
|  | +             port: 8000 | ||||||
|  | +         name: httpbin | ||||||
|  | +         ports: | ||||||
|  | +         - containerPort: 8000 | ||||||
|  | +         readinessProbe: | ||||||
|  | +           httpGet: | ||||||
|  | +             path: / | ||||||
|  | +             port: 8000 | ||||||
|  | +         resources: {} | ||||||
|  | + status: {} | ||||||
|  | helmfile-tests, installed-httpbin, Service (v1) has been added: | ||||||
|  | -  | ||||||
|  | + apiVersion: v1 | ||||||
|  | + kind: Service | ||||||
|  | + metadata: | ||||||
|  | +   labels: | ||||||
|  | +     app: httpbin | ||||||
|  | +     chart: httpbin-0.1.0 | ||||||
|  | +     heritage: Helm | ||||||
|  | +     release: installed | ||||||
|  | +   name: installed-httpbin | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + spec: | ||||||
|  | +   ports: | ||||||
|  | +   - name: httpbin | ||||||
|  | +     port: 8000 | ||||||
|  | +     protocol: TCP | ||||||
|  | +     targetPort: 8000 | ||||||
|  | +   selector: | ||||||
|  | +     app: httpbin | ||||||
|  | +     release: installed | ||||||
|  | +   type: LoadBalancer | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,68 @@ | ||||||
|  | ******************** | ||||||
|  | 
 | ||||||
|  | 	Release was not present in Helm.  Diff will show entire contents as new. | ||||||
|  | 
 | ||||||
|  | ******************** | ||||||
|  | helmfile-tests, installed-httpbin, Deployment (apps) has been added: | ||||||
|  | -  | ||||||
|  | + apiVersion: apps/v1 | ||||||
|  | + kind: Deployment | ||||||
|  | + metadata: | ||||||
|  | +   labels: | ||||||
|  | +     app: httpbin | ||||||
|  | +     chart: httpbin-0.1.0 | ||||||
|  | +     heritage: Helm | ||||||
|  | +     release: installed | ||||||
|  | +   name: installed-httpbin | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + spec: | ||||||
|  | +   replicas: 1 | ||||||
|  | +   selector: | ||||||
|  | +     matchLabels: | ||||||
|  | +       app: httpbin | ||||||
|  | +   strategy: {} | ||||||
|  | +   template: | ||||||
|  | +     metadata: | ||||||
|  | +       labels: | ||||||
|  | +         app: httpbin | ||||||
|  | +         release: installed | ||||||
|  | +     spec: | ||||||
|  | +       containers: | ||||||
|  | +       - image: docker.io/citizenstig/httpbin:latest | ||||||
|  | +         imagePullPolicy: IfNotPresent | ||||||
|  | +         livenessProbe: | ||||||
|  | +           httpGet: | ||||||
|  | +             path: / | ||||||
|  | +             port: 8000 | ||||||
|  | +         name: httpbin | ||||||
|  | +         ports: | ||||||
|  | +         - containerPort: 8000 | ||||||
|  | +         readinessProbe: | ||||||
|  | +           httpGet: | ||||||
|  | +             path: / | ||||||
|  | +             port: 8000 | ||||||
|  | +         resources: {} | ||||||
|  | + status: {} | ||||||
|  | helmfile-tests, installed-httpbin, Service (v1) has been added: | ||||||
|  | -  | ||||||
|  | + apiVersion: v1 | ||||||
|  | + kind: Service | ||||||
|  | + metadata: | ||||||
|  | +   labels: | ||||||
|  | +     app: httpbin | ||||||
|  | +     chart: httpbin-0.1.0 | ||||||
|  | +     heritage: Helm | ||||||
|  | +     release: installed | ||||||
|  | +   name: installed-httpbin | ||||||
|  | +   namespace: helmfile-tests | ||||||
|  | + spec: | ||||||
|  | +   ports: | ||||||
|  | +   - name: httpbin | ||||||
|  | +     port: 8000 | ||||||
|  | +     protocol: TCP | ||||||
|  | +     targetPort: 8000 | ||||||
|  | +   selector: | ||||||
|  | +     app: httpbin | ||||||
|  | +     release: installed | ||||||
|  | +   type: LoadBalancer | ||||||
|  | Comparing release=installed, chart=../../../charts/httpbin | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | https://github.com/helmfile/helmfile/issues/1095 | ||||||
		Loading…
	
		Reference in New Issue