From b5eb879357d0eae3ad914a38f7221bed94573cb6 Mon Sep 17 00:00:00 2001 From: Nikolai Rodionov Date: Tue, 28 Jan 2025 15:34:59 +0100 Subject: [PATCH] feat: execute templates against postRendererHooks (#1839) This commit is supposed to add template support to post renderer args. Also, to make it possible to template arguments that are added to helm defaults, during the load, I'm removing default post renderer args from the state and putting them to each release, unless custom args are defined for the release. Signed-off-by: Nikolai Rodionov --- pkg/app/desired_state_file_loader.go | 8 ++++++++ pkg/state/release.go | 12 ++++++++++++ pkg/state/state_exec_tmpl_test.go | 23 +++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/pkg/app/desired_state_file_loader.go b/pkg/app/desired_state_file_loader.go index a72d3e6d..76fa81f5 100644 --- a/pkg/app/desired_state_file_loader.go +++ b/pkg/app/desired_state_file_loader.go @@ -249,6 +249,14 @@ func (ld *desiredStateLoader) load(env, overrodeEnv *environment.Environment, ba finalState.RenderedValues = currentState.RenderedValues } + if len(finalState.HelmDefaults.PostRendererArgs) > 0 { + for i := range finalState.Releases { + if len(finalState.Releases[i].PostRendererArgs) == 0 { + finalState.Releases[i].PostRendererArgs = finalState.HelmDefaults.PostRendererArgs + } + } + finalState.HelmDefaults.PostRendererArgs = nil + } env = &finalState.Env ld.logger.Debugf("merged environment: %v", env) diff --git a/pkg/state/release.go b/pkg/state/release.go index 5cedcf91..c1b5c437 100644 --- a/pkg/state/release.go +++ b/pkg/state/release.go @@ -90,6 +90,18 @@ func (r ReleaseSpec) ExecuteTemplateExpressions(renderer *tmpl.FileRenderer) (*R result.Labels[key] = s.String() } + { + postRendererArgs := []string{} + for _, ts := range result.PostRendererArgs { + postRendererArg, err := renderer.RenderTemplateContentToString([]byte(ts)) + if err != nil { + return nil, fmt.Errorf("failed executing template expressions in release \"%s\".postRendererArgs = \"%s\": %v", r.Name, ts, err) + } + postRendererArgs = append(postRendererArgs, postRendererArg) + } + result.PostRendererArgs = postRendererArgs + } + if len(result.ValuesTemplate) > 0 { for i, t := range result.ValuesTemplate { switch ts := t.(type) { diff --git a/pkg/state/state_exec_tmpl_test.go b/pkg/state/state_exec_tmpl_test.go index 91efe615..2bb57b0a 100644 --- a/pkg/state/state_exec_tmpl_test.go +++ b/pkg/state/state_exec_tmpl_test.go @@ -123,6 +123,29 @@ func TestHelmState_executeTemplates(t *testing.T) { Values: []any{map[string]any{"key": "app-val0"}}, }, }, + { + name: "Has template expressions in post renderer args", + input: ReleaseSpec{ + Chart: "test-chart", + PostRendererArgs: []string{ + "--release", + "{{ .Release.Name }}", + "--chart", + "{{ .Release.Chart }}", + }, + Name: "test-release", + }, + want: ReleaseSpec{ + Chart: "test-chart", + Name: "test-release", + PostRendererArgs: []string{ + "--release", + "test-chart-dev", + "--chart", + "test-chart", + }, + }, + }, } for i := range tests {