From c5d44414b10a030f8a37cf96fd53bab31fa59c19 Mon Sep 17 00:00:00 2001 From: Nikolai Rodionov Date: Wed, 18 Dec 2024 19:11:17 +0100 Subject: [PATCH] feat: execute templates against postRendererHooks 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 {