12. Nodes and Hardware
12.1 Nodes
Endpoint Summary
| Path | Summary | Method |
|---|---|---|
/api/v1/nodes |
List nodes | GET |
/api/v1/nodes/{dataserial} |
Get node info | GET |
/api/v1/nodes/{dataserial}/actions |
Perform action on node | POST |
/api/v1/nodes/{dataserial}/drain |
Get OSD drain status | GET |
/api/v1/nodes/{dataserial}/drain |
Start or stop OSD drain | POST |
GET /api/v1/nodes
List nodes
Returns a list of nodes accessible to the authenticated user.
Authentication: required (PasswordLogin or BearerJWT).
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Successful response containing the list of nodes | NodeListResponse |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 500 | Internal server error. | - |
Response Body (200, NodeListResponse)
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
nodes |
array of Node object |
no | n/a | Array of node objects matching the query. Empty array if no nodes found | |
total |
integer | yes | n/a | 0, 2, 150 |
Total count of nodes available (may exceed returned array size if paginated). |
Example
{
"nodes" : [
{
"capacity_bytes" : 55650025472,
"dataserial" : "e9ff4075d18233",
"flags" : [
"repset",
"activated"
],
"hw_serial" : "3e7e0000310fff001",
"ip_address" : "10.97.18.200",
"name" : "ASD-1,1",
"role" : "any_director",
"shelf_id" : "3e7e0001402001001",
"status" : "online",
"storageset_id" : 1,
"vhost_id" : "bf806fa0c17feb"
}
],
"total" : 1
}GET /api/v1/nodes/{dataserial}
Get node info
Returns details for a specific node by its dataserial identifier.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
dataserial |
path | string | yes | dataserial to retrieve |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Successfully retrieved detailed information about the node. | NodeGetResponse |
| 400 | Bad request. Invalid dataserial parameter. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | Node not found. | - |
| 422 | Validation Error | HTTPValidationError |
| 500 | Internal server error. | - |
Response Body (200, NodeGetResponse)
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
node |
Node object |
yes | n/a | Node entity with all available details. |
Example
{
"node" : {
"capacity_bytes" : 55650025472,
"dataserial" : "e9ff4075d18233",
"flags" : [
"repset",
"activated"
],
"hw_serial" : "3e7e0000310fff001",
"ip_address" : "10.97.18.200",
"name" : "ASD-1,1",
"role" : "any_director",
"shelf_id" : "3e7e0001402001001",
"status" : "online",
"storageset_id" : 1,
"vhost_id" : "bf806fa0c17feb"
}
}POST /api/v1/nodes/{dataserial}/actions
Perform action on node
Performs a specified action on a node (see request body for supported actions).
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
dataserial |
path | string | yes | Node dataserial to perform action on |
Request Body (application/json, required)
One of the following, selected by action:
action: halt - NodeHaltActionRequest
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal halt |
yes | n/a | The action to perform on the node. | |
params |
null (not used) | no | n/a |
action: reboot - NodeRebootActionRequest
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal reboot |
yes | n/a | The action to perform on the node. | |
params |
null (not used) | no | n/a |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | Action performed successfully on the node. No content is returned. | - |
| 400 | Bad request. Invalid dataserial or invalid action parameters. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | Node not found. | - |
| 409 | Conflict. Action conflicts with current system state. | - |
| 422 | Validation Error | HTTPValidationError |
| 500 | Internal server error. | - |
GET /api/v1/nodes/{dataserial}/drain
Get OSD drain status
Returns drain progress for a node: byte and object counts, rate, state, percent complete, and ETA.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
dataserial |
path | string | yes | Node dataserial to query drain status for |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Successfully retrieved drain progress for the node. | NodeDrainStatusResponse |
| 400 | Bad request. Invalid dataserial parameter. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | Node not found. | - |
| 409 | Conflict. The node is not currently draining, so there is no drain progress to report. | - |
| 422 | Validation Error | HTTPValidationError |
| 500 | Internal server error. | - |
Response Body (200, NodeDrainStatusResponse)
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
amount_error |
integer | yes | n/a | Bytes that could not be migrated. | |
amount_moved |
integer | yes | n/a | Bytes already migrated off the node. | |
amount_remaining |
integer | yes | n/a | Bytes still to be migrated off the node. | |
eta_seconds |
integer, nullable | yes | n/a | 51, 0, null |
Estimated seconds to completion at the current rate, or null when the rate is zero. |
objects_error |
integer | yes | n/a | Objects that could not be migrated. | |
objects_moved |
integer | yes | n/a | Objects already migrated off the node. | |
objects_remaining |
integer | yes | n/a | Objects still to be migrated off the node. | |
percent_complete |
number, nullable | yes | n/a | 50, 100, null |
Percentage of bytes migrated, or null when there is nothing to drain. |
pm_id |
integer | yes | n/a | Identifier of the performance manager (PM) reporting this drain. | |
rate_bytes_per_sec |
integer | yes | n/a | Current data-movement rate for the drain, in bytes per second. | |
state |
NodeDrainState (draining, not_draining, suspended, unknown) |
yes | n/a | High-level state of the drain operation. |
Example
{
"amount_error" : 0,
"amount_moved" : 5368709120,
"amount_remaining" : 5368709120,
"eta_seconds" : 51,
"objects_error" : 0,
"objects_moved" : 1024,
"objects_remaining" : 1024,
"percent_complete" : 50,
"pm_id" : 4,
"rate_bytes_per_sec" : 104857600,
"state" : "draining"
}POST /api/v1/nodes/{dataserial}/drain
Start or stop OSD drain
Starts or stops draining data off a storage node (OSD). Draining migrates all data off the node onto other nodes in the same StorageSet.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
dataserial |
path | string | yes | Node dataserial to drain |
Request Body (application/json, required)
One of the following, selected by action:
action: start_drain - NodeStartDrainRequest
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal start_drain |
yes | n/a | The drain action to perform. | |
params |
null (not used) | no | n/a |
action: stop_drain - NodeStopDrainRequest
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal stop_drain |
yes | n/a | The drain action to perform. | |
params |
null (not used) | no | n/a |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | Drain action performed successfully on the node. No content is returned. | - |
| 400 | Bad request. Invalid dataserial or invalid action parameters. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | Node not found. | - |
| 409 | Conflict. Action conflicts with current system state. | - |
| 422 | Validation Error | HTTPValidationError |
| 500 | Internal server error. | - |
12.2 Hardware
Endpoint Summary
| Path | Summary | Method |
|---|---|---|
/api/v1/hardware |
List hardware models | GET |
/api/v1/hardware/{dataserial}/actions |
Perform an action on a hardware component | POST |
/api/v1/hardware/{model_id} |
Get hardware model info | GET |
GET /api/v1/hardware
List hardware models
Returns the hardware models present in the current realm.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
refresh |
query | boolean | no | Bypass the cache: re-read the catalog from disk and refresh the cached entries. |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Successful response containing the list of hardware models | HardwareListResponse |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 422 | Validation Error | HTTPValidationError |
| 500 | Internal server error. | - |
Response Body (200, HardwareListResponse)
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
hardware |
array of Hardware object |
no | n/a | Array of hardware models present in the current realm. Empty array if none are found. | |
total |
integer | yes | n/a | 0, 1, 3 |
Total count of hardware models present in the current realm. |
Example
{
"hardware" : [
{
"arch" : 64,
"compatibility_type" : "bravo",
"component_type" : "node",
"cpu" : "Intel Xeon E5-1630 v4 3.7GHz",
"generation" : "100",
"hdinfo" : "(1) 512GB SSD",
"id" : "301002001",
"introduced" : "7.0.0",
"memory" : "96GB",
"name" : "ASD-1-100-96-80",
"network" : "2x200GbE",
"platform" : "freebsd_142_amd64",
"powerdraw" : 400,
"product_name" : "Bravo Director Node 100",
"product_type" : "Bravo Director Node",
"role" : "director"
}
],
"total" : 1
}POST /api/v1/hardware/{dataserial}/actions
Perform an action on a hardware component
Performs a component-scoped action, selected by the request body. blink_node_led turns on a node’s identify (“locate”) LED so the component can be found physically; stop_node_led turns it off. blink_drive_led / stop_drive_led do the same for a single drive, identified by params.drive_number. dataserial is always the hosting node/blade data serial (for a drive, the node that hosts it). A drive_number past the node’s last drive answers 404. Platform Admin only.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
dataserial |
path | string | yes | Data serial of the hardware component to act on |
Request Body (application/json, required)
One of the following, selected by action:
action: blink_drive_led - HardwareBlinkDriveLedActionRequest
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal blink_drive_led |
yes | n/a | The action to perform on the component. | |
params |
HardwareDriveLedActionParams object |
yes | n/a | Identifies the drive on the hosting node. |
action: blink_node_led - HardwareBlinkNodeLedActionRequest
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal blink_node_led |
yes | n/a | The action to perform on the component. | |
params |
null (not used) | no | n/a |
action: stop_drive_led - HardwareStopDriveLedActionRequest
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal stop_drive_led |
yes | n/a | The action to perform on the component. | |
params |
HardwareDriveLedActionParams object |
yes | n/a | Identifies the drive on the hosting node. |
action: stop_node_led - HardwareStopNodeLedActionRequest
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal stop_node_led |
yes | n/a | The action to perform on the component. | |
params |
null (not used) | no | n/a |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | Action performed successfully on the hardware component. No content is returned. | - |
| 400 | Bad request. Invalid component id or invalid action parameters. | - |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | Not found. The requested resource does not exist. | - |
| 409 | Conflict. Action conflicts with current system state. | - |
| 422 | Validation Error | HTTPValidationError |
| 500 | Internal server error. | - |
GET /api/v1/hardware/{model_id}
Get hardware model info
Returns details for a hardware model present in the current realm, by its catalog id.
Authentication: required (PasswordLogin or BearerJWT).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
model_id |
path | string | yes | Catalog id of the hardware model to retrieve |
refresh |
query | boolean | no | Bypass the cache: re-read the catalog from disk and refresh the cached entry. |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Successfully retrieved detailed information about the hardware model. | HardwareGetResponse |
| 401 | Unauthorized. Authentication required. | - |
| 403 | Forbidden. Insufficient permissions. | - |
| 404 | Hardware model not found. | - |
| 422 | Validation Error | HTTPValidationError |
| 500 | Internal server error. | - |
Response Body (200, HardwareGetResponse)
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
hardware |
Hardware object |
yes | n/a | Hardware model with all available details. |
Example
{
"hardware" : {
"arch" : 64,
"compatibility_type" : "bravo",
"component_type" : "node",
"cpu" : "Intel Xeon E5-1630 v4 3.7GHz",
"generation" : "100",
"hdinfo" : "(1) 512GB SSD",
"id" : "301002001",
"introduced" : "7.0.0",
"memory" : "96GB",
"name" : "ASD-1-100-96-80",
"network" : "2x200GbE",
"platform" : "freebsd_142_amd64",
"powerdraw" : 400,
"product_name" : "Bravo Director Node 100",
"product_type" : "Bravo Director Node",
"role" : "director"
}
}