Skip to content

What this installer can install, and the limits.

GET
/v1/installer/options
Code sample: Shell / cURL
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.

The options.

Media typeapplication/json

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
defaultMode
required

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 (profile single-node; node.yaml mode: single-node).
  • hyperconverged-init: the first node of a hyperconverged cluster, the one that founds it (“HA init”; node.yaml mode: ha-init).
  • hyperconverged-join: a node that joins a hyperconverged cluster (“HA join”; node.yaml mode: join).
  • disaggregated-control-plane: a control-plane-only node that compute and storage nodes join later (profile disaggregated, a preview whose design is open,).

GET /v1/installer/options says which are available; the others are refused at mode, with the reason.

string
Allowed values: single-node hyperconverged-init hyperconverged-join disaggregated-control-plane
preselectedMode

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 (profile single-node; node.yaml mode: single-node).
  • hyperconverged-init: the first node of a hyperconverged cluster, the one that founds it (“HA init”; node.yaml mode: ha-init).
  • hyperconverged-join: a node that joins a hyperconverged cluster (“HA join”; node.yaml mode: join).
  • disaggregated-control-plane: a control-plane-only node that compute and storage nodes join later (profile disaggregated, a preview whose design is open,).

GET /v1/installer/options says which are available; the others are refused at mode, with the reason.

string
Allowed values: single-node hyperconverged-init hyperconverged-join disaggregated-control-plane
modes
required
Array<object>

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
mode
required

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 (profile single-node; node.yaml mode: single-node).
  • hyperconverged-init: the first node of a hyperconverged cluster, the one that founds it (“HA init”; node.yaml mode: ha-init).
  • hyperconverged-join: a node that joins a hyperconverged cluster (“HA join”; node.yaml mode: join).
  • disaggregated-control-plane: a control-plane-only node that compute and storage nodes join later (profile disaggregated, a preview whose design is open,).

GET /v1/installer/options says which are available; the others are refused at mode, with the reason.

string
Allowed values: single-node hyperconverged-init hyperconverged-join disaggregated-control-plane
defaultDevMode
required

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.

boolean
profile
required

The deployment profile the mode installs; the config’s profile must be this.

string
Allowed values: single-node hyperconverged disaggregated
nodeYamlMode

The node.yaml mode the mode writes. Absent for a mode node.yaml does not have yet.

string
Allowed values: single-node ha-init join
title
required

A short label, e.g. “HA, first node”.

string
summary
required

One sentence on what the node becomes.

string
available
required

Whether this installer can install the mode now.

boolean
reason

Why the mode is not available, for a person. Absent when it is.

string
preview
required

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.

boolean
sections
required

The config sections that apply to the mode, in the config’s order.

Array<string>
Allowed values: region admin dns network storage services time hostReservation advanced cluster networks links
fields
required

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.

Array<string>
Allowed values: region admin.email dns.parentDomain dns.lanAddress dns.upstreamServers dns.upstreamFallback network.uplinkInterface network.topology network.floatingIpCidrs network.defaultVpcCidr storage.disks storage.mdArrays storage.dataDisks storage.wipeConfirm services time.ntpServers advanced.devMode advanced.upgradesMirrorUrl advanced.releaseToken hostReservation cluster.name cluster.plannedSize networks.storage networks.overlay networks.providerVlan networks.vips links
services
required

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).

Array<object>
object
key
required
string
summary
required
string
enabledByDefault
required
boolean
requires
required
Array<string>
topologies
required

The provider topologies the mode supports (network.topology).

Array<string>
storage
required

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
uses
required

The use values the mode offers.

Array<string>
Allowed values: compute ceph
cephOffered
required

Whether ceph is one of uses.

boolean
cephReason

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.

string
osDiskLayout
required

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.

string
Allowed values: compute-tail whole-disk
computeDiskRequired
required

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.

boolean
cephDiskSuffices
required

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.

boolean
computeDiskReason

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.

string
defaultClassFrom
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.

string
Allowed values: os-disk first-compute-disk
mdLevels
required

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).

Array<object>

One RAID level a data array may have, and how many members it takes.

object
level
required
integer
Allowed values: 0 1 10
minMembers
required

The fewest members.

integer
evenMembers
required

Whether the number of members must be even (RAID 10).

boolean
redundant
required

Whether the array survives a failed member. False for RAID 0, which the draft accepts with a warning.

boolean
summary
required

The level for a person, e.g. “Mirror. Size of the smallest member. Survives all but one member failing.”

string
network

The mode’s network answers that need more than a type. Present when the mode lists network.floatingIpCidrs.

object
floatingIpCidrs
required

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
required
required

Whether the draft needs at least one range.

boolean
requiredReason
required

Why, for a person.

string
suggested

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.

Array<string>
suggestedReason

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.

string
hostReservation

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
settable
required

Whether the mode lists hostReservation among its fields.

boolean
reason

Why it is not settable, for a person. Absent when it is.

string
default
required

A host reservation: what the node keeps back from VMs for itself (the substrate, and on a hyperconverged node Ceph).

object
vcpus
required
integer
>= 1
memoryBytes
required

A whole number of MiB.

integer format: int64
>= 4294967296
minimum
required

A host reservation: what the node keeps back from VMs for itself (the substrate, and on a hyperconverged node Ceph).

object
vcpus
required
integer
>= 1
memoryBytes
required

A whole number of MiB.

integer format: int64
>= 4294967296
maximum
required

The node’s threads, and its memory rounded down to a whole MiB.

object
vcpus
required
integer
>= 1
memoryBytes
required

A whole number of MiB.

integer format: int64
>= 4294967296
perCephOsd

