Repository navigation
Description
Problem
talm upgrade extracts the target installer image from the node-body patch (nodes/<name>.yaml's machine.install.image), not from values.yaml's top-level image: key. Operators who change values.yaml: image: ... expecting the upgrade to use that image observe upgrade run against a different image, with no warning.
This diverges from talm apply / talm template, which do honor values.yaml overlays.
Reproduction
dev17 OCI cluster, running cozystack/talos:v1.12.6:
values.yaml:image: "ghcr.io/siderolabs/installer:v1.13.0"(operator's intent: upgrade to 1.13).nodes/node0.yamlstill carries the historicalmachine.install.image: ghcr.io/cozystack/cozystack/talos:v1.12.6.talm upgrade -f nodes/node0.yaml.
Wrapper code at pkg/commands/upgrade_handler.go:104-119:
configBundle, machineType, err := engine.FullConfigProcess(eopts, patches)
result, err := engine.SerializeConfiguration(configBundle, machineType)
config, err := configloader.NewFromBytes(result)
image := config.Machine().Install().Image()engine.FullConfigProcess(eopts, patches) calls InitializeConfigBundle (default Talos config generation via machinery's generate.NewInput — NOT chart render) then ApplyPatches(loadedPatches=[nodeFile]). The chart's values.yaml is never read. So Install().Image() reflects whatever machine.install.image the node body declares, falling back to the machinery default.
apply and template use engine.Render() against the chart, which DOES read values.yaml. Two code paths, two different sources of truth for the same value.
Expected
Either:
talm upgradeuses the same render path asapply/template, picking upvalues.yaml.imageand only falling back to node-bodymachine.install.imagewhen the chart didn't render one.- Or
talm upgradedocuments the divergence loudly and emits awarning:line when the node-body image diverges from the chart'svalues.yaml.image.
Why this matters
Verified on dev17: talm upgrade -f nodes/node0.yaml with values.yaml.image: siderolabs/installer:v1.13.0 and node-body cozystack/talos:v1.12.6 ran against cozystack:v1.12.6 — a no-op same-version upgrade. The operator's values.yaml change had zero effect. Operator footgun severity: HIGH on fleets where values.yaml is the single source of truth.
Surfaced during Phase 2C real-Talos validation (see #175 / PR #173 context).
Activity
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
fix(upgrade): take target image from values.yaml, not rendered node body
lexfrei commentedon May 14, 2026
Resolved by #204 (merged into main as a0301e7).