From e33b4725ea3bd5aff0919a810e68baecc7d1e27b Mon Sep 17 00:00:00 2001 From: Vince-Chenal Date: Fri, 14 Feb 2025 13:49:07 +0100 Subject: [PATCH] feat: inject cli state values (--state-values-set) into environment templating context (#1917) * feat: inject cli state values (--state-values-set) into environment templating context Signed-off-by: Vincent Chenal * test: added envvals_loader unit test for environment values Signed-off-by: Vincent Chenal * test: added 'state values set cli args in environments' integration test Signed-off-by: Vincent Chenal * fix: merge environments before loadValuesEntries Signed-off-by: Vincent Chenal * fix: 'state values set cli args in environments' integration test Signed-off-by: Vincent Chenal --------- Signed-off-by: Vincent Chenal --- pkg/state/create.go | 6 +++++- pkg/state/envvals_loader.go | 2 +- pkg/state/envvals_loader_test.go | 19 +++++++++++++++++++ pkg/state/testdata/values.9.yaml.gotmpl | 1 + test/integration/run.sh | 1 + ...ate-values-set-cli-args-in-environments.sh | 14 ++++++++++++++ .../input/environments.yaml.gotmpl | 2 ++ .../input/helmfile-extra-args | 1 + .../input/helmfile.yaml.gotmpl | 17 +++++++++++++++++ .../output/output.yaml | 8 ++++++++ 10 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 pkg/state/testdata/values.9.yaml.gotmpl create mode 100644 test/integration/test-cases/state-values-set-cli-args-in-environments.sh create mode 100644 test/integration/test-cases/state-values-set-cli-args-in-environments/input/environments.yaml.gotmpl create mode 100644 test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile-extra-args create mode 100644 test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile.yaml.gotmpl create mode 100644 test/integration/test-cases/state-values-set-cli-args-in-environments/output/output.yaml diff --git a/pkg/state/create.go b/pkg/state/create.go index c08086d4..ab2fa6b2 100644 --- a/pkg/state/create.go +++ b/pkg/state/create.go @@ -278,7 +278,11 @@ func (c *StateCreator) loadEnvValues(st *HelmState, name string, failOnMissingEn valuesFiles = append(valuesFiles, f) } envValuesEntries := append(valuesFiles, envSpec.Values...) - valuesVals, err = st.loadValuesEntries(envSpec.MissingFileHandler, envValuesEntries, c.remote, ctxEnv, name) + loadValuesEntriesEnv, err := ctxEnv.Merge(overrode) + if err != nil { + return nil, err + } + valuesVals, err = st.loadValuesEntries(envSpec.MissingFileHandler, envValuesEntries, c.remote, loadValuesEntriesEnv, name) if err != nil { return nil, err } diff --git a/pkg/state/envvals_loader.go b/pkg/state/envvals_loader.go index b0101f34..731cc70d 100644 --- a/pkg/state/envvals_loader.go +++ b/pkg/state/envvals_loader.go @@ -65,7 +65,7 @@ func (ld *EnvironmentValuesLoader) LoadEnvironmentValues(missingFileHandler *str if strings.HasSuffix(f, ".hcl") { hclLoader.AddFile(f) } else { - tmplData := NewEnvironmentTemplateData(env, "", map[string]any{}) + tmplData := NewEnvironmentTemplateData(env, "", env.Values) r := tmpl.NewFileRenderer(ld.fs, filepath.Dir(f), tmplData) bytes, err := r.RenderToBytes(f) if err != nil { diff --git a/pkg/state/envvals_loader_test.go b/pkg/state/envvals_loader_test.go index af801443..764ada78 100644 --- a/pkg/state/envvals_loader_test.go +++ b/pkg/state/envvals_loader_test.go @@ -228,3 +228,22 @@ func TestEnvValsLoad_MultiHCL(t *testing.T) { t.Error(diff) } } + +func TestEnvValsLoad_EnvironmentValues(t *testing.T) { + l := newLoader() + env := environment.New("test") + env.Values["foo"] = "bar" + + actual, err := l.LoadEnvironmentValues(nil, []any{"testdata/values.9.yaml.gotmpl"}, env, "") + if err != nil { + t.Fatal(err) + } + + expected := map[string]any{ + "foo": "bar", + } + + if diff := cmp.Diff(expected, actual); diff != "" { + t.Error(diff) + } +} diff --git a/pkg/state/testdata/values.9.yaml.gotmpl b/pkg/state/testdata/values.9.yaml.gotmpl new file mode 100644 index 00000000..09f8749f --- /dev/null +++ b/pkg/state/testdata/values.9.yaml.gotmpl @@ -0,0 +1 @@ +foo: {{ .Values.foo }} diff --git a/test/integration/run.sh b/test/integration/run.sh index f3d9bb5f..f43909ae 100755 --- a/test/integration/run.sh +++ b/test/integration/run.sh @@ -101,6 +101,7 @@ ${kubectl} create namespace ${test_ns} || fail "Could not create namespace ${tes . ${dir}/test-cases/hcl-secrets.sh . ${dir}/test-cases/issue-1749.sh . ${dir}/test-cases/issue-1893.sh +. ${dir}/test-cases/state-values-set-cli-args-in-environments.sh # ALL DONE ----------------------------------------------------------------------------------------------------------- diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments.sh b/test/integration/test-cases/state-values-set-cli-args-in-environments.sh new file mode 100644 index 00000000..e9de8f8d --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments.sh @@ -0,0 +1,14 @@ +state_values_set_cli_args_in_environments_input_dir="${cases_dir}/state-values-set-cli-args-in-environments/input" +state_values_set_cli_args_in_environments_output_dir="${cases_dir}/state-values-set-cli-args-in-environments/output" + +state_values_set_cli_args_in_environments_tmp=$(mktemp -d) +state_values_set_cli_args_in_environments_reverse=${state_values_set_cli_args_in_environments_tmp}/state.values.set.cli.args.build.yaml + +test_start "state values set cli args in environments" +info "Comparing state values set cli args environments output ${state_values_set_cli_args_in_environments_reverse} with ${state_values_set_cli_args_in_environments_output_dir}/output.yaml" + +${helmfile} -f ${state_values_set_cli_args_in_environments_input_dir}/helmfile.yaml.gotmpl template $(cat "$state_values_set_cli_args_in_environments_input_dir/helmfile-extra-args") --skip-deps > "${state_values_set_cli_args_in_environments_reverse}" || fail "\"helmfile template\" shouldn't fail" +./dyff between -bs "${state_values_set_cli_args_in_environments_output_dir}/output.yaml" "${state_values_set_cli_args_in_environments_reverse}" || fail "\"helmfile template\" should be consistent" +echo code=$? + +test_pass "state values set cli args in environments" diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments/input/environments.yaml.gotmpl b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/environments.yaml.gotmpl new file mode 100644 index 00000000..e822c582 --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/environments.yaml.gotmpl @@ -0,0 +1,2 @@ +--- +foo: {{ .Values.foo }} diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile-extra-args b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile-extra-args new file mode 100644 index 00000000..aed11348 --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile-extra-args @@ -0,0 +1 @@ +--state-values-set foo=bar diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile.yaml.gotmpl b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile.yaml.gotmpl new file mode 100644 index 00000000..e7cefc94 --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile.yaml.gotmpl @@ -0,0 +1,17 @@ +environments: + default: + values: + - environments.yaml.gotmpl +--- +releases: +- name: state-value-set-args-environments + chart: ../../../charts/raw + values: + - templates: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: test + data: + foo: {{ .Values.foo }} diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments/output/output.yaml b/test/integration/test-cases/state-values-set-cli-args-in-environments/output/output.yaml new file mode 100644 index 00000000..e0451d01 --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments/output/output.yaml @@ -0,0 +1,8 @@ +--- +# Source: raw/templates/resources.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: test +data: + foo: bar