Copyright (c) 2014-2015 StorPool. All rights reserved.
This reference document describes the StorPool API version 14.10 and the supported API calls.
The StorPool API can be used with any tool that can generate HTTP requests with the GET and POST methods. The only requirement is to supply the Authorization header and, if required by the request, valid JSON data.
For each call there is an explanation of the HTTP request and response and an example in raw format as it should be sent to the StorPool management service.
Here are two examples using curl using the GET and POST methods respectively and their counterparts as issued by the StorPool CLI:
curl -H "Authorization: Storpool v1:1556129910218014736" 192.168.42.208:81/ctrl/1.0/DisksList
storpool disk list
curl -d '{"addDisks":["1"]}' -H "Authorization: Storpool v1:1556129910218014736" 192.168.42.208:81/ctrl/1.0/PlacementGroupUpdate/hdd
storpool placementGroup hdd addDisk 1
Python programs may use the API by importing the Python StorPool bindings (use 'pypi install storpool' to install them):
>>>import spapi
>>>api=spapi.Api('192.168.0.5', 80, '1556560560218011653')
>>>a.peersList()
{
1: {
'networks': {
0: {
'mac': '00:4A:E6:5F:34:C3'
}
}
},
2: {
'networks': {
0: {
'mac': '52:54:E6:5F:34:DF'
}
}
},
3: {
'networks': {
0: {
'mac': '52:57:5F:54:E6:3A'
}
}
}
}
The calls that may be used may be found in the file spapi.py
Note: Requests will sometimes use GET instead of POST and consequently, will not require JSON. Responses on the other hand always produce JSON content.
List the network nodes running the StorPool beacon including information such as the ID of the node, the networks it communicates through and the corresponding MAC addresses.
GET /ctrl/1.0/NetworkPeersList HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"PeerID": {
"networks": {
"NetID": {
"mac": MAC Address
}, ...
}
}, ...
}
}
List the currently active recovery tasks. This call will return JSON data only when there is a relocation in progress. Under normal operation of the cluster it will return no data.
GET /ctrl/1.0/TasksList HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"allObjects": int,
"completedObjects": int,
"diskId": DiskID,
"dispatchedObjects": int,
"transactionId": long,
"unresolvedObjects": int /* Internal */
}, ...]
}
List all the services in the cluster (StorPool servers, clients, management, etc). If the whole cluster is not operational this call will return an error.
GET /ctrl/1.0/ServicesList HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"aoeTargets": {
"AoeTargetID": {
"id": AoeTargetID,
"nodeId": NodeID,
"status": ClientStatus,
"version": string
}, ...
},
"clients": {
"ClientID": {
"id": ClientID,
"nodeId": NodeID,
"status": ClientStatus,
"version": string
}, ...
},
"clusterStatus": ClusterStatus,
"mgmt": {
"MgmtID": {
"active": bool,
"id": MgmtID,
"nodeId": NodeID,
"prio": int /* Internal */,
"status": ClientStatus,
"version": string
}, ...
},
"servers": {
"ServerID": {
"id": ServerID,
"missingDisks": [DiskID, ...],
"nodeId": NodeID,
"pendingDisks": [DiskID, ...],
"status": ServerStatus,
"version": string
}, ...
}
}
}
List the currently active StorPool servers even before the cluster has become operational, along with information about any missing disks that the cluster is waiting for.
GET /ctrl/1.0/ServersListBlocked HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"aoeTargets": {
"AoeTargetID": {
"id": AoeTargetID,
"nodeId": NodeID,
"status": ClientStatus,
"version": string
}, ...
},
"clients": {
"ClientID": {
"id": ClientID,
"nodeId": NodeID,
"status": ClientStatus,
"version": string
}, ...
},
"clusterStatus": ClusterStatus,
"mgmt": {
"MgmtID": {
"active": bool,
"id": MgmtID,
"nodeId": NodeID,
"prio": int /* Internal */,
"status": ClientStatus,
"version": string
}, ...
},
"servers": {
"ServerID": {
"id": ServerID,
"missingDisks": [DiskID, ...],
"nodeId": NodeID,
"pendingDisks": [DiskID, ...],
"status": ServerStatus,
"version": string
}, ...
}
}
}
Return detailed information about each disk on the given server.
GET /ctrl/1.0/ServerDisksList/{serverId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"DiskID": Either({
"agAllocated": int /* Internal */,
"agCount": int /* Internal */,
"agFree": int /* Internal */,
"agFreeing": int /* Internal */,
"agFull": int /* Internal */,
"agMaxSizeFull": int /* Internal */,
"agMaxSizePartial": int /* Internal */,
"agPartial": int /* Internal */,
"description": DiskDescritpion,
"device": string,
"empty": bool,
"entriesAllocated": int,
"entriesCount": int,
"entriesFree": int,
"generationLeft": -1,
"id": DiskID,
"model": string,
"objectsAllocated": int,
"objectsCount": int,
"objectsFree": int,
"objectsOnDiskSize": long,
"sectorsCount": long,
"serial": string,
"serverId": ServerID,
"softEject": DiskSoftEjectStatus,
"ssd": bool
}, {
"description": DiskDescritpion,
"generationLeft": long,
"id": DiskID,
"model": string,
"serial": string,
"serverId": ServerID,
"softEject": DiskSoftEjectStatus
}), ...
}
}
Return detailed information about a disk on the given server and the objects on it.
GET /ctrl/1.0/ServerDiskDescribe/{serverId}/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"agAllocated": int /* Internal */,
"agCount": int /* Internal */,
"agFree": int /* Internal */,
"agFreeing": int /* Internal */,
"agFull": int /* Internal */,
"agMaxSizeFull": int /* Internal */,
"agMaxSizePartial": int /* Internal */,
"agPartial": int /* Internal */,
"description": DiskDescritpion,
"device": string,
"empty": bool,
"entriesAllocated": int,
"entriesCount": int,
"entriesFree": int,
"generationLeft": -1,
"id": DiskID,
"model": string,
"objects": {
"int": {
"generation": long,
"objectId": int /* Internal */,
"onDiskSize": int,
"parentVolume": string,
"state": ObjectState,
"storedSize": int,
"version": long,
"volume": string,
"volumeId": long /* Internal */
}, ...
},
"objectsAllocated": int,
"objectsCount": int,
"objectsFree": int,
"objectsOnDiskSize": long,
"sectorsCount": long,
"serial": string,
"serverId": ServerID,
"softEject": DiskSoftEjectStatus,
"ssd": bool
}
}
Return the status of each client including its current generation and generation update status.
GET /ctrl/1.0/ClientsConfigDump HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"clientGeneration": long,
"configStatus": client status,
"delay": int,
"generation": long,
"id": ClientID
}, ...]
}
Return the same JSON as ClientsConfigDump but block until the client has updated its configuration information to the current generation at the time of the request.
GET /ctrl/1.0/ClientConfigWait/{clientId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"clientGeneration": long,
"configStatus": client status,
"delay": int,
"generation": long,
"id": ClientID
}, ...]
}
List detailed information about the requests being currently processed on the given client.
GET /ctrl/1.0/ClientActiveRequests/{clientId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"clientId": ClientID,
"requests": [{
"address": long,
"drOp": string /* Internal */,
"msecActive": int,
"op": RequestOp,
"prevState": string /* Internal */,
"requestId": string,
"requestIdx": int,
"size": int,
"state": string /* Internal */,
"volume": Either(VolumeName, SnapshotName)
}, ...]
}
}
List the StorPool volumes and snapshots exported over AoE.
GET /ctrl/1.0/AoeStatus HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"aoeId": string,
"name": Either(VolumeName, SnapshotName),
"snapshot": bool,
"status": AoeExportStatus,
"target": Either(null, AoeTargetID)
}, ...]
}
Export the specified volume over AoE.
POST /ctrl/1.0/AoeExportVolume/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Export the specified snapshot over AoE.
POST /ctrl/1.0/AoeExportSnapshot/{snapshotName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Stop exporting the specified volume over AoE.
POST /ctrl/1.0/AoeUnexportVolume/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Stop exporting the specified snapshot over AoE.
POST /ctrl/1.0/AoeUnexportSnapshot/{snapshotName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
List detailed information about the requests being currently processed on the given AoE target
GET /ctrl/1.0/AoeTargetActiveRequests/{aoeTargetId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"aoeTargetId": AoeTargetID,
"requests": [{
"address": long,
"drOp": string /* Internal */,
"msecActive": int,
"op": RequestOp,
"prevState": string /* Internal */,
"requestId": string,
"requestIdx": int,
"size": int,
"state": string /* Internal */,
"volume": Either(VolumeName, SnapshotName)
}, ...]
}
}
GET /ctrl/1.0/DisksList HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"DiskID": Either({
"agAllocated": int /* Internal */,
"agCount": int /* Internal */,
"agFree": int /* Internal */,
"agFreeing": int /* Internal */,
"agFull": int /* Internal */,
"agMaxSizeFull": int /* Internal */,
"agMaxSizePartial": int /* Internal */,
"agPartial": int /* Internal */,
"description": DiskDescritpion,
"device": string,
"empty": bool,
"entriesAllocated": int,
"entriesCount": int,
"entriesFree": int,
"generationLeft": -1,
"id": DiskID,
"model": string,
"objectsAllocated": int,
"objectsCount": int,
"objectsFree": int,
"objectsOnDiskSize": long,
"sectorsCount": long,
"serial": string,
"serverId": ServerID,
"softEject": DiskSoftEjectStatus,
"ssd": bool
}, {
"description": DiskDescritpion,
"generationLeft": long,
"id": DiskID,
"model": string,
"serial": string,
"serverId": ServerID,
"softEject": DiskSoftEjectStatus
}), ...
}
}
List all disks including detailed information about the objects on each disk.
GET /ctrl/1.0/DiskDescribe/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"agAllocated": int /* Internal */,
"agCount": int /* Internal */,
"agFree": int /* Internal */,
"agFreeing": int /* Internal */,
"agFull": int /* Internal */,
"agMaxSizeFull": int /* Internal */,
"agMaxSizePartial": int /* Internal */,
"agPartial": int /* Internal */,
"description": DiskDescritpion,
"device": string,
"empty": bool,
"entriesAllocated": int,
"entriesCount": int,
"entriesFree": int,
"generationLeft": -1,
"id": DiskID,
"model": string,
"objects": {
"int": {
"generation": long,
"objectId": int /* Internal */,
"onDiskSize": int,
"parentVolume": string,
"state": ObjectState,
"storedSize": int,
"version": long,
"volume": string,
"volumeId": long /* Internal */
}, ...
},
"objectsAllocated": int,
"objectsCount": int,
"objectsFree": int,
"objectsOnDiskSize": long,
"sectorsCount": long,
"serial": string,
"serverId": ServerID,
"softEject": DiskSoftEjectStatus,
"ssd": bool
}
}
List all disks including information about the volumes stored on each disk.
GET /ctrl/1.0/DiskGetInfo/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"agAllocated": int /* Internal */,
"agCount": int /* Internal */,
"agFree": int /* Internal */,
"agFreeing": int /* Internal */,
"agFull": int /* Internal */,
"agMaxSizeFull": int /* Internal */,
"agMaxSizePartial": int /* Internal */,
"agPartial": int /* Internal */,
"description": DiskDescritpion,
"device": string,
"empty": bool,
"entriesAllocated": int,
"entriesCount": int,
"entriesFree": int,
"generationLeft": -1,
"id": DiskID,
"model": string,
"objectStates": {
"ObjectState": int, ...
},
"objectsAllocated": int,
"objectsCount": int,
"objectsFree": int,
"objectsOnDiskSize": long,
"sectorsCount": long,
"serial": string,
"serverId": ServerID,
"softEject": DiskSoftEjectStatus,
"ssd": bool,
"volumeInfos": {
"string": {
"name": string,
"objectStates": {
"ObjectState": int, ...
},
"objectsCount": long,
"onDiskSize": long,
"storedSize": long
}, ...
}
}
}
Stop operations on the given disk even if it is not empty.
POST /ctrl/1.0/DiskEject/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Remove the disk from any placement groups or volumes that it is used in.
POST /ctrl/1.0/DiskForget/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Try to boot the cluster by ignoring this disk.
POST /ctrl/1.0/DiskIgnore/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Stop writes to the given disk and start relocating all the data stored on it to other disks.
POST /ctrl/1.0/DiskSoftEject/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Temporarily pause the relocation tasks for the disk. This can be helpful in heavy load situations.
POST /ctrl/1.0/DiskSoftEjectPause/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Stop the relocation tasks for the disk and mark it as usable again. After this operation data will be moved back to the disk.
POST /ctrl/1.0/DiskSoftEjectCancel/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
POST /ctrl/1.0/DiskSetDescription/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"description": DiskDescritpion
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
List detailed information about the requests being currently processed on the given disk.
GET /ctrl/1.0/DiskActiveRequests/{diskId} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"diskId": DiskID,
"requests": [{
"address": long,
"drOp": string /* Internal */,
"msecActive": int,
"op": RequestOp,
"prevState": string /* Internal */,
"requestId": string,
"requestIdx": int,
"size": int,
"state": string /* Internal */,
"volume": Either(VolumeName, SnapshotName)
}, ...]
}
}
Return configuration information about all the volumes.
GET /ctrl/1.0/VolumesList HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"bw": Bandwidth,
"creationTimestamp": long,
"flags": int /* Internal */,
"id": long /* Internal */,
"iops": IOPS,
"name": VolumeName,
"objectsCount": int,
"originalParentVolumeId": long /* Internal */,
"parentName": Either("", SnapshotName),
"parentVolumeId": long /* Internal */,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Replication,
"size": Size,
"templateId": long /* Internal */,
"templateName": Either("", VolumeTemplateName),
"visibleVolumeId": long
}, ...]
}
Return the status of each volume and snapshot.
GET /ctrl/1.0/VolumesGetStatus HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"VolumeName": {
"balancerBlocked": bool,
"decreasedRedundancy": bool,
"downBytes": int,
"downDrives": [DiskID, ...],
"migrating": bool,
"missingDrives": [DiskID, ...],
"missingTargetDrives": [DiskID, ...],
"name": VolumeName,
"onDiskSize": int,
"replication": Replication,
"size": Size,
"snapshot": bool,
"softEjectingDrives": [DiskID, ...],
"status": VolumeCurentStatus,
"storedSize": int,
"syncingDataBytes": int,
"syncingMetaObjects": int
}, ...
}
}
Same as VolumeList but only return information about a given volume.
GET /ctrl/1.0/Volume/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"bw": Bandwidth,
"creationTimestamp": long,
"flags": int /* Internal */,
"id": long /* Internal */,
"iops": IOPS,
"name": VolumeName,
"objectsCount": int,
"originalParentVolumeId": long /* Internal */,
"parentName": Either("", SnapshotName),
"parentVolumeId": long /* Internal */,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Replication,
"size": Size,
"templateId": long /* Internal */,
"templateName": Either("", VolumeTemplateName),
"visibleVolumeId": long
}, ...]
}
Return detailed information about the distribution of the volume's data on the disks.
GET /ctrl/1.0/VolumeDescribe/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"bw": Bandwidth,
"creationTimestamp": long,
"flags": int /* Internal */,
"id": long /* Internal */,
"iops": IOPS,
"name": VolumeName,
"objects": [[DiskID, ...], ...],
"objectsCount": int,
"originalParentVolumeId": long /* Internal */,
"parentName": Either("", SnapshotName),
"parentVolumeId": long /* Internal */,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Replication,
"size": Size,
"targetDiskSets": [[DiskID, ...], ...],
"templateId": long /* Internal */,
"templateName": Either("", VolumeTemplateName),
"visibleVolumeId": long
}
}
Return general information about the distribution of the volume's data on the disks.
GET /ctrl/1.0/VolumeGetInfo/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"bw": Bandwidth,
"creationTimestamp": long,
"disksCount": int,
"flags": int /* Internal */,
"id": long /* Internal */,
"iops": IOPS,
"name": VolumeName,
"objectsCount": int,
"objectsPerChain": [{
"count": int,
"disks": [DiskID, ...]
}, ...],
"objectsPerDisk": {
"DiskID": int, ...
},
"objectsPerDiskSet": [{
"count": int,
"disks": [DiskID, ...]
}, ...],
"originalParentVolumeId": long /* Internal */,
"parentName": Either("", SnapshotName),
"parentVolumeId": long /* Internal */,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Replication,
"size": Size,
"templateId": long /* Internal */,
"templateName": Either("", VolumeTemplateName),
"visibleVolumeId": long
}
}
List a volume's parent snapshots in the same format as VolumeList
GET /ctrl/1.0/VolumeListSnapshots/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"bw": Bandwidth,
"creationTimestamp": long,
"flags": int /* Internal */,
"id": long /* Internal */,
"iops": IOPS,
"name": SnapshotName,
"objectsCount": int,
"onVolume": VolumeName,
"originalParentVolumeId": long /* Internal */,
"parentName": Either("", SnapshotName),
"parentVolumeId": long /* Internal */,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Replication,
"size": Size,
"templateId": long /* Internal */,
"templateName": Either("", VolumeTemplateName),
"visibleVolumeId": long
}, ...]
}
POST /ctrl/1.0/VolumeCreate HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"baseOn": VolumeName /* Optional */,
"bw": Bandwidth /* Optional */,
"iops": IOPS /* Optional */,
"name": VolumeName,
"parent": SnapshotName /* Optional */,
"placeAll": PlacementGroupName /* Optional */,
"placeTail": PlacementGroupName /* Optional */,
"replication": Replication /* Optional */,
"size": Size /* Optional */,
"template": VolumeTemplateName /* Optional */
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Alter the configuration of an existing volume.
POST /ctrl/1.0/VolumeUpdate/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"bw": Bandwidth /* Optional */,
"iops": IOPS /* Optional */,
"placeAll": PlacementGroupName /* Optional */,
"placeTail": PlacementGroupName /* Optional */,
"rename": VolumeName /* Optional */,
"replication": Replication /* Optional */,
"shrinkOk": bool /* Optional */,
"size": Size /* Optional */,
"sizeAdd": SizeAdd /* Optional */,
"template": VolumeTemplateName /* Optional */
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Convert the volume to a snapshot
POST /ctrl/1.0/VolumeFreeze/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Change the parent of the volume by choosing from the ones higher in the hierarchy or by rebasing it to no parent.
POST /ctrl/1.0/VolumeRebase/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"parentName": SnapshotName /* Optional */
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
POST /ctrl/1.0/VolumeAbandonDisk/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"diskId": DiskID
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
POST /ctrl/1.0/VolumeDelete/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Snapshots in their essence are very similar to volumes in the sense that many operations supported by volumes are also supported by snapshots (all except write-related operations). They can not be modified and play an essential role in copy-on-write scenarios.
List all the snapshots in the cluster in the same format as VolumeList.
GET /ctrl/1.0/SnapshotsList HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"bw": Bandwidth,
"creationTimestamp": long,
"flags": int /* Internal */,
"id": long /* Internal */,
"iops": IOPS,
"name": SnapshotName,
"objectsCount": int,
"onVolume": VolumeName,
"originalParentVolumeId": long /* Internal */,
"parentName": Either("", SnapshotName),
"parentVolumeId": long /* Internal */,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Replication,
"size": Size,
"templateId": long /* Internal */,
"templateName": Either("", VolumeTemplateName),
"visibleVolumeId": long
}, ...]
}
Same as SnapshotList but only return information about a given snapshot.
GET /ctrl/1.0/Snapshot/{snapshotName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"bw": Bandwidth,
"creationTimestamp": long,
"flags": int /* Internal */,
"id": long /* Internal */,
"iops": IOPS,
"name": SnapshotName,
"objectsCount": int,
"onVolume": VolumeName,
"originalParentVolumeId": long /* Internal */,
"parentName": Either("", SnapshotName),
"parentVolumeId": long /* Internal */,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Replication,
"size": Size,
"templateId": long /* Internal */,
"templateName": Either("", VolumeTemplateName),
"visibleVolumeId": long
}, ...]
}
Return detailed information about the distribution of the snapshot's data on the disks.
GET /ctrl/1.0/SnapshotDescribe/{snapshotName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"bw": Bandwidth,
"creationTimestamp": long,
"flags": int /* Internal */,
"id": long /* Internal */,
"iops": IOPS,
"name": VolumeName,
"objects": [[DiskID, ...], ...],
"objectsCount": int,
"originalParentVolumeId": long /* Internal */,
"parentName": Either("", SnapshotName),
"parentVolumeId": long /* Internal */,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Replication,
"size": Size,
"targetDiskSets": [[DiskID, ...], ...],
"templateId": long /* Internal */,
"templateName": Either("", VolumeTemplateName),
"visibleVolumeId": long
}
}
Return general information about the distribution of the snapshot's data on the disks.
GET /ctrl/1.0/SnapshotGetInfo/{snapshotName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"bw": Bandwidth,
"creationTimestamp": long,
"disksCount": int,
"flags": int /* Internal */,
"id": long /* Internal */,
"iops": IOPS,
"name": VolumeName,
"objectsCount": int,
"objectsPerChain": [{
"count": int,
"disks": [DiskID, ...]
}, ...],
"objectsPerDisk": {
"DiskID": int, ...
},
"objectsPerDiskSet": [{
"count": int,
"disks": [DiskID, ...]
}, ...],
"originalParentVolumeId": long /* Internal */,
"parentName": Either("", SnapshotName),
"parentVolumeId": long /* Internal */,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Replication,
"size": Size,
"templateId": long /* Internal */,
"templateName": Either("", VolumeTemplateName),
"visibleVolumeId": long
}
}
Create a snapshot of the given volume; the snapshot becomes the parent of the volume.
POST /ctrl/1.0/VolumeSnapshot/{volumeName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"bind": bool /* Optional */,
"name": VolumeName /* Optional */
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Alter the configuration of an existing snapshot.
POST /ctrl/1.0/SnapshotUpdate/{snapshotName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"bind": bool /* Optional */,
"bw": Bandwidth /* Optional */,
"iops": IOPS /* Optional */,
"placeAll": PlacementGroupName /* Optional */,
"placeTail": PlacementGroupName /* Optional */,
"rename": VolumeName /* Optional */,
"replication": Replication /* Optional */
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Change the parent of the snapshot by choosing from the ones higher in the hierarchy or by rebasing it to no parent.
POST /ctrl/1.0/SnapshotRebase/{snapshotName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"parentName": SnapshotName /* Optional */
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
POST /ctrl/1.0/VolumeAbandonDisk/{snapshotName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"diskId": DiskID
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
POST /ctrl/1.0/SnapshotDelete/{snapshotName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
List the volumes and snapshots currently attached to clients along with the read/write rights of each attachment.
GET /ctrl/1.0/AttachmentsList HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"client": ClientID,
"pos": AttachmentPos,
"rights": AttachmentRights,
"snapshot": bool,
"volume": VolumeName
}, ...]
}
Perform bulk attach/detach and attachment rights modification.
POST /ctrl/1.0/VolumesReassign HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
[Either({
"detach": Either("all", [ClientID, ...]) /* Optional */,
"force": bool, default=false,
"ro": [ClientID, ...] /* Optional */,
"rw": [ClientID, ...] /* Optional */,
"volume": VolumeName
}, {
"detach": Either("all", [ClientID, ...]) /* Optional */,
"force": bool, default=false,
"ro": [ClientID, ...] /* Optional */,
"snapshot": SnapshotName
}), ...]
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Placement groups provide a way to specify the disks on which a volume's data should be stored.
GET /ctrl/1.0/PlacementGroupsList HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"PlacementGroupName": {
"disks": [DiskID, ...],
"id": int /* Internal */,
"name": PlacementGroupName,
"servers": [ServerID, ...]
}, ...
}
}
Same as PlacementGroupsList but only return information about a given group.
GET /ctrl/1.0/PlacementGroupDescribe/{placementGroupName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"disks": [DiskID, ...],
"id": int /* Internal */,
"name": PlacementGroupName,
"servers": [ServerID, ...]
}
}
If a group by the specified name does not exist, it will be created.
POST /ctrl/1.0/PlacementGroupUpdate/{placementGroupName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"addDisks": [DiskID, ...],
"addServers": [ServerID, ...],
"rename": PlacementGroupName /* Optional */,
"rmDisks": [DiskID, ...],
"rmServers": [ServerID, ...]
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
POST /ctrl/1.0/PlacementGroupDelete/{placementGroupName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Templates are a set of rules used for creating many similar volumes.
GET /ctrl/1.0/VolumeTemplatesList HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"bw": Bandwidth,
"id": int /* Internal */,
"iops": IOPS,
"name": VolumeTemplateName,
"parentName": Either("", SnapshotName),
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Either("-", Replication),
"size": Either("-", Size)
}, ...]
}
GET /ctrl/1.0/VolumeTemplatesStatus HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": [{
"availablePlaceAll": long,
"availablePlaceTail": long,
"id": int /* Internal */,
"name": VolumeTemplateName,
"onDiskSize": long,
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"removingSnapshotsCount": int,
"replication": Either("-", Replication),
"size": Either(0, Size),
"snapshotsCount": int,
"storedSize": long,
"totalSize": Either(0, Size),
"volumesCount": int
}, ...]
}
Same as VolumeTemplatesList but only return information about a given template.
GET /ctrl/1.0/VolumeTemplateDescribe/{templateName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"bw": Bandwidth,
"id": int /* Internal */,
"iops": IOPS,
"name": VolumeTemplateName,
"parentName": Either("", SnapshotName),
"placeAll": PlacementGroupName,
"placeTail": PlacementGroupName,
"replication": Either("-", Replication),
"size": Either("-", Size)
}
}
POST /ctrl/1.0/VolumeTemplateCreate HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"bw": Bandwidth /* Optional */,
"iops": IOPS /* Optional */,
"name": VolumeTemplateName,
"parent": SnapshotName /* Optional */,
"placeAll": PlacementGroupName /* Optional */,
"placeTail": PlacementGroupName /* Optional */,
"replication": Replication /* Optional */,
"size": Size /* Optional */
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
Alter the configuration of an existing volume template.
POST /ctrl/1.0/VolumeTemplateUpdate/{templateName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
{
"bw": Bandwidth /* Optional */,
"iops": IOPS /* Optional */,
"parent": SnapshotName /* Optional */,
"placeAll": PlacementGroupName /* Optional */,
"placeTail": PlacementGroupName /* Optional */,
"propagate": bool /* Optional */,
"rename": VolumeTemplateName /* Optional */,
"replication": Replication /* Optional */,
"size": Size /* Optional */
}
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
POST /ctrl/1.0/VolumeTemplateDelete/{templateName} HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
This is a service that moves data when needed, e.g. when removing or adding disks.
POST /ctrl/1.0/VolumeRelocatorOn HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
POST /ctrl/1.0/VolumeRelocatorOff HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
GET /ctrl/1.0/VolumeRelocatorStatus HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"status": RelocatorStatus
}
}
This is a service that decides when it is a good time to move data.
POST /ctrl/1.0/VolumeBalancerOn HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
POST /ctrl/1.0/VolumeBalancerOff HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"generation": long,
"ok": true
}
}
GET /ctrl/1.0/VolumeBalancerStatus HTTP/1.0
Host: SP_API_HOST:SP_API_PORT
Authorization: Storpool v1:SP_AUTH_TOKEN
Content-Length: LENGTH
HTTP/1.0 200 OK
Connection: close
Content-Type: application/json
Cache-control: private
Content-Length: LENGTH
{
"generation": generation,
"data": {
"status": BalancerStatus
}
}
"": | The constant value "". |
"-": | The constant value "-". |
"all": | The constant value "all". |
-1: | The constant value -1. |
0: | The constant value 0. |
AoeExportStatus: | One of {"OK", "down"} |
AoeTargetID: | integer, 1 <= value <= 4095 |
AttachmentPos: | integer, 0 <= value <= 1023 |
AttachmentRights: | One of {"rw", "ro"} |
BalancerStatus: | One of {"on", "off", "blocked"} |
Bandwidth: | a positive integer or '-' for unlimited |
ClientID: | integer, 1 <= value <= 24575 |
ClientStatus: | One of {"running", "down"} |
ClusterStatus: | One of {"running", "waiting", "down"} |
DiskDescritpion: | string, regex ^[A-Za-z0-9_\- ]{,30}$ |
DiskID: | integer, 0 <= value <= 4095 |
DiskSoftEjectStatus: | One of {"on", "off", "paused"} |
IOPS: | a positive integer or '-' for unlimited |
MAC Address: | string, regex ^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$ |
MgmtID: | integer, 1 <= value <= 4095 |
NetID: | integer, 0 <= value <= 3 |
NodeID: | integer, 0 <= value <= 63 |
ObjectState: | ObjectState, enumeration from 0 to 9 |
PeerID: | integer, 0 <= value <= 65535 |
PeerStatus: | One of {"up", "down"} |
PlacementGroupName: | a string(128), matching ^[A-Za-z0-9_\-]+$, except {list} |
RelocatorStatus: | One of {"on", "off", "blocked"} |
Replication: | integer, 1 <= value <= 3 |
RequestOp: | One of {"read", "write", "merge", "system", "entries flush", "#bad_state", "#bad_drOp"} |
ServerID: | integer, 1 <= value <= 32767 |
ServerStatus: | One of {"running", "waiting", "booting", "down"} |
Size: | a positive integer divisible by 512 |
SizeAdd: | a positive integer divisible by 512 |
SnapshotName: | a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$, except {list, status} |
VolumeCurentStatus: | One of {"up", "up soon", "data lost", "down"} |
VolumeName: | a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$, except {list, status} |
VolumeTemplateName: | a string(200), matching ^[A-Za-z0-9_\-]+$, except {list} |
bool: | true or false. |
bool, default=false: | A value of type bool. Default value = False. |
client status: | One of {"ok", "updating", "down"} |
int: | An integer value. |
long: | A long integer value. |
null: | The constant value null. |
string: | A string value. |
true: | The constant value true. |