A host reservation: what the node keeps back from VMs for itself (the substrate, and on a hyperconverged node Ceph).

object
vcpus
required
integer
>= 1
memoryBytes
required

A whole number of MiB.

integer format: int64
>= 4294967296
cephOsds
required

The Ceph OSDs default counts.

integer
formula
required

How the default is computed, for a person.

string
cluster

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
plannedSizes
required

The planned control-plane sizes cluster.plannedSize takes.

Array<integer>
defaultPlannedSize
required

The planned size of a draft that gives none.

integer
mgmt

The management network, derived from the OOB NIC.

object
interface
required
string
cidr
required
string
address
required

The node’s management address, the OOB NIC’s.

string
suggestedVips

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
api
required
string
postgres
required
string
openbao
required
string
ovnNb
required
string
ovnSb
required
string
vmselect
required
string
providerGw

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).

string
suggestedVipsReason

Why the suggestion is what it is, or why there is none. At most 100 characters.

string
suggestedNetworks

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
storage
required

One suggested purpose network, in PurposeNetwork’s shape, and why.

object
cidr

The network. Absent when no candidate is free on this node.

string
vlan
required
integer
mtu
required
integer
reason
required

Why this range, for a person.

string
overlay
required

One suggested purpose network, in PurposeNetwork’s shape, and why.

object
cidr

The network. Absent when no candidate is free on this node.

string
vlan
required
integer
mtu
required
integer
reason
required

Why this range, for a person.

string
purposes
required

The purposes a link may carry (links[].purposes).

Array<string>
Allowed values: storage overlay provider
purposeInfo
required

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).

Array<object>

A network purpose, for a person.

object
key
required
string
Allowed values: oob mgmt storage overlay provider
label
required
string
description
required
string
linkKinds
required
Array<string>
Allowed values: ethernet bond vlan
bondModes
required
Array<string>
defaultBondMode
required
string
xmitHashPolicies
required
Array<string>
provider

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
default
required
string
Allowed values: routed-host bridged
choices
required
Array<object>

One provider topology, for a person.

object
topology
required
string
Allowed values: routed-host bridged
title
required
string
summary
required

One line on what the choice is.

string
configure
required

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.

string
providerVlan
required

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.

string
Allowed values: none oob-nic
staticRoutes

Routed-host: the routes your LAN router needs, one per floating-IP range, via this node’s address. Present when the machine is known.

Array<object>
object
destination
required
string
via
required
string
routerGateways

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.

Array<string>
profiles
required
Array<object>
object
name
required
string
offered
required
boolean
summary
required
string
reason

Why a profile is not offered.

string
services
required

The switchable services the single-node mode has, in display order (its modes entry’s services).

Array<object>
object
key
required
string
summary
required
string
enabledByDefault
required
boolean
requires
required
Array<string>
topologies
required

The provider topologies the single-node mode supports (its modes entry’s topologies).

Array<string>
limits
required
object
rootFloorGiB
required

The smallest root filesystem firstboot installs on.

integer
computeTailMinGiB
required

The smallest OS-disk tail that becomes the stratum-compute pool.

integer
defaultRegion
required
string
regionNamePattern
required
string
regionNameMinLength
required
integer
regionNameMaxLength
required
integer
defaultVpcCidr
required
string
transitCidr
required

The per-VPC transit range; floating IPs and the VPC must not overlap it.

string
defaultUpgradesMirrorUrl

The release mirror this installer was built with: what advanced.upgradesMirrorUrl starts with, and what a cluster checks when it is left out.

string
time

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
suggested
required

The recommended servers, ready to put in the field.

Array<string>
suggestedSource
required

Where suggested comes from: dhcp, the OOB NIC’s lease; pool, the public NTP pool (DHCP offered none).

string
Allowed values: dhcp pool
suggestedReason
required

Why those servers, for a person.

string
installSteps

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.

Array<object>
object
name
required

The step’s name in the event stream, e.g. firstboot/storage.

string
title
required

What a person is told the install is doing, e.g. “Preparing storage”.

string

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.

Media typeapplication/problem+json

RFC 7807 problem details, the control plane’s shape.

object
type
required
string
title
required
string
status
required
integer
>= 400 <= 599
detail
string
code
required
string
requestId
required
string
errors

Field errors, for INVALID_CONFIG.

Array<object>
object
field
required

The structured field (network.floatingIpCidrs[1]); empty for the whole config. For a raw YAML draft, the node.yaml key.

string
message
required
string

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.

Media typeapplication/problem+json

RFC 7807 problem details, the control plane’s shape.

object
type
required
string
title
required
string
status
required
integer
>= 400 <= 599
detail
string
code
required
string
requestId
required
string
errors

Field errors, for INVALID_CONFIG.

Array<object>
object
field
required

The structured field (network.floatingIpCidrs[1]); empty for the whole config. For a raw YAML draft, the node.yaml key.

string
message
required
string

Example generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"code": "example",
"requestId": "example",
"errors": [
{
"field": "example",
"message": "example"
}
]
}
Retry-After
integer

Seconds until the next attempt is considered.

The installer failed to answer.

Media typeapplication/problem+json

RFC 7807 problem details, the control plane’s shape.

object
type
required
string
title
required
string
status
required
integer
>= 400 <= 599
detail
string
code
required
string
requestId
required
string
errors

Field errors, for INVALID_CONFIG.

Array<object>
object
field
required

The structured field (network.floatingIpCidrs[1]); empty for the whole config. For a raw YAML draft, the node.yaml key.

string
message
required
string

Example generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"code": "example",
"requestId": "example",
"errors": [
{
"field": "example",
"message": "example"
}
]
}