Write a fresh GPT label on a disk (operator-only).
curl --request POST \ --url https://stratum.example.com/v1/compute/nodes/example/disks/example/actions/init-gpt \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "forceWipe": false }'. Erases any existing partition table and
writes a fresh GPT (sgdisk --zap-all + --clear). Destructive +
guarded: refused on the disk backing the running OS
(/, /boot, /boot/efi) EVEN with forceWipe; a disk carrying data
requires forceWipe. Runs in-container on the owning node. Cedar action
compute:DescribeNode.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The disk’s kernel name (e.g. vdb, nvme0n1) from GET…/disks.
Request Body
Section titled “Request Body”object
Required to wipe a disk that carries a filesystem or partition table. Never overrides the mounted-disk or active-LVM-PV guards.
Responses
Section titled “Responses”The disk’s refreshed state (synchronous, local node).
A whole block device on a node (lsblk type disk or loop),
classified by whether it is free to claim for a storage pool.
. Partitions and LVM/dm children are
folded into usage + children rather than surfaced as their
own rows — operators reason about whole disks.
object
Stable device path (e.g. /dev/sda, /dev/nvme0n1, /dev/loop0).
Bare kernel name (e.g. sda).
Spinning disk (true) vs SSD/NVMe (false) — feeds fast/bulk tiering.
Lsblk device type.
The disk’s World Wide Name, when it has one.
The disk’s hardware /dev/disk/by-id aliases, best first. Stable across reboots, where kernel names are not; the hardware plan keys disks on the WWN or the first of these.
Claimability classification, strongest in-use signal first.
available means no partition table, no filesystem
signature, nothing mounted — safe to wipe into a pool.
Convenience flag, true iff usage == available.
Child kernel-device names (partitions, dm/lvm) explaining why a disk is not available.
The disk’s partitions as first-class objects, so the UI can show a GPT layout + offer per-partition actions. Empty on an unpartitioned (whole-disk) device.
One partition on a node disk. A partition can be used as a PV.
object
GPT partition number (the N in /dev/sda2 -> 2).
GPT type GUID (e.g. the Linux LVM GUID for 8e00). Empty on MBR / typeless.
Signature on the partition (e.g. lvm2_member, ext4).
SMART-derived condition. Absent on devices with no SMART to
read (RBD maps, loop files, dm targets) — which is NOT the same as
condition: unknown, meaning the device should have answered and did
not.
object
Worst-wins roll-up.
failing— reliability actually degraded: spare exhausted, media errors, reallocated/pending sectors, or the drive reporting itself degraded.wearing— flash endurance consumed past the bound. Weeks-to-months of notice, unlike the others.hot— above the drive’s OWN warning temperature. A cooling problem.healthy— SMART read, nothing wrong.unknown— SMART could not be read. Never render as healthy; it is an absence of information.
Operator-facing explanation of a non-healthy condition, naming the drive’s own thresholds (e.g. “72C is above this drive’s 70C warning threshold”). Empty when healthy.
Smartctl’s overall verdict, reported verbatim. NOT used to derive condition — see the schema description.
Composite temperature.
The DRIVE’S own warning threshold (NVMe wctemp). Absent when nvme-cli could not be consulted — smartctl’s JSON does not carry it. Never substituted with a constant: thresholds are per-model (70, 84 and 90 C all appear in a single three-node cluster), so a fixed bound would be wrong for most drives.
The drive’s own critical threshold (NVMe cctemp).
CUMULATIVE minutes spent above the warning threshold.
This is the honest thermal signal. The instantaneous reading oscillates across the threshold under load, so it flaps; this only ever climbs, and a delta between two samples distinguishes “warm right now” from “chronically hot”. It is also how you prove a cooling fix worked — the counter stops advancing.
Cumulative minutes above the critical threshold.
NVMe endurance consumed, as the drive estimates it. Can exceed 100.
NVMe spare capacity remaining, percent.
The drive’s own spare floor; at or below it the drive is failing.
NVMe unrecovered data-integrity errors.
SATA/SAS SMART attribute 5.
SATA/SAS SMART attribute 197.
Lifetime power-on hours. Pair with warningTempMinutes to see what share of a drive’s life has been spent over temperature.
What this device carries — the Ceph daemons and LVM volume groups that would be affected if it failed. Absent when nothing known depends on it.
object
Cephadm daemons whose data lives on this device (e.g. osd.1, mon.stratum-01). A mon on the OS disk is included: losing that device takes the mon with it.
LVM volume groups with a physical volume on this device, including via a partition — a PV on /dev/nvme0n1p3 is attributed to nvme0n1, because the whole disk is what fails.
What an install reserved this disk for: a day-2 Ceph OSD. Absent when nothing reserved it.
object
ceph-osd: wiped at install and reserved for a day-2 Ceph bootstrap,
which starts with it selected (see
GET /v1/admin/storage/ceph/osd-candidates).
The stable /dev/disk/by-id path the install recorded the disk by.
Example
{ "type": "disk", "usage": "available", "partitions": [ { "usage": "available" } ], "health": { "condition": "unknown" }, "reservation": { "for": "ceph-osd" }}Cross-node op accepted and recorded as an intent. Poll the
intent at the Location header until state is done or error.
A cross-node disk/pool operation recorded by the CP leader for the
owning node’s reconciler to execute against its local /dev. Poll until state is done or error.
object
Intent id (nsi-…).
The node that executes the op (owns the physical disks).
Op-specific arguments (name, disks, poolId,…).
object
Op output on done. For create/extend/shrink: poolId, name,
totalBytes, devicePaths. For delete: poolId.
object
Failure detail when state is error.
Example
{ "op": "create-pool", "state": "pending"}Headers
Section titled “Headers”The intent poll URL.
Bad request.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}Resource not found.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}Conflicting state.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}