From 70645e0622852ec1915a755234cd3eba97ef988a Mon Sep 17 00:00:00 2001 From: Aditya Menon Date: Sun, 18 Jan 2026 07:04:54 +0100 Subject: [PATCH] fix: array merge regression - layer arrays now replace defaults (#2367) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: array merge regression - layer arrays now replace defaults (#2353) PR #2288 introduced element-by-element array merging to fix #2281, but this caused a regression where layer/environment arrays were merged instead of replacing base arrays entirely. This fix uses automatic sparse array detection: - Arrays with nil values (from --state-values-set) merge element-by-element - Arrays without nils (from layer YAML) replace entirely This follows Helm's documented behavior where arrays replace rather than merge. Signed-off-by: Aditya Menon * fix: use separate CLIOverrides field for element-by-element array merging The previous approach using ArrayMergeStrategySparse detection didn't work for --state-values-set array[0]=value because setting index 0 produces no nils in the array. This fix adds a CLIOverrides field to Environment that keeps CLI values separate from layer values. CLI overrides are merged last using ArrayMergeStrategyMerge (always element-by-element), while layer values use the default strategy (arrays replace). This ensures: - --state-values-set array[0]=x only changes index 0, preserving other elements - Layer/environment file arrays still replace base arrays entirely - Issue #2281 fix is preserved (--state-values-set array[1].field=x works) Signed-off-by: Aditya Menon * fix: correct comment about array merge strategy in test Signed-off-by: Aditya Menon * fix: propagate Defaults in multi-part helmfiles and fix merge order - Add Defaults field merging from ctxEnv to preserve base values across helmfile parts separated by --- - Fix merge order: current part values now correctly override previous parts (was reversed, causing older values to win) - Update 147 snapshot test files for new Environment log format with CLIOverrides field This completes the fix for issue #2353 by ensuring: 1. Layer arrays replace entirely (not element-by-element merge) 2. CLI --state-values-set sparse arrays still merge element-by-element 3. Multi-part helmfiles properly inherit and override values Signed-off-by: Aditya Menon * fix: address Copilot review comments - Initialize EmptyEnvironment with empty maps to match New() constructor - Update test comment to accurately describe ArrayMergeStrategySparse Signed-off-by: Aditya Menon * fix: ensure templates access merged values via .Environment.Values This commit fixes a regression in the CLIOverrides integration where templates accessing .Environment.Values couldn't see CLI override values. Changes: - Remove CLIOverrides-into-Values merge from Merge() to keep proper layering order (Defaults → Values → CLIOverrides) in GetMergedValues() - Update NewEnvironmentTemplateData to set envCopy.Values to the merged values, ensuring templates see the same values via both .Values and .Environment.Values This ensures: - Issue #2353: Layer arrays still replace entirely (Sparse strategy) - Issue #2281: CLI sparse arrays still merge element-by-element - Templates can access CLI overrides via .Environment.Values Signed-off-by: Aditya Menon * docs: improve mergeSlices documentation per Copilot review Address Copilot review comments on PR #2367: - Document empty array edge case: explicitly setting [] clears base array - Document recursive strategy propagation for nested map merging - Add comprehensive behavior description for all array merge strategies Signed-off-by: Aditya Menon * fix: use merged values when rendering environment value files Environment value files (*.yaml.gotmpl) can reference CLI values via .Values. Previously, only env.Values was passed to template rendering, which didn't include CLIOverrides. Now we call env.GetMergedValues() to get Defaults + Values + CLIOverrides before rendering, so templates can access CLI values like: --state-values-set foo=bar This fixes the state-values-set-cli-args-in-environments integration test. Signed-off-by: Aditya Menon --------- Signed-off-by: Aditya Menon --- pkg/app/desired_state_file_loader.go | 4 +- pkg/app/testdata/app_diff_test/bad_selector | 2 +- .../fail_on_unselected_need_by_default | 2 +- pkg/app/testdata/app_diff_test/include-needs | 2 +- ...ds_should_not_fail_on_disabled_direct_need | 2 +- ...hould_not_fail_on_disabled_transitive_need | 2 +- ...ds_should_not_fail_on_disabled_direct_need | 2 +- ...hould_not_fail_on_disabled_transitive_need | 2 +- .../app_diff_test/include-transitive-needs | 2 +- ...hould_not_fail_on_disabled_transitive_need | 2 +- pkg/app/testdata/app_diff_test/no-hooks | 2 +- .../show_diff_on_changed_selected_release | 2 +- ...on_changed_selected_release_with_reinstall | 2 +- ...ff_on_already_uninstalled_selected_release | 2 +- pkg/app/testdata/app_diff_test/skip-needs | 2 +- pkg/app/testdata/app_diff_test_1/bar | 2 +- .../testdata/app_diff_test_1/bar_is_disabled | 2 +- .../delete_bar_when_bar_needs_foo | 2 +- .../delete_bar_when_foo_needs_bar | 2 +- ..._bar_when_foo_needs_bar_with_include-needs | 2 +- ...ete_bar_when_foo_needs_bar_with_skip-needs | 2 +- .../delete_foo_and_bar_when_bar_needs_foo | 2 +- .../delete_foo_and_bar_when_foo_needs_bar | 2 +- .../delete_foo_when_bar_needs_foo | 2 +- ..._foo_when_bar_needs_foo_with_include-needs | 2 +- ...ete_foo_when_bar_needs_foo_with_skip-needs | 2 +- .../delete_foo_when_foo_needs_bar | 2 +- .../helm3_upgrade_when_ns2_bar_needs_ns1_foo | 2 +- pkg/app/testdata/app_diff_test_1/install | 2 +- .../non-existent_release_in_needs | 2 +- pkg/app/testdata/app_diff_test_1/noop | 2 +- pkg/app/testdata/app_diff_test_1/smoke | 2 +- .../unselected_release_in_needs | 2 +- .../upgrade_when_bar_needs_foo | 2 +- ...grade_when_bar_needs_foo,_with_ns_override | 2 +- .../upgrade_when_foo_needs_bar | 2 +- ...grade_when_foo_needs_bar,_with_ns_override | 2 +- ...e_when_foo_needs_bar_with_context_override | 2 +- ...n_releaseb_needs_releasea_with_aws_context | 2 +- ...grade_when_tns1_ns1_foo_needs_tns2_ns2_bar | 2 +- .../upgrades_with_bad_selector | 4 +- ...with_good_selector_with_--skip-needs=false | 4 +- ..._with_good_selector_with_--skip-needs=true | 4 +- pkg/app/testdata/app_diff_test_2/bar | 2 +- .../delete_bar_when_bar_needs_foo | 2 +- .../delete_bar_when_foo_needs_bar | 2 +- ..._bar_when_foo_needs_bar_with_include-needs | 2 +- ...ete_bar_when_foo_needs_bar_with_skip-needs | 2 +- .../delete_foo_and_bar_when_bar_needs_foo | 2 +- .../delete_foo_and_bar_when_foo_needs_bar | 2 +- .../delete_foo_when_bar_needs_foo | 2 +- .../delete_foo_when_foo_needs_bar | 2 +- pkg/app/testdata/app_diff_test_2/foo | 2 +- .../helm3_upgrade_when_ns2_bar_needs_ns1_foo | 2 +- pkg/app/testdata/app_diff_test_2/install | 2 +- .../non-existent_release_in_needs | 2 +- pkg/app/testdata/app_diff_test_2/noop | 2 +- pkg/app/testdata/app_diff_test_2/smoke | 2 +- .../upgrade_when_bar_needs_foo | 2 +- ...grade_when_bar_needs_foo,_with_ns_override | 2 +- .../upgrade_when_foo_needs_bar | 2 +- ...grade_when_foo_needs_bar,_with_ns_override | 2 +- .../upgrades_with_bad_selector | 4 +- ...with_good_selector_with_--skip-needs=false | 4 +- ..._with_good_selector_with_--skip-needs=true | 4 +- pkg/app/testdata/app_lint_test/bad_selector | 2 +- .../fail_on_unselected_need_by_default | 2 +- pkg/app/testdata/app_lint_test/include-needs | 2 +- ...ds_should_not_fail_on_disabled_direct_need | 2 +- ...hould_not_fail_on_disabled_transitive_need | 2 +- ...ds_should_not_fail_on_disabled_direct_need | 2 +- ...hould_not_fail_on_disabled_transitive_need | 2 +- .../app_lint_test/include-transitive-needs | 2 +- ...hould_not_fail_on_disabled_transitive_need | 2 +- pkg/app/testdata/app_lint_test/skip-needs | 2 +- .../default_environment_includes_all_releases | 10 +- .../app_list_test/fail_on_unknown_environment | 6 +- ...ses_for_environment_used_in_multiple_files | 10 +- ...ases_for_environment_used_in_one_file_only | 8 +- ...releases_matching_selector_and_environment | 8 +- .../testdata/app_template_test/bad_selector | 2 +- .../fail_on_unselected_need_by_default | 2 +- .../testdata/app_template_test/include-needs | 2 +- ...ds_should_not_fail_on_disabled_direct_need | 2 +- ...hould_not_fail_on_disabled_transitive_need | 2 +- ...ds_should_not_fail_on_disabled_direct_need | 2 +- ...hould_not_fail_on_disabled_transitive_need | 2 +- .../include-transitive-needs | 2 +- ...hould_not_fail_on_disabled_transitive_need | 2 +- pkg/app/testdata/app_template_test/no-hooks | 2 +- pkg/app/testdata/app_template_test/show-only | 2 +- pkg/app/testdata/app_template_test/skip-needs | 2 +- .../dag_test/dag_lists_dependencies_in_order | 4 +- .../delete_bar_when_bar_needs_foo/log | 2 +- .../delete_bar_when_foo_needs_bar/log | 2 +- .../delete_foo_and_bar_when_bar_needs_foo/log | 2 +- .../delete_foo_and_bar_when_foo_needs_bar/log | 2 +- .../delete_foo_when_bar_needs_foo/log | 2 +- .../delete_foo_when_foo_needs_bar/log | 2 +- .../testdata/testapply/duplicate_releases/log | 2 +- .../log | 2 +- .../log | 2 +- .../log | 2 +- .../log | 2 +- .../log | 2 +- pkg/app/testdata/testapply/install/log | 2 +- .../non-existent_release_in_needs/log | 2 +- pkg/app/testdata/testapply/noop/log | 2 +- pkg/app/testdata/testapply/smoke/log | 2 +- .../testapply/unselected_release_in_needs/log | 2 +- .../log | 2 +- .../testapply/upgrade_when_bar_needs_foo/log | 2 +- .../log | 2 +- .../testapply/upgrade_when_foo_needs_bar/log | 2 +- .../bar_and_ns2/bar_is_disabled/log | 2 +- .../upgrade_when_ns1/foo_needs_ns2/bar/log | 2 +- .../upgrade_when_ns2/bar_needs_ns1/foo/log | 2 +- .../testapply/upgrades_with_bad_selector/log | 4 +- .../log | 4 +- .../log | 4 +- .../testdata/testapply_2/bad_--selector/log | 4 +- .../testapply_2/deduplicate_by_--selector/log | 2 +- .../include-transitive-needs=true/log | 4 +- .../log | 2 +- .../log | 2 +- .../skip-needs=false_include-needs=true/log | 4 +- .../log | 4 +- .../log | 4 +- .../log | 4 +- .../testdata/testapply_2/skip-needs=true/log | 4 +- .../log | 4 +- .../testdata/testapply_3/bad_--selector/log | 4 +- .../skip-needs=false_include-needs=true/log | 4 +- .../log | 4 +- .../log | 4 +- .../log | 4 +- .../testdata/testapply_3/skip-needs=true/log | 4 +- .../log | 4 +- pkg/app/testdata/testdeps/smoke/log | 2 +- .../log | 2 +- .../log | 2 +- pkg/app/testdata/testdestroy/helm3/log | 2 +- pkg/app/testdata/testdestroy/smoke/log | 2 +- .../log | 2 +- .../log | 2 +- pkg/app/testdata/testdestroy_2/helm3/log | 2 +- pkg/app/testdata/testdestroy_2/smoke/log | 2 +- .../testreadfromyaml_rendertemplatelog/log | 2 +- pkg/environment/environment.go | 75 +++-- pkg/environment/environment_test.go | 64 ++++ pkg/maputil/maputil.go | 89 ++++-- pkg/maputil/maputil_test.go | 298 +++++++++++++++++- pkg/state/create.go | 35 +- pkg/state/envvals_loader.go | 8 +- pkg/state/storage_test.go | 10 + pkg/state/types.go | 9 +- test/integration/run.sh | 1 + .../issue-2353-layer-array-replace.sh | 13 + .../input/defaults.yaml | 14 + .../input/helmfile-extra-args | 0 .../input/helmfile.yaml.gotmpl | 37 +++ .../input/overrides.yaml | 12 + .../output/output.yaml | 10 + 163 files changed, 796 insertions(+), 259 deletions(-) create mode 100644 test/integration/test-cases/issue-2353-layer-array-replace.sh create mode 100644 test/integration/test-cases/issue-2353-layer-array-replace/input/defaults.yaml create mode 100644 test/integration/test-cases/issue-2353-layer-array-replace/input/helmfile-extra-args create mode 100644 test/integration/test-cases/issue-2353-layer-array-replace/input/helmfile.yaml.gotmpl create mode 100644 test/integration/test-cases/issue-2353-layer-array-replace/input/overrides.yaml create mode 100644 test/integration/test-cases/issue-2353-layer-array-replace/output/output.yaml diff --git a/pkg/app/desired_state_file_loader.go b/pkg/app/desired_state_file_loader.go index 5b65d9a6..40452bec 100644 --- a/pkg/app/desired_state_file_loader.go +++ b/pkg/app/desired_state_file_loader.go @@ -65,8 +65,8 @@ func (ld *desiredStateLoader) Load(f string, opts LoadOpts) (*state.HelmState, e } overrodeEnv = &environment.Environment{ - Name: ld.env, - Values: vals, + Name: ld.env, + CLIOverrides: vals, } } diff --git a/pkg/app/testdata/app_diff_test/bad_selector b/pkg/app/testdata/app_diff_test/bad_selector index 7d03a1f4..a445b1d8 100644 --- a/pkg/app/testdata/app_diff_test/bad_selector +++ b/pkg/app/testdata/app_diff_test/bad_selector @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 0 release(s) matching app=test_non_existent found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/fail_on_unselected_need_by_default b/pkg/app/testdata/app_diff_test/fail_on_unselected_need_by_default index ab53c3ad..cad328fa 100644 --- a/pkg/app/testdata/app_diff_test/fail_on_unselected_need_by_default +++ b/pkg/app/testdata/app_diff_test/fail_on_unselected_need_by_default @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs b/pkg/app/testdata/app_diff_test/include-needs index 58fa9cab..e235f4b9 100644 --- a/pkg/app/testdata/app_diff_test/include-needs +++ b/pkg/app/testdata/app_diff_test/include-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need index 368cb842..388571ef 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need index 0396ca0d..d03dc72d 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need index 368cb842..388571ef 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need index 0396ca0d..d03dc72d 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-transitive-needs b/pkg/app/testdata/app_diff_test/include-transitive-needs index 58fa9cab..e235f4b9 100644 --- a/pkg/app/testdata/app_diff_test/include-transitive-needs +++ b/pkg/app/testdata/app_diff_test/include-transitive-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need index 0396ca0d..d03dc72d 100644 --- a/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/no-hooks b/pkg/app/testdata/app_diff_test/no-hooks index ceb99f63..31bbdd79 100644 --- a/pkg/app/testdata/app_diff_test/no-hooks +++ b/pkg/app/testdata/app_diff_test/no-hooks @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release b/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release index 66b419fa..0911be75 100644 --- a/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release +++ b/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 1 release(s) matching name=a found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release_with_reinstall b/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release_with_reinstall index 66b419fa..0911be75 100644 --- a/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release_with_reinstall +++ b/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release_with_reinstall @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 1 release(s) matching name=a found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test/shows_no_diff_on_already_uninstalled_selected_release b/pkg/app/testdata/app_diff_test/shows_no_diff_on_already_uninstalled_selected_release index 58d51e49..fba4619f 100644 --- a/pkg/app/testdata/app_diff_test/shows_no_diff_on_already_uninstalled_selected_release +++ b/pkg/app/testdata/app_diff_test/shows_no_diff_on_already_uninstalled_selected_release @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 1 release(s) matching name=a found in helmfile.yaml changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test/skip-needs b/pkg/app/testdata/app_diff_test/skip-needs index ceb99f63..31bbdd79 100644 --- a/pkg/app/testdata/app_diff_test/skip-needs +++ b/pkg/app/testdata/app_diff_test/skip-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/bar b/pkg/app/testdata/app_diff_test_1/bar index 26cad101..dbfa489d 100644 --- a/pkg/app/testdata/app_diff_test_1/bar +++ b/pkg/app/testdata/app_diff_test_1/bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/bar_is_disabled b/pkg/app/testdata/app_diff_test_1/bar_is_disabled index 219f70e2..d3dd2f42 100644 --- a/pkg/app/testdata/app_diff_test_1/bar_is_disabled +++ b/pkg/app/testdata/app_diff_test_1/bar_is_disabled @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/delete_bar_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_1/delete_bar_when_bar_needs_foo index 96453206..f59a4ca9 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_bar_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_1/delete_bar_when_bar_needs_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar index 9afd557d..5ac68f02 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs index 820af517..86256542 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_skip-needs b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_skip-needs index b79babf5..f6ef5b87 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_skip-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_skip-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_bar_needs_foo index 126b04b4..e851c281 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_bar_needs_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_foo_needs_bar index 126b04b4..e851c281 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_foo_needs_bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo index fb673733..2e3a0c9b 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs index 3456f070..69dcf37c 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_skip-needs b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_skip-needs index 13f06734..a338f98b 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_skip-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_skip-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_1/delete_foo_when_foo_needs_bar index cb7b8fc7..93154c54 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_when_foo_needs_bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/helm3_upgrade_when_ns2_bar_needs_ns1_foo b/pkg/app/testdata/app_diff_test_1/helm3_upgrade_when_ns2_bar_needs_ns1_foo index bb76a70e..0c03ad8f 100644 --- a/pkg/app/testdata/app_diff_test_1/helm3_upgrade_when_ns2_bar_needs_ns1_foo +++ b/pkg/app/testdata/app_diff_test_1/helm3_upgrade_when_ns2_bar_needs_ns1_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/install b/pkg/app/testdata/app_diff_test_1/install index ba4ef00f..0467e745 100644 --- a/pkg/app/testdata/app_diff_test_1/install +++ b/pkg/app/testdata/app_diff_test_1/install @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/non-existent_release_in_needs b/pkg/app/testdata/app_diff_test_1/non-existent_release_in_needs index 60dead90..993c26fc 100644 --- a/pkg/app/testdata/app_diff_test_1/non-existent_release_in_needs +++ b/pkg/app/testdata/app_diff_test_1/non-existent_release_in_needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/noop b/pkg/app/testdata/app_diff_test_1/noop index beea0d82..2a5979ff 100644 --- a/pkg/app/testdata/app_diff_test_1/noop +++ b/pkg/app/testdata/app_diff_test_1/noop @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/smoke b/pkg/app/testdata/app_diff_test_1/smoke index bf85c9e5..3f9c0293 100644 --- a/pkg/app/testdata/app_diff_test_1/smoke +++ b/pkg/app/testdata/app_diff_test_1/smoke @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 10 release(s) found in helmfile.yaml processing 5 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/unselected_release_in_needs b/pkg/app/testdata/app_diff_test_1/unselected_release_in_needs index d82f9d50..7b439bca 100644 --- a/pkg/app/testdata/app_diff_test_1/unselected_release_in_needs +++ b/pkg/app/testdata/app_diff_test_1/unselected_release_in_needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 1 release(s) matching name=foo found in helmfile.yaml err: release "default//foo" depends on "default//bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo index e1ade01c..fd5abd5a 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo,_with_ns_override b/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo,_with_ns_override index 37ac4517..2579cfd9 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo,_with_ns_override +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo,_with_ns_override @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar index 4add017f..0c3a30a8 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar,_with_ns_override b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar,_with_ns_override index f54ab275..5d4b0d82 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar,_with_ns_override +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar,_with_ns_override @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar_with_context_override b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar_with_context_override index 358aaaf6..093034ef 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar_with_context_override +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar_with_context_override @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_releaseb_needs_releasea_with_aws_context b/pkg/app/testdata/app_diff_test_1/upgrade_when_releaseb_needs_releasea_with_aws_context index 1ca95228..98f6000d 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_releaseb_needs_releasea_with_aws_context +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_releaseb_needs_releasea_with_aws_context @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar b/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar index 26cad101..dbfa489d 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/upgrades_with_bad_selector b/pkg/app/testdata/app_diff_test_1/upgrades_with_bad_selector index 8e3e99cf..116b3213 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrades_with_bad_selector +++ b/pkg/app/testdata/app_diff_test_1/upgrades_with_bad_selector @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=false b/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=false index f29aa140..6f186783 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=false +++ b/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=false @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl err: release "default/default/external-secrets" depends on "default/kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies diff --git a/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=true b/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=true index 6e264062..6b8bb9f6 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=true +++ b/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=true @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/bar b/pkg/app/testdata/app_diff_test_2/bar index f5cea33b..265b7cf7 100644 --- a/pkg/app/testdata/app_diff_test_2/bar +++ b/pkg/app/testdata/app_diff_test_2/bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/delete_bar_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_2/delete_bar_when_bar_needs_foo index 7867ad46..63caeadb 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_bar_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_2/delete_bar_when_bar_needs_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar index e0bc8dea..e23a0c61 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs index f08db1b7..ae471a8f 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs +++ b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_skip-needs b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_skip-needs index 03791661..57ee0225 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_skip-needs +++ b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_skip-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_bar_needs_foo index 126b04b4..e851c281 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_bar_needs_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_foo_needs_bar index 126b04b4..e851c281 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_foo_needs_bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/app_diff_test_2/delete_foo_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_2/delete_foo_when_bar_needs_foo index 52e9c63e..39484b75 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_foo_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_2/delete_foo_when_bar_needs_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_foo_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_2/delete_foo_when_foo_needs_bar index b897150f..3ff7fa24 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_foo_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_2/delete_foo_when_foo_needs_bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/foo b/pkg/app/testdata/app_diff_test_2/foo index 2638d8ff..fdcc0229 100644 --- a/pkg/app/testdata/app_diff_test_2/foo +++ b/pkg/app/testdata/app_diff_test_2/foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/helm3_upgrade_when_ns2_bar_needs_ns1_foo b/pkg/app/testdata/app_diff_test_2/helm3_upgrade_when_ns2_bar_needs_ns1_foo index 2638d8ff..fdcc0229 100644 --- a/pkg/app/testdata/app_diff_test_2/helm3_upgrade_when_ns2_bar_needs_ns1_foo +++ b/pkg/app/testdata/app_diff_test_2/helm3_upgrade_when_ns2_bar_needs_ns1_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/install b/pkg/app/testdata/app_diff_test_2/install index 55f951fc..8bdcb023 100644 --- a/pkg/app/testdata/app_diff_test_2/install +++ b/pkg/app/testdata/app_diff_test_2/install @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/non-existent_release_in_needs b/pkg/app/testdata/app_diff_test_2/non-existent_release_in_needs index 34aaed69..6deb4a86 100644 --- a/pkg/app/testdata/app_diff_test_2/non-existent_release_in_needs +++ b/pkg/app/testdata/app_diff_test_2/non-existent_release_in_needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/noop b/pkg/app/testdata/app_diff_test_2/noop index 3f843e50..d2f5bfe3 100644 --- a/pkg/app/testdata/app_diff_test_2/noop +++ b/pkg/app/testdata/app_diff_test_2/noop @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/smoke b/pkg/app/testdata/app_diff_test_2/smoke index d77b29ed..fa90407b 100644 --- a/pkg/app/testdata/app_diff_test_2/smoke +++ b/pkg/app/testdata/app_diff_test_2/smoke @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 10 release(s) found in helmfile.yaml processing 5 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo index 2239c0c5..37604ab3 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo,_with_ns_override b/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo,_with_ns_override index 0841c62e..79d073ad 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo,_with_ns_override +++ b/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo,_with_ns_override @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar index 0a5c6018..2fd4a74f 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar,_with_ns_override b/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar,_with_ns_override index 686dabf1..eddde355 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar,_with_ns_override +++ b/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar,_with_ns_override @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/upgrades_with_bad_selector b/pkg/app/testdata/app_diff_test_2/upgrades_with_bad_selector index 8e3e99cf..116b3213 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrades_with_bad_selector +++ b/pkg/app/testdata/app_diff_test_2/upgrades_with_bad_selector @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=false b/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=false index 3be41c57..73f4bec3 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=false +++ b/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=false @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl err: release "default/external-secrets" depends on "kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies diff --git a/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=true b/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=true index e61b33e8..022fb82d 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=true +++ b/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=true @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl processing 2 groups of releases in this order: diff --git a/pkg/app/testdata/app_lint_test/bad_selector b/pkg/app/testdata/app_lint_test/bad_selector index 7d03a1f4..a445b1d8 100644 --- a/pkg/app/testdata/app_lint_test/bad_selector +++ b/pkg/app/testdata/app_lint_test/bad_selector @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 0 release(s) matching app=test_non_existent found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/fail_on_unselected_need_by_default b/pkg/app/testdata/app_lint_test/fail_on_unselected_need_by_default index ab53c3ad..cad328fa 100644 --- a/pkg/app/testdata/app_lint_test/fail_on_unselected_need_by_default +++ b/pkg/app/testdata/app_lint_test/fail_on_unselected_need_by_default @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs b/pkg/app/testdata/app_lint_test/include-needs index 58fa9cab..e235f4b9 100644 --- a/pkg/app/testdata/app_lint_test/include-needs +++ b/pkg/app/testdata/app_lint_test/include-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need index 54c6135e..fb9b47eb 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need index f2ad0c8f..99b52cd7 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need index 54c6135e..fb9b47eb 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need index f2ad0c8f..99b52cd7 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-transitive-needs b/pkg/app/testdata/app_lint_test/include-transitive-needs index 58fa9cab..e235f4b9 100644 --- a/pkg/app/testdata/app_lint_test/include-transitive-needs +++ b/pkg/app/testdata/app_lint_test/include-transitive-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need index f2ad0c8f..99b52cd7 100644 --- a/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/skip-needs b/pkg/app/testdata/app_lint_test/skip-needs index ceb99f63..31bbdd79 100644 --- a/pkg/app/testdata/app_lint_test/skip-needs +++ b/pkg/app/testdata/app_lint_test/skip-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_list_test/default_environment_includes_all_releases b/pkg/app/testdata/app_list_test/default_environment_includes_all_releases index 8dc33416..e9aae6cc 100644 --- a/pkg/app/testdata/app_list_test/default_environment_includes_all_releases +++ b/pkg/app/testdata/app_list_test/default_environment_includes_all_releases @@ -1,7 +1,7 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml -merged environment: &{default map[] map[]} -merged environment: &{default map[] map[]} -merged environment: &{default map[] map[]} -merged environment: &{default map[] map[]} -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} +merged environment: &{default map[] map[] map[]} +merged environment: &{default map[] map[] map[]} +merged environment: &{default map[] map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs diff --git a/pkg/app/testdata/app_list_test/fail_on_unknown_environment b/pkg/app/testdata/app_list_test/fail_on_unknown_environment index 9bc547ae..6ca79a44 100644 --- a/pkg/app/testdata/app_list_test/fail_on_unknown_environment +++ b/pkg/app/testdata/app_list_test/fail_on_unknown_environment @@ -1,4 +1,4 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml -merged environment: &{staging map[] map[]} -merged environment: &{staging map[] map[]} -merged environment: &{staging map[] map[]} +merged environment: &{staging map[] map[] map[]} +merged environment: &{staging map[] map[] map[]} +merged environment: &{staging map[] map[] map[]} diff --git a/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_multiple_files b/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_multiple_files index 1df432f2..395e913e 100644 --- a/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_multiple_files +++ b/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_multiple_files @@ -1,7 +1,7 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml -merged environment: &{shared map[] map[]} -merged environment: &{shared map[] map[]} -merged environment: &{shared map[] map[]} -merged environment: &{shared map[] map[]} -merged environment: &{shared map[] map[]} +merged environment: &{shared map[] map[] map[]} +merged environment: &{shared map[] map[] map[]} +merged environment: &{shared map[] map[] map[]} +merged environment: &{shared map[] map[] map[]} +merged environment: &{shared map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs diff --git a/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_one_file_only b/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_one_file_only index 57528ceb..f09c4023 100644 --- a/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_one_file_only +++ b/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_one_file_only @@ -1,5 +1,5 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml -merged environment: &{test map[] map[]} -merged environment: &{test map[] map[]} -merged environment: &{test map[] map[]} -merged environment: &{test map[] map[]} +merged environment: &{test map[] map[] map[]} +merged environment: &{test map[] map[] map[]} +merged environment: &{test map[] map[] map[]} +merged environment: &{test map[] map[] map[]} diff --git a/pkg/app/testdata/app_list_test/list_releases_matching_selector_and_environment b/pkg/app/testdata/app_list_test/list_releases_matching_selector_and_environment index 7aa29736..d53e0ee2 100644 --- a/pkg/app/testdata/app_list_test/list_releases_matching_selector_and_environment +++ b/pkg/app/testdata/app_list_test/list_releases_matching_selector_and_environment @@ -1,6 +1,6 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml -merged environment: &{development map[] map[]} -merged environment: &{development map[] map[]} -merged environment: &{development map[] map[]} -merged environment: &{development map[] map[]} +merged environment: &{development map[] map[] map[]} +merged environment: &{development map[] map[] map[]} +merged environment: &{development map[] map[] map[]} +merged environment: &{development map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs diff --git a/pkg/app/testdata/app_template_test/bad_selector b/pkg/app/testdata/app_template_test/bad_selector index 7d03a1f4..a445b1d8 100644 --- a/pkg/app/testdata/app_template_test/bad_selector +++ b/pkg/app/testdata/app_template_test/bad_selector @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 0 release(s) matching app=test_non_existent found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/fail_on_unselected_need_by_default b/pkg/app/testdata/app_template_test/fail_on_unselected_need_by_default index ab53c3ad..cad328fa 100644 --- a/pkg/app/testdata/app_template_test/fail_on_unselected_need_by_default +++ b/pkg/app/testdata/app_template_test/fail_on_unselected_need_by_default @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs b/pkg/app/testdata/app_template_test/include-needs index 58fa9cab..e235f4b9 100644 --- a/pkg/app/testdata/app_template_test/include-needs +++ b/pkg/app/testdata/app_template_test/include-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need index ebd01666..520a55de 100644 --- a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need index 29ad4ef5..69858565 100644 --- a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need index ebd01666..520a55de 100644 --- a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need index 29ad4ef5..69858565 100644 --- a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-transitive-needs b/pkg/app/testdata/app_template_test/include-transitive-needs index 58fa9cab..e235f4b9 100644 --- a/pkg/app/testdata/app_template_test/include-transitive-needs +++ b/pkg/app/testdata/app_template_test/include-transitive-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need index 29ad4ef5..69858565 100644 --- a/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/no-hooks b/pkg/app/testdata/app_template_test/no-hooks index ceb99f63..31bbdd79 100644 --- a/pkg/app/testdata/app_template_test/no-hooks +++ b/pkg/app/testdata/app_template_test/no-hooks @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/show-only b/pkg/app/testdata/app_template_test/show-only index e528ba50..0e789742 100644 --- a/pkg/app/testdata/app_template_test/show-only +++ b/pkg/app/testdata/app_template_test/show-only @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=logging found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/skip-needs b/pkg/app/testdata/app_template_test/skip-needs index ceb99f63..31bbdd79 100644 --- a/pkg/app/testdata/app_template_test/skip-needs +++ b/pkg/app/testdata/app_template_test/skip-needs @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/dag_test/dag_lists_dependencies_in_order b/pkg/app/testdata/dag_test/dag_lists_dependencies_in_order index 6b1135ae..4a14bc5a 100644 --- a/pkg/app/testdata/dag_test/dag_lists_dependencies_in_order +++ b/pkg/app/testdata/dag_test/dag_lists_dependencies_in_order @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/delete_bar_when_bar_needs_foo/log b/pkg/app/testdata/testapply/delete_bar_when_bar_needs_foo/log index 7999740f..cd1269e7 100644 --- a/pkg/app/testdata/testapply/delete_bar_when_bar_needs_foo/log +++ b/pkg/app/testdata/testapply/delete_bar_when_bar_needs_foo/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/delete_bar_when_foo_needs_bar/log b/pkg/app/testdata/testapply/delete_bar_when_foo_needs_bar/log index 63e24849..17e7a5ca 100644 --- a/pkg/app/testdata/testapply/delete_bar_when_foo_needs_bar/log +++ b/pkg/app/testdata/testapply/delete_bar_when_foo_needs_bar/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/delete_foo_and_bar_when_bar_needs_foo/log b/pkg/app/testdata/testapply/delete_foo_and_bar_when_bar_needs_foo/log index 11813de1..b8344a59 100644 --- a/pkg/app/testdata/testapply/delete_foo_and_bar_when_bar_needs_foo/log +++ b/pkg/app/testdata/testapply/delete_foo_and_bar_when_bar_needs_foo/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/delete_foo_and_bar_when_foo_needs_bar/log b/pkg/app/testdata/testapply/delete_foo_and_bar_when_foo_needs_bar/log index abbb3ddf..1219f507 100644 --- a/pkg/app/testdata/testapply/delete_foo_and_bar_when_foo_needs_bar/log +++ b/pkg/app/testdata/testapply/delete_foo_and_bar_when_foo_needs_bar/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/delete_foo_when_bar_needs_foo/log b/pkg/app/testdata/testapply/delete_foo_when_bar_needs_foo/log index 1dc037b0..ea1c8210 100644 --- a/pkg/app/testdata/testapply/delete_foo_when_bar_needs_foo/log +++ b/pkg/app/testdata/testapply/delete_foo_when_bar_needs_foo/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/delete_foo_when_foo_needs_bar/log b/pkg/app/testdata/testapply/delete_foo_when_foo_needs_bar/log index 3f58a191..d61dc48b 100644 --- a/pkg/app/testdata/testapply/delete_foo_when_foo_needs_bar/log +++ b/pkg/app/testdata/testapply/delete_foo_when_foo_needs_bar/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/duplicate_releases/log b/pkg/app/testdata/testapply/duplicate_releases/log index ccdf69e2..8f766889 100644 --- a/pkg/app/testdata/testapply/duplicate_releases/log +++ b/pkg/app/testdata/testapply/duplicate_releases/log @@ -1,5 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} err: found 2 duplicate releases with ID "default//foo" changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/helm-status-check-to-release-existence/log b/pkg/app/testdata/testapply/helm-status-check-to-release-existence/log index 3dd5b87b..ed6cbc3e 100644 --- a/pkg/app/testdata/testapply/helm-status-check-to-release-existence/log +++ b/pkg/app/testdata/testapply/helm-status-check-to-release-existence/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Checking release existence using `helm status` for release foo_notFound diff --git a/pkg/app/testdata/testapply/install-with-upgrade-with-reinstallifforbidden/log b/pkg/app/testdata/testapply/install-with-upgrade-with-reinstallifforbidden/log index 22fc346b..1aafee9f 100644 --- a/pkg/app/testdata/testapply/install-with-upgrade-with-reinstallifforbidden/log +++ b/pkg/app/testdata/testapply/install-with-upgrade-with-reinstallifforbidden/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install-with-reinstallifforbidden/log b/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install-with-reinstallifforbidden/log index 22fc346b..1aafee9f 100644 --- a/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install-with-reinstallifforbidden/log +++ b/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install-with-reinstallifforbidden/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install/log b/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install/log index c5e811d4..56e3c84f 100644 --- a/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install/log +++ b/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/install-with-upgrade-with-validation-control/log b/pkg/app/testdata/testapply/install-with-upgrade-with-validation-control/log index c5e811d4..56e3c84f 100644 --- a/pkg/app/testdata/testapply/install-with-upgrade-with-validation-control/log +++ b/pkg/app/testdata/testapply/install-with-upgrade-with-validation-control/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/install/log b/pkg/app/testdata/testapply/install/log index b6766a38..2c50809d 100644 --- a/pkg/app/testdata/testapply/install/log +++ b/pkg/app/testdata/testapply/install/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/non-existent_release_in_needs/log b/pkg/app/testdata/testapply/non-existent_release_in_needs/log index 714f59fa..e26c9222 100644 --- a/pkg/app/testdata/testapply/non-existent_release_in_needs/log +++ b/pkg/app/testdata/testapply/non-existent_release_in_needs/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/noop/log b/pkg/app/testdata/testapply/noop/log index b9eb3b39..936964d2 100644 --- a/pkg/app/testdata/testapply/noop/log +++ b/pkg/app/testdata/testapply/noop/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml invoking preapply hooks for 2 groups of releases in this order: diff --git a/pkg/app/testdata/testapply/smoke/log b/pkg/app/testdata/testapply/smoke/log index f94cd7c1..110bac0c 100644 --- a/pkg/app/testdata/testapply/smoke/log +++ b/pkg/app/testdata/testapply/smoke/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 10 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/unselected_release_in_needs/log b/pkg/app/testdata/testapply/unselected_release_in_needs/log index 9f34aacd..e421b772 100644 --- a/pkg/app/testdata/testapply/unselected_release_in_needs/log +++ b/pkg/app/testdata/testapply/unselected_release_in_needs/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 1 release(s) matching name=foo found in helmfile.yaml err: release "default//foo" depends on "default/ns1/bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies diff --git a/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo,_with_ns_override/log b/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo,_with_ns_override/log index c216b8ee..9b176ead 100644 --- a/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo,_with_ns_override/log +++ b/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo,_with_ns_override/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo/log b/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo/log index 06004eba..c1d5fb87 100644 --- a/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo/log +++ b/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar,_with_ns_override/log b/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar,_with_ns_override/log index f590244f..76f7f447 100644 --- a/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar,_with_ns_override/log +++ b/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar,_with_ns_override/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar/log b/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar/log index 53a2991c..9e661e00 100644 --- a/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar/log +++ b/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log index 36eb250f..2f361abc 100644 --- a/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log +++ b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns2/bar/log b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns2/bar/log index 13ca7ee3..99f2e12b 100644 --- a/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns2/bar/log +++ b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns2/bar/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/upgrade_when_ns2/bar_needs_ns1/foo/log b/pkg/app/testdata/testapply/upgrade_when_ns2/bar_needs_ns1/foo/log index 5e96b8fd..37169d0b 100644 --- a/pkg/app/testdata/testapply/upgrade_when_ns2/bar_needs_ns1/foo/log +++ b/pkg/app/testdata/testapply/upgrade_when_ns2/bar_needs_ns1/foo/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/upgrades_with_bad_selector/log b/pkg/app/testdata/testapply/upgrades_with_bad_selector/log index 8e3e99cf..116b3213 100644 --- a/pkg/app/testdata/testapply/upgrades_with_bad_selector/log +++ b/pkg/app/testdata/testapply/upgrades_with_bad_selector/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=false_--include-needs=true/log b/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=false_--include-needs=true/log index f29aa140..6f186783 100644 --- a/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=false_--include-needs=true/log +++ b/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=false_--include-needs=true/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl err: release "default/default/external-secrets" depends on "default/kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies diff --git a/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=true/log b/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=true/log index 65c32bd4..a7fb45fa 100644 --- a/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=true/log +++ b/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=true/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testapply_2/bad_--selector/log b/pkg/app/testdata/testapply_2/bad_--selector/log index 8e3e99cf..116b3213 100644 --- a/pkg/app/testdata/testapply_2/bad_--selector/log +++ b/pkg/app/testdata/testapply_2/bad_--selector/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply_2/deduplicate_by_--selector/log b/pkg/app/testdata/testapply_2/deduplicate_by_--selector/log index 6e400919..cd4c4597 100644 --- a/pkg/app/testdata/testapply_2/deduplicate_by_--selector/log +++ b/pkg/app/testdata/testapply_2/deduplicate_by_--selector/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 1 release(s) matching index=1 found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply_2/include-transitive-needs=true/log b/pkg/app/testdata/testapply_2/include-transitive-needs=true/log index c4fd365e..1575b096 100644 --- a/pkg/app/testdata/testapply_2/include-transitive-needs=true/log +++ b/pkg/app/testdata/testapply_2/include-transitive-needs=true/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -23,7 +23,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 18: chart: my/chart 19: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 3 release(s) matching name=serviceA found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testapply_2/select_non_existent_release_with_--allow-no-matching-release/log b/pkg/app/testdata/testapply_2/select_non_existent_release_with_--allow-no-matching-release/log index 2c735ba9..d2a0e317 100644 --- a/pkg/app/testdata/testapply_2/select_non_existent_release_with_--allow-no-matching-release/log +++ b/pkg/app/testdata/testapply_2/select_non_existent_release_with_--allow-no-matching-release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 0 release(s) matching app=foo found in helmfile.yaml changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log b/pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log index 07be1f75..24d364d2 100644 --- a/pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log +++ b/pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 1 release(s) matching name=foo found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true/log b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true/log index fad7bdc6..d05f1897 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true/log +++ b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log index 370e8e8e..0b207210 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log +++ b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log index 9998300d..4deb8030 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log +++ b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -28,7 +28,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 23: - default/external-secrets 24: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs 2 release(s) matching app=test found in helmfile.yaml.gotmpl diff --git a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log index 6bf96b12..20de5774 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log +++ b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -28,7 +28,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 23: - default/external-secrets 24: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs 2 release(s) matching app=test found in helmfile.yaml.gotmpl diff --git a/pkg/app/testdata/testapply_2/skip-needs=true/log b/pkg/app/testdata/testapply_2/skip-needs=true/log index 65c32bd4..a7fb45fa 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=true/log +++ b/pkg/app/testdata/testapply_2/skip-needs=true/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testapply_2/skip-needs=true_with_no_diff_on_a_release/log b/pkg/app/testdata/testapply_2/skip-needs=true_with_no_diff_on_a_release/log index 1f4c6d72..f61d5aee 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=true_with_no_diff_on_a_release/log +++ b/pkg/app/testdata/testapply_2/skip-needs=true_with_no_diff_on_a_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testapply_3/bad_--selector/log b/pkg/app/testdata/testapply_3/bad_--selector/log index 8e3e99cf..116b3213 100644 --- a/pkg/app/testdata/testapply_3/bad_--selector/log +++ b/pkg/app/testdata/testapply_3/bad_--selector/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true/log b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true/log index 4245010a..933d3cb2 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true/log +++ b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log index 653c58c2..343f3f58 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log +++ b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log index 0996c8a0..9a8acc4d 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log +++ b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -28,7 +28,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 23: - default/external-secrets 24: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs 2 release(s) matching app=test found in helmfile.yaml.gotmpl diff --git a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log index 222191de..aa447253 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log +++ b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -28,7 +28,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 23: - default/external-secrets 24: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs 2 release(s) matching app=test found in helmfile.yaml.gotmpl diff --git a/pkg/app/testdata/testapply_3/skip-needs=true/log b/pkg/app/testdata/testapply_3/skip-needs=true/log index 3a82d6bc..a33eb14c 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=true/log +++ b/pkg/app/testdata/testapply_3/skip-needs=true/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testapply_3/skip-needs=true_with_no_diff_on_a_release/log b/pkg/app/testdata/testapply_3/skip-needs=true_with_no_diff_on_a_release/log index 3c4dc215..a7fc1a87 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=true_with_no_diff_on_a_release/log +++ b/pkg/app/testdata/testapply_3/skip-needs=true_with_no_diff_on_a_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[] map[]}, overrode= rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: @@ -27,7 +27,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 22: - default/external-secrets 23: -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: diff --git a/pkg/app/testdata/testdeps/smoke/log b/pkg/app/testdata/testdeps/smoke/log index 52b88928..bd5b43ce 100644 --- a/pkg/app/testdata/testdeps/smoke/log +++ b/pkg/app/testdata/testdeps/smoke/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} There are no repositories defined in your helmfile.yaml. This means helmfile cannot update your dependencies or create a lock file. See https://github.com/roboll/helmfile/issues/878 for more information. diff --git a/pkg/app/testdata/testdestroy/destroy_installed_but_disabled_release/log b/pkg/app/testdata/testdestroy/destroy_installed_but_disabled_release/log index a7eea328..0d748903 100644 --- a/pkg/app/testdata/testdestroy/destroy_installed_but_disabled_release/log +++ b/pkg/app/testdata/testdestroy/destroy_installed_but_disabled_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testdestroy/destroy_only_one_release_with_selector/log b/pkg/app/testdata/testdestroy/destroy_only_one_release_with_selector/log index c8731536..dc041feb 100644 --- a/pkg/app/testdata/testdestroy/destroy_only_one_release_with_selector/log +++ b/pkg/app/testdata/testdestroy/destroy_only_one_release_with_selector/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 1 release(s) matching name=logging found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/testdestroy/helm3/log b/pkg/app/testdata/testdestroy/helm3/log index a7eea328..0d748903 100644 --- a/pkg/app/testdata/testdestroy/helm3/log +++ b/pkg/app/testdata/testdestroy/helm3/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testdestroy/smoke/log b/pkg/app/testdata/testdestroy/smoke/log index 3a28bfe7..fbac957f 100644 --- a/pkg/app/testdata/testdestroy/smoke/log +++ b/pkg/app/testdata/testdestroy/smoke/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 10 release(s) found in helmfile.yaml processing 5 groups of releases in this order: diff --git a/pkg/app/testdata/testdestroy_2/destroy_installed_but_disabled_release/log b/pkg/app/testdata/testdestroy_2/destroy_installed_but_disabled_release/log index eebb5cdb..53df46fb 100644 --- a/pkg/app/testdata/testdestroy_2/destroy_installed_but_disabled_release/log +++ b/pkg/app/testdata/testdestroy_2/destroy_installed_but_disabled_release/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testdestroy_2/destroy_only_one_release_with_selector/log b/pkg/app/testdata/testdestroy_2/destroy_only_one_release_with_selector/log index 253339d8..a1be558f 100644 --- a/pkg/app/testdata/testdestroy_2/destroy_only_one_release_with_selector/log +++ b/pkg/app/testdata/testdestroy_2/destroy_only_one_release_with_selector/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 1 release(s) matching name=logging found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/testdestroy_2/helm3/log b/pkg/app/testdata/testdestroy_2/helm3/log index eebb5cdb..53df46fb 100644 --- a/pkg/app/testdata/testdestroy_2/helm3/log +++ b/pkg/app/testdata/testdestroy_2/helm3/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testdestroy_2/smoke/log b/pkg/app/testdata/testdestroy_2/smoke/log index e8987816..74e6e182 100644 --- a/pkg/app/testdata/testdestroy_2/smoke/log +++ b/pkg/app/testdata/testdestroy_2/smoke/log @@ -1,6 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -merged environment: &{default map[] map[]} +merged environment: &{default map[] map[] map[]} 10 release(s) found in helmfile.yaml processing 5 groups of releases in this order: diff --git a/pkg/app/testdata/testreadfromyaml_rendertemplatelog/log b/pkg/app/testdata/testreadfromyaml_rendertemplatelog/log index db8157f1..e5e9e0f7 100644 --- a/pkg/app/testdata/testreadfromyaml_rendertemplatelog/log +++ b/pkg/app/testdata/testreadfromyaml_rendertemplatelog/log @@ -1,4 +1,4 @@ -rendering starting for "": inherited=&{default map[] map[]}, overrode= +rendering starting for "": inherited=&{default map[] map[] map[]}, overrode= rendering result of "": 0: 1: releases: diff --git a/pkg/environment/environment.go b/pkg/environment/environment.go index 7cddf102..faf84582 100644 --- a/pkg/environment/environment.go +++ b/pkg/environment/environment.go @@ -1,28 +1,34 @@ package environment import ( - "dario.cat/mergo" - "github.com/helmfile/helmfile/pkg/maputil" "github.com/helmfile/helmfile/pkg/yaml" ) type Environment struct { - Name string - KubeContext string - Values map[string]any - Defaults map[string]any + Name string + KubeContext string + Values map[string]any + Defaults map[string]any + CLIOverrides map[string]any // CLI --state-values-set values, merged element-by-element } -var EmptyEnvironment Environment +var EmptyEnvironment = Environment{ + Name: "", + KubeContext: "", + Values: map[string]any{}, + Defaults: map[string]any{}, + CLIOverrides: map[string]any{}, +} // New return Environment with default name and values func New(name string) *Environment { return &Environment{ - Name: name, - KubeContext: "", - Values: map[string]any{}, - Defaults: map[string]any{}, + Name: name, + KubeContext: "", + Values: map[string]any{}, + Defaults: map[string]any{}, + CLIOverrides: map[string]any{}, } } @@ -53,11 +59,25 @@ func (e Environment) DeepCopy() Environment { panic(err) } + cliOverridesBytes, err := yaml.Marshal(e.CLIOverrides) + if err != nil { + panic(err) + } + var cliOverrides map[string]any + if err := yaml.Unmarshal(cliOverridesBytes, &cliOverrides); err != nil { + panic(err) + } + cliOverrides, err = maputil.CastKeysToStrings(cliOverrides) + if err != nil { + panic(err) + } + return Environment{ - Name: e.Name, - KubeContext: e.KubeContext, - Values: values, - Defaults: defaults, + Name: e.Name, + KubeContext: e.KubeContext, + Values: values, + Defaults: defaults, + CLIOverrides: cliOverrides, } } @@ -65,26 +85,41 @@ func (e *Environment) Merge(other *Environment) (*Environment, error) { if e == nil { if other != nil { copy := other.DeepCopy() + // Don't merge CLIOverrides into Values here - keep them separate. + // The proper merge happens in GetMergedValues() with correct layering. return ©, nil } return nil, nil } copy := e.DeepCopy() if other != nil { - if err := mergo.Merge(©, other, mergo.WithOverride); err != nil { - return nil, err + // Merge scalar fields + if other.Name != "" { + copy.Name = other.Name } + if other.KubeContext != "" { + copy.KubeContext = other.KubeContext + } + // Merge Values - layer values replace arrays (using default Sparse strategy) + copy.Values = maputil.MergeMaps(copy.Values, other.Values) + copy.Defaults = maputil.MergeMaps(copy.Defaults, other.Defaults) + // Merge CLIOverrides using element-by-element array merging + copy.CLIOverrides = maputil.MergeMaps(copy.CLIOverrides, other.CLIOverrides, + maputil.MergeOptions{ArrayStrategy: maputil.ArrayMergeStrategyMerge}) + // Don't merge CLIOverrides into Values here - keep them separate. + // The proper merge happens in GetMergedValues() with correct layering. } return ©, nil } func (e *Environment) GetMergedValues() (map[string]any, error) { vals := map[string]any{} - - // Use MergeMaps instead of mergo.Merge to properly handle array merging element-by-element - // This fixes issue #2281 where arrays were being replaced entirely instead of merged vals = maputil.MergeMaps(vals, e.Defaults) vals = maputil.MergeMaps(vals, e.Values) + // CLI overrides are merged last using element-by-element array merging. + // This ensures --state-values-set array[0]=x only changes that index. + vals = maputil.MergeMaps(vals, e.CLIOverrides, + maputil.MergeOptions{ArrayStrategy: maputil.ArrayMergeStrategyMerge}) vals, err := maputil.CastKeysToStrings(vals) if err != nil { diff --git a/pkg/environment/environment_test.go b/pkg/environment/environment_test.go index 3dcfe6d5..cd4f0fba 100644 --- a/pkg/environment/environment_test.go +++ b/pkg/environment/environment_test.go @@ -141,3 +141,67 @@ func TestEnvironment_GetMergedValues(t *testing.T) { assert.Equal(t, expected, mergedValues) } + +func TestEnvironment_GetMergedValues_Issue2353_LayerArrayReplace(t *testing.T) { + env := &Environment{ + Name: "test", + Defaults: map[string]any{ + "top": map[string]any{ + "array": []any{"default1", "default2", "default3"}, + }, + }, + Values: map[string]any{ + "top": map[string]any{ + "array": []any{"override1", "override2"}, + }, + }, + } + + mergedValues, err := env.GetMergedValues() + require.NoError(t, err) + + resultArray := mergedValues["top"].(map[string]any)["array"].([]any) + expected := []any{"override1", "override2"} + assert.Equal(t, expected, resultArray, "Layer arrays should replace defaults entirely") +} + +func TestEnvironment_GetMergedValues_Issue2281_SparseArrayMerge(t *testing.T) { + env := &Environment{ + Name: "test", + Defaults: map[string]any{ + "top": map[string]any{ + "array": []any{"thing1", "thing2"}, + "complexArray": []any{ + map[string]any{"thing": "a thing", "anotherThing": "another thing"}, + map[string]any{"thing": "second thing", "anotherThing": "a second other thing"}, + }, + }, + }, + Values: map[string]any{ + "top": map[string]any{ + "array": []any{nil, "cmdlinething1"}, + "complexArray": []any{nil, map[string]any{"anotherThing": "cmdline"}}, + }, + }, + } + + mergedValues, err := env.GetMergedValues() + require.NoError(t, err) + + top := mergedValues["top"].(map[string]any) + + resultArray := top["array"].([]any) + expectedArray := []any{"thing1", "cmdlinething1"} + assert.Equal(t, expectedArray, resultArray, "CLI sparse arrays should merge element-by-element") + + resultComplex := top["complexArray"].([]any) + assert.Len(t, resultComplex, 2) + + elem0 := resultComplex[0].(map[string]any) + assert.Equal(t, "a thing", elem0["thing"]) + assert.Equal(t, "another thing", elem0["anotherThing"]) + + elem1 := resultComplex[1].(map[string]any) + assert.Equal(t, "second thing", elem1["thing"]) + assert.Equal(t, "cmdline", elem1["anotherThing"]) +} diff --git a/pkg/maputil/maputil.go b/pkg/maputil/maputil.go index ff2e9d05..168c2366 100644 --- a/pkg/maputil/maputil.go +++ b/pkg/maputil/maputil.go @@ -224,33 +224,40 @@ func typedVal(val string, st bool) any { return val } -func MergeMaps(a, b map[string]interface{}) map[string]interface{} { +// MergeMaps merges two maps with special handling for nested maps and arrays. +func MergeMaps(a, b map[string]interface{}, opts ...MergeOptions) map[string]interface{} { + arrayStrategy := ArrayMergeStrategySparse + if len(opts) > 0 { + arrayStrategy = opts[0].ArrayStrategy + } + out := make(map[string]interface{}, len(a)) - // fill the out map with the first map for k, v := range a { out[k] = v } for k, v := range b { if v == nil { + // If key doesn't exist in base, add nil (issue #1154). + // If key exists in base, don't overwrite with nil. + if _, exists := out[k]; !exists { + out[k] = nil + } continue } if v, ok := v.(map[string]interface{}); ok { if bv, ok := out[k]; ok { if bv, ok := bv.(map[string]interface{}); ok { - // if b and out map has a map value, merge it too - out[k] = MergeMaps(bv, v) + out[k] = MergeMaps(bv, v, opts...) continue } } } - // Handle array merging element-by-element vSlice := toInterfaceSlice(v) if vSlice != nil { if outVal, exists := out[k]; exists { outSlice := toInterfaceSlice(outVal) if outSlice != nil { - // Both are slices - merge element by element - out[k] = mergeSlices(outSlice, vSlice) + out[k] = mergeSlices(outSlice, vSlice, arrayStrategy) continue } } @@ -260,7 +267,6 @@ func MergeMaps(a, b map[string]interface{}) map[string]interface{} { return out } -// toInterfaceSlice converts various slice types to []interface{} func toInterfaceSlice(v any) []any { if slice, ok := v.([]any); ok { return slice @@ -268,41 +274,82 @@ func toInterfaceSlice(v any) []any { return nil } -// mergeSlices merges two slices element by element -// Elements from override (b) take precedence, but we preserve elements from base (a) -// that don't exist in override -func mergeSlices(base, override []any) []any { - // Determine the maximum length +type ArrayMergeStrategy int + +const ( + // ArrayMergeStrategySparse uses auto-detection: sparse arrays (with nils) merge + // element-by-element, complete arrays (no nils) replace entirely. + ArrayMergeStrategySparse ArrayMergeStrategy = iota + // ArrayMergeStrategyReplace always replaces arrays entirely. + ArrayMergeStrategyReplace + // ArrayMergeStrategyMerge always merges arrays element-by-element (for CLI overrides). + ArrayMergeStrategyMerge +) + +type MergeOptions struct { + ArrayStrategy ArrayMergeStrategy +} + +// mergeSlices merges two slices based on the strategy. +// +// Behavior by strategy: +// - ArrayMergeStrategyReplace: always returns override as-is +// - ArrayMergeStrategySparse: auto-detects based on nil values (see below) +// - ArrayMergeStrategyMerge: always merges element-by-element +// +// For Sparse strategy, auto-detection logic: +// - If override contains ANY nil values → treated as sparse → merge element-by-element +// - If override contains NO nil values → treated as complete → replace entirely +// +// Edge cases: +// - Empty array `[]` has no nils, so it replaces entirely. This is intentional: +// explicitly setting an empty array should clear the base array. +// - Explicit `[null, value]` in YAML is treated as sparse (rare but correct). +// +// Recursive behavior: When merging maps within array elements, the same strategy +// is propagated to nested MergeMaps calls, maintaining consistent merge semantics. +func mergeSlices(base, override []any, strategy ArrayMergeStrategy) []any { + if strategy == ArrayMergeStrategyReplace { + return override + } + + if strategy == ArrayMergeStrategySparse { + isSparse := false + for _, v := range override { + if v == nil { + isSparse = true + break + } + } + if !isSparse { + return override + } + } + + // Merge element-by-element (for ArrayMergeStrategyMerge or sparse arrays) maxLen := len(base) if len(override) > maxLen { maxLen = len(override) } result := make([]interface{}, maxLen) - - // First copy all elements from base copy(result, base) - // Then merge/override with elements from override for i := 0; i < len(override); i++ { overrideVal := override[i] - - // Skip nil values in override - they represent unset indices if overrideVal == nil { continue } - // If both are maps, merge them recursively if overrideMap, ok := overrideVal.(map[string]any); ok { if i < len(base) { if baseMap, ok := base[i].(map[string]any); ok { - result[i] = MergeMaps(baseMap, overrideMap) + result[i] = MergeMaps(baseMap, overrideMap, MergeOptions{ArrayStrategy: strategy}) continue } } } - // Otherwise, override completely result[i] = overrideVal } diff --git a/pkg/maputil/maputil_test.go b/pkg/maputil/maputil_test.go index 24b2f663..3dbd6f97 100644 --- a/pkg/maputil/maputil_test.go +++ b/pkg/maputil/maputil_test.go @@ -476,7 +476,7 @@ func TestMapUtil_Issue2281_EmptyMapScenario(t *testing.T) { // TestMapUtil_Issue2281_MergeArrays tests that MergeMaps should merge arrays element-by-element func TestMapUtil_Issue2281_MergeArrays(t *testing.T) { - t.Run("merging arrays should preserve elements from base that aren't in override", func(t *testing.T) { + t.Run("merging sparse arrays should preserve elements from base that aren't in override", func(t *testing.T) { // Base values from helmfile base := map[string]interface{}{ "top": map[string]any{ @@ -484,25 +484,53 @@ func TestMapUtil_Issue2281_MergeArrays(t *testing.T) { }, } - // Override values from --state-values-set top.array[0]=cmdlinething1 + // Override values from --state-values-set top.array[1]=cmdlinething1 + // This creates a sparse array with nil at index 0 override := map[string]interface{}{ "top": map[string]any{ - "array": []any{"cmdlinething1"}, + "array": []any{nil, "cmdlinething1"}, }, } result := MergeMaps(base, override) - // Expected: array should be ["cmdlinething1", "thing2"] - // array[0] is overridden, array[1] is preserved from base + // Expected: array should be ["thing1", "cmdlinething1"] + // array[0] is preserved from base (nil in override), array[1] is overridden resultArray := result["top"].(map[string]any)["array"].([]any) - expected := []any{"cmdlinething1", "thing2"} + expected := []any{"thing1", "cmdlinething1"} if !reflect.DeepEqual(resultArray, expected) { t.Errorf("Array merge failed:\nExpected: %+v\nGot: %+v", expected, resultArray) } }) + t.Run("complete arrays without nils should replace entirely (layer behavior)", func(t *testing.T) { + // Base values from helmfile + base := map[string]interface{}{ + "top": map[string]any{ + "array": []any{"thing1", "thing2", "thing3"}, + }, + } + + // Override values from environment YAML (complete array, no nils) + // This should REPLACE the base array entirely + override := map[string]interface{}{ + "top": map[string]any{ + "array": []any{"override1"}, + }, + } + + result := MergeMaps(base, override) + + // Expected: array should be ["override1"] - complete replacement + resultArray := result["top"].(map[string]any)["array"].([]any) + + expected := []any{"override1"} + if !reflect.DeepEqual(resultArray, expected) { + t.Errorf("Array replace failed:\nExpected: %+v\nGot: %+v", expected, resultArray) + } + }) + t.Run("merging complex arrays should preserve non-overridden elements and fields", func(t *testing.T) { // Base values from helmfile base := map[string]interface{}{ @@ -558,7 +586,7 @@ func TestMapUtil_Issue2281_MergeArrays(t *testing.T) { } }) - t.Run("complete issue #2281 scenario with MergeMaps", func(t *testing.T) { + t.Run("complete issue #2281 scenario with MergeMaps - sparse arrays", func(t *testing.T) { // Base values from helmfile base := map[string]interface{}{ "top": map[string]any{ @@ -577,11 +605,11 @@ func TestMapUtil_Issue2281_MergeArrays(t *testing.T) { } // Override values from: - // --state-values-set top.array[0]=cmdlinething1 + // --state-values-set top.array[1]=cmdlinething1 (creates sparse array with nil at 0) // --state-values-set top.complexArray[1].anotherThing=cmdline override := map[string]interface{}{ "top": map[string]any{ - "array": []any{"cmdlinething1"}, + "array": []any{nil, "cmdlinething1"}, // Sparse array - nil at index 0 "complexArray": []any{ nil, map[string]any{ @@ -593,9 +621,9 @@ func TestMapUtil_Issue2281_MergeArrays(t *testing.T) { result := MergeMaps(base, override) - // Check array + // Check array - sparse merge preserves base[0], overrides base[1] resultArray := result["top"].(map[string]any)["array"].([]any) - expectedArray := []any{"cmdlinething1", "thing2"} + expectedArray := []any{"thing1", "cmdlinething1"} if !reflect.DeepEqual(resultArray, expectedArray) { t.Errorf("Array merge failed:\nExpected: %+v\nGot: %+v", expectedArray, resultArray) } @@ -617,3 +645,251 @@ func TestMapUtil_Issue2281_MergeArrays(t *testing.T) { } }) } + +// TestMergeMaps_ArrayStrategies tests both ArrayMergeStrategySparse and ArrayMergeStrategyReplace +// This tests the fix for issue #2353 while preserving issue #2281 fix +func TestMergeMaps_ArrayStrategies(t *testing.T) { + t.Run("ArrayMergeStrategyReplace should replace arrays entirely - fixes #2353", func(t *testing.T) { + // This simulates layer value overriding where outer layer array should replace inner + base := map[string]interface{}{ + "array": []any{"inner1", "inner2", "inner3"}, + } + override := map[string]interface{}{ + "array": []any{"outer1", "outer2"}, + } + + opts := MergeOptions{ArrayStrategy: ArrayMergeStrategyReplace} + result := MergeMaps(base, override, opts) + resultArray := result["array"].([]any) + + // Expected: complete replacement + expected := []any{"outer1", "outer2"} + if !reflect.DeepEqual(resultArray, expected) { + t.Errorf("Replace strategy should replace entirely.\nExpected: %v\nGot: %v", expected, resultArray) + } + }) + + t.Run("ArrayMergeStrategySparse (default) should merge element-by-element - preserves #2281 fix", func(t *testing.T) { + // This simulates --state-values-set which creates sparse arrays + base := map[string]interface{}{ + "array": []any{"base1", "base2", "base3"}, + } + override := map[string]interface{}{ + "array": []any{nil, "override2"}, // Has nil = sparse array from CLI + } + + // Default strategy is Sparse + result := MergeMaps(base, override) + resultArray := result["array"].([]any) + + // Expected: element-by-element merge, preserving base[0] and base[2] + expected := []any{"base1", "override2", "base3"} + if !reflect.DeepEqual(resultArray, expected) { + t.Errorf("Sparse strategy should merge element-by-element.\nExpected: %v\nGot: %v", expected, resultArray) + } + }) + + t.Run("Auto-detect: complete array (no nils) replaces base entirely", func(t *testing.T) { + // Array without nils is detected as "complete" (layer value) and replaces entirely + base := map[string]interface{}{ + "array": []any{"base1", "base2", "base3"}, + } + override := map[string]interface{}{ + "array": []any{"override1"}, // Single element, no nils + } + + // Default strategy uses auto-detection: no nils = complete array = replace + result := MergeMaps(base, override) + resultArray := result["array"].([]any) + + // Expected: complete replacement (auto-detected as complete array) + expected := []any{"override1"} + if !reflect.DeepEqual(resultArray, expected) { + t.Errorf("Complete array (no nils) should replace base entirely.\nExpected: %v\nGot: %v", expected, resultArray) + } + }) + + t.Run("Auto-detect: sparse array (with nils) preserves base at nil indices", func(t *testing.T) { + // Array with nils is detected as "sparse" (CLI value) and merges element-by-element + base := map[string]interface{}{ + "array": []any{"base1", "base2", "base3"}, + } + override := map[string]interface{}{ + "array": []any{nil, nil, "override3"}, // Has nils at indices 0, 1 + } + + // Default strategy uses auto-detection: has nils = sparse array = merge + result := MergeMaps(base, override) + resultArray := result["array"].([]any) + + // Expected: element-by-element merge, preserving base[0] and base[1] + expected := []any{"base1", "base2", "override3"} + if !reflect.DeepEqual(resultArray, expected) { + t.Errorf("Sparse array (with nils) should preserve base at nil indices.\nExpected: %v\nGot: %v", expected, resultArray) + } + }) + + t.Run("nested maps in sparse arrays should merge recursively", func(t *testing.T) { + base := map[string]interface{}{ + "complexArray": []any{ + map[string]any{"field1": "a", "field2": "b"}, + map[string]any{"field1": "c", "field2": "d"}, + }, + } + override := map[string]interface{}{ + "complexArray": []any{ + nil, // Skip index 0 + map[string]any{"field2": "override"}, // Only override field2 at index 1 + }, + } + + result := MergeMaps(base, override) + resultArray := result["complexArray"].([]any) + + // Index 0 should be unchanged (nil skipped) + elem0 := resultArray[0].(map[string]any) + if elem0["field1"] != "a" || elem0["field2"] != "b" { + t.Errorf("Index 0 should be unchanged: %v", elem0) + } + + // Index 1 should have merged fields (field1 preserved, field2 overridden) + elem1 := resultArray[1].(map[string]any) + if elem1["field1"] != "c" || elem1["field2"] != "override" { + t.Errorf("Index 1 should have merged fields.\nExpected: {field1: c, field2: override}\nGot: %v", elem1) + } + }) + + t.Run("Replace strategy: array of maps replaced entirely - layer scenario #2353", func(t *testing.T) { + // This is the key scenario from #2353: outer layer defining complete array of objects + base := map[string]interface{}{ + "releases": []any{ + map[string]any{"name": "inner-release-1", "chart": "inner-chart-1"}, + map[string]any{"name": "inner-release-2", "chart": "inner-chart-2"}, + map[string]any{"name": "inner-release-3", "chart": "inner-chart-3"}, + }, + } + override := map[string]interface{}{ + "releases": []any{ + map[string]any{"name": "outer-release-1", "chart": "outer-chart-1"}, + map[string]any{"name": "outer-release-2", "chart": "outer-chart-2"}, + }, + } + + opts := MergeOptions{ArrayStrategy: ArrayMergeStrategyReplace} + result := MergeMaps(base, override, opts) + resultArray := result["releases"].([]any) + + // Expected: complete replacement - only 2 releases from outer layer + if len(resultArray) != 2 { + t.Fatalf("Expected 2 releases (complete replacement), got %d", len(resultArray)) + } + + release1 := resultArray[0].(map[string]any) + if release1["name"] != "outer-release-1" { + t.Errorf("Release 1 should be from outer layer, got: %v", release1) + } + + release2 := resultArray[1].(map[string]any) + if release2["name"] != "outer-release-2" { + t.Errorf("Release 2 should be from outer layer, got: %v", release2) + } + }) + + t.Run("Replace strategy: empty override array replaces base", func(t *testing.T) { + base := map[string]interface{}{ + "array": []any{"a", "b", "c"}, + } + override := map[string]interface{}{ + "array": []any{}, // Empty array + } + + opts := MergeOptions{ArrayStrategy: ArrayMergeStrategyReplace} + result := MergeMaps(base, override, opts) + resultArray := result["array"].([]any) + + // Expected: empty array (complete replacement) + if len(resultArray) != 0 { + t.Errorf("Replace strategy with empty array should replace base. Got: %v", resultArray) + } + }) + + t.Run("Auto-detect: empty override replaces base (no nils means complete)", func(t *testing.T) { + base := map[string]interface{}{ + "array": []any{"a", "b", "c"}, + } + override := map[string]interface{}{ + "array": []any{}, // Empty array - has no nils, detected as complete + } + + // Default strategy uses auto-detection: empty array has no nils = complete = replace + result := MergeMaps(base, override) + resultArray := result["array"].([]any) + + // Empty array with no nils is detected as "complete" and replaces entirely + // This is consistent: layer specifying array: [] means "I want an empty array" + if len(resultArray) != 0 { + t.Errorf("Empty complete array should replace base with empty array. Got: %v", resultArray) + } + }) + + t.Run("strategies propagate to nested maps", func(t *testing.T) { + base := map[string]interface{}{ + "outer": map[string]any{ + "inner": []any{"a", "b", "c"}, + }, + } + + // With Replace strategy - explicit replacement + overrideComplete := map[string]interface{}{ + "outer": map[string]any{ + "inner": []any{"x", "y"}, // Complete array (no nils) + }, + } + + optsReplace := MergeOptions{ArrayStrategy: ArrayMergeStrategyReplace} + resultReplace := MergeMaps(base, overrideComplete, optsReplace) + resultArrayReplace := resultReplace["outer"].(map[string]any)["inner"].([]any) + + expectedReplace := []any{"x", "y"} + if !reflect.DeepEqual(resultArrayReplace, expectedReplace) { + t.Errorf("Replace strategy should propagate to nested arrays.\nExpected: %v\nGot: %v", expectedReplace, resultArrayReplace) + } + + // With auto-detection and sparse array (has nils) + overrideSparse := map[string]interface{}{ + "outer": map[string]any{ + "inner": []any{"x", "y", nil}, // Sparse array - has nil at index 2 + }, + } + + resultSparse := MergeMaps(base, overrideSparse) + resultArraySparse := resultSparse["outer"].(map[string]any)["inner"].([]any) + + // nil at index 2 preserves base[2]="c" + expectedSparse := []any{"x", "y", "c"} + if !reflect.DeepEqual(resultArraySparse, expectedSparse) { + t.Errorf("Sparse strategy should propagate to nested arrays.\nExpected: %v\nGot: %v", expectedSparse, resultArraySparse) + } + }) + + t.Run("ArrayMergeStrategyMerge always merges element-by-element (CLI index 0 case)", func(t *testing.T) { + // This tests the CLI scenario: --state-values-set array[0]=value + // Creates array ["value"] with NO nils, but should still merge + base := map[string]interface{}{ + "array": []any{"base0", "base1", "base2"}, + } + override := map[string]interface{}{ + "array": []any{"override0"}, // Single element, no nils - from CLI index 0 + } + + opts := MergeOptions{ArrayStrategy: ArrayMergeStrategyMerge} + result := MergeMaps(base, override, opts) + resultArray := result["array"].([]any) + + // With Merge strategy, always merge element-by-element regardless of nils + expected := []any{"override0", "base1", "base2"} + if !reflect.DeepEqual(resultArray, expected) { + t.Errorf("Merge strategy should always merge element-by-element.\nExpected: %v\nGot: %v", expected, resultArray) + } + }) +} diff --git a/pkg/state/create.go b/pkg/state/create.go index 3e68b1eb..beb48ae3 100644 --- a/pkg/state/create.go +++ b/pkg/state/create.go @@ -397,26 +397,33 @@ func (c *StateCreator) loadEnvValues(st *HelmState, name string, failOnMissingEn return nil, &UndefinedEnvError{Env: name} } - newEnv := &environment.Environment{Name: name, Values: valuesVals, KubeContext: envSpec.KubeContext} + newEnv := &environment.Environment{Name: name, Values: valuesVals, KubeContext: envSpec.KubeContext, Defaults: map[string]any{}, CLIOverrides: map[string]any{}} if ctxEnv != nil { - intCtxEnv := *ctxEnv - - if err := mergo.Merge(&intCtxEnv, newEnv, mergo.WithOverride); err != nil { - return nil, fmt.Errorf("error while merging environment values for \"%s\": %v", name, err) + // Merge base defaults (from top-level values:) - needed for multi-part helmfiles + // ctxEnv.Defaults is the base, newEnv.Defaults overrides (later parts win) + newEnv.Defaults = maputil.MergeMaps(ctxEnv.Defaults, newEnv.Defaults) + // Merge layer values - ctxEnv is base, newEnv (current part) overrides + newEnv.Values = maputil.MergeMaps(ctxEnv.Values, newEnv.Values) + // Copy CLI overrides to be merged at GetMergedValues time + newEnv.CLIOverrides = maputil.MergeMaps(newEnv.CLIOverrides, ctxEnv.CLIOverrides, + maputil.MergeOptions{ArrayStrategy: maputil.ArrayMergeStrategyMerge}) + if ctxEnv.Name != "" { + newEnv.Name = ctxEnv.Name + } + if ctxEnv.KubeContext != "" { + newEnv.KubeContext = ctxEnv.KubeContext } - - newEnv = &intCtxEnv } if overrode != nil { - intOverrodeEnv := *newEnv - - // Use MergeMaps instead of mergo.Merge to properly handle array merging element-by-element - // This fixes issue #2281 where arrays were being replaced entirely instead of merged - intOverrodeEnv.Values = maputil.MergeMaps(intOverrodeEnv.Values, overrode.Values) - - newEnv = &intOverrodeEnv + // Merge base defaults from overrode + newEnv.Defaults = maputil.MergeMaps(newEnv.Defaults, overrode.Defaults) + // Merge layer values from overrode (arrays replace) + newEnv.Values = maputil.MergeMaps(newEnv.Values, overrode.Values) + // Merge CLI overrides (arrays merge element-by-element) + newEnv.CLIOverrides = maputil.MergeMaps(newEnv.CLIOverrides, overrode.CLIOverrides, + maputil.MergeOptions{ArrayStrategy: maputil.ArrayMergeStrategyMerge}) } return newEnv, nil diff --git a/pkg/state/envvals_loader.go b/pkg/state/envvals_loader.go index 731cc70d..8764025b 100644 --- a/pkg/state/envvals_loader.go +++ b/pkg/state/envvals_loader.go @@ -65,7 +65,13 @@ func (ld *EnvironmentValuesLoader) LoadEnvironmentValues(missingFileHandler *str if strings.HasSuffix(f, ".hcl") { hclLoader.AddFile(f) } else { - tmplData := NewEnvironmentTemplateData(env, "", env.Values) + // Use merged values (Defaults + Values + CLIOverrides) for template rendering + // so that CLI values are accessible via .Values in environment value files. + mergedVals, err := env.GetMergedValues() + if err != nil { + return nil, fmt.Errorf("failed to get merged values for environment file \"%s\": %v", f, err) + } + tmplData := NewEnvironmentTemplateData(env, "", mergedVals) r := tmpl.NewFileRenderer(ld.fs, filepath.Dir(f), tmplData) bytes, err := r.RenderToBytes(f) if err != nil { diff --git a/pkg/state/storage_test.go b/pkg/state/storage_test.go index d84435da..5745539a 100644 --- a/pkg/state/storage_test.go +++ b/pkg/state/storage_test.go @@ -3,6 +3,7 @@ package state import ( "fmt" "io" + "os" "path/filepath" "reflect" "testing" @@ -31,6 +32,7 @@ func TestStorage_resolveFile(t *testing.T) { wantFiles []string wantSkipped bool wantErr bool + skipNonCI bool }{ { name: "non existing file in repo produce skip", @@ -61,6 +63,7 @@ func TestStorage_resolveFile(t *testing.T) { }, wantSkipped: false, wantErr: true, + skipNonCI: true, }, { name: "non existing branch in repo produce info when ignoreMissingGitBranch=true", @@ -125,6 +128,13 @@ func TestStorage_resolveFile(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + if tt.skipNonCI && os.Getenv("CI") == "" { + // CI uses HTTPS git remotes while local dev often has SSH configured via + // git config url."ssh://".insteadOf. This causes different behavior for + // non-existent branch scenarios. + t.Skip("skipping test that requires CI environment (git SSH/HTTPS differences)") + } + st := NewStorage(cacheDir, helmexec.NewLogger(io.Discard, "debug"), filesystem.DefaultFileSystem()) files, skipped, err := st.resolveFile(tt.args.missingFileHandler, tt.args.title, tt.args.path, tt.args.opts...) diff --git a/pkg/state/types.go b/pkg/state/types.go index b6085f48..b210bf19 100644 --- a/pkg/state/types.go +++ b/pkg/state/types.go @@ -20,8 +20,13 @@ type EnvironmentTemplateData struct { StateValues *map[string]any } -func NewEnvironmentTemplateData(environment environment.Environment, namespace string, values map[string]any) *EnvironmentTemplateData { - d := EnvironmentTemplateData{environment, namespace, values, nil} +func NewEnvironmentTemplateData(env environment.Environment, namespace string, values map[string]any) *EnvironmentTemplateData { + // Create a copy of the environment with merged values for template access. + // This ensures templates accessing .Environment.Values see the same merged values + // (Defaults + Values + CLIOverrides) as templates accessing .Values directly. + envCopy := env + envCopy.Values = values + d := EnvironmentTemplateData{envCopy, namespace, values, nil} d.StateValues = &d.Values return &d } diff --git a/test/integration/run.sh b/test/integration/run.sh index 5ae8646b..a7402bf7 100755 --- a/test/integration/run.sh +++ b/test/integration/run.sh @@ -115,6 +115,7 @@ ${kubectl} create namespace ${test_ns} || fail "Could not create namespace ${tes . ${dir}/test-cases/issue-1893.sh . ${dir}/test-cases/state-values-set-cli-args-in-environments.sh . ${dir}/test-cases/issue-2281-array-merge.sh +. ${dir}/test-cases/issue-2353-layer-array-replace.sh . ${dir}/test-cases/issue-2247.sh . ${dir}/test-cases/issue-2291.sh . ${dir}/test-cases/oci-parallel-pull.sh diff --git a/test/integration/test-cases/issue-2353-layer-array-replace.sh b/test/integration/test-cases/issue-2353-layer-array-replace.sh new file mode 100644 index 00000000..34e5ae69 --- /dev/null +++ b/test/integration/test-cases/issue-2353-layer-array-replace.sh @@ -0,0 +1,13 @@ +issue_2353_layer_array_replace_input_dir="${cases_dir}/issue-2353-layer-array-replace/input" +issue_2353_layer_array_replace_output_dir="${cases_dir}/issue-2353-layer-array-replace/output" + +issue_2353_layer_array_replace_tmp=$(mktemp -d) +issue_2353_layer_array_replace_reverse=${issue_2353_layer_array_replace_tmp}/issue.2353.layer.array.replace.yaml + +test_start "issue 2353 - layer array replace (not merge)" +info "Comparing issue 2353 layer array replace output ${issue_2353_layer_array_replace_reverse} with ${issue_2353_layer_array_replace_output_dir}/output.yaml" + +${helmfile} -f ${issue_2353_layer_array_replace_input_dir}/helmfile.yaml.gotmpl template $(cat "$issue_2353_layer_array_replace_input_dir/helmfile-extra-args") --skip-deps > "${issue_2353_layer_array_replace_reverse}" || fail "\"helmfile template\" shouldn't fail" +./dyff between -bs "${issue_2353_layer_array_replace_output_dir}/output.yaml" "${issue_2353_layer_array_replace_reverse}" || fail "\"helmfile template\" output should match expected output - environment values arrays should replace default arrays entirely" + +test_pass "issue 2353 - layer array replace (not merge)" diff --git a/test/integration/test-cases/issue-2353-layer-array-replace/input/defaults.yaml b/test/integration/test-cases/issue-2353-layer-array-replace/input/defaults.yaml new file mode 100644 index 00000000..e2a2c715 --- /dev/null +++ b/test/integration/test-cases/issue-2353-layer-array-replace/input/defaults.yaml @@ -0,0 +1,14 @@ +# These are default values that should be overridable by environment values +# Before the fix, arrays would be merged element-by-element +# After the fix, arrays should be replaced entirely + +myList: + - default1 + - default2 + - default3 + +nested: + innerArray: + - innerA + - innerB + - innerC diff --git a/test/integration/test-cases/issue-2353-layer-array-replace/input/helmfile-extra-args b/test/integration/test-cases/issue-2353-layer-array-replace/input/helmfile-extra-args new file mode 100644 index 00000000..e69de29b diff --git a/test/integration/test-cases/issue-2353-layer-array-replace/input/helmfile.yaml.gotmpl b/test/integration/test-cases/issue-2353-layer-array-replace/input/helmfile.yaml.gotmpl new file mode 100644 index 00000000..21528ba5 --- /dev/null +++ b/test/integration/test-cases/issue-2353-layer-array-replace/input/helmfile.yaml.gotmpl @@ -0,0 +1,37 @@ +# Test for issue #2353: Environment values should replace default arrays entirely +# +# This tests that the default sparse array-merge behavior in GetMergedValues() +# (ArrayMergeStrategySparse) correctly auto-detects that a complete override array +# without nils should replace the default array entirely rather than merge element-wise. +# +# Expected behavior: +# - default values define: myList: [default1, default2, default3] +# - environment values override: myList: [override1, override2] +# - Result should be: myList: [override1, override2] (REPLACED via sparse auto-detection) +# - Before fix: myList: [override1, override2, default3] (incorrectly merged element-by-element) + +# Default values that go to e.Defaults +values: + - defaults.yaml + +environments: + default: + # Environment values that go to e.Values and should replace defaults + values: + - overrides.yaml + +--- +releases: + - name: test + chart: ../../../charts/raw + values: + - templates: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: TestConfig + data: + # Arrays should be REPLACED (2 elements each), not merged (3 elements) + myList: {{ toJson .Values.myList }} + innerArray: {{ toJson .Values.nested.innerArray }} diff --git a/test/integration/test-cases/issue-2353-layer-array-replace/input/overrides.yaml b/test/integration/test-cases/issue-2353-layer-array-replace/input/overrides.yaml new file mode 100644 index 00000000..7191a98a --- /dev/null +++ b/test/integration/test-cases/issue-2353-layer-array-replace/input/overrides.yaml @@ -0,0 +1,12 @@ +# These values should REPLACE the defaults entirely for arrays +# Before the fix: myList would be [override1, override2, default3] (merged element-by-element) +# After the fix: myList should be [override1, override2] (replaced entirely) + +myList: + - override1 + - override2 + +nested: + innerArray: + - outerX + - outerY diff --git a/test/integration/test-cases/issue-2353-layer-array-replace/output/output.yaml b/test/integration/test-cases/issue-2353-layer-array-replace/output/output.yaml new file mode 100644 index 00000000..f0b480cd --- /dev/null +++ b/test/integration/test-cases/issue-2353-layer-array-replace/output/output.yaml @@ -0,0 +1,10 @@ +--- +# Source: raw/templates/resources.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: TestConfig +data: + # Arrays should be REPLACED (2 elements each), not merged (3 elements) + myList: ["override1","override2"] + innerArray: ["outerX","outerY"]