User guide: image catalog (spec.image.catalogName)
Reference a named, checksummed (and optionally signed) image alias instead of a raw disk path -- FluxVM's own image catalog, node-scoped admin API, API-only first cut.
What this is
apiVersion: kairon.zyvor.dev/v1alpha1
kind: Machine
metadata: {name: db}
spec:
image: {catalogName: ubuntu-24.04} # instead of image.path
resources: {cpu: "2", memory: 2Gi}
spec.image.catalogName is passed straight through as FluxVM's own
CreateVmRequest.image field, which already accepts a catalog alias
interchangeably with a raw path -- kairon-node does no resolution of its
own (unlike spec.image.source, which
downloads into Kairon's own node-local cache). It's exempt from
--image-root path fencing entirely, since it was never a filesystem
path to begin with -- FluxVM's own catalog integrity checks (mandatory
SHA-256, optional Ed25519 signature) are the trust boundary here instead.
Managing the catalog
Every operation is a node-scoped admin REST endpoint -- catalog entries,
like sandbox templates, are per-node state; registering one on
worker-1 doesn't make it visible from worker-2.
GET /api/v1/nodes/{node}/catalog-- list every entry (any authenticated operator, read-only).POST /api/v1/nodes/{node}/catalog(admin-only, body{"name", "source", "format"}) -- register a new entry.sourceis a local path orhttp(s)://URL; FluxVM downloads it and computes its own SHA-256 (unlikespec.image.source's image-import cache, there's no way to pre-supply a digest here -- FluxVM always derives it itself).formatdefaults toqcow2.DELETE /api/v1/nodes/{node}/catalog/{name}(admin-only) -- remove an entry. Refused by FluxVM itself if the entry is marked read-only.POST .../catalog/{name}/rename(body{"newName"}) -- rename in place.POST .../catalog/{name}/clone(body{"targetName"}) -- copy an entry's underlying image under a new name, e.g. to branch off a read-only base image without touching it.POST .../catalog/{name}/export(body{"path"}) -- copy an entry's image out to an explicit node-local path.POST .../catalog/{name}/read-only(body{"readOnly"}) -- toggle the read-only flag that protects a base image other entries clone from.POST .../catalog/clean-- remove orphaned download artifacts left behind by a previousPOST .../catalogcall.
Real limits today (first cut)
- No dashboard yet. Every capability here is API-only;
kaironctlhas no dedicated verbs either. - No signature generation from Kairon. FluxVM's own
fluxvm catalog signCLI (out of band, on the node itself) is how a signed entry gets its signature -- Kairon only ever relays what FluxVM already reports, never creates or verifies one itself. - Registering an entry is a real, potentially slow operation (a real image download plus a SHA-256 pass over it) -- the admin API's own timeout is generous (15 minutes) to match, but a very large image over a slow link can still exceed it.
- No admission-time validation of
catalogName-- an unresolvable alias just fails clearly at Machine creation time (FluxVM's own error, surfaced unmodified), not rejected earlier by the webhook.