diff --git a/pkg/app/desired_state_file_loader.go b/pkg/app/desired_state_file_loader.go index 4d868ee5..d519581c 100644 --- a/pkg/app/desired_state_file_loader.go +++ b/pkg/app/desired_state_file_loader.go @@ -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 } diff --git a/pkg/environment/environment.go b/pkg/environment/environment.go index 58f02f28..e7e92709 100644 --- a/pkg/environment/environment.go +++ b/pkg/environment/environment.go @@ -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 { diff --git a/pkg/environment/environment_test.go b/pkg/environment/environment_test.go index 3200dabc..11ad7872 100644 --- a/pkg/environment/environment_test.go +++ b/pkg/environment/environment_test.go @@ -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) +} diff --git a/pkg/state/create.go b/pkg/state/create.go index 0654f684..6a8d9672 100644 --- a/pkg/state/create.go +++ b/pkg/state/create.go @@ -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 } diff --git a/pkg/state/envvals_loader.go b/pkg/state/envvals_loader.go index 4eb07498..a81cf3a1 100644 --- a/pkg/state/envvals_loader.go +++ b/pkg/state/envvals_loader.go @@ -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 } diff --git a/pkg/state/envvals_loader_test.go b/pkg/state/envvals_loader_test.go index 098e1558..a2f7d308 100644 --- a/pkg/state/envvals_loader_test.go +++ b/pkg/state/envvals_loader_test.go @@ -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) } diff --git a/pkg/state/testdata/values.6.yaml.gotmpl b/pkg/state/testdata/values.6.yaml.gotmpl new file mode 100644 index 00000000..881b51fc --- /dev/null +++ b/pkg/state/testdata/values.6.yaml.gotmpl @@ -0,0 +1 @@ +envName: {{ .Environment.Name }} diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/config.yaml b/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/config.yaml index f19f5e89..71fee0cb 100644 --- a/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/config.yaml +++ b/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/config.yaml @@ -1,6 +1,3 @@ -localChartRepoServer: - enabled: true - port: 18083 chartifyTempDir: envs_releases_within_same_yaml_part helmfileArgs: - --environment diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/config.yaml b/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/config.yaml new file mode 100644 index 00000000..457221a2 --- /dev/null +++ b/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/config.yaml @@ -0,0 +1,5 @@ +chartifyTempDir: environments_values_gotmpl_with_environment_name +helmfileArgs: +- --environment +- test +- template diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/input.yaml new file mode 100644 index 00000000..e7f10f58 --- /dev/null +++ b/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/input.yaml @@ -0,0 +1,12 @@ +environments: + test: + values: + - test.yaml.gotmpl +--- +releases: +- name: raw + chart: ../../charts/raw-0.0.1 + values: + - templates: + - | + envName: {{ .Values.envName }} diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/output.yaml b/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/output.yaml new file mode 100644 index 00000000..ca434208 --- /dev/null +++ b/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/output.yaml @@ -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 + diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/test.yaml.gotmpl b/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/test.yaml.gotmpl new file mode 100644 index 00000000..03c9afe7 --- /dev/null +++ b/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/test.yaml.gotmpl @@ -0,0 +1 @@ +envName: {{ .Environment.Name }} \ No newline at end of file