diff --git a/cmd/diff.go b/cmd/diff.go index 44d6ba9e..eccdbff8 100644 --- a/cmd/diff.go +++ b/cmd/diff.go @@ -51,6 +51,7 @@ func NewDiffCmd(globalCfg *config.GlobalImpl) *cobra.Command { f.StringArrayVar(&diffOptions.Suppress, "suppress", nil, "suppress specified Kubernetes objects in the output. Can be provided multiple times. For example: --suppress KeycloakClient --suppress VaultSecret") f.BoolVar(&diffOptions.ReuseValues, "reuse-values", false, `Override helmDefaults.reuseValues "helm diff upgrade --install --reuse-values"`) f.BoolVar(&diffOptions.ResetValues, "reset-values", false, `Override helmDefaults.reuseValues "helm diff upgrade --install --reset-values"`) + f.StringVar(&diffOptions.PostRenderer, "post-renderer", "", `pass --post-renderer to "helm template" or "helm upgrade --install"`) return cmd } diff --git a/pkg/app/app.go b/pkg/app/app.go index 69de4bc4..10d88caa 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -1569,6 +1569,7 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) helm := r.helm helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) + helm.SetPostRenderer(c.PostRenderer()) var errs []error @@ -1873,6 +1874,8 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) { helm.SetExtraArgs(args...) } + helm.SetPostRenderer(c.PostRenderer()) + opts := &state.TemplateOpts{ Set: c.Set(), IncludeCRDs: c.IncludeCRDs(), diff --git a/pkg/app/config.go b/pkg/app/config.go index 7da50308..26cc2151 100644 --- a/pkg/app/config.go +++ b/pkg/app/config.go @@ -108,6 +108,7 @@ type SyncConfigProvider interface { type DiffConfigProvider interface { Args() string + PostRenderer() string Values() []string Set() []string diff --git a/pkg/app/diff_test.go b/pkg/app/diff_test.go index a9654a83..d41de33e 100644 --- a/pkg/app/diff_test.go +++ b/pkg/app/diff_test.go @@ -150,6 +150,10 @@ func (a diffConfig) ResetValues() bool { return !a.reuseValues } +func (a diffConfig) PostRenderer() string { + return "" +} + func TestDiff(t *testing.T) { type flags struct { skipNeeds bool diff --git a/pkg/config/diff.go b/pkg/config/diff.go index d9eeee85..625c581b 100644 --- a/pkg/config/diff.go +++ b/pkg/config/diff.go @@ -40,6 +40,8 @@ type DiffOptions struct { ReuseValues bool // ResetValues is true if helm command should reset values to charts' default ResetValues bool + // Propagate '--post-renderer' to helmv3 template and helm install + PostRenderer string } // NewDiffOptions creates a new Apply @@ -171,3 +173,8 @@ func (t *DiffImpl) ReuseValues() bool { func (t *DiffImpl) ResetValues() bool { return t.DiffOptions.ResetValues } + +// PostRenderer returns the PostRenderer. +func (t *DiffImpl) PostRenderer() string { + return t.DiffOptions.PostRenderer +} diff --git a/pkg/state/helmx.go b/pkg/state/helmx.go index c96bb8ce..93ae7541 100644 --- a/pkg/state/helmx.go +++ b/pkg/state/helmx.go @@ -29,10 +29,10 @@ func (st *HelmState) appendHelmXFlags(flags []string, release *ReleaseSpec) []st func (st *HelmState) appendPostRenderFlags(flags []string, release *ReleaseSpec, helm helmexec.Interface) []string { switch { // helm.GetPostRenderer() comes from cmd flag. - case helm.GetPostRenderer() != "": - flags = append(flags, "--post-renderer", helm.GetPostRenderer()) case release.PostRenderer != nil && *release.PostRenderer != "": flags = append(flags, "--post-renderer", *release.PostRenderer) + case helm.GetPostRenderer() != "": + flags = append(flags, "--post-renderer", helm.GetPostRenderer()) case st.HelmDefaults.PostRenderer != nil && *st.HelmDefaults.PostRenderer != "": flags = append(flags, "--post-renderer", *st.HelmDefaults.PostRenderer) } diff --git a/test/integration/run.sh b/test/integration/run.sh index 45fc9df4..14d3eaa4 100755 --- a/test/integration/run.sh +++ b/test/integration/run.sh @@ -82,7 +82,7 @@ ${kubectl} create namespace ${test_ns} || fail "Could not create namespace ${tes . ${dir}/test-cases/secretssops.sh . ${dir}/test-cases/yaml-overwrite.sh . ${dir}/test-cases/chart-needs.sh -. ${dir}/test-cases/postrender-diff.sh +. ${dir}/test-cases/postrender.sh # ALL DONE ----------------------------------------------------------------------------------------------------------- diff --git a/test/integration/test-cases/postrender-diff.sh b/test/integration/test-cases/postrender-diff.sh deleted file mode 100644 index 74b33bc4..00000000 --- a/test/integration/test-cases/postrender-diff.sh +++ /dev/null @@ -1,28 +0,0 @@ -postrender_diff_case_input_dir="${cases_dir}/postrender-diff/input" -postrender_diff_case_output_dir="${cases_dir}/postrender-diff/output" - -config_file="helmfile.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${postrender_diff_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi - -postrender_diff_out_file=${postrender_diff_case_output_dir}/result -if [[ $EXTRA_HELMFILE_FLAGS == *--enable-live-output* ]]; then - postrender_diff_out_file=${postrender_diff_case_output_dir}/result-live -fi - -postrender_diff_tmp=$(mktemp -d) -postrender_diff_reverse=${postrender_diff_tmp}/postrender.diff.build.yaml - -test_start "postrender diff" -info "Comparing postrender diff output ${postrender_diff_reverse} with ${postrender_diff_case_output_dir}/result.yaml" -for i in $(seq 10); do - info "Comparing build/postrender-diff #$i" - ${helmfile} -f ${postrender_diff_case_input_dir}/${config_file} diff --concurrency 1 &> ${postrender_diff_reverse} || fail "\"helmfile diff\" shouldn't fail" - diff -u ${postrender_diff_out_file} ${postrender_diff_reverse} || fail "\"helmfile diff\" should be consistent" - echo code=$? -done -test_pass "postrender diff" \ No newline at end of file diff --git a/test/integration/test-cases/postrender.sh b/test/integration/test-cases/postrender.sh new file mode 100644 index 00000000..d34d0867 --- /dev/null +++ b/test/integration/test-cases/postrender.sh @@ -0,0 +1,44 @@ +postrender_case_input_dir="${cases_dir}/postrender/input" +postrender_case_output_dir="${cases_dir}/postrender/output" + +config_file="helmfile.yaml" +if [[ ${HELMFILE_V1MODE} = true ]]; then + pushd "${postrender_case_input_dir}" + mv "${config_file}" "${config_file}.gotmpl" + config_file="${config_file}.gotmpl" + popd +fi + +postrender_diff_out_file=${postrender_case_output_dir}/diff-result +if [[ $EXTRA_HELMFILE_FLAGS == *--enable-live-output* ]]; then + postrender_diff_out_file=${postrender_case_output_dir}/diff-result-live +fi + +postrender_template_out_file=${postrender_case_output_dir}/template-result +if [[ $EXTRA_HELMFILE_FLAGS == *--enable-live-output* ]]; then + postrender_template_out_file=${postrender_case_output_dir}/template-result-live +fi + +postrender_diff_tmp=$(mktemp -d) +postrender_diff_reverse=${postrender_diff_tmp}/postrender.diff.build.yaml +postrender_template_reverse=${postrender_diff_tmp}/postrender.template.build.yaml + +test_start "postrender diff" +info "Comparing postrender diff output ${postrender_diff_reverse} with ${postrender_case_output_dir}/result.yaml" +for i in $(seq 10); do + info "Comparing build/postrender-diff #$i" + ${helmfile} -f ${postrender_case_input_dir}/${config_file} diff --concurrency 1 --post-renderer ./add-cm1.bash &> ${postrender_diff_reverse} || fail "\"helmfile diff\" shouldn't fail" + diff -u ${postrender_diff_out_file} ${postrender_diff_reverse} || fail "\"helmfile diff\" should be consistent" + echo code=$? +done +test_pass "postrender diff" + +test_start "postrender template" +info "Comparing postrender template output ${postrender_template_reverse} with ${postrender_case_output_dir}/result.yaml" +for i in $(seq 10); do + info "Comparing build/postrender-diff #$i" + ${helmfile} -f ${postrender_case_input_dir}/${config_file} template --concurrency 1 --post-renderer ./add-cm1.bash &> ${postrender_template_reverse} || fail "\"helmfile template\" shouldn't fail" + diff -u ${postrender_template_out_file} ${postrender_template_reverse} || fail "\"helmfile template\" should be consistent" + echo code=$? +done +test_pass "postrender template" diff --git a/test/integration/test-cases/postrender-diff/input/add-cm1.bash b/test/integration/test-cases/postrender/input/add-cm1.bash similarity index 100% rename from test/integration/test-cases/postrender-diff/input/add-cm1.bash rename to test/integration/test-cases/postrender/input/add-cm1.bash diff --git a/test/integration/test-cases/postrender-diff/input/add-cm2.bash b/test/integration/test-cases/postrender/input/add-cm2.bash similarity index 100% rename from test/integration/test-cases/postrender-diff/input/add-cm2.bash rename to test/integration/test-cases/postrender/input/add-cm2.bash diff --git a/test/integration/test-cases/postrender-diff/input/helmfile.yaml b/test/integration/test-cases/postrender/input/helmfile.yaml similarity index 94% rename from test/integration/test-cases/postrender-diff/input/helmfile.yaml rename to test/integration/test-cases/postrender/input/helmfile.yaml index 40a11654..eddf46bb 100644 --- a/test/integration/test-cases/postrender-diff/input/helmfile.yaml +++ b/test/integration/test-cases/postrender/input/helmfile.yaml @@ -1,6 +1,3 @@ -helmDefaults: - postRenderer: ./add-cm1.bash - releases: - name: foo chart: ../../../charts/raw diff --git a/test/integration/test-cases/postrender-diff/output/result b/test/integration/test-cases/postrender/output/diff-result similarity index 100% rename from test/integration/test-cases/postrender-diff/output/result rename to test/integration/test-cases/postrender/output/diff-result diff --git a/test/integration/test-cases/postrender-diff/output/result-live b/test/integration/test-cases/postrender/output/diff-result-live similarity index 100% rename from test/integration/test-cases/postrender-diff/output/result-live rename to test/integration/test-cases/postrender/output/diff-result-live diff --git a/test/integration/test-cases/postrender/output/template-result b/test/integration/test-cases/postrender/output/template-result new file mode 100644 index 00000000..ccad44d0 --- /dev/null +++ b/test/integration/test-cases/postrender/output/template-result @@ -0,0 +1,38 @@ +Building dependency release=foo, chart=../../../charts/raw +Building dependency release=baz, chart=../../../charts/raw +Templating release=foo, chart=../../../charts/raw +--- +# Source: raw/templates/resources.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: foo-1 + namespace: helmfile-tests +data: + foo: FOO +--- +apiVersion: v1 +kind: ConfigMap +data: + two: TWO +metadata: + name: cm2 + +Templating release=baz, chart=../../../charts/raw +--- +# Source: raw/templates/resources.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: baz-3 + namespace: helmfile-tests +data: + baz: BAZ +--- +apiVersion: v1 +kind: ConfigMap +data: + one: ONE +metadata: + name: cm1 + diff --git a/test/integration/test-cases/postrender/output/template-result-live b/test/integration/test-cases/postrender/output/template-result-live new file mode 100644 index 00000000..b5ccb5d3 --- /dev/null +++ b/test/integration/test-cases/postrender/output/template-result-live @@ -0,0 +1,39 @@ +Live output is enabled +Building dependency release=foo, chart=../../../charts/raw +Building dependency release=baz, chart=../../../charts/raw +Templating release=foo, chart=../../../charts/raw +--- +# Source: raw/templates/resources.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: foo-1 + namespace: helmfile-tests +data: + foo: FOO +--- +apiVersion: v1 +kind: ConfigMap +data: + two: TWO +metadata: + name: cm2 + +Templating release=baz, chart=../../../charts/raw +--- +# Source: raw/templates/resources.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: baz-3 + namespace: helmfile-tests +data: + baz: BAZ +--- +apiVersion: v1 +kind: ConfigMap +data: + one: ONE +metadata: + name: cm1 +