helm: render numbers and booleans in extraEnvironmentVars as values (#12137)

Only a string rendered as `value`; anything else went to `valueFrom`. An
unquoted number or boolean in a values file or `--set`, such as
`WEED_MYSQL_PORT: 3306` or `WEED_MYSQL_ENABLED=true`, rendered as
`valueFrom: 3306` and the API server rejected the workload.

A map still renders as `valueFrom`, a null still renders an empty variable,
and strings are unchanged. Numbers go through toJson because values files
decode them as float64, and quote would print 1000000 as 1e+06.
This commit is contained in:
Ege Zambelli authored and GitHub committed 2026-10-27 17:34:46 -07:00
1 parent 5f26ef6ad1
commit ef16b4ed02
11 files changed
+68 -11

No files matched your search

+38 -1
View File
@@ -560,7 +560,7 @@ jobs:
print("cluster alias: hook waits on the renamed names and the chart's addresses")
# Keys kept in a Secret are referenced, not inlined, so the hook
# must render valueFrom for non-string extraEnvironmentVars.
# must render valueFrom for map-valued extraEnvironmentVars.
out = render(dict(jwt, **{
"global.seaweedfs.extraEnvironmentVars.WEED_JWT_FILER_SIGNING_KEY.secretKeyRef.name": "signing-keys",
"global.seaweedfs.extraEnvironmentVars.WEED_JWT_FILER_SIGNING_KEY.secretKeyRef.key": "filerWrite",
@@ -1224,6 +1224,43 @@ jobs:
print("all-in-one env: shared key renders once, component value wins")
PYEOF
echo "=== Testing extraEnvironmentVars: numbers and booleans render as values ==="
# Only a string rendered as value; anything else went to valueFrom, so an
# unquoted 3306 or true in a values file (or --set) became "valueFrom: 3306"
# and the API server rejected the workload. A map still renders valueFrom,
# and a null still renders an empty variable. --set-json decodes numbers as
# float64, as values files do, which quote would print as 1e+06.
helm template test $CHART_DIR \
--set-json global.seaweedfs.extraEnvironmentVars.WEED_GLOBAL_INT=1000000 \
--set master.extraEnvironmentVars.WEED_MASTER_VOLUME_GROWTH_COPY_1=7 \
--set master.extraEnvironmentVars.WEED_EMPTY=null \
--set filer.extraEnvironmentVars.WEED_MYSQL_ENABLED=true \
--set filer.extraEnvironmentVars.WEED_MYSQL_PORT=3306 \
--set filer.extraEnvironmentVars.WEED_REF.secretKeyRef.name=s \
--set filer.extraEnvironmentVars.WEED_REF.secretKeyRef.key=k > /tmp/env-scalars.yaml
python3 - /tmp/env-scalars.yaml <<'PYEOF'
import sys, yaml
docs = [d for d in yaml.safe_load_all(open(sys.argv[1])) if d]
def env(suffix):
sts = next(d for d in docs if d.get("kind") == "StatefulSet"
and d["metadata"]["name"].endswith(suffix))
return {e["name"]: e for e in sts["spec"]["template"]["spec"]["containers"][0]["env"]}
master, filer = env("-master"), env("-filer")
want = [(master, "WEED_MASTER_VOLUME_GROWTH_COPY_1", "7"), (master, "WEED_GLOBAL_INT", "1000000"),
(filer, "WEED_MYSQL_ENABLED", "true"), (filer, "WEED_MYSQL_PORT", "3306"),
(filer, "WEED_GLOBAL_INT", "1000000")]
failed = [f"{name}: {e.get(name)}" for e, name, value in want
if e.get(name) != {"name": name, "value": value}]
if master.get("WEED_EMPTY") != {"name": "WEED_EMPTY"}:
failed.append(f"WEED_EMPTY: {master.get('WEED_EMPTY')}")
if filer.get("WEED_REF", {}).get("valueFrom") != {"secretKeyRef": {"name": "s", "key": "k"}}:
failed.append(f"WEED_REF: {filer.get('WEED_REF')}")
if failed:
print("FAIL: extraEnvironmentVars rendered wrong:", *failed, sep="\n ", file=sys.stderr)
sys.exit(1)
print("extraEnvironmentVars: numbers and booleans render as values, a map as valueFrom, a null as empty")
PYEOF
echo "=== Testing bucket versioning: YAML bool false suspends like string \"false\" ==="
# bool false used to be a silent no-op while string "false" suspended.
BOOL_FALSE=$(helm template test $CHART_DIR \