Add disk(s) to a pool to grow it (operator-only).
curl --request POST \ --url https://stratum.example.com/v1/storage-pools/example/actions/extend \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "disks": [ "example" ], "forceWipe": false }'. Adds whole disks to the pool’s LVM
volume group (pvcreate + vgextend) and grows the thin pool to
absorb the new space (lvextend), executed in-container on the
owning node. The added disks must be empty (no
mountpoint, filesystem, LVM signature, or partition table) unless
forceWipe is set. Synchronous: the lvm metadata ops are
sub-second; returns the updated pool.
Cedar action storage:ExtendStoragePool. A pool on the local node
runs synchronously (200); a pool on another node is recorded as an
intent and returns 202.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The stable pool id (pool-…). pools are addressed by a surrogate id, since the same pool name can exist on multiple nodes. The id is in GET /v1/storage-pools.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Device paths to add to the pool — a whole disk (e.g. /dev/sdb) OR a partition meant to be a PV (e.g. /dev/sdb1, GPT type 8e00). The device must be empty (no filesystem/LVM signature, no partition table on a whole disk) unless forceWipe..
Wipe a disk that holds data (partitions, signatures, an old volume group) instead of refusing it. A mounted disk is refused either way. Destroys everything on the disk.
Responses
Section titled “Responses”The grown pool (synchronous, local node).
A storage pool. For lvm-thin this is the install’s VG + thin pool on one node; capacity is refreshed by the 60s poller.
object
Stable surrogate id (pool-…)..
missing: the backend no longer has the pool; see
stateReason. Volumes cannot be placed in it. The next successful poll
restores the real state.
Why the pool is missing. Absent otherwise.
Physical devices (PVs) backing the pool’s VG.
The LVM volume group the pool lives in (lvm-thin only). The install’s
default pool is named after its thin LV but lives in the configured
VG, so read the VG from here, never from name. Absent for Ceph and
until the pool’s node has polled it..
Example
{ "driver": "lvm-thin", "state": "healthy"}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" } ]}DISK_NOT_EMPTY — a disk is mounted, or carries a filesystem, an
LVM signature or a partition table, and forceWipe is not set.
No disk is added.
CONFLICT — another refusal by the volume manager, such as a disk
that is already a physical volume.
UNSUPPORTED — no live driver can extend pools.
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" } ]}