10. StorageSets
The StorageSets that volumes are created within, their space usage, and StorageSet-level actions.
Endpoint Summary
| Path | Summary | Method |
|---|---|---|
/api/v1/storagesets |
List storagesets | GET |
/api/v1/storagesets |
Create StorageSet | POST |
/api/v1/storagesets/{storageset_id} |
Get StorageSet details | GET |
/api/v1/storagesets/{storageset_id} |
Update StorageSet | PATCH |
/api/v1/storagesets/{storageset_id} |
Delete StorageSet | DELETE |
/api/v1/storagesets/{storageset_id}/actions |
Perform StorageSet Action | POST |
/api/v1/storagesets/{storageset_id}/space |
Get StorageSet space | GET |
GET /api/v1/storagesets
List storagesets
Returns a list of storagesets accessible to the authenticated user.
Authentication: required (PasswordLogin or BearerJWT).
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Successful response containing the list of storagesets | StorageSetListResponse |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 500 | Internal server error. | - |
Response Body (200, StorageSetListResponse)
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
storagesets |
array of StorageSet object |
no | n/a | Array of StorageSet objects | |
total |
integer | yes | n/a | 1, 5, 10 |
Total count of StorageSets in this response. |
Example
{
"storagesets" : [
{
"capacity_balancing" : true,
"encrypted" : false,
"fips_mode" : false,
"id" : 1,
"mlec" : false,
"name" : "Set 1",
"nodes_not_responding" : 0,
"nodes_offline" : 0,
"nodes_online" : 6,
"nodes_reconstructing" : 0,
"nodes_total" : 6,
"spares_available" : 2,
"spares_requested" : 2,
"state" : {
"conditions" : [],
"status" : "ok"
},
"topology_aware_placement" : false,
"ure_default" : false,
"vhosts_total" : 6
}
],
"total" : 1
}POST /api/v1/storagesets
Create StorageSet
Creates a new StorageSet with the specified configuration.
Authentication: required (PasswordLogin or BearerJWT).
Request Body (application/json, required)
Schema: StorageSetCreateRequest
Request payload for creating a StorageSet.
Requires a unique StorageSet name. Optional parameters use system defaults when omitted.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
flags |
array of StorageSetFlag (ure_default, capacity_balancing_disabled, encrypted, fips_mode, topology_aware_placement, mlec) |
no | n/a | ["mlec"], [] |
Flags to set during StorageSet creation. |
name |
string | yes | n/a | Set 2, Production Set |
Unique display name of the StorageSet. Must be unique within the realm. |
spares_requested |
integer | no | 2 |
2, 4, 6 |
Number of VPODs to be reserved for reconstruction within the new StorageSet. Default: 2. |
Example
{
"flags" : [
"mlec"
],
"name" : "Set 1",
"spares_requested" : 4
}Responses
| Status | Description | Schema |
|---|---|---|
| 201 | StorageSet created successfully | StorageSetCreateResponse |
| 400 | Bad request. Invalid parameters or validation error. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 409 | Conflict. StorageSet name already exists. | - |
| 422 | Validation error. Returned for invalid request body. | - |
| 500 | Internal server error. | - |
Response Body (201, StorageSetCreateResponse)
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
id |
integer | yes | n/a | 1, 2, 3 |
Unique StorageSet identifier assigned by the system |
Example
{
"id" : 3
}GET /api/v1/storagesets/{storageset_id}
Get StorageSet details
Returns details for a specific StorageSet by its ID.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
storageset_id |
path | integer | yes | StorageSet identifier |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Successfully retrieved detailed information about the StorageSet. | StorageSetGetResponse |
| 400 | Bad request. Invalid storageset_id parameter. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | StorageSet not found. | - |
| 422 | Validation Error | HTTPValidationError |
| 500 | Internal server error. | - |
Response Body (200, StorageSetGetResponse)
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
storageset |
StorageSet object |
yes | n/a | StorageSet entity with all available details. |
Example
{
"storageset" : {
"capacity_balancing" : true,
"encrypted" : false,
"fips_mode" : false,
"id" : 1,
"mlec" : false,
"name" : "Set 1",
"nodes_not_responding" : 0,
"nodes_offline" : 0,
"nodes_online" : 6,
"nodes_reconstructing" : 0,
"nodes_total" : 6,
"spares_available" : 2,
"spares_requested" : 2,
"state" : {
"conditions" : [],
"status" : "ok"
},
"topology_aware_placement" : false,
"ure_default" : false,
"vhosts_total" : 6
}
}PATCH /api/v1/storagesets/{storageset_id}
Update StorageSet
Updates an existing StorageSet using PATCH semantics. Only the fields provided in the request are modified.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
storageset_id |
path | integer | yes | StorageSet identifier |
Request Body (application/json, required)
Schema: StorageSetPatchRequest
Request payload for updating an existing StorageSet via PATCH.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
capacity_balancing_disabled |
boolean, nullable | no | null |
true, false |
True to disable capacity balancing (set flag), False to enable it (clear flag). |
name |
string, nullable | no | null |
Set 3, Production Set |
Updated StorageSet name. Must be unique within the realm. |
spares_requested |
integer, nullable | no | null |
1, 2, 4 |
Optional updated number of VPOD spares reserved for reconstruction. If provided, must be at least 1. |
Example
{
"capacity_balancing_disabled" : false,
"name" : "Set 3",
"spares_requested" : 3
}Responses
| Status | Description | Schema |
|---|---|---|
| 204 | StorageSet updated successfully. | - |
| 400 | Bad request. Invalid storageset_id or custom validation error. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | StorageSet not found. | - |
| 409 | Conflict. StorageSet update conflicts with system state. | - |
| 422 | Validation error. Returned for invalid request body or Path parameter. | - |
| 500 | Internal server error. | - |
DELETE /api/v1/storagesets/{storageset_id}
Delete StorageSet
Deletes a StorageSet by its ID.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
storageset_id |
path | integer | yes | StorageSet identifier |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | StorageSet successfully deleted. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | StorageSet not found. | - |
| 409 | StorageSet cannot be deleted due to a conflict (e.g. it still contains volumes). | - |
| 422 | Validation Error | HTTPValidationError |
| 500 | Internal server error. | - |
POST /api/v1/storagesets/{storageset_id}/actions
Perform StorageSet Action
Performs an action on a StorageSet. Currently supports “add_storage” action to add unassigned storage nodes (dataserials). The add_storage action supports “add_spare” mode to expand capacity with optional spare adjustment, or “migration” mode to add storage for draining another enclosure. A vhost adds its capacity later, not at once. Each of its VPODs joins the StorageSet after it installs and boots, which takes tens of minutes. Until the first VPOD joins, the StorageSet reports the “activating” condition.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
storageset_id |
path | integer | yes | StorageSet identifier |
Request Body (application/json, required)
Schema: StorageSetAddStorageActionRequest
Request to perform an add_storage action on a StorageSet.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal add_storage |
yes | n/a | The action to perform on the storageset. | |
params |
StorageSetAddStorageParams object |
yes | n/a | Parameters required to perform the add_storage action. |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | Action completed successfully. | - |
| 400 | Bad Request. Dataserials belong to non-storage nodes. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | StorageSet not found. | - |
| 409 | Conflict. Operation conflicts with current system state. | - |
| 422 | Validation error. Returned for invalid request body or Path parameter. | - |
| 500 | Internal server error. | - |
GET /api/v1/storagesets/{storageset_id}/space
Get StorageSet space
Returns detailed space usage for a specific StorageSet: raw, usable, and reserved capacity buckets (each with total/free/used), plus volume/node counts, capacity-balancing state, and volume hard quota.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
storageset_id |
path | integer | yes | StorageSet identifier |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Successful response containing space information for the StorageSet. | StorageSetSpaceResponse |
| 400 | Bad request. Validation error (e.g., invalid StorageSet ID). | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | StorageSet not found. | - |
| 422 | Validation error. Returned for invalid path parameters. | - |
| 500 | Internal server error. | - |
Response Body (200, StorageSetSpaceResponse)
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
capacity_balancing_active |
boolean | yes | n/a | true, false |
Whether automatic capacity balancing is currently active for this StorageSet. |
node_count |
integer | yes | n/a | 12, 6 |
Number of OSD nodes (storage blades) in this StorageSet. |
raw |
StorageSetSpaceCapacity object |
yes | n/a | Overall physical capacity across all buckets in this StorageSet. | |
reserved |
StorageSetSpaceCapacity object |
yes | n/a | Reconstruction reserve capacity. Held for spare rebuilds; not available for regular data storage. | |
usable |
StorageSetSpaceCapacity object |
yes | n/a | Capacity available for data storage (usable bucket). | |
volume_hard_quota |
integer | yes | n/a | 524288000, 0 |
Sum of hard quotas for all volumes in this StorageSet, in bytes. A create is reflected immediately; after a delete the RM releases the quota asynchronously, so this figure can briefly overstate the true sum. |
Example
{
"capacity_balancing_active" : true,
"node_count" : 6,
"raw" : {
"free" : 333884440576,
"total" : 333900152832,
"used" : 15712256
},
"reserved" : {
"free" : 55650041856,
"total" : 55650041856,
"used" : 0
},
"usable" : {
"free" : 278234398720,
"total" : 278250110976,
"used" : 15712256
},
"volume_hard_quota" : 524288000
}