mirror of
https://github.com/helmfile/helmfile.git
synced 2026-09-30 08:50:54 +02:00
* fix: retry rendering with lenient requiredEnv when selectors are active (#1172) The entire helmfile document is rendered as a Go template before selector labels filter releases. This means requiredEnv calls in releases excluded by selectors still fail, blocking the whole run. When selectors are active and rendering fails due to a requiredEnv error, helmfile now retries with lenient mode: unset env vars produce empty strings instead of failing. The document can then be parsed and filtered by selectors normally. Behavior: - Without selectors: requiredEnv fails as before (validation preserved) - With selectors, all env vars set: strict render succeeds, no retry - With selectors, some env vars missing: lenient retry, excluded releases get empty values and are filtered out by selectors Implementation: - Add RequiredEnvError type + ErrRequiredEnvNotSet sentinel for type-safe error detection via errors.As - Add lenientRequiredEnv flag to tmpl.Context; requiredEnv returns empty string instead of failing when set - Add NewLenientFileRenderer via functional options pattern (FileRendererOption / WithPreRender / WithLenientRequiredEnv) - Extract renderWithSelectorFallback in two_pass_renderer.go - Pass selectors from LoadOpts to desiredStateLoader Closes #1172 Signed-off-by: yxxhero <yxxhero@example.com> Signed-off-by: yxxhero <aiopsclub@163.com> * test: add integration test for selector filtering with requiredEnv (#1172) Verify that selector-based filtering works correctly when requiredEnv is used in release values. Users set all required env vars, so rendering succeeds, and selectors filter out non-matching releases. Test scenarios: - helmfile template -l tier=label2: only rel2 is templated (rel1 excluded) - helmfile template without selector: both releases are templated Closes #1172 Signed-off-by: yxxhero <yxxhero@example.com> Signed-off-by: yxxhero <aiopsclub@163.com> --------- Signed-off-by: yxxhero <yxxhero@example.com> Signed-off-by: yxxhero <aiopsclub@163.com>
68 lines
2.3 KiB
Bash
68 lines
2.3 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Test for issue #1172: Helmfile renders entire helmfile even with selector labels
|
|
# https://github.com/helmfile/helmfile/issues/1172
|
|
#
|
|
# This test verifies that selector-based filtering works correctly when
|
|
# requiredEnv is used in release values. Users set all required env vars,
|
|
# so rendering succeeds, and selectors filter out non-matching releases.
|
|
|
|
issue_1172_case_dir="$(cd "${cases_dir}/issue-1172-selector-required-env" && pwd)"
|
|
issue_1172_tmp=$(mktemp -d)
|
|
|
|
cleanup_issue_1172() {
|
|
rm -rf "${issue_1172_tmp}"
|
|
}
|
|
trap cleanup_issue_1172 EXIT
|
|
|
|
test_start "issue-1172: selector filtering with requiredEnv"
|
|
|
|
export ISSUE_1172_BUZZ="test-buzz-value"
|
|
|
|
# Test 1: With selector tier=label2, only rel2 should be templated
|
|
info "Test 1: helmfile template with -l tier=label2 should only template rel2"
|
|
code=0
|
|
${helmfile} -f "${issue_1172_case_dir}/input/helmfile.yaml.gotmpl" \
|
|
template -l tier=label2 > "${issue_1172_tmp}/selected.yaml" 2>&1 || code=$?
|
|
|
|
if [ ${code} -ne 0 ]; then
|
|
cat "${issue_1172_tmp}/selected.yaml"
|
|
fail "helmfile template with selector should succeed when all env vars are set"
|
|
fi
|
|
|
|
if grep -q "release: rel1" "${issue_1172_tmp}/selected.yaml"; then
|
|
fail "rel1 should NOT be templated when selector tier=label2 is active"
|
|
fi
|
|
|
|
if ! grep -q "release: rel2" "${issue_1172_tmp}/selected.yaml"; then
|
|
cat "${issue_1172_tmp}/selected.yaml"
|
|
fail "rel2 should be templated when selector tier=label2 is active"
|
|
fi
|
|
|
|
info "PASS: only rel2 was templated with selector"
|
|
|
|
# Test 2: Without selector, both releases should be templated
|
|
info "Test 2: helmfile template without selector should template both releases"
|
|
code=0
|
|
${helmfile} -f "${issue_1172_case_dir}/input/helmfile.yaml.gotmpl" \
|
|
template > "${issue_1172_tmp}/all.yaml" 2>&1 || code=$?
|
|
|
|
if [ ${code} -ne 0 ]; then
|
|
cat "${issue_1172_tmp}/all.yaml"
|
|
fail "helmfile template without selector should succeed when all env vars are set"
|
|
fi
|
|
|
|
if ! grep -q "release: rel1" "${issue_1172_tmp}/all.yaml"; then
|
|
fail "rel1 should be templated when no selector is active"
|
|
fi
|
|
|
|
if ! grep -q "release: rel2" "${issue_1172_tmp}/all.yaml"; then
|
|
fail "rel2 should be templated when no selector is active"
|
|
fi
|
|
|
|
info "PASS: both releases were templated without selector"
|
|
|
|
trap - EXIT
|
|
cleanup_issue_1172
|
|
test_pass "issue-1172: selector filtering with requiredEnv"
|