fix env value lost in environment values (#605)
* fix env value lost in environment values Signed-off-by: yxxhero <aiopsclub@163.com> * add more test Signed-off-by: yxxhero <aiopsclub@163.com> Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
		
							parent
							
								
									6664f01596
								
							
						
					
					
						commit
						d8cb740dcf
					
				|  | @ -53,7 +53,7 @@ func (ld *desiredStateLoader) Load(f string, opts LoadOpts) (*state.HelmState, e | |||
| 		storage := state.NewStorage(opts.CalleePath, ld.logger, ld.fs) | ||||
| 		envld := state.NewEnvironmentValuesLoader(storage, ld.fs, ld.logger, ld.remote) | ||||
| 		handler := state.MissingFileHandlerError | ||||
| 		vals, err := envld.LoadEnvironmentValues(&handler, args, &environment.EmptyEnvironment) | ||||
| 		vals, err := envld.LoadEnvironmentValues(&handler, args, environment.New(ld.env), ld.env) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  |  | |||
|  | @ -15,6 +15,15 @@ type Environment struct { | |||
| 
 | ||||
| var EmptyEnvironment Environment | ||||
| 
 | ||||
| // New return Environment with default name and values
 | ||||
| func New(name string) *Environment { | ||||
| 	return &Environment{ | ||||
| 		Name:     name, | ||||
| 		Values:   map[string]interface{}{}, | ||||
| 		Defaults: map[string]interface{}{}, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (e Environment) DeepCopy() Environment { | ||||
| 	valuesBytes, err := yaml.Marshal(e.Values) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ import ( | |||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| ) | ||||
| 
 | ||||
| // See https://github.com/roboll/helmfile/issues/1150
 | ||||
|  | @ -97,3 +98,10 @@ func TestMerge_OverwriteWithNilValue_Issue1154(t *testing.T) { | |||
| 		t.Errorf(diff) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestNew(t *testing.T) { | ||||
| 	envName := "test" | ||||
| 	env := New(envName) | ||||
| 
 | ||||
| 	require.Equal(t, envName, env.Name, "environment name should be %s, but got %s", envName, env.Name) | ||||
| } | ||||
|  |  | |||
|  | @ -142,7 +142,7 @@ func (c *StateCreator) LoadEnvValues(target *HelmState, env string, ctxEnv *envi | |||
| 		return nil, &StateLoadError{fmt.Sprintf("failed to read %s", state.FilePath), err} | ||||
| 	} | ||||
| 
 | ||||
| 	newDefaults, err := state.loadValuesEntries(nil, state.DefaultValues, c.remote, ctxEnv) | ||||
| 	newDefaults, err := state.loadValuesEntries(nil, state.DefaultValues, c.remote, ctxEnv, env) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | @ -217,7 +217,7 @@ func (c *StateCreator) loadEnvValues(st *HelmState, name string, failOnMissingEn | |||
| 	envSpec, ok := st.Environments[name] | ||||
| 	if ok { | ||||
| 		var err error | ||||
| 		envVals, err = st.loadValuesEntries(envSpec.MissingFileHandler, envSpec.Values, c.remote, ctxEnv) | ||||
| 		envVals, err = st.loadValuesEntries(envSpec.MissingFileHandler, envSpec.Values, c.remote, ctxEnv, name) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | @ -361,13 +361,13 @@ func (c *StateCreator) scatterGatherEnvSecretFiles(st *HelmState, envSecretFiles | |||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (st *HelmState) loadValuesEntries(missingFileHandler *string, entries []interface{}, remote *remote.Remote, ctxEnv *environment.Environment) (map[string]interface{}, error) { | ||||
| func (st *HelmState) loadValuesEntries(missingFileHandler *string, entries []interface{}, remote *remote.Remote, ctxEnv *environment.Environment, envName string) (map[string]interface{}, error) { | ||||
| 	var envVals map[string]interface{} | ||||
| 
 | ||||
| 	valuesEntries := append([]interface{}{}, entries...) | ||||
| 	ld := NewEnvironmentValuesLoader(st.storage(), st.fs, st.logger, remote) | ||||
| 	var err error | ||||
| 	envVals, err = ld.LoadEnvironmentValues(missingFileHandler, valuesEntries, ctxEnv) | ||||
| 	envVals, err = ld.LoadEnvironmentValues(missingFileHandler, valuesEntries, ctxEnv, envName) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  |  | |||
|  | @ -34,7 +34,7 @@ func NewEnvironmentValuesLoader(storage *Storage, fs *filesystem.FileSystem, log | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (ld *EnvironmentValuesLoader) LoadEnvironmentValues(missingFileHandler *string, valuesEntries []interface{}, ctxEnv *environment.Environment) (map[string]interface{}, error) { | ||||
| func (ld *EnvironmentValuesLoader) LoadEnvironmentValues(missingFileHandler *string, valuesEntries []interface{}, ctxEnv *environment.Environment, envName string) (map[string]interface{}, error) { | ||||
| 	result := map[string]interface{}{} | ||||
| 
 | ||||
| 	for _, entry := range valuesEntries { | ||||
|  | @ -59,7 +59,7 @@ func (ld *EnvironmentValuesLoader) LoadEnvironmentValues(missingFileHandler *str | |||
| 			for _, f := range files { | ||||
| 				var env environment.Environment | ||||
| 				if ctxEnv == nil { | ||||
| 					env = environment.EmptyEnvironment | ||||
| 					env = *environment.New(envName) | ||||
| 				} else { | ||||
| 					env = *ctxEnv | ||||
| 				} | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ import ( | |||
| 
 | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 
 | ||||
| 	"github.com/helmfile/helmfile/pkg/environment" | ||||
| 	ffs "github.com/helmfile/helmfile/pkg/filesystem" | ||||
| 	"github.com/helmfile/helmfile/pkg/helmexec" | ||||
| 	"github.com/helmfile/helmfile/pkg/remote" | ||||
|  | @ -28,7 +29,7 @@ func newLoader() *EnvironmentValuesLoader { | |||
| func TestEnvValsLoad_SingleValuesFile(t *testing.T) { | ||||
| 	l := newLoader() | ||||
| 
 | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"testdata/values.5.yaml"}, nil) | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"testdata/values.5.yaml"}, nil, "") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | @ -42,11 +43,67 @@ func TestEnvValsLoad_SingleValuesFile(t *testing.T) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestEnvValsLoad_EnvironmentNameFile(t *testing.T) { | ||||
| 	l := newLoader() | ||||
| 
 | ||||
| 	expected := map[string]interface{}{ | ||||
| 		"envName": "test", | ||||
| 	} | ||||
| 	emptyExpected := map[string]interface{}{ | ||||
| 		"envName": nil, | ||||
| 	} | ||||
| 
 | ||||
| 	tests := []struct { | ||||
| 		name     string | ||||
| 		env      *environment.Environment | ||||
| 		envName  string | ||||
| 		expected map[string]interface{} | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name:     "env is nil but envName is not", | ||||
| 			env:      nil, | ||||
| 			envName:  "test", | ||||
| 			expected: expected, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:     "envName is emplte but env is not", | ||||
| 			env:      environment.New("test"), | ||||
| 			envName:  "", | ||||
| 			expected: expected, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:     "envName and env is not nil", | ||||
| 			env:      environment.New("test"), | ||||
| 			envName:  "test", | ||||
| 			expected: expected, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:     "envName and env is nil", | ||||
| 			env:      nil, | ||||
| 			envName:  "", | ||||
| 			expected: emptyExpected, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			actual, err := l.LoadEnvironmentValues(nil, []interface{}{"testdata/values.6.yaml.gotmpl"}, tt.env, tt.envName) | ||||
| 			if err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
| 
 | ||||
| 			if diff := cmp.Diff(tt.expected, actual); diff != "" { | ||||
| 				t.Errorf(diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Fetch Environment values from remote
 | ||||
| func TestEnvValsLoad_SingleValuesFileRemote(t *testing.T) { | ||||
| 	l := newLoader() | ||||
| 
 | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"git::https://github.com/helm/helm.git@cmd/helm/testdata/output/values.yaml?ref=v3.8.0"}, nil) | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"git::https://github.com/helm/helm.git@cmd/helm/testdata/output/values.yaml?ref=v3.8.0"}, nil, "") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | @ -64,7 +121,7 @@ func TestEnvValsLoad_SingleValuesFileRemote(t *testing.T) { | |||
| func TestEnvValsLoad_OverwriteNilValue_Issue1150(t *testing.T) { | ||||
| 	l := newLoader() | ||||
| 
 | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"testdata/values.1.yaml", "testdata/values.2.yaml"}, nil) | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"testdata/values.1.yaml", "testdata/values.2.yaml"}, nil, "") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | @ -86,7 +143,7 @@ func TestEnvValsLoad_OverwriteNilValue_Issue1150(t *testing.T) { | |||
| func TestEnvValsLoad_OverwriteWithNilValue_Issue1154(t *testing.T) { | ||||
| 	l := newLoader() | ||||
| 
 | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"testdata/values.3.yaml", "testdata/values.4.yaml"}, nil) | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"testdata/values.3.yaml", "testdata/values.4.yaml"}, nil, "") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | @ -109,7 +166,7 @@ func TestEnvValsLoad_OverwriteWithNilValue_Issue1154(t *testing.T) { | |||
| func TestEnvValsLoad_OverwriteEmptyValue_Issue1168(t *testing.T) { | ||||
| 	l := newLoader() | ||||
| 
 | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"testdata/issues/1168/addons.yaml", "testdata/issues/1168/addons2.yaml"}, nil) | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"testdata/issues/1168/addons.yaml", "testdata/issues/1168/addons2.yaml"}, nil, "") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| envName: {{ .Environment.Name }} | ||||
|  | @ -1,6 +1,3 @@ | |||
| localChartRepoServer: | ||||
|   enabled: true | ||||
|   port: 18083 | ||||
| chartifyTempDir: envs_releases_within_same_yaml_part | ||||
| helmfileArgs: | ||||
| - --environment | ||||
|  |  | |||
|  | @ -0,0 +1,5 @@ | |||
| chartifyTempDir: environments_values_gotmpl_with_environment_name | ||||
| helmfileArgs: | ||||
| - --environment | ||||
| - test | ||||
| - template | ||||
|  | @ -0,0 +1,12 @@ | |||
| environments: | ||||
|   test: | ||||
|     values: | ||||
|     - test.yaml.gotmpl | ||||
| --- | ||||
| releases: | ||||
| - name: raw | ||||
|   chart: ../../charts/raw-0.0.1 | ||||
|   values: | ||||
|   - templates: | ||||
|     - | | ||||
|       envName: {{ .Values.envName }} | ||||
|  | @ -0,0 +1,6 @@ | |||
| Building dependency release=raw, chart=../../charts/raw-0.0.1 | ||||
| Templating release=raw, chart=../../charts/raw-0.0.1 | ||||
| --- | ||||
| # Source: raw/templates/resources.yaml | ||||
| envName: test | ||||
| 
 | ||||
|  | @ -0,0 +1 @@ | |||
| envName: {{ .Environment.Name }} | ||||
		Loading…
	
		Reference in New Issue