Create/update a Ceph pool (storage tier) — bootstrap-admin.
curl --request POST \ --url https://stratum.example.com/v1/admin/storage/ceph/pools \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "example", "size": 1, "minSize": 1, "failureDomain": "example", "pgNum": 1, "deviceClass": "example", "maxBytes": 1 }'Record a desired Ceph pool; the reconciler converges
the live cluster (create the RBD pool, apply size/min_size, and — when a
device class is set — a CRUSH rule pinning the pool to that class, i.e. an
ssd/hdd tier). Idempotent on name; returns 202. Install-scope; gates on
storage:ManageCephPool.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”Create/update a Ceph pool.
object
Replica count (default 3).
Minimum replicas for I/O (default 2); must be <= size.
CRUSH failure domain (default host).
Placement groups; 0 = PG autoscaler (default).
Pin the pool to a CRUSH device class (ssd/hdd/nvme).
Per-pool byte cap (hard write ceiling); 0 = unlimited.
Example generated
{ "name": "example", "size": 1, "minSize": 1, "failureDomain": "example", "pgNum": 1, "deviceClass": "example", "maxBytes": 1}Responses
Section titled “Responses”Desired pool recorded; reconciler converges it.
A desired Ceph pool (storage tier). deviceClass, when set, pins the pool to a CRUSH device class (ssd/hdd/nvme).
object
Replica count (default 3).
Minimum replicas for I/O (default 2).
CRUSH failure domain (default host).
Placement groups; 0 = PG autoscaler.
CRUSH device class to pin to (ssd/hdd/nvme); empty = any.
RADOS application tag: empty/‘rbd’ (block pools, rbd-initialized) or ‘rgw’ (object-storage pools, not rbd-initialized).
Per-pool capacity cap in bytes (a hard write-reject ceiling
applied via ceph osd pool set-quota); 0 = unlimited. Counts
LOGICAL/STORED bytes (at size=3, 1 TiB logical ≈ 3 TiB raw). In the pool
list this reflects the LIVE quota in effect on the cluster.
True for a Stratum-created + fully-reconciled pool (create + size/crush/application); false for a quota-only view of an auto-created cluster pool (RGW’s default.rgw.buckets.data, cephfs data). Only maxBytes is settable on an unmanaged pool.
LOGICAL/STORED bytes currently in the pool (from ceph df), so
the UI can show a used-vs-quota bar. Present only in the pool list.
True for the install’s system pool (volumes): the pool the
replicated VM-volume tier and the base images live in, and the one
that cannot be deleted. Exactly one pool is the system pool, so clients
read it from here instead of hard-coding a name.
Example generated
{ "name": "example", "size": 1, "minSize": 1, "failureDomain": "example", "pgNum": 1, "deviceClass": "example", "application": "example", "maxBytes": 1, "managed": true, "storedBytes": 1, "system": true}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" } ]}Authenticated but not authorized.
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" } ]}