Skip to content

Write a fresh GPT label on a disk (operator-only).

POST
/v1/compute/nodes/{nodeId}/disks/{disk}/actions/init-gpt
Code sample: Shell / cURL
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.

nodeId
required
string
/^n-[a-z0-9-]+$/
disk
required
string

The disk’s kernel name (e.g. vdb, nvme0n1) from GET…/disks.

Media typeapplication/json
object
forceWipe

Required to wipe a disk that carries a filesystem or partition table. Never overrides the mounted-disk or active-LVM-PV guards.

boolean

The disk’s refreshed state (synchronous, local node).

Media typeapplication/json

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

Stable device path (e.g. /dev/sda, /dev/nvme0n1, /dev/loop0).

string
kernelName
required

Bare kernel name (e.g. sda).

string
sizeBytes
required
integer format: int64
rotational
required

Spinning disk (true) vs SSD/NVMe (false) — feeds fast/bulk tiering.

boolean
type
required

Lsblk device type.

string
Allowed values: disk loop
model
string
serial
string
wwn

The disk’s World Wide Name, when it has one.

string
byIds

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.

Array<string>
usage
required

Claimability classification, strongest in-use signal first. available means no partition table, no filesystem signature, nothing mounted — safe to wipe into a pool.

string
Allowed values: available partitioned filesystem lvm-member ceph mounted
available
required

Convenience flag, true iff usage == available.

boolean
children

Child kernel-device names (partitions, dm/lvm) explaining why a disk is not available.

Array<string>
partitions

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.

Array<object>

One partition on a node disk. A partition can be used as a PV.

object
number
required

GPT partition number (the N in /dev/sda2 -> 2).

integer
kernelName
required
string
devicePath
required
string
sizeBytes
required
integer format: int64
partType

GPT type GUID (e.g. the Linux LVM GUID for 8e00). Empty on MBR / typeless.

string
fsType

Signature on the partition (e.g. lvm2_member, ext4).

string
usage
required
string
Allowed values: available partitioned filesystem lvm-member ceph mounted
health

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

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.
string
Allowed values: unknown healthy hot wearing failing
reasons

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.

Array<string>
smartPassed

Smartctl’s overall verdict, reported verbatim. NOT used to derive condition — see the schema description.

boolean
temperatureCelsius

Composite temperature.

integer
warningTempCelsius

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.

integer
criticalTempCelsius

The drive’s own critical threshold (NVMe cctemp).

integer
warningTempMinutes

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.

integer format: int64
criticalTempMinutes

Cumulative minutes above the critical threshold.

integer format: int64
percentageUsed

NVMe endurance consumed, as the drive estimates it. Can exceed 100.

integer
availableSpare

NVMe spare capacity remaining, percent.

integer
availableSpareThreshold

The drive’s own spare floor; at or below it the drive is failing.

integer
mediaErrors

NVMe unrecovered data-integrity errors.

integer format: int64
reallocatedSectors

SATA/SAS SMART attribute 5.

integer format: int64
pendingSectors

SATA/SAS SMART attribute 197.

integer format: int64
powerOnHours

Lifetime power-on hours. Pair with warningTempMinutes to see what share of a drive’s life has been spent over temperature.

integer format: int64
carries

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
cephDaemons

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.

Array<string>
volumeGroups

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.

Array<string>
reservation

What an install reserved this disk for: a day-2 Ceph OSD. Absent when nothing reserved it.

object
for
required

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

string
Allowed values: ceph-osd
byId
required

The stable /dev/disk/by-id path the install recorded the disk by.

string
recordedAt
required
string format: date-time

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.

Media typeapplication/json

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

Intent id (nsi-…).

string
nodeId
required

The node that executes the op (owns the physical disks).

string
op
required
string
Allowed values: create-pool extend-pool shrink-pool delete-pool wipe-disk
args

Op-specific arguments (name, disks, poolId,…).

object
key
additional properties
any
state
required
string
Allowed values: pending running done error
result

Op output on done. For create/extend/shrink: poolId, name, totalBytes, devicePaths. For delete: poolId.

object
key
additional properties
any
error

Failure detail when state is error.

string
claimedAt
string format: date-time
actor
required
string
createdAt
required
string format: date-time
updatedAt
required
string format: date-time

Example

{
"op": "create-pool",
"state": "pending"
}
Location
string

The intent poll URL.

Bad request.

Media typeapplication/problem+json
object
type
required
string format: uri
title
required
string
status
required
integer
>= 400 <= 599
detail
string
instance
string format: uri-reference
requestId
required
string
code
required
string
issues

The findings of a rejected IAM policy document (custom and resource policies).

Array<object>

One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.

object
code
required

The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.

string
statement
required

Index of the statement at fault; -1 for the document as a whole.

integer
>= -1
detail
required
string
action

The offending action, where one is at fault (ACTION_NOT_APPLICABLE).

string
errors

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.

Array<object>

One field’s problem, the stage-2 installer API’s shape. field is the field’s path, message what is wrong with it.

object
field
required

The field’s path, e.g. links[0].interface, disks[1].confirm, mgmt.address or role; empty for the whole request.

string
message
required
string
details

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
key
additional properties
any

Example

{
"issues": [
{
"code": "ACTION_NOT_APPLICABLE",
"action": "compute:CreateVpc"
}
]
}

Resource not found.

Media typeapplication/problem+json
object
type
required
string format: uri
title
required
string
status
required
integer
>= 400 <= 599
detail
string
instance
string format: uri-reference
requestId
required
string
code
required
string
issues

The findings of a rejected IAM policy document (custom and resource policies).

Array<object>

One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.

object
code
required

The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.

string
statement
required

Index of the statement at fault; -1 for the document as a whole.

integer
>= -1
detail
required
string
action

The offending action, where one is at fault (ACTION_NOT_APPLICABLE).

string
errors

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.

Array<object>

One field’s problem, the stage-2 installer API’s shape. field is the field’s path, message what is wrong with it.

object
field
required

The field’s path, e.g. links[0].interface, disks[1].confirm, mgmt.address or role; empty for the whole request.

string
message
required
string
details

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
key
additional properties
any

Example

{
"issues": [
{
"code": "ACTION_NOT_APPLICABLE",
"action": "compute:CreateVpc"
}
]
}

Conflicting state.

Media typeapplication/problem+json
object
type
required
string format: uri
title
required
string
status
required
integer
>= 400 <= 599
detail
string
instance
string format: uri-reference
requestId
required
string
code
required
string
issues

The findings of a rejected IAM policy document (custom and resource policies).

Array<object>

One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.

object
code
required

The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.

string
statement
required

Index of the statement at fault; -1 for the document as a whole.

integer
>= -1
detail
required
string
action

The offending action, where one is at fault (ACTION_NOT_APPLICABLE).

string
errors

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.

Array<object>

One field’s problem, the stage-2 installer API’s shape. field is the field’s path, message what is wrong with it.

object
field
required

The field’s path, e.g. links[0].interface, disks[1].confirm, mgmt.address or role; empty for the whole request.

string
message
required
string
details

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
key
additional properties
any

Example

{
"issues": [
{
"code": "ACTION_NOT_APPLICABLE",
"action": "compute:CreateVpc"
}
]
}