What this installer can install, and the limits.
curl --request GET \ --url https://192.0.2.10:9443/v1/installer/options \ --header 'Authorization: <Authorization>'The install modes first (modes,): the first
answer of an install. Each mode says whether it is available (and
why not), which config sections and fields apply to it, its
switchable services with their defaults, its provider topologies
and the storage uses its data disks may have. A front end renders
every later step from the chosen mode’s entry; nothing about a mode
is hard-coded in a client. single-node is the only available mode
today. A mode that asks for floating IPs marks them required and
recommends a range that is free on this node (network,).
Then, for clients that predate the modes, the same answers for
single-node: profiles, services (services the profile never
offers are left out, not marked unavailable) and topologies. Last,
the floors the install enforces and the install’s steps.
Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”The options.
defaultMode is the mode a draft without one has (single-node, so
a client that predates the modes keeps installing what it did).
modes lists every install mode, available or not, in the order to
offer them. profiles, services and topologies are the
single-node answers, kept for clients that predate modes.
preselectedMode is the mode stage 1’s install kind fixed: the draft’s mode. Stage 2 asks no mode; a draft
that names another is refused at mode. Absent when the node has no
install record, and then any available mode is judged.
object
How this node is installed: the first answer of stage 2. Each mode is a deployment profile of the release model and the node’s part in it.
single-node: one node runs everything (profilesingle-node; node.yamlmode: single-node).hyperconverged-init: the first node of a hyperconverged cluster, the one that founds it (“HA init”; node.yamlmode: ha-init).hyperconverged-join: a node that joins a hyperconverged cluster (“HA join”; node.yamlmode: join).disaggregated-control-plane: a control-plane-only node that compute and storage nodes join later (profiledisaggregated, a preview whose design is open,).
GET /v1/installer/options says which are available; the others
are refused at mode, with the reason.
How this node is installed: the first answer of stage 2. Each mode is a deployment profile of the release model and the node’s part in it.
single-node: one node runs everything (profilesingle-node; node.yamlmode: single-node).hyperconverged-init: the first node of a hyperconverged cluster, the one that founds it (“HA init”; node.yamlmode: ha-init).hyperconverged-join: a node that joins a hyperconverged cluster (“HA join”; node.yamlmode: join).disaggregated-control-plane: a control-plane-only node that compute and storage nodes join later (profiledisaggregated, a preview whose design is open,).
GET /v1/installer/options says which are available; the others
are refused at mode, with the reason.
One install mode and what it asks for. A front end shows
every mode, offers only the available ones (an unavailable one shows
reason), and once one is chosen renders the later steps from it:
the sections and fields it lists, its services, topologies
and storage uses. A field the chosen mode does not list is refused
with an error on that field that names the mode. mode and
profile themselves apply to every mode and are not listed.
object
How this node is installed: the first answer of stage 2. Each mode is a deployment profile of the release model and the node’s part in it.
single-node: one node runs everything (profilesingle-node; node.yamlmode: single-node).hyperconverged-init: the first node of a hyperconverged cluster, the one that founds it (“HA init”; node.yamlmode: ha-init).hyperconverged-join: a node that joins a hyperconverged cluster (“HA join”; node.yamlmode: join).disaggregated-control-plane: a control-plane-only node that compute and storage nodes join later (profiledisaggregated, a preview whose design is open,).
GET /v1/installer/options says which are available; the others
are refused at mode, with the reason.
The mode’s advanced.devMode default: what a draft of
the mode that leaves it out installs, and what a front end sets
the toggle to when the mode is chosen. On for single-node, off
for the others.
The deployment profile the mode installs; the config’s profile must be this.
The node.yaml mode the mode writes. Absent for a mode node.yaml does not have yet.
A short label, e.g. “HA, first node”.
One sentence on what the node becomes.
Whether this installer can install the mode now.
Why the mode is not available, for a person. Absent when it is.
The mode’s design is still open (the disaggregated one,): it is listed so the choice is visible, and it lists no sections, fields, services, topologies or storage uses yet.
The config sections that apply to the mode, in the config’s order.
The config fields that apply to the mode, in the config’s order. The others do not belong to it: a value in one is refused.
The switchable services the mode offers, in display order: the
keys services may name. Empty for a mode whose node adopts the
cluster’s services (a joiner).
object
The provider topologies the mode supports (network.topology).
What a data disk may be for in this mode (storage.disks[].use).
compute is offered in every mode that has storage. ceph only on
a node of a cluster (the hyperconverged modes): Ceph needs a
cluster, so a single-node install does not offer it at all
and a front end hides the choice rather than show it and fail. A
use the mode does not offer is refused on storage.disks[i].use.
It also says what this node’s OS disks leave for compute: stage 1 either kept a free tail on each OS disk for the
node’s first pool, stratum-compute, or gave the OS disks whole to
the system. With the second, the Storage step must have a compute
disk (computeDiskRequired), and the first compute disk’s class is
the install’s default (defaultClassFrom). In a mode with Ceph a
disk reserved for Ceph meets that need too (cephDiskSuffices):
Ceph is then the node’s compute storage, once Ceph is set up.
object
The use values the mode offers.
Whether ceph is one of uses.
Why Ceph is not offered, for a person, e.g. “Ceph needs a cluster; a single node uses compute pools only”. Absent when it is offered.
How stage 1 laid out this node’s OS disks, from its install
record (install.yaml os_disk_layout,). It is a fact of
the node, not an answer: stage 2 writes it into node.yaml
(storage.os_disk_layout) and a draft cannot change it.
compute-tail: the end of each OS disk becomes the node’s first
pool, stratum-compute, whose class stratum-compute is the
install’s default. Data disks are optional.
whole-disk: the OS disks were given whole to the system. They
carry no compute space and there is no stratum-compute: at
least one data disk must be use: compute (or, where
cephDiskSuffices, use: ceph), and the first compute disk is
the node’s first pool (it holds the node’s images) and its class
the install’s default.
Whether the Storage step needs at least one compute disk
(storage.disks[].use: compute, or an entry in the older
storage.dataDisks): true when osDiskLayout is whole-disk.
When cephDiskSuffices, a use: ceph disk counts too. A draft
without one is refused at storage.disks, with
computeDiskReason as the message.
Whether a disk reserved for Ceph (use: ceph) meets
computeDiskRequired on its own: true when computeDiskRequired
and the mode offers Ceph (the hyperconverged modes). A node with
Ceph disks and no compute disk has Ceph as its compute storage:
it builds no local pool, its control plane’s default storage
driver is ceph-rbd, and it has no storage class, so no image
can be added and no instance can launch until Ceph is set up and
given a default storage class. Readiness says so
with the warning StorageAwaitsCeph; it does not block the
install.
Why a compute disk is required, for a person: the OS disks carry no compute space, so a node without a compute pool could hold no instance volume and stage no image. In a mode with Ceph it names both options, a compute pool or a disk reserved for Ceph. Absent when none is required.
Where the install’s default storage class (the one a volume
create, an image import and the console use when none is named)
comes from. os-disk: stratum-compute, the OS disks’ tail.
first-compute-disk: the class of the first compute disk, in
storage.disks order (or the first storage.dataDisks entry).
storagePlan marks that disk with defaultClass. With no
compute disk (Ceph only, cephDiskSuffices) the install has no
default class: one is created when Ceph is set up.
The RAID levels storage.mdArrays[].level may have,
in the order to offer them, with their member rules. Empty for a
mode with no storage answers yet (a preview).
One RAID level a data array may have, and how many members it takes.
object
The fewest members.
Whether the number of members must be even (RAID 10).
Whether the array survives a failed member. False for RAID 0, which the draft accepts with a warning.
The level for a person, e.g. “Mirror. Size of the smallest member. Survives all but one member failing.”
The mode’s network answers that need more than a type.
Present when the mode lists network.floatingIpCidrs.
object
The floating-IP pool (network.floatingIpCidrs, node.yaml
network.floating_ip_cidrs). It is required: a draft with no range
is refused at that field, structured or raw. Tenant floating IPs come
from it, and the LAN router routes it to the node.
suggested is the range a fresh draft starts with: the first of the
installer’s candidates (192.0.2.0/24, 192.0.2.0/24,…) that the
same checks a person’s answer gets accept on this node, beside the
draft’s default VPC: it overlaps none of the node’s networks, the
default VPC, the VPC transit range or the ranges the platform uses
on the node. A front end pre-fills the field with it and shows
suggestedReason.
object
Whether the draft needs at least one range.
Why, for a person.
The recommended ranges, ready to put in the field (one today). Absent when no candidate is free on this node, or the machine could not be read.
One or two short sentences for a person: the candidates skipped as in use, and that the LAN router must route the range to the node; or that none is free. At most 100 characters.
The mode’s host reservation on this machine: the default
the install computes, and the range an operator may choose in
hostReservation instead. A front end shows default and lets the
operator change it between minimum and maximum when settable.
The minimum is for development and test boxes, not production.
In GET /v1/installer/options the default counts no Ceph OSD; a
hyperconverged node adds perCephOsd for each disk it gives Ceph.
The draft’s own (ConfigDraft.hostReservation) counts the draft’s
Ceph disks. Absent when the machine’s CPUs or memory cannot be read,
and for a preview mode.
object
Whether the mode lists hostReservation among its fields.
Why it is not settable, for a person. Absent when it is.
A host reservation: what the node keeps back from VMs for itself (the substrate, and on a hyperconverged node Ceph).
object
A whole number of MiB.
A host reservation: what the node keeps back from VMs for itself (the substrate, and on a hyperconverged node Ceph).
object
A whole number of MiB.
The node’s threads, and its memory rounded down to a whole MiB.
object
A whole number of MiB.
A host reservation: what the node keeps back from VMs for itself (the substrate, and on a hyperconverged node Ceph).
object
A whole number of MiB.
The Ceph OSDs default counts.
How the default is computed, for a person.
What a founder (hyperconverged-init) asks about the cluster and its
networks. Present for that mode
only.
mgmt is the management network, which rides the OOB NIC: the
node’s management address is the OOB NIC’s, and the six VIPs are on
its subnet. It is shown, not asked. suggestedVips is a block of
six addresses at the top of that subnet that are not the node’s;
they are probed free (ARP) when the draft is validated, not here.
object
The planned control-plane sizes cluster.plannedSize takes.
The planned size of a draft that gives none.
The management network, derived from the OOB NIC.
object
The node’s management address, the OOB NIC’s.
The service VIPs (node.yaml cluster.vips), on the management
network. Each must be in its subnet, not the node’s own address nor
another VIP, outside the floating-IP ranges, and free: the draft’s
validation probes each with ARP on the OOB NIC, and an address that
answers is refused. Errors name networks.vips.<name>.
object
The routed-host floating-IP next hop: the LAN router routes every floating range to it, and
it follows the node whose chassis holds the VPC gateways. Required
when network.topology is routed-host, refused when bridged
(the router is the floating IPs’ gateway there).
Why the suggestion is what it is, or why there is none. At most 100 characters.
The storage and overlay networks a fresh founder draft starts with
(networks.storage, networks.overlay). The defaults are
192.0.2.0/24 on VLAN 90 and 192.0.2.0/24 on VLAN 91, MTU 9000. A
default that overlaps a range in use on this node steps to the next
free /24 (192.0.2.0/24… 192.0.2.0/24, then 192.0.2.0/24…
192.0.2.0/24, then 192.168.90.0/24… 192.168.99.0/24), in that
order, so the same node gets the same answer. In use: the
management network, the addresses and routes on the node’s NICs,
the draft’s default VPC, the VPC transit range, the draft’s floating
IP ranges (or the suggested one), the ranges the platform uses on
the node (100.64.0.0/10 among them), and the other purpose’s
suggestion. Present when the machine is known.
object
One suggested purpose network, in PurposeNetwork’s shape, and why.
object
The network. Absent when no candidate is free on this node.
Why this range, for a person.
One suggested purpose network, in PurposeNetwork’s shape, and why.
object
The network. Absent when no candidate is free on this node.
Why this range, for a person.
The purposes a link may carry (links[].purposes).
Every network purpose with a label and a one-line description, in
display order: the copy a front end shows beside the networks
and the links. oob and mgmt ride the OOB NIC; a link carries the
others (purposes).
A network purpose, for a person.
object
The provider network choice (network.topology): how VM traffic and
floating IPs reach your network. One choice per topology the mode
offers (topologies), in display order; default is a fresh
draft’s. The copy is the server’s: a front end shows title,
summary and configure as they are, and asks for the provider VLAN
only as providerVlan says. Present for single-node (routed-host
only) and hyperconverged-init.
object
One provider topology, for a person.
object
One line on what the choice is.
What you configure outside Stratum for it, one line, with this node’s addresses and the draft’s floating-IP ranges (else the suggested one) when they are known.
When the founder’s networks.providerVlan applies. none: never;
a VLAN is refused (routed-host, and a single node, which has no
such field). oob-nic: required (1 to 4094) when no link carries
provider, so VM traffic rides the OOB NIC tagged; not needed
when a link carries provider on its own.
Routed-host: the routes your LAN router needs, one per floating-IP range, via this node’s address. Present when the machine is known.
object
Bridged: the addresses your router serves on the provider VLAN, one per floating-IP range: its first address, with the range’s prefix. The first is the VMs’ gateway: a bridged founder’s transit range is its first floating-IP range, and the VPC routers’ next hop that range’s first address.
object
Why a profile is not offered.
The switchable services the single-node mode has, in display order (its modes entry’s services).
object
The provider topologies the single-node mode supports (its modes entry’s topologies).
object
The smallest root filesystem firstboot installs on.
The smallest OS-disk tail that becomes the stratum-compute pool.
The per-VPC transit range; floating IPs and the VPC must not overlap it.
The release mirror this installer was built with: what
advanced.upgradesMirrorUrl starts with, and what a cluster
checks when it is left out.
The NTP servers (time.ntpServers, node.yaml time.ntp_servers,
). suggested is the list a fresh draft starts with: the NTP
servers the OOB NIC’s DHCP lease offers (option 42), else the public
NTP pool. A front end pre-fills the field with it and shows
suggestedReason. A draft or node.yaml that leaves the field out
gets the same servers. Absent when the machine could not be read.
object
The recommended servers, ready to put in the field.
Where suggested comes from: dhcp, the OOB NIC’s lease;
pool, the public NTP pool (DHCP offered none).
Why those servers, for a person.
The install’s steps, in the order they run: the
firstboot phases (firstboot/<phase>), then readiness. The
event stream reports each by this name, so a front end can draw
the whole checklist before the install starts. A phase an
install did not need ends done with the message “not needed”.
firstboot itself also appears in the stream, as the umbrella
step around its phases. The install registers no images: they are added after it, from the console.
object
The step’s name in the event stream, e.g. firstboot/storage.
What a person is told the install is doing, e.g. “Preparing storage”.
Example
{ "defaultMode": "single-node", "preselectedMode": "single-node", "modes": [ { "mode": "single-node", "profile": "single-node", "nodeYamlMode": "single-node", "sections": [ "region" ], "fields": [ "region" ], "storage": { "uses": [ "compute" ], "osDiskLayout": "compute-tail", "defaultClassFrom": "os-disk", "mdLevels": [ { "level": 0 } ] }, "cluster": { "mgmt": { "interface": "enp87s0", "cidr": "192.0.2.0/24", "address": "192.0.2.11" }, "suggestedVips": { "api": "192.0.2.240", "postgres": "192.0.2.241", "openbao": "192.0.2.242", "ovnNb": "192.0.2.243", "ovnSb": "192.0.2.244", "vmselect": "192.0.2.245", "providerGw": "192.0.2.246" }, "suggestedNetworks": { "storage": { "cidr": "192.0.2.0/24", "vlan": 90, "mtu": 9000, "reason": "192.0.2.0/24 overlaps the management network. A /24 fits up to 250 nodes." }, "overlay": { "cidr": "192.0.2.0/24", "vlan": 90, "mtu": 9000, "reason": "192.0.2.0/24 overlaps the management network. A /24 fits up to 250 nodes." } }, "purposes": [ "storage" ], "purposeInfo": [ { "key": "oob", "label": "Storage", "description": "Ceph replication between nodes. Use a fast NIC (10G+)." } ], "linkKinds": [ "ethernet" ] }, "provider": { "default": "routed-host", "choices": [ { "topology": "routed-host", "title": "Routed", "summary": "No VLAN. This node routes the floating IPs.", "configure": "On your LAN router, add a static route: 192.0.2.0/24 via 192.168.1.20.", "providerVlan": "none", "staticRoutes": [ { "destination": "192.0.2.0/24", "via": "192.168.1.20" } ], "routerGateways": [ "192.0.2.1/24" ] } ] } } ], "time": { "suggestedSource": "dhcp" }}No install code, or the wrong one.
RFC 7807 problem details, the control plane’s shape.
object
Field errors, for INVALID_CONFIG.
object
The structured field (network.floatingIpCidrs[1]); empty for the whole config. For a raw YAML draft, the node.yaml key.
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "code": "example", "requestId": "example", "errors": [ { "field": "example", "message": "example" } ]}Too many wrong install codes; wait for Retry-After.
RFC 7807 problem details, the control plane’s shape.
object
Field errors, for INVALID_CONFIG.
object
The structured field (network.floatingIpCidrs[1]); empty for the whole config. For a raw YAML draft, the node.yaml key.
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "code": "example", "requestId": "example", "errors": [ { "field": "example", "message": "example" } ]}Headers
Section titled “Headers”Seconds until the next attempt is considered.
The installer failed to answer.
RFC 7807 problem details, the control plane’s shape.
object
Field errors, for INVALID_CONFIG.
object
The structured field (network.floatingIpCidrs[1]); empty for the whole config. For a raw YAML draft, the node.yaml key.
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "code": "example", "requestId": "example", "errors": [ { "field": "example", "message": "example" } ]}