Skip to content

feat: per-node installer image override for platforms the image factory cannot build #134

Description

@ojsef39

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions