Problem
topf upgrade cannot handle a node whose installer image is not an image-factory URL. plan() runs the configured machine.install.image through extractSchematicAndVersion:
pattern := `^.*/([a-zA-Z0-9]+):v?(.+)$`
which requires the last path segment to be a schematic ID. A custom image fails that, and since the error is returned from plan(), one unparseable node aborts the run for the entire cluster, including nodes that would have been fine:
ERROR error error="couldn't extract schematic and version from installer image
'ghcr.io/ojsef39/talos-rpi5-installer:v1.13.10': invalid format: expected */<schematic>:v?<version>"
Only upgrade is affected. apply writes the image without parsing it.
Why a custom image
Raspberry Pi 5 is not supported upstream by Talos, so those nodes install a self-built installer image and the factory cannot produce an equivalent. The cluster is mixed: the amd64 nodes use normal factory images and upgrade fine, the two Pi control planes cannot be upgraded by topf at all.
Current state
pkg/config/node.go exposes factory, platform, schematicId, secureboot and talosVersion, and Node.InstallerImage() always composes <factory>/<platform>-installer/<schematic>:v<version>. There is no way to express a fully custom image.
talhelper covered this with talosImageURL, and topf's own migration skill already flags it as unmapped:
| talosImageURL | derive from factory + schematicId + talosVersion | flag if a specific pinned URL must be preserved |
Proposal
A per-node installerImage which, when set, is used verbatim and skips schematic extraction. The upgrade decision could fall back to comparing the node's running Talos version against talosVersion, or simply always treat such a node as needing an upgrade.
Workaround
--nodes-filter to exclude those nodes, then talosctl upgrade --image by hand.
Problem
topf upgradecannot handle a node whose installer image is not an image-factory URL.plan()runs the configuredmachine.install.imagethroughextractSchematicAndVersion:which requires the last path segment to be a schematic ID. A custom image fails that, and since the error is returned from
plan(), one unparseable node aborts the run for the entire cluster, including nodes that would have been fine:Only
upgradeis affected.applywrites the image without parsing it.Why a custom image
Raspberry Pi 5 is not supported upstream by Talos, so those nodes install a self-built installer image and the factory cannot produce an equivalent. The cluster is mixed: the amd64 nodes use normal factory images and upgrade fine, the two Pi control planes cannot be upgraded by topf at all.
Current state
pkg/config/node.goexposesfactory,platform,schematicId,securebootandtalosVersion, andNode.InstallerImage()always composes<factory>/<platform>-installer/<schematic>:v<version>. There is no way to express a fully custom image.talhelper covered this with
talosImageURL, and topf's own migration skill already flags it as unmapped:Proposal
A per-node
installerImagewhich, when set, is used verbatim and skips schematic extraction. The upgrade decision could fall back to comparing the node's running Talos version againsttalosVersion, or simply always treat such a node as needing an upgrade.Workaround
--nodes-filterto exclude those nodes, thentalosctl upgrade --imageby hand.