REST API

This reference document describes the StorPool API version 21.0 and the supported API calls.

  1. General
  2. Volumes
    1. List all volumes
    2. Get volume and snapshot status and stored size
    3. Get volume and snapshot status
    4. List total used space by each volume
    5. List a single volume
    6. Describe a volume
    7. Get volume info
    8. List the parent snapshots of a volume
    9. Create a new volume
    10. Update a volume
    11. Freeze a volume
    12. Rebase a volume
    13. Abandon disk
    14. Delete a volume
    15. Backup a volume to a remote location
    16. Backup a group of volumes to a remote location
    17. Move a volume from the local cluster to a remote cluster
    18. Export a volume to another cluster, so it can be attached when allowRemoteExports is true
    19. Move the volume from its current remote cluster to the local one. Noop if already here. Multicluster only call
    20. Create a volume from a snapshot from a remote location
    21. Revert a volume to a snapshot discarding all its current data.
    22. Revert a group of volumes to snapshots discarding all of theirs current data.
  3. Templates
    1. List all volume templates
    2. List the status of all volume templates
    3. Describe a single volume template
    4. Create a volume template
    5. Update a volume template
    6. Delete a volume template
  4. Snapshots
    1. List all snapshots
    2. List snapshots space estimations
    3. List a single snapshot
    4. Describe a snapshot
    5. Get snapshot info
    6. Snapshot a volume
    7. Update a snapshot
    8. Rebase a snapshot
    9. Abandon disk
    10. Delete a snapshot
    11. Delete multiple snapshot
    12. Delete a snapshot by global id
    13. Create consistent snapshots of a group of volumes
    14. Copy a snapshot from a remote location
    15. Move a snapshot from the local cluster to a remote cluster
    16. Allow a remote location to access a local snapshot
    17. Revoke a remote location's access to a local snapshot
    18. List exported snapshots
    19. List exported volumes
    20. List the available remote snapshots
    21. List the available remote volumes
    22. Instruct the remote location that we will no longer use those snapshots
  5. Attachments
    1. List all attachments
    2. Reassign volumes and/or snapshots
    3. Reassign volumes and/or snapshots with confirmation from the clients
  6. Disks
    1. List all disks
    2. Describe a disk
    3. Eject a disk
    4. Forget a disk
    5. Ignore a disk
    6. Soft-eject a disk
    7. Pause a disk's soft-eject operation
    8. Cancel a disk's soft-eject operation
    9. Set a disk's description
    10. List all the active requests on a disk
    11. Start scrubbing process
    12. Pause scrubbing process
    13. Continue paused scrubbing process
    14. Retrim disk
  7. Placement Groups
    1. List all placement groups
    2. Describe a single placement group
    3. Create and/or update a placement group
    4. Delete a placement group
    5. List all fault sets
    6. List the properties of a volume allocation group
    7. Update the allocation group of a volume
    8. Update the allocation group of a snapshot
    9. Update the targets of a volume allocation group
  8. Services
    1. List all StorPool services
    2. List all blocked StorPool servers
  9. Servers
    1. List all Storpool servers
    2. List all disks on a server
    3. Describe a disk on a server
  10. Clients
    1. Get the current status of all the clients
    2. Wait until a client updates to the current configuration
    3. List all the active requests on a client
  11. Node maintenance
    1. List the nodes in maintenance
    2. Set node in maintenance
    3. Complete node's maintenance.
  12. Network
    1. List the network peers
    2. Query all peers for their status and active requests
  13. iSCSI
    1. Get the StorPool iSCSI configuration
    2. Modify the StorPool iSCSI configuration
    3. Query iSCSI controllers for active sessions
    4. Query iSCSI controllers for interfaces state
  14. Volume Relocator
    1. Get the relocator's status
    2. List total per disk relocation estimates
    3. List per disk relocation estimates for a given volume
    4. List per disk relocation estimates for a given snapshot
  15. Balancer
    1. Get the balancer's status
    2. Set the balancer's status
    3. List balancer volume and snapshot status
    4. List total per disk rebalancing estimates
    5. List per disk rebalancing estimated for a given volume
    6. List per disk rebalancing estimates for a given snapshot
    7. Get the disk sets computed by the balancer for a given volume
    8. Get the disk sets computed by the balancer for a given snapshot
  16. Tasks
    1. List tasks
  17. Remote locations, bridges, and clusters
    1. List the registered remote locations
    2. Register a new remote location
    3. Remove a remote location
    4. Update a remote location
    5. Rename a remote location
    6. List the registered remote clusters
    7. Register a new remote cluster
    8. Remove a remote cluster
    9. Rename a remote cluster
    10. List the registered remote bridges
    11. Register a new remote bridge
    12. Deregister a remote bridge
  18. Key Value Store
    1. List all created key value buckets
    2. List a complete key value bucket
    3. List a specific key-value pair from a specific bucket
    4. Create a new bucket
    5. Delete a bucket
    6. Update a bucket
  19. Metadata volumes
    1. Read the data from a metadata volume
    2. Read the data from a metadata snapshot
    3. Write the data to a metadata volume.
  20. StorPool Features
    1. Show information about StorPool features
  21. Data Types

General

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 'pip install storpool' to install them):

# Use the default StorPool configuration settings

>>> from storpool import spapi
>>> api=spapi.Api.fromConfig()

# Use the default StorPool configuration settings, but do NOT allow environment variables to
# override them

>>> from storpool import spapi
>>> api=spapi.Api.fromConfig(use_env=False)

# Use an already-created spconfig.SPConfig object
>>> api=spapi.Api.fromConfig(cfg=cfg)

# Explicitly specify the hostname, port, and authentication string
>>> api=spapi.Api(host='192.168.0.5', port=80, auth='1556560560218011653')

# Use the default StorPool configuration settings but explicitly specify the source address as
# a string

>>> from storpool import spapi
>>> api=spapi.Api.fromConfig(source='192.168.0.2')

# Use the created API access object
>>> api.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'
          }
        }
  }
}

Any of the methods may be invoked with the additional boolean parameter "returnRawAPIData"; if it has a true value, the method call will not construct a Python object representing the return value, but will return a Python dictionary or list corresponding to the JSON response data instead.

The calls that may be used may be found in the file spapi.py. As a rule of thumb, the name of the call is the name of the HTTP query with the first letter in lowercase (as above: "peersList()" for the "PeersList" query). To view them all once the StorPool bindings are installed, run a Python interpreter and then:

>>> from storpool import spapi
>>> help(spapi)

Note: Requests will sometimes use GET instead of POST and consequently, will not require JSON. Responses on the other hand always produce JSON content.

Some of the API calls may be used in a StorPool multicluster environment to reference and modify volumes and snapshots in a different (but connected) StorPool cluster. These have a "MultiCluster/" component in their URL path. When using the Python StorPool bindings, multicluster feature is enabled by adding a "multiCluster=True" parameter to the Api constructor invocation.

In a StorPool multicluster environment an instance of the StorPool API may be used to forward a command to the API instance of another cluster by adding a "RemoteCommand/<cluster_name>/" path component immediately after the API version prefix:

curl -H "Authorization: Storpool v1:1556129910218014736"       192.168.42.208:81/ctrl/1.0/RemoteCommand/backup/DisksList

When using the Python StorPool bindings, this is done by adding a "clusterName=clusterName" parameter to the API method invocation:

api.disksList(clusterName="backup")

Peers

List the network peers (NetworkPeersList)

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.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/NetworkPeersList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/NetworkPeersList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "PeerID": {
            "beaconStatus": BeaconNodeStatus,
            "clusterStatus": BeaconClusterStatus,
            "joined": bool,
            "networks": {
              "NetID": {
                "mac": MAC Address
              }, ...
            } /* Optional */,
            "nonVoting": bool,
            "rdma": {
              "NetID": {
                "guid": GUID,
                "state": RdmaState
              }, ...
            }
          }, ...
        }
      }
      
    • Response Data: A dict from PeerID to PeerDesc
      • Key type: PeerID
      • Value type: PeerDesc
        • beaconStatus: (BeaconNodeStatus): Whether a beacon is running at all on this node.
        • clusterStatus: (BeaconClusterStatus): Whether we consider this node a part of the cluster quorum.
        • joined: (bool): Whether the node considers itself a part of the cluster quorum.
        • networks: (Optional {NetID: NetDesc}): List of the Ethernet networks that StorPool communicates through on this node.
        • nonVoting: (bool): Whether this is a non-voting StorPool node (e.g. client only).
        • rdma: List of the RDMA networks that StorPool communicates through on this node.A dict from NetID to RdmaDesc
          • Key type: NetID
          • Value type: RdmaDesc
            • guid: (GUID): global unique id
            • state: (RdmaState): state of the RDMA module

Tasks

List tasks (TasksList)

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.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/TasksList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/TasksList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      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": int,
          "unresolvedObjects": int /* Internal */
        }, ...]
      }
      
    • Response Data:
        Element type: Task
        • allObjects: (int): The number of all the objects that the task is performing actions on.
        • completedObjects: (int): The number of objects that the task has finished working on.
        • diskId: (DiskID): The ID of the disk this task is on.
        • dispatchedObjects: (int): Objects that the task has started working on.
        • transactionId: (int): An ID associated with the currently running task. This ID is the same for all the
        • unresolvedObjects: (Internal int)

Services

List all StorPool services (ServicesList)

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.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/ServicesList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/ServicesList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "bridges": {
            "BridgeId": {
              "id": BridgeId,
              "nodeId": NodeID /* Optional */,
              "startTime": Either(null, int),
              "status": BridgeStatus,
              "version": string
            }, ...
          },
          "clients": {
            "ClientID": {
              "id": ClientID,
              "nodeId": NodeID /* Optional */,
              "startTime": Either(null, int),
              "status": ClientStatus,
              "version": string
            }, ...
          },
          "clusterStatus": ClusterStatus,
          "iscsiTargets": {
            "iscsiTargetId": {
              "id": iscsiTargetId,
              "nodeId": NodeID /* Optional */,
              "startTime": Either(null, int),
              "status": iscsiTargetStatus,
              "version": string
            }, ...
          },
          "mgmt": {
            "MgmtID": {
              "active": bool,
              "id": MgmtID,
              "nodeId": NodeID /* Optional */,
              "prio": int /* Internal */,
              "startTime": Either(null, int),
              "status": ClientStatus,
              "version": string
            }, ...
          },
          "servers": {
            "ServerID": {
              "id": ServerID,
              "missingDisks": [DiskID, ...],
              "nodeId": NodeID /* Optional */,
              "pendingDisks": [DiskID, ...],
              "startTime": Either(null, int),
              "status": ServerStatus,
              "version": string
            }, ...
          }
        }
      }
      
    • Response Data: ClusterStatus
      • bridges: A dict from BridgeId to Bridge
        • Key type: BridgeId
        • Value type: Bridge
          • id: (BridgeId): The ID of the service.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (BridgeStatus): The current status of the remote cluster bridge.
          • version: (string): The version of the running StorPool service.
      • clients: A dict from ClientID to Client
        • Key type: ClientID
        • Value type: Client
          • id: (ClientID): The ID of the service. Currently this is the same as the ID of the node.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ClientStatus): The current status of the client.
          • version: (string): The version of the running StorPool service.
      • clusterStatus: (ClusterStatus)
      • iscsiTargets: A dict from iscsiTargetId to IscsiTarget
        • Key type: iscsiTargetId
        • Value type: IscsiTarget
          • id: (iscsiTargetId): The ID of the service.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (iscsiTargetStatus): The current status of the iSCSI target service.
          • version: (string): The version of the running StorPool service.
      • mgmt: A dict from MgmtID to Mgmt
        • Key type: MgmtID
        • Value type: Mgmt
          • active: (bool): If the instance is currently active. For a given cluster one mgmt instance will be
          • id: (MgmtID): The ID of the service.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • prio: (Internal int)
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ClientStatus): The current status of the mgmt instance.
          • version: (string): The version of the running StorPool service.
      • servers: A dict from ServerID to Server
        • Key type: ServerID
        • Value type: Server
          • id: (ServerID): The ID of the service. Currently this is the same as the ID of the node.
          • missingDisks: The cluster will remain down until these disks are seen again.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • pendingDisks: Similar to missingDisks, these are the disks that are ready and waiting for the
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ServerStatus)
          • version: (string): The version of the running StorPool service.

List all blocked StorPool servers (ServersListBlocked)

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.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/ServersListBlocked HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/ServersListBlocked
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "bridges": {
            "BridgeId": {
              "id": BridgeId,
              "nodeId": NodeID /* Optional */,
              "startTime": Either(null, int),
              "status": BridgeStatus,
              "version": string
            }, ...
          },
          "clients": {
            "ClientID": {
              "id": ClientID,
              "nodeId": NodeID /* Optional */,
              "startTime": Either(null, int),
              "status": ClientStatus,
              "version": string
            }, ...
          },
          "clusterStatus": ClusterStatus,
          "iscsiTargets": {
            "iscsiTargetId": {
              "id": iscsiTargetId,
              "nodeId": NodeID /* Optional */,
              "startTime": Either(null, int),
              "status": iscsiTargetStatus,
              "version": string
            }, ...
          },
          "mgmt": {
            "MgmtID": {
              "active": bool,
              "id": MgmtID,
              "nodeId": NodeID /* Optional */,
              "prio": int /* Internal */,
              "startTime": Either(null, int),
              "status": ClientStatus,
              "version": string
            }, ...
          },
          "servers": {
            "ServerID": {
              "id": ServerID,
              "missingDisks": [DiskID, ...],
              "nodeId": NodeID /* Optional */,
              "pendingDisks": [DiskID, ...],
              "startTime": Either(null, int),
              "status": ServerStatus,
              "version": string
            }, ...
          }
        }
      }
      
    • Response Data: ClusterStatus
      • bridges: A dict from BridgeId to Bridge
        • Key type: BridgeId
        • Value type: Bridge
          • id: (BridgeId): The ID of the service.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (BridgeStatus): The current status of the remote cluster bridge.
          • version: (string): The version of the running StorPool service.
      • clients: A dict from ClientID to Client
        • Key type: ClientID
        • Value type: Client
          • id: (ClientID): The ID of the service. Currently this is the same as the ID of the node.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ClientStatus): The current status of the client.
          • version: (string): The version of the running StorPool service.
      • clusterStatus: (ClusterStatus)
      • iscsiTargets: A dict from iscsiTargetId to IscsiTarget
        • Key type: iscsiTargetId
        • Value type: IscsiTarget
          • id: (iscsiTargetId): The ID of the service.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (iscsiTargetStatus): The current status of the iSCSI target service.
          • version: (string): The version of the running StorPool service.
      • mgmt: A dict from MgmtID to Mgmt
        • Key type: MgmtID
        • Value type: Mgmt
          • active: (bool): If the instance is currently active. For a given cluster one mgmt instance will be
          • id: (MgmtID): The ID of the service.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • prio: (Internal int)
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ClientStatus): The current status of the mgmt instance.
          • version: (string): The version of the running StorPool service.
      • servers: A dict from ServerID to Server
        • Key type: ServerID
        • Value type: Server
          • id: (ServerID): The ID of the service. Currently this is the same as the ID of the node.
          • missingDisks: The cluster will remain down until these disks are seen again.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • pendingDisks: Similar to missingDisks, these are the disks that are ready and waiting for the
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ServerStatus)
          • version: (string): The version of the running StorPool service.

Active requests

Query all peers for their status and active requests (AllPeersActiveRequests)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/AllPeersActiveRequests HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "msecsTimeout": int /* Optional */
      } /* Optional */
    • Method: GET
    • Path: /ctrl/1.0/AllPeersActiveRequests
    • Arguments: No arguments
    • JSON: Optional AllPeersActiveRequestsQuery
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "requests": [Either({
            "diskId": DiskID,
            "lastState": LastState,
            "peerId": PeerID,
            "service": {
              "id": string,
              "type": Id
            },
            "status": "diskExpected"
          }, {
            "allObjectsFlushed": bool /* Internal */,
            "diskId": DiskID,
            "diskState": DiskState,
            "objectsOutdated": int /* Internal */,
            "objectsOutdatedRemote": int /* Internal */,
            "objectsWaitingForVersion": int /* Internal */,
            "peerId": PeerID,
            "service": {
              "id": string,
              "type": Id
            },
            "status": "diskState"
          }, {
            "address": int,
            "diskId": Either(4294967294, DiskID),
            "drOp": string /* Optional */ /* Internal */,
            "op": RequestOp,
            "peerId": PeerID,
            "peers": [{
              "diskId": Either(4294967294, DiskID),
              "peerId": PeerID,
              "service": {
                "id": string,
                "type": Id
              } /* Optional */
            }, ...],
            "prevState": string /* Internal */,
            "requestId": string,
            "requestIdx": int,
            "service": {
              "id": string,
              "type": Id
            },
            "size": int,
            "state": string /* Internal */,
            "status": "request",
            "usecActive": int,
            "volume": Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId) /* Optional */,
            "volumeId": int
          }, {
            "peerId": PeerID,
            "service": {
              "id": string,
              "type": Id
            },
            "status": Status
          }), ...]
        }
      }
      
    • Response Data: AllPeersActiveRequests
      • requests: list containing service status messages and active requests descriptions
          Element type: The value must be of one of the following types: AllPeersActiveRequestsDiskExpected, AllPeersActiveRequestsDiskStatus, AllPeersActiveRequestsRequest, AllPeersActiveRequestsSimpleStats.
            Subtypes:
          • AllPeersActiveRequestsDiskExpected
            • diskId: (DiskID): disk id
            • lastState: (LastState): last known state of the disk
            • peerId: (PeerID): peer id
            • service: identification json for the service
              • id: (string): identificator for the service of the given type
              • type: (Id): type of the service
            • status: ("diskExpected"): "diskExpected"
          • AllPeersActiveRequestsDiskStatus
            • allObjectsFlushed: (Internal bool): An internal boolean attribute to indicate if all objects have been flushed
            • diskId: (DiskID): disk id
            • diskState: (DiskState)
            • objectsOutdated: (Internal int): An internal attribute used only for debugging.
            • objectsOutdatedRemote: (Internal int): An internal attribute used only for debugging.
            • objectsWaitingForVersion: (Internal int): An internal attribute used only for debugging.
            • peerId: (PeerID): peer id
            • service: identification json for the service
              • id: (string): identificator for the service of the given type
              • type: (Id): type of the service
            • status: ("diskState"): "diskState"
          • AllPeersActiveRequestsRequest
            • address: (int): The offset in bytes within the logical volume.
            • diskId: The value must be of one of the following types: 4294967294, DiskID.
            • drOp: (Internal Optional): An internal attribute used only for debugging.
            • op: (RequestOp): The type of the requested operation; one of
            • peerId: (PeerID): peer id
            • peers: list of peers associated with the request
                Element type: AllPeersActiveRequestsRequestPeer
            • prevState: (Internal string): An internal attribute used only for debugging.
            • requestId: (string): A unique request ID that may be matched between clients and disks.
            • requestIdx: (int): A temporary local request identifier for this request on this client or disk.
            • service: identification json for the service
              • id: (string): identificator for the service of the given type
              • type: (Id): type of the service
            • size: (int): The size of the request in bytes.
            • state: (Internal string): An internal attribute used only for debugging.
            • status: ("request"): "request"
            • usecActive: (int): Time in microseconds since the request was submitted.
            • volume: (Optional Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId)): global id or name of the volume associated with the request
            • volumeId: (int): id of the volume associated with the request
          • AllPeersActiveRequestsSimpleStats
            • peerId: (PeerID): peer id
            • service: identification json for the service
              • id: (string): identificator for the service of the given type
              • type: (Id): type of the service
            • status: (Status): status of the request to the service

Servers

List all Storpool servers (ServersList)

Returns the the same output as ServicesList but omits clients. Returns an error if the whole cluster is not operational.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/ServersList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/ServersList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "bridges": {
            "BridgeId": {
              "id": BridgeId,
              "nodeId": NodeID /* Optional */,
              "startTime": Either(null, int),
              "status": BridgeStatus,
              "version": string
            }, ...
          },
          "clients": {
            "ClientID": {
              "id": ClientID,
              "nodeId": NodeID /* Optional */,
              "startTime": Either(null, int),
              "status": ClientStatus,
              "version": string
            }, ...
          },
          "clusterStatus": ClusterStatus,
          "iscsiTargets": {
            "iscsiTargetId": {
              "id": iscsiTargetId,
              "nodeId": NodeID /* Optional */,
              "startTime": Either(null, int),
              "status": iscsiTargetStatus,
              "version": string
            }, ...
          },
          "mgmt": {
            "MgmtID": {
              "active": bool,
              "id": MgmtID,
              "nodeId": NodeID /* Optional */,
              "prio": int /* Internal */,
              "startTime": Either(null, int),
              "status": ClientStatus,
              "version": string
            }, ...
          },
          "servers": {
            "ServerID": {
              "id": ServerID,
              "missingDisks": [DiskID, ...],
              "nodeId": NodeID /* Optional */,
              "pendingDisks": [DiskID, ...],
              "startTime": Either(null, int),
              "status": ServerStatus,
              "version": string
            }, ...
          }
        }
      }
      
    • Response Data: ClusterStatus
      • bridges: A dict from BridgeId to Bridge
        • Key type: BridgeId
        • Value type: Bridge
          • id: (BridgeId): The ID of the service.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (BridgeStatus): The current status of the remote cluster bridge.
          • version: (string): The version of the running StorPool service.
      • clients: A dict from ClientID to Client
        • Key type: ClientID
        • Value type: Client
          • id: (ClientID): The ID of the service. Currently this is the same as the ID of the node.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ClientStatus): The current status of the client.
          • version: (string): The version of the running StorPool service.
      • clusterStatus: (ClusterStatus)
      • iscsiTargets: A dict from iscsiTargetId to IscsiTarget
        • Key type: iscsiTargetId
        • Value type: IscsiTarget
          • id: (iscsiTargetId): The ID of the service.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (iscsiTargetStatus): The current status of the iSCSI target service.
          • version: (string): The version of the running StorPool service.
      • mgmt: A dict from MgmtID to Mgmt
        • Key type: MgmtID
        • Value type: Mgmt
          • active: (bool): If the instance is currently active. For a given cluster one mgmt instance will be
          • id: (MgmtID): The ID of the service.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • prio: (Internal int)
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ClientStatus): The current status of the mgmt instance.
          • version: (string): The version of the running StorPool service.
      • servers: A dict from ServerID to Server
        • Key type: ServerID
        • Value type: Server
          • id: (ServerID): The ID of the service. Currently this is the same as the ID of the node.
          • missingDisks: The cluster will remain down until these disks are seen again.
          • nodeId: (Optional NodeID): The ID of the node on which the service is running.
          • pendingDisks: Similar to missingDisks, these are the disks that are ready and waiting for the
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ServerStatus)
          • version: (string): The version of the running StorPool service.

List all disks on a server (ServerDisksList)

Return detailed information about each disk on the given server.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: GET
    • Path: /ctrl/1.0/ServerDisksList/{serverId}
    • Arguments:
      • serverId - ServerID: integer, 1 <= value <= 32767
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      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 */,
            "aggregateScore": {
              "entries": int,
              "space": int,
              "total": int
            } /* Internal */,
            "description": DiskDescritpion,
            "device": string,
            "empty": bool,
            "entriesAllocated": int,
            "entriesCount": int,
            "entriesFree": int,
            "generationLeft": -1,
            "id": DiskID,
            "isWbc": bool,
            "journaled": bool,
            "lastScrubCompleted": int,
            "model": string,
            "noFlush": bool,
            "noFua": bool,
            "noTrim": bool,
            "objectsAllocated": int,
            "objectsCount": int,
            "objectsFree": int,
            "objectsOnDiskSize": int,
            "scrubbedBytes": int,
            "scrubbingBW": int,
            "scrubbingFinishAfter": int,
            "scrubbingPaused": bool,
            "scrubbingPausedFor": int,
            "scrubbingStartedBefore": int,
            "sectorsCount": int,
            "serial": string,
            "serverId": ServerID,
            "softEject": DiskSoftEjectStatus,
            "ssd": bool,
            "wbc": Either(null, {
              "maxPages": int,
              "pages": int,
              "pagesPending": int
            }) /* Internal */
          }, {
            "description": DiskDescritpion,
            "generationLeft": int,
            "id": DiskID,
            "model": string,
            "serial": string,
            "serverId": ServerID,
            "softEject": DiskSoftEjectStatus,
            "ssd": bool
          }), ...
        }
      }
      
    • Response Data: A dict from DiskID to Either(UpDiskSummary, DownDiskSummary)
      • Key type: DiskID
      • Value type: The value must be of one of the following types: UpDiskSummary, DownDiskSummary.
          Subtypes:
        • UpDiskSummary
          • agAllocated: (Internal int)
          • agCount: (Internal int)
          • agFree: (Internal int)
          • agFreeing: (Internal int)
          • agFull: (Internal int)
          • agMaxSizeFull: (Internal int)
          • agMaxSizePartial: (Internal int)
          • agPartial: (Internal int)
          • aggregateScore: (Internal DiskAggregateScores)
          • description: (DiskDescritpion): A user-defined description of the disk for easier identification of the device.
          • device: (string): The name of the physical disk device on the server.
          • empty: (bool): True if no volumes or snapshots are on this disk.
          • entriesAllocated: (int): Used entries of the disk.
          • entriesCount: (int): The maximum amount of entries that can exists on the disk.
          • entriesFree: (int): The remaining number of entries that can be stored on the disk.
          • generationLeft: (-1): The last cluster generation when the disk was active on a running server, or -1
          • id: (DiskID): The ID of this disk. It is set when the disk is formatted to work with StorPool.
          • isWbc: (bool): Whether write-back cache is enabled for this device.
          • journaled: (bool): Whether StorPool journaling is enabled for this device.
          • lastScrubCompleted: (int): Unix time in seconds when last scrubbing job was completed.
          • model: (string): The drive's model name.
          • noFlush: (bool): Whether write-back cache flushing is disabled for this device.
          • noFua: (bool): Whether to issue FUA writes to this device.
          • noTrim: (bool): Whether trim-below is disabled for this device.
          • objectsAllocated: (int): Used objects of the disk.
          • objectsCount: (int): The maximum amount of object that can exists on the disk.
          • objectsFree: (int): The remaining number of objects that can be stored on the disk.
          • objectsOnDiskSize: (int): Total size occupied by objects.
          • scrubbedBytes: (int): For current scrubbing job run.
          • scrubbingBW: (int): Estimate of the disk bandwidth used for scrubbing B/s.
          • scrubbingFinishAfter: (int): Estimate of when the scrubbing job is expected to finish based on
          • scrubbingPaused: (bool): Is scrubbing currently paused
          • scrubbingPausedFor: (int): How many seconds has the current scrubbing job been paused.
          • scrubbingStartedBefore: (int): In seconds.
          • sectorsCount: (int): The number of 512-byte sectors on the disk.
          • serial: (string): The drive's serial number.
          • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down,
          • softEject: (DiskSoftEjectStatus): The status of the soft-eject process.
          • ssd: (bool): Whether the device is an SSD.
          • wbc: (Internal Either(null, DiskWbcStats))
        • DownDiskSummary
          • description: (DiskDescritpion): A user-defined description of the disk for easier identification of the device.
          • generationLeft: (int): The last cluster generation when the disk was active on a running server, or -1
          • id: (DiskID): The ID of this disk. It is set when the disk is formatted to work with StorPool.
          • model: (string): The drive's model name.
          • serial: (string): The drive's serial number.
          • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down,
          • softEject: (DiskSoftEjectStatus): The status of the soft-eject process.
          • ssd: (bool): Whether the device is an SSD.

Describe a disk on a server (ServerDiskDescribe)

Return detailed information about a disk on the given server and the objects on it.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: GET
    • Path: /ctrl/1.0/ServerDiskDescribe/{serverId}/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
      • serverId - ServerID: integer, 1 <= value <= 32767
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      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 */,
          "aggregateScore": {
            "entries": int,
            "space": int,
            "total": int
          } /* Internal */,
          "description": DiskDescritpion,
          "device": string,
          "empty": bool,
          "entriesAllocated": int,
          "entriesCount": int,
          "entriesFree": int,
          "generationLeft": -1,
          "id": DiskID,
          "isWbc": bool,
          "journaled": bool,
          "lastScrubCompleted": int,
          "model": string,
          "noFlush": bool,
          "noFua": bool,
          "noTrim": bool,
          "objects": {
            "int": {
              "generation": int,
              "objectId": int /* Internal */,
              "onDiskSize": int,
              "parentVolume": string,
              "state": ObjectState,
              "storedSize": int,
              "version": int,
              "volume": string,
              "volumeId": int /* Internal */
            }, ...
          },
          "objectsAllocated": int,
          "objectsCount": int,
          "objectsFree": int,
          "objectsOnDiskSize": int,
          "scrubbedBytes": int,
          "scrubbingBW": int,
          "scrubbingFinishAfter": int,
          "scrubbingPaused": bool,
          "scrubbingPausedFor": int,
          "scrubbingStartedBefore": int,
          "sectorsCount": int,
          "serial": string,
          "serverId": ServerID,
          "softEject": DiskSoftEjectStatus,
          "ssd": bool,
          "wbc": Either(null, {
            "maxPages": int,
            "pages": int,
            "pagesPending": int
          }) /* Internal */
        }
      }
      
    • Response Data: Disk
      • agAllocated: (Internal int)
      • agCount: (Internal int)
      • agFree: (Internal int)
      • agFreeing: (Internal int)
      • agFull: (Internal int)
      • agMaxSizeFull: (Internal int)
      • agMaxSizePartial: (Internal int)
      • agPartial: (Internal int)
      • aggregateScore: (Internal DiskAggregateScores)
      • description: (DiskDescritpion): A user-defined description of the disk for easier identification of the device.
      • device: (string): The name of the physical disk device on the server.
      • empty: (bool): True if no volumes or snapshots are on this disk.
      • entriesAllocated: (int): Used entries of the disk.
      • entriesCount: (int): The maximum amount of entries that can exists on the disk.
      • entriesFree: (int): The remaining number of entries that can be stored on the disk.
      • generationLeft: (-1): The last cluster generation when the disk was active on a running server, or -1
      • id: (DiskID): The ID of this disk. It is set when the disk is formatted to work with StorPool.
      • isWbc: (bool): Whether write-back cache is enabled for this device.
      • journaled: (bool): Whether StorPool journaling is enabled for this device.
      • lastScrubCompleted: (int): Unix time in seconds when last scrubbing job was completed.
      • model: (string): The drive's model name.
      • noFlush: (bool): Whether write-back cache flushing is disabled for this device.
      • noFua: (bool): Whether to issue FUA writes to this device.
      • noTrim: (bool): Whether trim-below is disabled for this device.
      • objects: Detailed information about each object on the disk.A dict from int to DiskObject
        • Key type: int
        • Value type: DiskObject
          • generation: (int): The generation when the last write to this object occurred.
          • objectId: (Internal int)
          • onDiskSize: (int): The space allocated on the disk for the object. This can go up to 32MB.
          • parentVolume: (string): The name of the parent snapshot.
          • state: (ObjectState)
          • storedSize: (int): The size of the actual data in that object (<= onDiskSize).
          • version: (int): With each write the version is increased.
          • volume: (string): The name of the volume for which the object contains data.
          • volumeId: (Internal int)
      • objectsAllocated: (int): Used objects of the disk.
      • objectsCount: (int): The maximum amount of object that can exists on the disk.
      • objectsFree: (int): The remaining number of objects that can be stored on the disk.
      • objectsOnDiskSize: (int): Total size occupied by objects.
      • scrubbedBytes: (int): For current scrubbing job run.
      • scrubbingBW: (int): Estimate of the disk bandwidth used for scrubbing B/s.
      • scrubbingFinishAfter: (int): Estimate of when the scrubbing job is expected to finish based on
      • scrubbingPaused: (bool): Is scrubbing currently paused
      • scrubbingPausedFor: (int): How many seconds has the current scrubbing job been paused.
      • scrubbingStartedBefore: (int): In seconds.
      • sectorsCount: (int): The number of 512-byte sectors on the disk.
      • serial: (string): The drive's serial number.
      • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down,
      • softEject: (DiskSoftEjectStatus): The status of the soft-eject process.
      • ssd: (bool): Whether the device is an SSD.
      • wbc: (Internal Either(null, DiskWbcStats))

Clients

Get the current status of all the clients (ClientsConfigDump)

Return the status of each client including its current generation and generation update status.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/ClientsConfigDump HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/ClientsConfigDump
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "clientGeneration": int,
          "configStatus": client status,
          "delay": int,
          "generation": int,
          "id": ClientID
        }, ...]
      }
      
    • Response Data:
        Element type: ClientConfigStatus
        • clientGeneration: (int): The generation of the specific client.
        • configStatus: (client status): Whether there is an update of the configuration in progress.
        • delay: (int): The time it took for the client generation to reach the cluster generation.
        • generation: (int): The cluster generation based on the number of configuration changes since the
        • id: (ClientID)

Wait until a client updates to the current configuration (ClientConfigWait)

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.

  1. Request:
    • Example HTTP 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
      
    • Method: GET
    • Path: /ctrl/1.0/ClientConfigWait/{clientId}
    • Arguments:
      • clientId - ClientID: integer, 1 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "clientGeneration": int,
          "configStatus": client status,
          "delay": int,
          "generation": int,
          "id": ClientID
        }, ...]
      }
      
    • Response Data:
        Element type: ClientConfigStatus
        • clientGeneration: (int): The generation of the specific client.
        • configStatus: (client status): Whether there is an update of the configuration in progress.
        • delay: (int): The time it took for the client generation to reach the cluster generation.
        • generation: (int): The cluster generation based on the number of configuration changes since the
        • id: (ClientID)

List all the active requests on a client (ClientActiveRequests)

List detailed information about the requests being currently processed on the given client.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: GET
    • Path: /ctrl/1.0/ClientActiveRequests/{clientId}
    • Arguments:
      • clientId - ClientID: integer, 1 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "clientId": ClientID,
          "requests": [{
            "address": int,
            "drOp": string /* Internal */,
            "msecActive": int,
            "op": RequestOp,
            "prevState": string /* Internal */,
            "requestId": string,
            "requestIdx": int,
            "size": int,
            "state": string /* Internal */,
            "volume": Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId)
          }, ...]
        }
      }
      
    • Response Data: ClientActiveRequests
      • clientId: (ClientID)
      • requests: A detailed listing of all the requests associated with the given client.
          Element type: ActiveRequestDesc
          • address: (int): The offset in bytes within the logical volume.
          • drOp: (Internal string): An internal attribute used only for debugging.
          • msecActive: (int): Time in microseconds since the request was submitted.
          • op: (RequestOp)
          • prevState: (Internal string): An internal attribute used only for debugging.
          • requestId: (string): A unique request ID that may be matched between clients and disks.
          • requestIdx: (int): A temporary local request identifier for this request on this client or disk.
          • size: (int): The size of the request in bytes.
          • state: (Internal string): An internal attribute used only for debugging.
          • volume: The value must be of one of the following types: VolumeNameOrGlobalId, SnapshotNameOrGlobalId.

Disks

List all disks (DisksList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/DisksList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/DisksList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      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 */,
            "aggregateScore": {
              "entries": int,
              "space": int,
              "total": int
            } /* Internal */,
            "description": DiskDescritpion,
            "device": string,
            "empty": bool,
            "entriesAllocated": int,
            "entriesCount": int,
            "entriesFree": int,
            "generationLeft": -1,
            "id": DiskID,
            "isWbc": bool,
            "journaled": bool,
            "lastScrubCompleted": int,
            "model": string,
            "noFlush": bool,
            "noFua": bool,
            "noTrim": bool,
            "objectsAllocated": int,
            "objectsCount": int,
            "objectsFree": int,
            "objectsOnDiskSize": int,
            "scrubbedBytes": int,
            "scrubbingBW": int,
            "scrubbingFinishAfter": int,
            "scrubbingPaused": bool,
            "scrubbingPausedFor": int,
            "scrubbingStartedBefore": int,
            "sectorsCount": int,
            "serial": string,
            "serverId": ServerID,
            "softEject": DiskSoftEjectStatus,
            "ssd": bool,
            "wbc": Either(null, {
              "maxPages": int,
              "pages": int,
              "pagesPending": int
            }) /* Internal */
          }, {
            "description": DiskDescritpion,
            "generationLeft": int,
            "id": DiskID,
            "model": string,
            "serial": string,
            "serverId": ServerID,
            "softEject": DiskSoftEjectStatus,
            "ssd": bool
          }), ...
        }
      }
      
    • Response Data: A dict from DiskID to Either(UpDiskSummary, DownDiskSummary)
      • Key type: DiskID
      • Value type: The value must be of one of the following types: UpDiskSummary, DownDiskSummary.
          Subtypes:
        • UpDiskSummary
          • agAllocated: (Internal int)
          • agCount: (Internal int)
          • agFree: (Internal int)
          • agFreeing: (Internal int)
          • agFull: (Internal int)
          • agMaxSizeFull: (Internal int)
          • agMaxSizePartial: (Internal int)
          • agPartial: (Internal int)
          • aggregateScore: (Internal DiskAggregateScores)
          • description: (DiskDescritpion): A user-defined description of the disk for easier identification of the device.
          • device: (string): The name of the physical disk device on the server.
          • empty: (bool): True if no volumes or snapshots are on this disk.
          • entriesAllocated: (int): Used entries of the disk.
          • entriesCount: (int): The maximum amount of entries that can exists on the disk.
          • entriesFree: (int): The remaining number of entries that can be stored on the disk.
          • generationLeft: (-1): The last cluster generation when the disk was active on a running server, or -1
          • id: (DiskID): The ID of this disk. It is set when the disk is formatted to work with StorPool.
          • isWbc: (bool): Whether write-back cache is enabled for this device.
          • journaled: (bool): Whether StorPool journaling is enabled for this device.
          • lastScrubCompleted: (int): Unix time in seconds when last scrubbing job was completed.
          • model: (string): The drive's model name.
          • noFlush: (bool): Whether write-back cache flushing is disabled for this device.
          • noFua: (bool): Whether to issue FUA writes to this device.
          • noTrim: (bool): Whether trim-below is disabled for this device.
          • objectsAllocated: (int): Used objects of the disk.
          • objectsCount: (int): The maximum amount of object that can exists on the disk.
          • objectsFree: (int): The remaining number of objects that can be stored on the disk.
          • objectsOnDiskSize: (int): Total size occupied by objects.
          • scrubbedBytes: (int): For current scrubbing job run.
          • scrubbingBW: (int): Estimate of the disk bandwidth used for scrubbing B/s.
          • scrubbingFinishAfter: (int): Estimate of when the scrubbing job is expected to finish based on
          • scrubbingPaused: (bool): Is scrubbing currently paused
          • scrubbingPausedFor: (int): How many seconds has the current scrubbing job been paused.
          • scrubbingStartedBefore: (int): In seconds.
          • sectorsCount: (int): The number of 512-byte sectors on the disk.
          • serial: (string): The drive's serial number.
          • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down,
          • softEject: (DiskSoftEjectStatus): The status of the soft-eject process.
          • ssd: (bool): Whether the device is an SSD.
          • wbc: (Internal Either(null, DiskWbcStats))
        • DownDiskSummary
          • description: (DiskDescritpion): A user-defined description of the disk for easier identification of the device.
          • generationLeft: (int): The last cluster generation when the disk was active on a running server, or -1
          • id: (DiskID): The ID of this disk. It is set when the disk is formatted to work with StorPool.
          • model: (string): The drive's model name.
          • serial: (string): The drive's serial number.
          • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down,
          • softEject: (DiskSoftEjectStatus): The status of the soft-eject process.
          • ssd: (bool): Whether the device is an SSD.

Describe a disk (DiskDescribe)

List all disks including detailed information about the objects on each disk.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: GET
    • Path: /ctrl/1.0/DiskDescribe/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      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 */,
          "aggregateScore": {
            "entries": int,
            "space": int,
            "total": int
          } /* Internal */,
          "description": DiskDescritpion,
          "device": string,
          "empty": bool,
          "entriesAllocated": int,
          "entriesCount": int,
          "entriesFree": int,
          "generationLeft": -1,
          "id": DiskID,
          "isWbc": bool,
          "journaled": bool,
          "lastScrubCompleted": int,
          "model": string,
          "noFlush": bool,
          "noFua": bool,
          "noTrim": bool,
          "objects": {
            "int": {
              "generation": int,
              "objectId": int /* Internal */,
              "onDiskSize": int,
              "parentVolume": string,
              "state": ObjectState,
              "storedSize": int,
              "version": int,
              "volume": string,
              "volumeId": int /* Internal */
            }, ...
          },
          "objectsAllocated": int,
          "objectsCount": int,
          "objectsFree": int,
          "objectsOnDiskSize": int,
          "scrubbedBytes": int,
          "scrubbingBW": int,
          "scrubbingFinishAfter": int,
          "scrubbingPaused": bool,
          "scrubbingPausedFor": int,
          "scrubbingStartedBefore": int,
          "sectorsCount": int,
          "serial": string,
          "serverId": ServerID,
          "softEject": DiskSoftEjectStatus,
          "ssd": bool,
          "wbc": Either(null, {
            "maxPages": int,
            "pages": int,
            "pagesPending": int
          }) /* Internal */
        }
      }
      
    • Response Data: Disk
      • agAllocated: (Internal int)
      • agCount: (Internal int)
      • agFree: (Internal int)
      • agFreeing: (Internal int)
      • agFull: (Internal int)
      • agMaxSizeFull: (Internal int)
      • agMaxSizePartial: (Internal int)
      • agPartial: (Internal int)
      • aggregateScore: (Internal DiskAggregateScores)
      • description: (DiskDescritpion): A user-defined description of the disk for easier identification of the device.
      • device: (string): The name of the physical disk device on the server.
      • empty: (bool): True if no volumes or snapshots are on this disk.
      • entriesAllocated: (int): Used entries of the disk.
      • entriesCount: (int): The maximum amount of entries that can exists on the disk.
      • entriesFree: (int): The remaining number of entries that can be stored on the disk.
      • generationLeft: (-1): The last cluster generation when the disk was active on a running server, or -1
      • id: (DiskID): The ID of this disk. It is set when the disk is formatted to work with StorPool.
      • isWbc: (bool): Whether write-back cache is enabled for this device.
      • journaled: (bool): Whether StorPool journaling is enabled for this device.
      • lastScrubCompleted: (int): Unix time in seconds when last scrubbing job was completed.
      • model: (string): The drive's model name.
      • noFlush: (bool): Whether write-back cache flushing is disabled for this device.
      • noFua: (bool): Whether to issue FUA writes to this device.
      • noTrim: (bool): Whether trim-below is disabled for this device.
      • objects: Detailed information about each object on the disk.A dict from int to DiskObject
        • Key type: int
        • Value type: DiskObject
          • generation: (int): The generation when the last write to this object occurred.
          • objectId: (Internal int)
          • onDiskSize: (int): The space allocated on the disk for the object. This can go up to 32MB.
          • parentVolume: (string): The name of the parent snapshot.
          • state: (ObjectState)
          • storedSize: (int): The size of the actual data in that object (<= onDiskSize).
          • version: (int): With each write the version is increased.
          • volume: (string): The name of the volume for which the object contains data.
          • volumeId: (Internal int)
      • objectsAllocated: (int): Used objects of the disk.
      • objectsCount: (int): The maximum amount of object that can exists on the disk.
      • objectsFree: (int): The remaining number of objects that can be stored on the disk.
      • objectsOnDiskSize: (int): Total size occupied by objects.
      • scrubbedBytes: (int): For current scrubbing job run.
      • scrubbingBW: (int): Estimate of the disk bandwidth used for scrubbing B/s.
      • scrubbingFinishAfter: (int): Estimate of when the scrubbing job is expected to finish based on
      • scrubbingPaused: (bool): Is scrubbing currently paused
      • scrubbingPausedFor: (int): How many seconds has the current scrubbing job been paused.
      • scrubbingStartedBefore: (int): In seconds.
      • sectorsCount: (int): The number of 512-byte sectors on the disk.
      • serial: (string): The drive's serial number.
      • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down,
      • softEject: (DiskSoftEjectStatus): The status of the soft-eject process.
      • ssd: (bool): Whether the device is an SSD.
      • wbc: (Internal Either(null, DiskWbcStats))

Eject a disk (DiskEject)

Stop operations on the given disk even if it is not empty.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: POST
    • Path: /ctrl/1.0/DiskEject/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Forget a disk (DiskForget)

Remove the disk from any placement groups or volumes that it is used in.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: POST
    • Path: /ctrl/1.0/DiskForget/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Ignore a disk (DiskIgnore)

Try to boot the cluster by ignoring this disk.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: POST
    • Path: /ctrl/1.0/DiskIgnore/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Soft-eject a disk (DiskSoftEject)

Stop writes to the given disk and start relocating all the data stored on it to other disks.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: POST
    • Path: /ctrl/1.0/DiskSoftEject/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Pause a disk's soft-eject operation (DiskSoftEjectPause)

Temporarily pause the relocation tasks for the disk. This can be helpful in heavy load situations.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: POST
    • Path: /ctrl/1.0/DiskSoftEjectPause/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Cancel a disk's soft-eject operation (DiskSoftEjectCancel)

Stop the relocation tasks for the disk and mark it as usable again. After this operation data will be moved back to the disk.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: POST
    • Path: /ctrl/1.0/DiskSoftEjectCancel/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Set a disk's description (DiskSetDescription)

  1. Request:
    • Example HTTP Request:
      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
      }
    • Method: POST
    • Path: /ctrl/1.0/DiskSetDescription/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: DiskDescUpdate
      • description: (DiskDescritpion): A user-defined description of the disk for easier identification of the device.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

List all the active requests on a disk (DiskActiveRequests)

List detailed information about the requests being currently processed on the given disk.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: GET
    • Path: /ctrl/1.0/DiskActiveRequests/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "diskId": DiskID,
          "requests": [{
            "address": int,
            "drOp": string /* Internal */,
            "msecActive": int,
            "op": RequestOp,
            "prevState": string /* Internal */,
            "requestId": string,
            "requestIdx": int,
            "size": int,
            "state": string /* Internal */,
            "volume": Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId)
          }, ...]
        }
      }
      
    • Response Data: DiskActiveRequests
      • diskId: (DiskID)
      • requests: A detailed listing of all the requests associated with the given disk.
          Element type: ActiveRequestDesc
          • address: (int): The offset in bytes within the logical volume.
          • drOp: (Internal string): An internal attribute used only for debugging.
          • msecActive: (int): Time in microseconds since the request was submitted.
          • op: (RequestOp)
          • prevState: (Internal string): An internal attribute used only for debugging.
          • requestId: (string): A unique request ID that may be matched between clients and disks.
          • requestIdx: (int): A temporary local request identifier for this request on this client or disk.
          • size: (int): The size of the request in bytes.
          • state: (Internal string): An internal attribute used only for debugging.
          • volume: The value must be of one of the following types: VolumeNameOrGlobalId, SnapshotNameOrGlobalId.

Start scrubbing process (DiskScrubStart)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/DiskScrubStart/{diskId} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: POST
    • Path: /ctrl/1.0/DiskScrubStart/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Pause scrubbing process (DiskScrubPause)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/DiskScrubPause/{diskId} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: POST
    • Path: /ctrl/1.0/DiskScrubPause/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Continue paused scrubbing process (DiskScrubContinue)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/DiskScrubContinue/{diskId} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: POST
    • Path: /ctrl/1.0/DiskScrubContinue/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Retrim disk (DiskRetrim)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/DiskRetrim/{diskId} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: POST
    • Path: /ctrl/1.0/DiskRetrim/{diskId}
    • Arguments:
      • diskId - DiskID: integer, 0 <= value <= 4095
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Volumes

List all volumes (VolumesList)

Return configuration information about all the volumes.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/VolumesList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/VolumesList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "creationTimestamp": int,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": VolumeNameOrGlobalId,
          "objectsCount": int,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "visibleVolumeId": int
        }, ...]
      }
      
    • Response Data:
        Element type: VolumeSummary
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • limitType: (Optional LimitType)
        • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
        • name: (VolumeNameOrGlobalId): The name of this volume.
        • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
        • originalParentVolumeId: (Internal int)
        • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
        • parentVolumeId: (Internal int): The ID of the parent snapshot.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • remote: (Optional bool): Indicated whether this is a remote volume or not
        • replication: (Replication): The number of copies/replicas kept.
        • reuseServer: (Optional bool): is it allowed to place replicas on the same server
        • size: (Size): The volume/snapshots's size in bytes.
        • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
        • templateId: (Internal int)
        • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
        • visibleVolumeId: (int): The ID by which the volume/snapshot was created.

Get volume and snapshot status and stored size (VolumesGetStatus)

Return the status and stored size of each volume and snapshot.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/VolumesGetStatus HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/VolumesGetStatus
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "Either(SnapshotNameOrGlobalId, VolumeNameOrGlobalId)": Either({
            "autoName": bool,
            "backup": bool /* Optional */,
            "backupOfGlobalId": Global Volume Id /* Optional */,
            "backupOfVisibleVolumeId": int /* Optional */,
            "balancerBlocked": bool,
            "bound": bool,
            "bw": Bandwidth,
            "clusterId": Global Location Id /* Optional */,
            "clusterName": ClusterName /* Optional */,
            "createdFromGlobalId": Global Volume Id /* Internal */ /* Optional */,
            "createdFromVisibleVolumeId": int /* Internal */ /* Optional */,
            "creationTimestamp": int,
            "decreasedRedundancy": bool,
            "deleteBlocked": DeleteBlocked /* Internal */ /* Optional */,
            "deleted": bool,
            "dematerializationStatus": DematerializationStatus /* Internal */ /* Optional */,
            "destroyed": bool /* Internal */ /* Optional */,
            "downBytes": int,
            "downDrives": [DiskID, ...],
            "ecDeleted": bool /* Internal */ /* Optional */,
            "firstNotParentObjectId": int /* Internal */,
            "flags": int /* Internal */,
            "globalId": Global Volume Id,
            "id": int /* Internal */,
            "iops": IOPS,
            "limitType": LimitType /* Optional */,
            "mcState": MultiClusterState /* Internal */ /* Optional */,
            "mcStateVal": int /* Internal */ /* Optional */,
            "metadataVolume": bool /* Optional */,
            "migrating": bool,
            "missingDrives": [DiskID, ...],
            "missingTargetDrives": [DiskID, ...],
            "name": SnapshotNameOrGlobalId,
            "objectsCount": int,
            "onDiskSize": int,
            "onVolume": VolumeNameOrGlobalId,
            "originalParentVolumeId": int /* Internal */,
            "parentName": Either("", SnapshotNameOrGlobalId),
            "parentVolumeId": int /* Internal */,
            "placeAll": PlacementGroupName,
            "placeHead": PlacementGroupName,
            "placeTail": PlacementGroupName,
            "recoveringFromRemote": bool,
            "remote": bool /* Optional */,
            "replication": Replication,
            "reuseServer": bool /* Optional */,
            "size": Size,
            "snapshot": bool,
            "softEjectingDrives": [DiskID, ...],
            "status": VolumeCurrentStatus,
            "storedSize": int,
            "syncingDataBytes": int,
            "syncingMetaObjects": int,
            "tags": {
              "VolumeTagName": VolumeTagValue, ...
            } /* Optional */,
            "targetDeleteDate": int /* Optional */,
            "templateId": int /* Internal */,
            "templateName": Either("", VolumeTemplateName),
            "transient": bool,
            "upSoonChainsCount": int,
            "visibleVolumeId": int,
            "volumeMoveSource": bool /* Internal */ /* Optional */
          }, {
            "balancerBlocked": bool,
            "bw": Bandwidth,
            "clusterId": Global Location Id /* Optional */,
            "clusterName": ClusterName /* Optional */,
            "creationTimestamp": int,
            "decreasedRedundancy": bool,
            "downBytes": int,
            "downDrives": [DiskID, ...],
            "firstNotParentObjectId": int /* Internal */,
            "flags": int /* Internal */,
            "globalId": Global Volume Id,
            "id": int /* Internal */,
            "iops": IOPS,
            "limitType": LimitType /* Optional */,
            "metadataVolume": bool /* Optional */,
            "migrating": bool,
            "missingDrives": [DiskID, ...],
            "missingTargetDrives": [DiskID, ...],
            "name": VolumeNameOrGlobalId,
            "objectsCount": int,
            "onDiskSize": int,
            "originalParentVolumeId": int /* Internal */,
            "parentName": Either("", SnapshotNameOrGlobalId),
            "parentVolumeId": int /* Internal */,
            "placeAll": PlacementGroupName,
            "placeHead": PlacementGroupName,
            "placeTail": PlacementGroupName,
            "remote": bool /* Optional */,
            "replication": Either(0, Replication),
            "reuseServer": bool /* Optional */,
            "size": Size,
            "snapshot": bool,
            "softEjectingDrives": [DiskID, ...],
            "status": VolumeCurrentStatus,
            "storedSize": int,
            "syncingDataBytes": int,
            "syncingMetaObjects": int,
            "tags": {
              "VolumeTagName": VolumeTagValue, ...
            } /* Optional */,
            "templateId": int /* Internal */,
            "templateName": Either("", VolumeTemplateName),
            "upSoonChainsCount": int,
            "visibleVolumeId": int
          }), ...
        }
      }
      
    • Response Data: A dict from Either(SnapshotNameOrGlobalId, VolumeNameOrGlobalId) to Either(SnapshotStatus, VolumeStatus)
      • Key type: The value must be of one of the following types: SnapshotNameOrGlobalId, VolumeNameOrGlobalId.
      • Value type: The value must be of one of the following types: SnapshotStatus, VolumeStatus.
          Subtypes:
        • SnapshotStatus
          • autoName: (bool): Is this snapshot anonymous.
          • backup: (Optional bool): Is this snapshot a backup of a remote snapshot.
          • backupOfGlobalId: (Optional Global Volume Id): The global ID of the volume that has been backed up to this snapshot.
          • backupOfVisibleVolumeId: (Optional int): The numeric global ID of the snapshot that has been backed up to
          • balancerBlocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current
          • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain
          • bw: (Bandwidth): Bandwidth limit in KB.
          • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
          • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
          • createdFromGlobalId: (Optional Internal)
          • createdFromVisibleVolumeId: (Optional Internal)
          • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
          • decreasedRedundancy: (bool): True if any of the replicas of the volume are missing.
          • deleteBlocked: (Optional Internal)
          • deleted: (bool): Is this snapshot currently being deleted.
          • dematerializationStatus: (Optional Internal)
          • destroyed: (Optional Internal): Is this snapshot currently being destroyed.
          • downBytes: (int): The number of bytes of the volume that are not accessible at the moment.
          • downDrives: The IDs of the drives that are not accessible at the moment but needed by this
          • ecDeleted: (Optional Internal)
          • firstNotParentObjectId: (Internal int)
          • flags: (Internal int)
          • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
          • id: (Internal int)
          • iops: (IOPS): iops limit.
          • limitType: (Optional LimitType)
          • mcState: (Optional Internal)
          • mcStateVal: (Optional Internal)
          • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
          • migrating: (bool): True if there are tasks for reallocation of the volume.
          • missingDrives: The IDs of the drives that are not accessible at the moment. The volume has all
          • missingTargetDrives:
          • name: (SnapshotNameOrGlobalId): The name of this snapshot
          • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
          • onDiskSize: (int): The actual size that the objects of this volume occupy on the disks.
          • onVolume: (VolumeNameOrGlobalId): The name of the volume that this is a parent of.
          • originalParentVolumeId: (Internal int)
          • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
          • parentVolumeId: (Internal int): The ID of the parent snapshot.
          • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
          • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
          • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
          • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location
          • remote: (Optional bool): Indicated whether this is a remote volume or not
          • replication: (Replication): The number of copies/replicas kept.
          • reuseServer: (Optional bool): is it allowed to place replicas on the same server
          • size: (Size): The volume/snapshots's size in bytes.
          • snapshot: (bool): True if this response describes a snapshot instead of a volume.
          • softEjectingDrives:
          • status: (VolumeCurrentStatus)
          • storedSize: (int): The number of bytes of client data on the volume. This does not take into account
          • syncingDataBytes: (int): The total number of bytes in objects currently being synchronized
          • syncingMetaObjects: (int): The number of objects currently being synchronized
          • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
          • targetDeleteDate: (Optional int): Scheduled date for the snapshot to be deleted. Unix timestamp
          • templateId: (Internal int)
          • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
          • transient: (bool): Is this a transient snapshot. Transient snapshots are internally created when
          • upSoonChainsCount: (int): The number of objects that have to be transferred.
          • visibleVolumeId: (int): The ID by which the volume/snapshot was created.
          • volumeMoveSource: (Optional Internal)
        • VolumeStatus
          • balancerBlocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current
          • bw: (Bandwidth): Bandwidth limit in KB.
          • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
          • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
          • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
          • decreasedRedundancy: (bool): True if any of the replicas of the volume are missing.
          • downBytes: (int): The number of bytes of the volume that are not accessible at the moment.
          • downDrives: The IDs of the drives that are not accessible at the moment but needed by this
          • firstNotParentObjectId: (Internal int)
          • flags: (Internal int)
          • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
          • id: (Internal int)
          • iops: (IOPS): iops limit.
          • limitType: (Optional LimitType)
          • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
          • migrating: (bool): True if there are tasks for reallocation of the volume.
          • missingDrives: The IDs of the drives that are not accessible at the moment. The volume has all
          • missingTargetDrives:
          • name: (VolumeNameOrGlobalId): The name of this volume.
          • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
          • onDiskSize: (int): The actual size that the objects of this volume occupy on the disks.
          • originalParentVolumeId: (Internal int)
          • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
          • parentVolumeId: (Internal int): The ID of the parent snapshot.
          • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
          • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
          • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
          • remote: (Optional bool): Indicated whether this is a remote volume or not
          • replication: The number of copies/replicas kept.The value must be of one of the following types: 0, Replication.
          • reuseServer: (Optional bool): is it allowed to place replicas on the same server
          • size: (Size): The volume/snapshots's size in bytes.
          • snapshot: (bool): True if this response describes a snapshot instead of a volume.
          • softEjectingDrives:
          • status: (VolumeCurrentStatus)
          • storedSize: (int): The number of bytes of client data on the volume. This does not take into account
          • syncingDataBytes: (int): The total number of bytes in objects currently being synchronized
          • syncingMetaObjects: (int): The number of objects currently being synchronized
          • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
          • templateId: (Internal int)
          • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
          • upSoonChainsCount: (int): The number of objects that have to be transferred.
          • visibleVolumeId: (int): The ID by which the volume/snapshot was created.

Get volume and snapshot status (VolumesGetStatusQuick)

Return the status of each volume and snapshot.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/VolumesGetStatusQuick HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/VolumesGetStatusQuick
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "Either(SnapshotNameOrGlobalId, VolumeNameOrGlobalId)": Either({
            "autoName": bool,
            "backup": bool /* Optional */,
            "backupOfGlobalId": Global Volume Id /* Optional */,
            "backupOfVisibleVolumeId": int /* Optional */,
            "balancerBlocked": bool,
            "bound": bool,
            "bw": Bandwidth,
            "clusterId": Global Location Id /* Optional */,
            "clusterName": ClusterName /* Optional */,
            "createdFromGlobalId": Global Volume Id /* Internal */ /* Optional */,
            "createdFromVisibleVolumeId": int /* Internal */ /* Optional */,
            "creationTimestamp": int,
            "decreasedRedundancy": bool,
            "deleteBlocked": DeleteBlocked /* Internal */ /* Optional */,
            "deleted": bool,
            "dematerializationStatus": DematerializationStatus /* Internal */ /* Optional */,
            "destroyed": bool /* Internal */ /* Optional */,
            "downBytes": int,
            "downDrives": [DiskID, ...],
            "ecDeleted": bool /* Internal */ /* Optional */,
            "firstNotParentObjectId": int /* Internal */,
            "flags": int /* Internal */,
            "globalId": Global Volume Id,
            "id": int /* Internal */,
            "iops": IOPS,
            "limitType": LimitType /* Optional */,
            "mcState": MultiClusterState /* Internal */ /* Optional */,
            "mcStateVal": int /* Internal */ /* Optional */,
            "metadataVolume": bool /* Optional */,
            "migrating": bool,
            "missingDrives": [DiskID, ...],
            "missingTargetDrives": [DiskID, ...],
            "name": SnapshotNameOrGlobalId,
            "objectsCount": int,
            "onVolume": VolumeNameOrGlobalId,
            "originalParentVolumeId": int /* Internal */,
            "parentName": Either("", SnapshotNameOrGlobalId),
            "parentVolumeId": int /* Internal */,
            "placeAll": PlacementGroupName,
            "placeHead": PlacementGroupName,
            "placeTail": PlacementGroupName,
            "recoveringFromRemote": bool,
            "remote": bool /* Optional */,
            "replication": Replication,
            "reuseServer": bool /* Optional */,
            "size": Size,
            "snapshot": bool,
            "softEjectingDrives": [DiskID, ...],
            "status": VolumeCurrentStatus,
            "syncingDataBytes": int,
            "syncingMetaObjects": int,
            "tags": {
              "VolumeTagName": VolumeTagValue, ...
            } /* Optional */,
            "targetDeleteDate": int /* Optional */,
            "templateId": int /* Internal */,
            "templateName": Either("", VolumeTemplateName),
            "transient": bool,
            "upSoonChainsCount": int,
            "visibleVolumeId": int,
            "volumeMoveSource": bool /* Internal */ /* Optional */
          }, {
            "balancerBlocked": bool,
            "bw": Bandwidth,
            "clusterId": Global Location Id /* Optional */,
            "clusterName": ClusterName /* Optional */,
            "creationTimestamp": int,
            "decreasedRedundancy": bool,
            "downBytes": int,
            "downDrives": [DiskID, ...],
            "firstNotParentObjectId": int /* Internal */,
            "flags": int /* Internal */,
            "globalId": Global Volume Id,
            "id": int /* Internal */,
            "iops": IOPS,
            "limitType": LimitType /* Optional */,
            "metadataVolume": bool /* Optional */,
            "migrating": bool,
            "missingDrives": [DiskID, ...],
            "missingTargetDrives": [DiskID, ...],
            "name": VolumeNameOrGlobalId,
            "objectsCount": int,
            "originalParentVolumeId": int /* Internal */,
            "parentName": Either("", SnapshotNameOrGlobalId),
            "parentVolumeId": int /* Internal */,
            "placeAll": PlacementGroupName,
            "placeHead": PlacementGroupName,
            "placeTail": PlacementGroupName,
            "remote": bool /* Optional */,
            "replication": Either(0, Replication),
            "reuseServer": bool /* Optional */,
            "size": Size,
            "snapshot": bool,
            "softEjectingDrives": [DiskID, ...],
            "status": VolumeCurrentStatus,
            "syncingDataBytes": int,
            "syncingMetaObjects": int,
            "tags": {
              "VolumeTagName": VolumeTagValue, ...
            } /* Optional */,
            "templateId": int /* Internal */,
            "templateName": Either("", VolumeTemplateName),
            "upSoonChainsCount": int,
            "visibleVolumeId": int
          }), ...
        }
      }
      
    • Response Data: A dict from Either(SnapshotNameOrGlobalId, VolumeNameOrGlobalId) to Either(SnapshotStatusQuick, VolumeStatusQuick)
      • Key type: The value must be of one of the following types: SnapshotNameOrGlobalId, VolumeNameOrGlobalId.
      • Value type: The value must be of one of the following types: SnapshotStatusQuick, VolumeStatusQuick.
          Subtypes:
        • SnapshotStatusQuick
          • autoName: (bool): Is this snapshot anonymous.
          • backup: (Optional bool): Is this snapshot a backup of a remote snapshot.
          • backupOfGlobalId: (Optional Global Volume Id): The global ID of the volume that has been backed up to this snapshot.
          • backupOfVisibleVolumeId: (Optional int): The numeric global ID of the snapshot that has been backed up to
          • balancerBlocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current
          • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain
          • bw: (Bandwidth): Bandwidth limit in KB.
          • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
          • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
          • createdFromGlobalId: (Optional Internal)
          • createdFromVisibleVolumeId: (Optional Internal)
          • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
          • decreasedRedundancy: (bool): True if any of the replicas of the volume are missing.
          • deleteBlocked: (Optional Internal)
          • deleted: (bool): Is this snapshot currently being deleted.
          • dematerializationStatus: (Optional Internal)
          • destroyed: (Optional Internal): Is this snapshot currently being destroyed.
          • downBytes: (int): The number of bytes of the volume that are not accessible at the moment.
          • downDrives: The IDs of the drives that are not accessible at the moment but needed by this
          • ecDeleted: (Optional Internal)
          • firstNotParentObjectId: (Internal int)
          • flags: (Internal int)
          • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
          • id: (Internal int)
          • iops: (IOPS): iops limit.
          • limitType: (Optional LimitType)
          • mcState: (Optional Internal)
          • mcStateVal: (Optional Internal)
          • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
          • migrating: (bool): True if there are tasks for reallocation of the volume.
          • missingDrives: The IDs of the drives that are not accessible at the moment. The volume has all
          • missingTargetDrives:
          • name: (SnapshotNameOrGlobalId): The name of this snapshot
          • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
          • onVolume: (VolumeNameOrGlobalId): The name of the volume that this is a parent of.
          • originalParentVolumeId: (Internal int)
          • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
          • parentVolumeId: (Internal int): The ID of the parent snapshot.
          • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
          • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
          • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
          • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location
          • remote: (Optional bool): Indicated whether this is a remote volume or not
          • replication: (Replication): The number of copies/replicas kept.
          • reuseServer: (Optional bool): is it allowed to place replicas on the same server
          • size: (Size): The volume/snapshots's size in bytes.
          • snapshot: (bool): True if this response describes a snapshot instead of a volume.
          • softEjectingDrives:
          • status: (VolumeCurrentStatus)
          • syncingDataBytes: (int): The total number of bytes in objects currently being synchronized
          • syncingMetaObjects: (int): The number of objects currently being synchronized
          • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
          • targetDeleteDate: (Optional int): Scheduled date for the snapshot to be deleted. Unix timestamp
          • templateId: (Internal int)
          • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
          • transient: (bool): Is this a transient snapshot. Transient snapshots are internally created when
          • upSoonChainsCount: (int): The number of objects that have to be transferred.
          • visibleVolumeId: (int): The ID by which the volume/snapshot was created.
          • volumeMoveSource: (Optional Internal)
        • VolumeStatusQuick
          • balancerBlocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current
          • bw: (Bandwidth): Bandwidth limit in KB.
          • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
          • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
          • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
          • decreasedRedundancy: (bool): True if any of the replicas of the volume are missing.
          • downBytes: (int): The number of bytes of the volume that are not accessible at the moment.
          • downDrives: The IDs of the drives that are not accessible at the moment but needed by this
          • firstNotParentObjectId: (Internal int)
          • flags: (Internal int)
          • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
          • id: (Internal int)
          • iops: (IOPS): iops limit.
          • limitType: (Optional LimitType)
          • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
          • migrating: (bool): True if there are tasks for reallocation of the volume.
          • missingDrives: The IDs of the drives that are not accessible at the moment. The volume has all
          • missingTargetDrives:
          • name: (VolumeNameOrGlobalId): The name of this volume.
          • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
          • originalParentVolumeId: (Internal int)
          • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
          • parentVolumeId: (Internal int): The ID of the parent snapshot.
          • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
          • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
          • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
          • remote: (Optional bool): Indicated whether this is a remote volume or not
          • replication: The number of copies/replicas kept.The value must be of one of the following types: 0, Replication.
          • reuseServer: (Optional bool): is it allowed to place replicas on the same server
          • size: (Size): The volume/snapshots's size in bytes.
          • snapshot: (bool): True if this response describes a snapshot instead of a volume.
          • softEjectingDrives:
          • status: (VolumeCurrentStatus)
          • syncingDataBytes: (int): The total number of bytes in objects currently being synchronized
          • syncingMetaObjects: (int): The number of objects currently being synchronized
          • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
          • templateId: (Internal int)
          • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
          • upSoonChainsCount: (int): The number of objects that have to be transferred.
          • visibleVolumeId: (int): The ID by which the volume/snapshot was created.

List total used space by each volume (VolumesSpace)

List estimated total virtual space used by each volume.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/VolumesSpace HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/VolumesSpace
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "creationTimestamp": int,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": VolumeNameOrGlobalId,
          "objectsCount": int,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "spaceUsed": int,
          "storedSize": int,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "visibleVolumeId": int
        }, ...]
      }
      
    • Response Data:
        Element type: VolumeSpace
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • limitType: (Optional LimitType)
        • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
        • name: (VolumeNameOrGlobalId): The name of this volume.
        • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
        • originalParentVolumeId: (Internal int)
        • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
        • parentVolumeId: (Internal int): The ID of the parent snapshot.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • remote: (Optional bool): Indicated whether this is a remote volume or not
        • replication: (Replication): The number of copies/replicas kept.
        • reuseServer: (Optional bool): is it allowed to place replicas on the same server
        • size: (Size): The volume/snapshots's size in bytes.
        • spaceUsed: (int): The total number of bytes of client data that on this volume. This includes data that
        • storedSize: (int): The number of bytes of client data on this volume. This does not take into account
        • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
        • templateId: (Internal int)
        • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
        • visibleVolumeId: (int): The ID by which the volume/snapshot was created.

List a single volume (Volume)

Same as VolumeList but only return information about a given volume.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/Volume/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/Volume/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "creationTimestamp": int,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": VolumeNameOrGlobalId,
          "objectsCount": int,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "visibleVolumeId": int
        }, ...]
      }
      
    • Response Data:
        Element type: VolumeSummary
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • limitType: (Optional LimitType)
        • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
        • name: (VolumeNameOrGlobalId): The name of this volume.
        • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
        • originalParentVolumeId: (Internal int)
        • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
        • parentVolumeId: (Internal int): The ID of the parent snapshot.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • remote: (Optional bool): Indicated whether this is a remote volume or not
        • replication: (Replication): The number of copies/replicas kept.
        • reuseServer: (Optional bool): is it allowed to place replicas on the same server
        • size: (Size): The volume/snapshots's size in bytes.
        • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
        • templateId: (Internal int)
        • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
        • visibleVolumeId: (int): The ID by which the volume/snapshot was created.

Describe a volume (VolumeDescribe)

Return detailed information about the distribution of the volume's data on the disks.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/VolumeDescribe/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/VolumeDescribe/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "creationTimestamp": int,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": VolumeNameOrGlobalId,
          "objects": [[DiskID, ...], ...],
          "objectsCount": int,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "targetDiskSets": [[DiskID, ...], ...],
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "visibleVolumeId": int
        }
      }
      
    • Response Data: Volume
      • bw: (Bandwidth): Bandwidth limit in KB.
      • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
      • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
      • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
      • firstNotParentObjectId: (Internal int)
      • flags: (Internal int)
      • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
      • id: (Internal int)
      • iops: (IOPS): iops limit.
      • limitType: (Optional LimitType)
      • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
      • name: (VolumeNameOrGlobalId): The name of this volume.
      • objects: Where each object is actually stored.
          Element type:
      • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
      • originalParentVolumeId: (Internal int)
      • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
      • parentVolumeId: (Internal int): The ID of the parent snapshot.
      • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • remote: (Optional bool): Indicated whether this is a remote volume or not
      • replication: (Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): is it allowed to place replicas on the same server
      • size: (Size): The volume/snapshots's size in bytes.
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
      • targetDiskSets: Sets of disks that the volume's data should be stored on.
          Element type:
      • templateId: (Internal int)
      • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
      • visibleVolumeId: (int): The ID by which the volume/snapshot was created.

Get volume info (VolumeGetInfo)

Return general information about the distribution of the volume's data on the disks.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/VolumeGetInfo/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/VolumeGetInfo/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "creationTimestamp": int,
          "disksCount": int,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": VolumeNameOrGlobalId,
          "objectsCount": int,
          "objectsPerChain": [{
            "count": int,
            "disks": [DiskID, ...]
          }, ...],
          "objectsPerDisk": {
            "DiskID": int, ...
          },
          "objectsPerDiskSet": [{
            "count": int,
            "disks": [DiskID, ...]
          }, ...],
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "visibleVolumeId": int
        }
      }
      
    • Response Data: VolumeInfo
      • bw: (Bandwidth): Bandwidth limit in KB.
      • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
      • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
      • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
      • disksCount: (int)
      • firstNotParentObjectId: (Internal int)
      • flags: (Internal int)
      • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
      • id: (Internal int)
      • iops: (IOPS): iops limit.
      • limitType: (Optional LimitType)
      • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
      • name: (VolumeNameOrGlobalId): The name of this volume.
      • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
      • objectsPerChain:
          Element type: VolumeChainStat
          • count: (int): The number of objects on the disks.
          • disks: IDs of the disks.
      • objectsPerDisk: A dict from DiskID to int
      • objectsPerDiskSet:
          Element type: VolumeChainStat
          • count: (int): The number of objects on the disks.
          • disks: IDs of the disks.
      • originalParentVolumeId: (Internal int)
      • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
      • parentVolumeId: (Internal int): The ID of the parent snapshot.
      • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • remote: (Optional bool): Indicated whether this is a remote volume or not
      • replication: (Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): is it allowed to place replicas on the same server
      • size: (Size): The volume/snapshots's size in bytes.
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
      • templateId: (Internal int)
      • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
      • visibleVolumeId: (int): The ID by which the volume/snapshot was created.

List the parent snapshots of a volume (VolumeListSnapshots)

List a volume's parent snapshots in the same format as VolumeList

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeListSnapshots/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "autoName": bool,
          "backup": bool /* Optional */,
          "backupOfGlobalId": Global Volume Id /* Optional */,
          "backupOfVisibleVolumeId": int /* Optional */,
          "bound": bool,
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "createdFromGlobalId": Global Volume Id /* Internal */ /* Optional */,
          "createdFromVisibleVolumeId": int /* Internal */ /* Optional */,
          "creationTimestamp": int,
          "deleteBlocked": DeleteBlocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": DematerializationStatus /* Internal */ /* Optional */,
          "destroyed": bool /* Internal */ /* Optional */,
          "ecDeleted": bool /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "mcState": MultiClusterState /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objectsCount": int,
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "targetDeleteDate": int /* Optional */,
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "transient": bool,
          "visibleVolumeId": int,
          "volumeMoveSource": bool /* Internal */ /* Optional */
        }, ...]
      }
      
    • Response Data:
        Element type: SnapshotSummary
        • autoName: (bool): Is this snapshot anonymous.
        • backup: (Optional bool): Is this snapshot a backup of a remote snapshot.
        • backupOfGlobalId: (Optional Global Volume Id): The global ID of the volume that has been backed up to this snapshot.
        • backupOfVisibleVolumeId: (Optional int): The numeric global ID of the snapshot that has been backed up to
        • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
        • createdFromGlobalId: (Optional Internal)
        • createdFromVisibleVolumeId: (Optional Internal)
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • deleteBlocked: (Optional Internal)
        • deleted: (bool): Is this snapshot currently being deleted.
        • dematerializationStatus: (Optional Internal)
        • destroyed: (Optional Internal): Is this snapshot currently being destroyed.
        • ecDeleted: (Optional Internal)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • limitType: (Optional LimitType)
        • mcState: (Optional Internal)
        • mcStateVal: (Optional Internal)
        • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
        • name: (SnapshotNameOrGlobalId): The name of this snapshot
        • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
        • onVolume: (VolumeNameOrGlobalId): The name of the volume that this is a parent of.
        • originalParentVolumeId: (Internal int)
        • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
        • parentVolumeId: (Internal int): The ID of the parent snapshot.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location
        • remote: (Optional bool): Indicated whether this is a remote volume or not
        • replication: (Replication): The number of copies/replicas kept.
        • reuseServer: (Optional bool): is it allowed to place replicas on the same server
        • size: (Size): The volume/snapshots's size in bytes.
        • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
        • targetDeleteDate: (Optional int): Scheduled date for the snapshot to be deleted. Unix timestamp
        • templateId: (Internal int)
        • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
        • transient: (bool): Is this a transient snapshot. Transient snapshots are internally created when
        • visibleVolumeId: (int): The ID by which the volume/snapshot was created.
        • volumeMoveSource: (Optional Internal)

Create a new volume (VolumeCreate)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumeCreate HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "baseOn": VolumeNameOrGlobalId /* Optional */,
        "bw": Bandwidth /* Optional */,
        "iops": IOPS /* Optional */,
        "metadata": bool /* Optional */,
        "name": Either("", VolumeName) /* Optional */,
        "parent": SnapshotNameOrGlobalId /* Optional */,
        "placeAll": PlacementGroupName /* Optional */,
        "placeHead": PlacementGroupName /* Optional */,
        "placeTail": PlacementGroupName /* Optional */,
        "replication": Replication /* Optional */,
        "reuseServer": bool /* Optional */,
        "size": Size /* Optional */,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "template": VolumeTemplateName /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumeCreate
    • Arguments: No arguments
    • JSON: VolumeCreateDesc
      • baseOn: (Optional VolumeNameOrGlobalId): The name of an already existing volume that the new volume is to be a copy of.
      • bw: (Optional Bandwidth): Bandwidth limit in KB.
      • iops: (Optional IOPS): iops limit.
      • metadata: (Optional bool): Flag for a metadata volume
      • name: (Optional Either("", VolumeName)): The name of the volume to be created.
      • parent: (Optional SnapshotNameOrGlobalId): The name of the snapshot that the new volume is based on.
      • placeAll: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • replication: (Optional Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): allow placement of replicas on same server.
      • size: (Optional Size): The volume's size in bytes.
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Optional name=value tags.
      • template: (Optional VolumeTemplateName): The name of the template that the settings of the new volume are based on.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "autoName": SnapshotName /* Optional */,
          "generation": int,
          "globalId": Global Volume Id /* Optional */,
          "info": string /* Optional */,
          "name": VolumeNameOrGlobalId /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOkVolumeCreate
      • autoName: (Optional SnapshotName): The name of the transient snapshot used during the creation of the volume.
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • globalId: (Optional Global Volume Id): The globalId of the new volume
      • info: (Optional string): May contain additional information about the request.
      • name: (Optional VolumeNameOrGlobalId): The name of the newly-created volume if one was not provided in the VolumeCreate
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Update a volume (VolumeUpdate)

Alter the configuration of an existing volume.

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/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 */,
        "placeHead": PlacementGroupName /* Optional */,
        "placeTail": PlacementGroupName /* Optional */,
        "rename": Either("", VolumeName) /* Optional */,
        "replication": Replication /* Optional */,
        "reuseServer": bool /* Optional */,
        "shrinkOk": bool /* Optional */,
        "size": Size /* Optional */,
        "sizeAdd": SizeAdd /* Optional */,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "template": VolumeTemplateName /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumeUpdate/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: VolumeUpdateDesc
      • bw: (Optional Bandwidth): Bandwidth limit in KB.
      • iops: (Optional IOPS): iops limit.
      • placeAll: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • rename: (Optional Either("", VolumeName)): The new name to be set.
      • replication: (Optional Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): allow placement of replicas on same server.
      • shrinkOk: (Optional bool)
      • size: (Optional Size): The new size in bytes.
      • sizeAdd: (Optional SizeAdd): The number of bytes that the volume's size should be increased by.
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Optional name=value tags.
      • template: (Optional VolumeTemplateName): The new template that the volume's settings should be based on.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Freeze a volume (VolumeFreeze)

Convert the volume to a snapshot

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumeFreeze/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "deleteAfter": int /* Optional */,
        "targetDeleteDate": int /* Optional */
      } /* Optional */
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumeFreeze/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Optional VolumeFreezeDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Rebase a volume (VolumeRebase)

Change the parent of the volume by choosing from the ones higher in the hierarchy or by rebasing it to no parent.

  1. Request:
    • Example HTTP Request:
      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": SnapshotNameOrGlobalId /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeRebase/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: VolumeRebaseDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Abandon disk (VolumeAbandonDisk)

  1. Request:
    • Example HTTP Request:
      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
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeAbandonDisk/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: AbandonDiskDesc
      • diskId: (DiskID): the disk to abandon.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Delete a volume (VolumeDelete)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumeDelete/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumeDelete/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Backup a volume to a remote location (VolumeBackup)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumeBackup HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "location": RemoteLocationName,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "volume": VolumeNameOrGlobalId
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumeBackup
    • Arguments: No arguments
    • JSON: VolumeBackupDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "autoName": SnapshotName /* Optional */,
          "generation": int,
          "globalId": Global Volume Id /* Optional */,
          "info": string /* Optional */,
          "name": VolumeNameOrGlobalId /* Optional */,
          "ok": true,
          "remoteId": Global Volume Id /* Optional */
        }
      }
      
    • Response Data: ApiOkVolumeBackup
      • autoName: (Optional SnapshotName): The name of the transient snapshot used during the creation of the volume.
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • globalId: (Optional Global Volume Id): The globalId of the new volume
      • info: (Optional string): May contain additional information about the request.
      • name: (Optional VolumeNameOrGlobalId): The name of the newly-created volume if one was not provided in the VolumeCreate
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.
      • remoteId: (Optional Global Volume Id): The globally unique id of the backup

Backup a group of volumes to a remote location (VolumesGroupBackup)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumesGroupBackup HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "location": RemoteLocationName,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "volumes": [VolumeNameOrGlobalId, ...]
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumesGroupBackup
    • Arguments: No arguments
    • JSON: VolumesGroupBackupDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "backups": {
            "VolumeName": {
              "remoteId": Global Volume Id,
              "snapshotGlobalId": Global Volume Id
            }, ...
          },
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOkVolumesGroupBackup
      • backups: The mapping of volume names to backup id.A dict from VolumeName to VolumesGroupBackupSingle
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Move a volume from the local cluster to a remote cluster (VolumeMoveToRemote)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/VolumeMoveToRemote/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "cluster": ClusterName /* Optional */,
        "clusterId": Global Location Id /* Optional */,
        "onAttached": OnAttached /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeMoveToRemote/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: VolumeMoveToRemoteDesc
      • cluster: (Optional ClusterName): The name of the target cluster, use this or clusterId
      • clusterId: (Optional Global Location Id): The id of the target cluster, use this or cluster
      • onAttached: (Optional OnAttached): What to do if volume is attached. "fail" if not specified
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Export a volume to another cluster, so it can be attached when allowRemoteExports is true (VolumeExport)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/VolumeExport/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "cluster": ClusterName /* Optional */,
        "clusterId": Global Location Id /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeExport/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: VolumeExportDesc
      • cluster: (Optional ClusterName): The name of the target cluster, use this or clusterId
      • clusterId: (Optional Global Location Id): The id of the target cluster, use this or cluster
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Move the volume from its current remote cluster to the local one. Noop if already here. Multicluster only call (VolumeAcquire)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumeAcquire/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "onRemoteAttached": OnAttached /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumeAcquire/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: VolumeAcquireDesc
      • onRemoteAttached: (Optional OnAttached): What to do if volume is attached. "fail" if not specified
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Create a volume from a snapshot from a remote location (VolumeFromRemote)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/VolumeFromRemote HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "export": bool /* Optional */,
        "name": Either("", VolumeName),
        "placeAll": PlacementGroupName /* Optional */,
        "placeHead": PlacementGroupName /* Optional */,
        "placeTail": PlacementGroupName /* Optional */,
        "remoteId": Global Volume Id,
        "remoteLocation": RemoteLocationName,
        "replication": Replication /* Optional */,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "template": VolumeTemplateName /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeFromRemote
    • Arguments: No arguments
    • JSON: VolumeFromRemoteDesc
      • export: (Optional bool): Auto-export the volume after creating it. e.g. for backup.
      • name: The name of the new volume.The value must be of one of the following types: "", VolumeName.
      • placeAll: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • remoteId: (Global Volume Id): The global snapshot identifier.
      • remoteLocation: (RemoteLocationName): The name of the remote location to fetch the snapshot from.
      • replication: (Optional Replication): The number of copies/replicas kept.
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
      • template: (Optional VolumeTemplateName): The name of the template that the settings of the new volume are based on.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Revert a volume to a snapshot discarding all its current data. (VolumeRevert)

Revert volume to a snapshot discarding all its current data. If the volume is attached, after the revert it will get 2 links in /dev/storpool-byid/ - the original autogenerated name (a.k.a. StorPool globalId that the volume was initially created with) and the actual current globalId of the volume (after the revert).

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumeRevert/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "revertSize": bool /* Optional */,
        "toSnapshot": SnapshotNameOrGlobalId
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumeRevert/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: VolumeRevertDesc
      • revertSize: (Optional bool): set the volume size to the exact size of the snapshot.
      • toSnapshot: (SnapshotNameOrGlobalId): name of the snapshot to revert to
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Revert a group of volumes to snapshots discarding all of theirs current data. (VolumesGroupRevert)

Revert a group of volumes to snapshots discarding all of theirs current data.

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumesGroupRevert HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "revertSize": bool /* Optional */,
        "volumes": [{
          "toSnapshot": SnapshotNameOrGlobalId,
          "volume": VolumeNameOrGlobalId
        }, ...]
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumesGroupRevert
    • Arguments: No arguments
    • JSON: VolumesGroupRevertDesc
      • revertSize: (Optional bool): set the volume size to the exact size of the snapshot.
      • volumes: description of volumes to be reverted
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Snapshots

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 snapshots (SnapshotsList)

List all the snapshots in the cluster in the same format as VolumeList.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/SnapshotsList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/SnapshotsList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "autoName": bool,
          "backup": bool /* Optional */,
          "backupOfGlobalId": Global Volume Id /* Optional */,
          "backupOfVisibleVolumeId": int /* Optional */,
          "bound": bool,
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "createdFromGlobalId": Global Volume Id /* Internal */ /* Optional */,
          "createdFromVisibleVolumeId": int /* Internal */ /* Optional */,
          "creationTimestamp": int,
          "deleteBlocked": DeleteBlocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": DematerializationStatus /* Internal */ /* Optional */,
          "destroyed": bool /* Internal */ /* Optional */,
          "ecDeleted": bool /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "mcState": MultiClusterState /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objectsCount": int,
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "targetDeleteDate": int /* Optional */,
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "transient": bool,
          "visibleVolumeId": int,
          "volumeMoveSource": bool /* Internal */ /* Optional */
        }, ...]
      }
      
    • Response Data:
        Element type: SnapshotSummary
        • autoName: (bool): Is this snapshot anonymous.
        • backup: (Optional bool): Is this snapshot a backup of a remote snapshot.
        • backupOfGlobalId: (Optional Global Volume Id): The global ID of the volume that has been backed up to this snapshot.
        • backupOfVisibleVolumeId: (Optional int): The numeric global ID of the snapshot that has been backed up to
        • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
        • createdFromGlobalId: (Optional Internal)
        • createdFromVisibleVolumeId: (Optional Internal)
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • deleteBlocked: (Optional Internal)
        • deleted: (bool): Is this snapshot currently being deleted.
        • dematerializationStatus: (Optional Internal)
        • destroyed: (Optional Internal): Is this snapshot currently being destroyed.
        • ecDeleted: (Optional Internal)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • limitType: (Optional LimitType)
        • mcState: (Optional Internal)
        • mcStateVal: (Optional Internal)
        • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
        • name: (SnapshotNameOrGlobalId): The name of this snapshot
        • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
        • onVolume: (VolumeNameOrGlobalId): The name of the volume that this is a parent of.
        • originalParentVolumeId: (Internal int)
        • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
        • parentVolumeId: (Internal int): The ID of the parent snapshot.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location
        • remote: (Optional bool): Indicated whether this is a remote volume or not
        • replication: (Replication): The number of copies/replicas kept.
        • reuseServer: (Optional bool): is it allowed to place replicas on the same server
        • size: (Size): The volume/snapshots's size in bytes.
        • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
        • targetDeleteDate: (Optional int): Scheduled date for the snapshot to be deleted. Unix timestamp
        • templateId: (Internal int)
        • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
        • transient: (bool): Is this a transient snapshot. Transient snapshots are internally created when
        • visibleVolumeId: (int): The ID by which the volume/snapshot was created.
        • volumeMoveSource: (Optional Internal)

List snapshots space estimations (SnapshotsSpace)

List estimated virtual space used by each snapshot.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/SnapshotsSpace HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/SnapshotsSpace
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "autoName": bool,
          "backup": bool /* Optional */,
          "backupOfGlobalId": Global Volume Id /* Optional */,
          "backupOfVisibleVolumeId": int /* Optional */,
          "bound": bool,
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "createdFromGlobalId": Global Volume Id /* Internal */ /* Optional */,
          "createdFromVisibleVolumeId": int /* Internal */ /* Optional */,
          "creationTimestamp": int,
          "deleteBlocked": DeleteBlocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": DematerializationStatus /* Internal */ /* Optional */,
          "destroyed": bool /* Internal */ /* Optional */,
          "ecDeleted": bool /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "mcState": MultiClusterState /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objectsCount": int,
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "spaceUsed": int,
          "storedSize": int,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "targetDeleteDate": int /* Optional */,
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "transient": bool,
          "visibleVolumeId": int,
          "volumeMoveSource": bool /* Internal */ /* Optional */
        }, ...]
      }
      
    • Response Data:
        Element type: SnapshotSpace
        • autoName: (bool): Is this snapshot anonymous.
        • backup: (Optional bool): Is this snapshot a backup of a remote snapshot.
        • backupOfGlobalId: (Optional Global Volume Id): The global ID of the volume that has been backed up to this snapshot.
        • backupOfVisibleVolumeId: (Optional int): The numeric global ID of the snapshot that has been backed up to
        • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
        • createdFromGlobalId: (Optional Internal)
        • createdFromVisibleVolumeId: (Optional Internal)
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • deleteBlocked: (Optional Internal)
        • deleted: (bool): Is this snapshot currently being deleted.
        • dematerializationStatus: (Optional Internal)
        • destroyed: (Optional Internal): Is this snapshot currently being destroyed.
        • ecDeleted: (Optional Internal)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • limitType: (Optional LimitType)
        • mcState: (Optional Internal)
        • mcStateVal: (Optional Internal)
        • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
        • name: (SnapshotNameOrGlobalId): The name of this snapshot
        • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
        • onVolume: (VolumeNameOrGlobalId): The name of the volume that this is a parent of.
        • originalParentVolumeId: (Internal int)
        • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
        • parentVolumeId: (Internal int): The ID of the parent snapshot.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location
        • remote: (Optional bool): Indicated whether this is a remote volume or not
        • replication: (Replication): The number of copies/replicas kept.
        • reuseServer: (Optional bool): is it allowed to place replicas on the same server
        • size: (Size): The volume/snapshots's size in bytes.
        • spaceUsed: (int): The number of bytes of client data that will be freed if this snapshot is deleted.
        • storedSize: (int): The number of bytes of client data on this snapshot. This does not take into account
        • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
        • targetDeleteDate: (Optional int): Scheduled date for the snapshot to be deleted. Unix timestamp
        • templateId: (Internal int)
        • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
        • transient: (bool): Is this a transient snapshot. Transient snapshots are internally created when
        • visibleVolumeId: (int): The ID by which the volume/snapshot was created.
        • volumeMoveSource: (Optional Internal)

List a single snapshot (Snapshot)

Same as SnapshotList but only return information about a given snapshot.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/Snapshot/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/Snapshot/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "autoName": bool,
          "backup": bool /* Optional */,
          "backupOfGlobalId": Global Volume Id /* Optional */,
          "backupOfVisibleVolumeId": int /* Optional */,
          "bound": bool,
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "createdFromGlobalId": Global Volume Id /* Internal */ /* Optional */,
          "createdFromVisibleVolumeId": int /* Internal */ /* Optional */,
          "creationTimestamp": int,
          "deleteBlocked": DeleteBlocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": DematerializationStatus /* Internal */ /* Optional */,
          "destroyed": bool /* Internal */ /* Optional */,
          "ecDeleted": bool /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "mcState": MultiClusterState /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objectsCount": int,
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "targetDeleteDate": int /* Optional */,
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "transient": bool,
          "visibleVolumeId": int,
          "volumeMoveSource": bool /* Internal */ /* Optional */
        }, ...]
      }
      
    • Response Data:
        Element type: SnapshotSummary
        • autoName: (bool): Is this snapshot anonymous.
        • backup: (Optional bool): Is this snapshot a backup of a remote snapshot.
        • backupOfGlobalId: (Optional Global Volume Id): The global ID of the volume that has been backed up to this snapshot.
        • backupOfVisibleVolumeId: (Optional int): The numeric global ID of the snapshot that has been backed up to
        • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
        • createdFromGlobalId: (Optional Internal)
        • createdFromVisibleVolumeId: (Optional Internal)
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • deleteBlocked: (Optional Internal)
        • deleted: (bool): Is this snapshot currently being deleted.
        • dematerializationStatus: (Optional Internal)
        • destroyed: (Optional Internal): Is this snapshot currently being destroyed.
        • ecDeleted: (Optional Internal)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • limitType: (Optional LimitType)
        • mcState: (Optional Internal)
        • mcStateVal: (Optional Internal)
        • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
        • name: (SnapshotNameOrGlobalId): The name of this snapshot
        • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
        • onVolume: (VolumeNameOrGlobalId): The name of the volume that this is a parent of.
        • originalParentVolumeId: (Internal int)
        • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
        • parentVolumeId: (Internal int): The ID of the parent snapshot.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location
        • remote: (Optional bool): Indicated whether this is a remote volume or not
        • replication: (Replication): The number of copies/replicas kept.
        • reuseServer: (Optional bool): is it allowed to place replicas on the same server
        • size: (Size): The volume/snapshots's size in bytes.
        • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
        • targetDeleteDate: (Optional int): Scheduled date for the snapshot to be deleted. Unix timestamp
        • templateId: (Internal int)
        • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
        • transient: (bool): Is this a transient snapshot. Transient snapshots are internally created when
        • visibleVolumeId: (int): The ID by which the volume/snapshot was created.
        • volumeMoveSource: (Optional Internal)

Describe a snapshot (SnapshotDescribe)

Return detailed information about the distribution of the snapshot's data on the disks.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/SnapshotDescribe/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/SnapshotDescribe/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "autoName": bool,
          "backup": bool /* Optional */,
          "backupOfGlobalId": Global Volume Id /* Optional */,
          "backupOfVisibleVolumeId": int /* Optional */,
          "bound": bool,
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "createdFromGlobalId": Global Volume Id /* Internal */ /* Optional */,
          "createdFromVisibleVolumeId": int /* Internal */ /* Optional */,
          "creationTimestamp": int,
          "deleteBlocked": DeleteBlocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": DematerializationStatus /* Internal */ /* Optional */,
          "destroyed": bool /* Internal */ /* Optional */,
          "ecDeleted": bool /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "mcState": MultiClusterState /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objects": [[DiskID, ...], ...],
          "objectsCount": int,
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "targetDeleteDate": int /* Optional */,
          "targetDiskSets": [[DiskID, ...], ...],
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "transient": bool,
          "visibleVolumeId": int,
          "volumeMoveSource": bool /* Internal */ /* Optional */
        }
      }
      
    • Response Data: Snapshot
      • autoName: (bool): Is this snapshot anonymous.
      • backup: (Optional bool): Is this snapshot a backup of a remote snapshot.
      • backupOfGlobalId: (Optional Global Volume Id): The global ID of the volume that has been backed up to this snapshot.
      • backupOfVisibleVolumeId: (Optional int): The numeric global ID of the snapshot that has been backed up to
      • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain
      • bw: (Bandwidth): Bandwidth limit in KB.
      • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
      • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
      • createdFromGlobalId: (Optional Internal)
      • createdFromVisibleVolumeId: (Optional Internal)
      • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
      • deleteBlocked: (Optional Internal)
      • deleted: (bool): Is this snapshot currently being deleted.
      • dematerializationStatus: (Optional Internal)
      • destroyed: (Optional Internal): Is this snapshot currently being destroyed.
      • ecDeleted: (Optional Internal)
      • firstNotParentObjectId: (Internal int)
      • flags: (Internal int)
      • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
      • id: (Internal int)
      • iops: (IOPS): iops limit.
      • limitType: (Optional LimitType)
      • mcState: (Optional Internal)
      • mcStateVal: (Optional Internal)
      • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
      • name: (SnapshotNameOrGlobalId): The name of this snapshot
      • objects: Where each object is actually stored.
          Element type:
      • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
      • onVolume: (VolumeNameOrGlobalId): The name of the volume that this is a parent of.
      • originalParentVolumeId: (Internal int)
      • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
      • parentVolumeId: (Internal int): The ID of the parent snapshot.
      • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location
      • remote: (Optional bool): Indicated whether this is a remote volume or not
      • replication: (Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): is it allowed to place replicas on the same server
      • size: (Size): The volume/snapshots's size in bytes.
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
      • targetDeleteDate: (Optional int): Scheduled date for the snapshot to be deleted. Unix timestamp
      • targetDiskSets: Sets of disks that the volume's data should be stored on.
          Element type:
      • templateId: (Internal int)
      • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
      • transient: (bool): Is this a transient snapshot. Transient snapshots are internally created when
      • visibleVolumeId: (int): The ID by which the volume/snapshot was created.
      • volumeMoveSource: (Optional Internal)

Get snapshot info (SnapshotGetInfo)

Return general information about the distribution of the snapshot's data on the disks.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/SnapshotGetInfo/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/SnapshotGetInfo/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "autoName": bool,
          "backup": bool /* Optional */,
          "backupOfGlobalId": Global Volume Id /* Optional */,
          "backupOfVisibleVolumeId": int /* Optional */,
          "bound": bool,
          "bw": Bandwidth,
          "clusterId": Global Location Id /* Optional */,
          "clusterName": ClusterName /* Optional */,
          "createdFromGlobalId": Global Volume Id /* Internal */ /* Optional */,
          "createdFromVisibleVolumeId": int /* Internal */ /* Optional */,
          "creationTimestamp": int,
          "deleteBlocked": DeleteBlocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": DematerializationStatus /* Internal */ /* Optional */,
          "destroyed": bool /* Internal */ /* Optional */,
          "disksCount": int,
          "ecDeleted": bool /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "limitType": LimitType /* Optional */,
          "mcState": MultiClusterState /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "metadataVolume": bool /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objectsCount": int,
          "objectsPerChain": [{
            "count": int,
            "disks": [DiskID, ...]
          }, ...],
          "objectsPerDisk": {
            "DiskID": int, ...
          },
          "objectsPerDiskSet": [{
            "count": int,
            "disks": [DiskID, ...]
          }, ...],
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "remote": bool /* Optional */,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "size": Size,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "targetDeleteDate": int /* Optional */,
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "transient": bool,
          "visibleVolumeId": int,
          "volumeMoveSource": bool /* Internal */ /* Optional */
        }
      }
      
    • Response Data: SnapshotInfo
      • autoName: (bool): Is this snapshot anonymous.
      • backup: (Optional bool): Is this snapshot a backup of a remote snapshot.
      • backupOfGlobalId: (Optional Global Volume Id): The global ID of the volume that has been backed up to this snapshot.
      • backupOfVisibleVolumeId: (Optional int): The numeric global ID of the snapshot that has been backed up to
      • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain
      • bw: (Bandwidth): Bandwidth limit in KB.
      • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently resides in
      • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently resides in
      • createdFromGlobalId: (Optional Internal)
      • createdFromVisibleVolumeId: (Optional Internal)
      • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
      • deleteBlocked: (Optional Internal)
      • deleted: (bool): Is this snapshot currently being deleted.
      • dematerializationStatus: (Optional Internal)
      • destroyed: (Optional Internal): Is this snapshot currently being destroyed.
      • disksCount: (int)
      • ecDeleted: (Optional Internal)
      • firstNotParentObjectId: (Internal int)
      • flags: (Internal int)
      • globalId: (Global Volume Id): The globally-unique identifier of the volume or snapshot.
      • id: (Internal int)
      • iops: (IOPS): iops limit.
      • limitType: (Optional LimitType)
      • mcState: (Optional Internal)
      • mcStateVal: (Optional Internal)
      • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
      • name: (SnapshotNameOrGlobalId): The name of this snapshot
      • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
      • objectsPerChain:
          Element type: VolumeChainStat
          • count: (int): The number of objects on the disks.
          • disks: IDs of the disks.
      • objectsPerDisk: A dict from DiskID to int
      • objectsPerDiskSet:
          Element type: VolumeChainStat
          • count: (int): The number of objects on the disks.
          • disks: IDs of the disks.
      • onVolume: (VolumeNameOrGlobalId): The name of the volume that this is a parent of.
      • originalParentVolumeId: (Internal int)
      • parentName: The volume/snapshot's parent snapshot.The value must be of one of the following types: "", SnapshotNameOrGlobalId.
      • parentVolumeId: (Internal int): The ID of the parent snapshot.
      • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location
      • remote: (Optional bool): Indicated whether this is a remote volume or not
      • replication: (Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): is it allowed to place replicas on the same server
      • size: (Size): The volume/snapshots's size in bytes.
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
      • targetDeleteDate: (Optional int): Scheduled date for the snapshot to be deleted. Unix timestamp
      • templateId: (Internal int)
      • templateName: The template that the volume/snapshot's settings are inherited from.The value must be of one of the following types: "", VolumeTemplateName.
      • transient: (bool): Is this a transient snapshot. Transient snapshots are internally created when
      • visibleVolumeId: (int): The ID by which the volume/snapshot was created.
      • volumeMoveSource: (Optional Internal)

Snapshot a volume (VolumeSnapshot)

Create a snapshot of the given volume; the snapshot becomes the parent of the volume.

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumeSnapshot/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "bind": bool /* Optional */,
        "deleteAfter": int /* Optional */,
        "name": Either("", VolumeName) /* Optional */,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "targetDeleteDate": int /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumeSnapshot/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: VolumeSnapshotDesc
      • bind: (Optional bool): If true, the lifetime of the newly created snapshot will be bound to the lifetime of
      • deleteAfter: (Optional int): If not 0 set targetDeleteDate relative to the current time on the mgmt node.
      • name: (Optional Either("", VolumeName)): The name of the newly created snapshot. If not specified, a name will be auto-generated
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the snapshot.
      • targetDeleteDate: (Optional int): If not 0 set absolute targetDeleteDate for the new snapshot. Unix timestamp.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "autoName": SnapshotName /* Optional */,
          "generation": int,
          "info": string /* Optional */,
          "ok": true,
          "snapshotGlobalId": Global Volume Id /* Optional */,
          "snapshotVisibleVolumeId": int /* Optional */
        }
      }
      
    • Response Data: ApiOkSnapshotCreate
      • autoName: (Optional SnapshotName): The name of the transient snapshot used during the creation of the volume.
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.
      • snapshotGlobalId: (Optional Global Volume Id): The global snapshot identifier.
      • snapshotVisibleVolumeId: (Optional int): The ID by which the volume/snapshot was created.

Update a snapshot (SnapshotUpdate)

Alter the configuration of an existing snapshot.

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/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 */,
        "deleteAfter": int /* Optional */,
        "iops": IOPS /* Optional */,
        "placeAll": PlacementGroupName /* Optional */,
        "placeHead": PlacementGroupName /* Optional */,
        "placeTail": PlacementGroupName /* Optional */,
        "rename": Either("", VolumeName) /* Optional */,
        "replication": Replication /* Optional */,
        "reuseServer": bool /* Optional */,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "targetDeleteDate": int /* Optional */,
        "template": VolumeTemplateName /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/SnapshotUpdate/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: SnapshotUpdateDesc
      • bind: (Optional bool): When true bind this snapshot, when false - unbind it. If not set or missing - no change.
      • bw: (Optional Bandwidth): Bandwidth limit in KB.
      • deleteAfter: (Optional int): set targetDeleteDate relative to the current time on the mgmt node. If not 0,
      • iops: (Optional IOPS): iops limit.
      • placeAll: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • rename: (Optional Either("", VolumeName)): The new name to be set.
      • replication: (Optional Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): allow placement of replicas on same server.
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the snapshot.
      • targetDeleteDate: (Optional int): set absolute targetDeleteDate, or 0 to disable automatic deleting.
      • template: (Optional VolumeTemplateName): The new template that the snapshot's settings should be based on.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Rebase a snapshot (SnapshotRebase)

Change the parent of the snapshot by choosing from the ones higher in the hierarchy or by rebasing it to no parent.

  1. Request:
    • Example HTTP Request:
      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": SnapshotNameOrGlobalId /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/SnapshotRebase/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: VolumeRebaseDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Abandon disk (VolumeAbandonDisk)

  1. Request:
    • Example HTTP Request:
      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
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeAbandonDisk/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: AbandonDiskDesc
      • diskId: (DiskID): the disk to abandon.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Delete a snapshot (SnapshotDelete)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/SnapshotDelete/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/SnapshotDelete/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Delete multiple snapshot (SnapshotsGroupDelete)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/SnapshotsGroupDelete HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "remoteUnexports": [{
          "deleteAfter": int /* Optional */,
          "globalSnapshotId": Global Volume Id,
          "location": RemoteLocationName /* Optional */,
          "remote": Either(RemoteClusterName, RemoteLocationName) /* Optional */,
          "targetDeleteDate": int /* Optional */
        }, ...] /* Optional */,
        "snapshots": [{
          "name": SnapshotNameOrGlobalId,
          "unexport": {
            "all": bool,
            "force": bool /* Optional */
          } /* Optional */
        }, ...]
      }
    • Method: POST
    • Path: /ctrl/1.0/SnapshotsGroupDelete
    • Arguments: No arguments
    • JSON: GroupSnapshotsDeleteSpec
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Delete a snapshot by global id (SnapshotDeleteById)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/SnapshotDeleteById/{globalVolumeId} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: POST
    • Path: /ctrl/1.0/SnapshotDeleteById/{globalVolumeId}
    • Arguments:
      • globalVolumeId - Global Volume Id: string, regex [a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Create consistent snapshots of a group of volumes (VolumesGroupSnapshot)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumesGroupSnapshot HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "volumes": [{
          "export": RemoteLocationName /* Optional */,
          "name": Either("", SnapshotName) /* Optional */,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "volume": VolumeNameOrGlobalId
        }, ...]
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumesGroupSnapshot
    • Arguments: No arguments
    • JSON: GroupSnapshotsSpec
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "snapshots": [{
            "remoteId": Global Volume Id,
            "snapshot": SnapshotNameOrGlobalId /* Optional */,
            "snapshotGlobalId": Global Volume Id,
            "volume": VolumeNameOrGlobalId,
            "volumeGlobalId": Global Volume Id
          }, ...]
        }
      }
      
    • Response Data: GroupSnapshotsResult
      • snapshots: The volumes to create snapshots of.

Copy a snapshot from a remote location (SnapshotFromRemote)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/SnapshotFromRemote HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "export": bool /* Optional */,
        "name": Either("", VolumeName) /* Optional */,
        "placeAll": PlacementGroupName /* Optional */,
        "placeHead": PlacementGroupName /* Optional */,
        "placeTail": PlacementGroupName /* Optional */,
        "remoteId": Global Volume Id,
        "remoteLocation": RemoteLocationName,
        "replication": Replication /* Optional */,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "template": VolumeTemplateName /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/SnapshotFromRemote
    • Arguments: No arguments
    • JSON: SnapshotFromRemoteDesc
      • export: (Optional bool): Auto-export the snapshot after creating it. e.g. for backup.
      • name: (Optional Either("", VolumeName)): The name of the new snapshot.
      • placeAll: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • remoteId: (Global Volume Id): The global snapshot identifier.
      • remoteLocation: (RemoteLocationName): The name of the remote location to fetch the snapshot from.
      • replication: (Optional Replication): The number of copies/replicas kept.
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the snapshot.
      • template: (Optional VolumeTemplateName): The name of the template that the settings of the new volume are based on.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Move a snapshot from the local cluster to a remote cluster (SnapshotMoveToRemote)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/SnapshotMoveToRemote/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "cluster": ClusterName /* Optional */,
        "clusterId": Global Location Id /* Optional */,
        "onAttached": OnAttached /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/SnapshotMoveToRemote/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: SnapshotMoveToRemoteDesc
      • cluster: (Optional ClusterName): The name of the target cluster, use this or clusterId
      • clusterId: (Optional Global Location Id): The id of the target cluster, use this or cluster
      • onAttached: (Optional OnAttached): What to do if volume is attached. "fail" if not specified
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Allow a remote location to access a local snapshot (SnapshotExport)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/SnapshotExport HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "location": RemoteLocationName,
        "snapshot": SnapshotNameOrGlobalId
      }
    • Method: POST
    • Path: /ctrl/1.0/SnapshotExport
    • Arguments: No arguments
    • JSON: SnapshotExportDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Revoke a remote location's access to a local snapshot (SnapshotUnexport)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/SnapshotUnexport HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "all": bool /* Optional */,
        "force": bool /* Optional */,
        "location": RemoteLocationName /* Optional */,
        "snapshot": SnapshotNameOrGlobalId
      }
    • Method: POST
    • Path: /ctrl/1.0/SnapshotUnexport
    • Arguments: No arguments
    • JSON: SnapshotUnexportDesc
      • all: (Optional bool): Revoke access from all locations.
      • force: (Optional bool): Don't check if the snapshot is still recovering in the remote location.
      • location: (Optional RemoteLocationName): The name of the remote location to revoke access from.
      • snapshot: (SnapshotNameOrGlobalId): The name of the snapshot.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

List exported snapshots (ExportsList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/ExportsList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/ExportsList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "str, default="exports"": [{
            "backingUp": bool /* Optional */,
            "globalId": Global Volume Id,
            "location": RemoteLocationName,
            "snapshot": SnapshotNameOrGlobalId,
            "visibleVolumeId": int /* Internal */,
            "volumeId": int /* Internal */
          }, ...], ...
        }
      }
      
    • Response Data: A dict from str, default="exports" to [Export]

List exported volumes (VolumeExportsList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeExportsList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeExportsList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "str, default="exports"": [{
            "backingUp": bool /* Optional */,
            "globalId": Global Volume Id,
            "location": RemoteLocationName,
            "snapshot": SnapshotNameOrGlobalId,
            "visibleVolumeId": int /* Internal */,
            "volumeId": int /* Internal */
          }, ...], ...
        }
      }
      
    • Response Data: A dict from str, default="exports" to [Export]

List the available remote snapshots (SnapshotsRemoteList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/SnapshotsRemoteList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/SnapshotsRemoteList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "str, default="snapshots"": [{
            "createdFromGlobalId": Global Volume Id /* Internal */,
            "createdFromVisibleVolumeId": int /* Internal */,
            "creationTimestamp": int,
            "localSnapshot": SnapshotNameOrGlobalId /* Optional */,
            "location": RemoteLocationName,
            "metadataVolume": bool /* Optional */,
            "name": VolumeNameOrGlobalId,
            "onVolume": VolumeNameOrGlobalId /* Optional */,
            "remoteId": Global Volume Id,
            "size": Size,
            "tags": {
              "VolumeTagName": VolumeTagValue, ...
            } /* Optional */,
            "type": mc /* Optional */
          }, ...], ...
        }
      }
      
    • Response Data: A dict from str, default="snapshots" to [RemoteSnapshot]
      • Key type: str, default="snapshots"
      • Value type:
          Element type: RemoteSnapshot
          • createdFromGlobalId: (Internal Global Volume Id)
          • createdFromVisibleVolumeId: (Internal int)
          • creationTimestamp: (int): The snapshot's creation timestamp (UNIX timestamp).
          • localSnapshot: (Optional SnapshotNameOrGlobalId): The name of the local snapshot (if any) which is a copy of the remote snapshot.
          • location: (RemoteLocationName): Where the snapshot is located.
          • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
          • name: (VolumeNameOrGlobalId): The name of the snapshot.
          • onVolume: (Optional VolumeNameOrGlobalId): The name of the local volume (if any) on which the snapshot was created.
          • remoteId: (Global Volume Id): The global snapshot identifier.
          • size: (Size): The snapshots's size in bytes.
          • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the snapshot.
          • type: (Optional mc): creation type of the export

List the available remote volumes (VolumesRemoteList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumesRemoteList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumesRemoteList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "str, default="volumes"": [{
            "createdFromGlobalId": Global Volume Id /* Internal */,
            "createdFromVisibleVolumeId": int /* Internal */,
            "creationTimestamp": int,
            "localSnapshot": SnapshotNameOrGlobalId /* Optional */,
            "location": RemoteLocationName,
            "metadataVolume": bool /* Optional */,
            "name": VolumeNameOrGlobalId,
            "onVolume": VolumeNameOrGlobalId /* Optional */,
            "remoteId": Global Volume Id,
            "size": Size,
            "tags": {
              "VolumeTagName": VolumeTagValue, ...
            } /* Optional */,
            "type": mc /* Optional */
          }, ...], ...
        }
      }
      
    • Response Data: A dict from str, default="volumes" to [RemoteSnapshot]
      • Key type: str, default="volumes"
      • Value type:
          Element type: RemoteSnapshot
          • createdFromGlobalId: (Internal Global Volume Id)
          • createdFromVisibleVolumeId: (Internal int)
          • creationTimestamp: (int): The snapshot's creation timestamp (UNIX timestamp).
          • localSnapshot: (Optional SnapshotNameOrGlobalId): The name of the local snapshot (if any) which is a copy of the remote snapshot.
          • location: (RemoteLocationName): Where the snapshot is located.
          • metadataVolume: (Optional bool): flag for metadata volumes and snapshots
          • name: (VolumeNameOrGlobalId): The name of the snapshot.
          • onVolume: (Optional VolumeNameOrGlobalId): The name of the local volume (if any) on which the snapshot was created.
          • remoteId: (Global Volume Id): The global snapshot identifier.
          • size: (Size): The snapshots's size in bytes.
          • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the snapshot.
          • type: (Optional mc): creation type of the export

Instruct the remote location that we will no longer use those snapshots (SnapshotsRemoteUnexport)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/SnapshotsRemoteUnexport HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "remoteSnapshots": [{
          "deleteAfter": int /* Optional */,
          "globalSnapshotId": Global Volume Id,
          "location": RemoteLocationName /* Optional */,
          "remote": Either(RemoteClusterName, RemoteLocationName) /* Optional */,
          "targetDeleteDate": int /* Optional */
        }, ...]
      }
    • Method: POST
    • Path: /ctrl/1.0/SnapshotsRemoteUnexport
    • Arguments: No arguments
    • JSON: SnapshotsRemoteUnexport
      • remoteSnapshots: list of SnapshotRemoteUnexportDesc
          Element type: SnapshotRemoteUnexportDesc
          • deleteAfter: (Optional int): same as targetDeleteDate, but time in secs relative to the current time on the
          • globalSnapshotId: (Global Volume Id): the id of the snapshot to be unexported
          • location: (Optional RemoteLocationName): name of the location to unexport from
          • remote: (Optional Either(RemoteClusterName, RemoteLocationName)): name of the cluster to unexport from
          • targetDeleteDate: (Optional int): if not 0 instruct the remote location to delete the snapshot at the specified
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Attachments

List all attachments (AttachmentsList)

List the volumes and snapshots currently attached to clients along with the read/write rights of each attachment.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MultiCluster/AttachmentsList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MultiCluster/AttachmentsList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "client": ClientID,
          "cluster": RemoteLocationName /* Optional */,
          "clusterId": Global Location Id /* Optional */,
          "globalId": Global Volume Id /* Optional */,
          "pos": AttachmentPos,
          "rights": AttachmentRights,
          "snapshot": bool,
          "tags": {
            "VolumeTagName": VolumeTagValue, ...
          } /* Optional */,
          "volume": VolumeNameOrGlobalId
        }, ...]
      }
      
    • Response Data:
        Element type: AttachmentDesc
        • client: (ClientID): The ID of the client on which the volume or snapshot is attached.
        • cluster: (Optional RemoteLocationName): The local name of the cluster of this attachement for the multicluster call
        • clusterId: (Optional Global Location Id): The clusterId of the cluster of this attachement for the multicluster call
        • globalId: (Optional Global Volume Id): The globally-unique identifier of the volume or snapshot.
        • pos: (AttachmentPos): The attachment position on the client; used by the StorPool client to form the name of the
        • rights: (AttachmentRights): Whether the volume is attached as read only or read/write; always ro for snapshots.
        • snapshot: (bool): Whether this is a snapshot or a volume.
        • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.
        • volume: (VolumeNameOrGlobalId): The name of the attached volume.

Reassign volumes and/or snapshots (VolumesReassign)

Perform bulk attach/detach and attachment rights modification.

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumesReassign HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      [Either({
        "allowRemoteExported": bool /* Optional */,
        "detach": Either("all", [ClientID, ...]) /* Optional */,
        "force": bool, default=false,
        "mcMode": move /* Optional */,
        "onRemoteAttached": OnAttached /* Optional */,
        "ro": [ClientID, ...] /* Optional */,
        "rw": [ClientID, ...] /* Optional */,
        "volume": VolumeNameOrGlobalId
      }, {
        "detach": Either("all", [ClientID, ...]) /* Optional */,
        "force": bool, default=false,
        "ro": [ClientID, ...] /* Optional */,
        "snapshot": SnapshotNameOrGlobalId
      }), ...]
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumesReassign
    • Arguments: No arguments
    • JSON:
        Element type: The value must be of one of the following types: VolumeReassignDesc, SnapshotReassignDesc.
          Subtypes:
        • VolumeReassignDesc
          • allowRemoteExported: (Optional bool): if true allow attaching a remote exported volume
          • detach: (Optional Either("all", [ClientID])): The clients from which to detach the given volume.
          • force: (bool, default=false): Whether to force detaching of open volumes.
          • mcMode: (Optional move): multicluster only. Whether to move the the volume to the local cluster if remote
          • onRemoteAttached: (Optional OnAttached): mutlicluster only. What to do if volume is attached in the remote cluster.
          • ro: (Optional [ClientID]): The clients on which to attach the volume as read only.
          • rw: (Optional [ClientID]): The clients on which to attach the volume as read/write.
          • volume: (VolumeNameOrGlobalId): The name of the volume to be reassigned.
        • SnapshotReassignDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Reassign volumes and/or snapshots with confirmation from the clients (VolumesReassignWait)

Perform bulk attach/detach and attachment rights modification and waits for the clients to catch up.

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MultiCluster/VolumesReassignWait HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "attachTimeout": int /* Optional */,
        "reassign": [Either({
          "allowRemoteExported": bool /* Optional */,
          "detach": Either("all", [ClientID, ...]) /* Optional */,
          "force": bool, default=false,
          "mcMode": move /* Optional */,
          "onRemoteAttached": OnAttached /* Optional */,
          "ro": [ClientID, ...] /* Optional */,
          "rw": [ClientID, ...] /* Optional */,
          "volume": VolumeNameOrGlobalId
        }, {
          "detach": Either("all", [ClientID, ...]) /* Optional */,
          "force": bool, default=false,
          "ro": [ClientID, ...] /* Optional */,
          "snapshot": SnapshotNameOrGlobalId
        }), ...]
      }
    • Method: POST
    • Path: /ctrl/1.0/MultiCluster/VolumesReassignWait
    • Arguments: No arguments
    • JSON: VolumesReassignWaitDesc
      • attachTimeout: (Optional int): The number of seconds to wait for missing clients to appear when attaching to
      • reassign: The list of volumes and snapshots to modify the attachment settings for.
          Element type: The value must be of one of the following types: VolumeReassignDesc, SnapshotReassignDesc.
            Subtypes:
          • VolumeReassignDesc
            • allowRemoteExported: (Optional bool): if true allow attaching a remote exported volume
            • detach: (Optional Either("all", [ClientID])): The clients from which to detach the given volume.
            • force: (bool, default=false): Whether to force detaching of open volumes.
            • mcMode: (Optional move): multicluster only. Whether to move the the volume to the local cluster if remote
            • onRemoteAttached: (Optional OnAttached): mutlicluster only. What to do if volume is attached in the remote cluster.
            • ro: (Optional [ClientID]): The clients on which to attach the volume as read only.
            • rw: (Optional [ClientID]): The clients on which to attach the volume as read/write.
            • volume: (VolumeNameOrGlobalId): The name of the volume to be reassigned.
          • SnapshotReassignDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Placement Groups

Placement groups provide a way to specify the disks on which a volume's data should be stored.

List all placement groups (PlacementGroupsList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/PlacementGroupsList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/PlacementGroupsList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      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
          }, ...
        }
      }
      
    • Response Data: A dict from PlacementGroupName to PlacementGroup

Describe a single placement group (PlacementGroupDescribe)

Same as PlacementGroupsList but only return information about a given group.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: GET
    • Path: /ctrl/1.0/PlacementGroupDescribe/{placementGroupName}
    • Arguments:
      • placementGroupName - PlacementGroupName: a string(128), matching ^[A-Za-z0-9_\-]+$, except {list}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      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
        }
      }
      
    • Response Data: PlacementGroup

Create and/or update a placement group (PlacementGroupUpdate)

If a group by the specified name does not exist, it will be created.

  1. Request:
    • Example HTTP Request:
      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, ...],
        "rename": PlacementGroupName /* Optional */,
        "rmDisks": [DiskID, ...]
      }
    • Method: POST
    • Path: /ctrl/1.0/PlacementGroupUpdate/{placementGroupName}
    • Arguments:
      • placementGroupName - PlacementGroupName: a string(128), matching ^[A-Za-z0-9_\-]+$, except {list}
    • JSON: PlacementGroupUpdateDesc
      • addDisks: IDs of the disks to add to this group.
      • rename: (Optional PlacementGroupName): The new name of the placement group.
      • rmDisks: IDs of the disks to be removed from this group.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Delete a placement group (PlacementGroupDelete)

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: POST
    • Path: /ctrl/1.0/PlacementGroupDelete/{placementGroupName}
    • Arguments:
      • placementGroupName - PlacementGroupName: a string(128), matching ^[A-Za-z0-9_\-]+$, except {list}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

List all fault sets (FaultSetsList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/FaultSetsList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/FaultSetsList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "PlacementGroupName": {
            "name": PlacementGroupName,
            "servers": [ServerID, ...]
          }, ...
        }
      }
      
    • Response Data: A dict from PlacementGroupName to FaultSet

List the properties of a volume allocation group (VagList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VagList/{vagName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VagList/{vagName}
    • Arguments:
      • vagName - VagId: integer, 1 <= value <= 18446744073709551616
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "chains": [[DiskID, ...], ...],
          "diskSetsConstraintsViolated": bool,
          "name": VagId,
          "overrides": {
            "OverrideId": [DiskID, ...], ...
          },
          "parentVagId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "targetDiskSets": [[DiskID, ...], ...],
          "templateId": int /* Internal */,
          "templateName": Either("", VolumeTemplateName),
          "vagId": int /* Internal */
        }
      }
      
    • Response Data: Vag
      • chains: The list of disks where the chains are stored.
          Element type:
      • diskSetsConstraintsViolated: (bool): Whether any constraint violations have been detected for this VAG
      • name: (VagId)
      • overrides: The disk set overrides for this VAG.A dict from OverrideId to [DiskID]
      • parentVagId: (Internal int): The ID of the parent volume allocation group.
      • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • replication: (Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): is it allowed to place replicas on the same server
      • targetDiskSets: The sets of disks that the volume's data should be stored on.
          Element type:
      • templateId: (Internal int)
      • templateName: The template that the volume/snapshot's settings are taken from.The value must be of one of the following types: "", VolumeTemplateName.
      • vagId: (Internal int): The ID of this volume allocation group

Update the allocation group of a volume (VolumeUpdateVag)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/VolumeUpdateVag/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "vagId": Either("parent", VagId)
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeUpdateVag/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: VolumeUpdateVagDesc
      • vagId: The numeric ID of the volume allocation group or the string "parent".The value must be of one of the following types: "parent", VagId.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Update the allocation group of a snapshot (SnapshotUpdateVag)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/SnapshotUpdateVag/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "vagId": Either("parent", VagId)
      }
    • Method: POST
    • Path: /ctrl/1.0/SnapshotUpdateVag/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: SnapshotUpdateVagDesc
      • vagId: The numeric ID of the volume allocation group or the string "parent".The value must be of one of the following types: "parent", VagId.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Update the targets of a volume allocation group (VagUpdate)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/VagUpdate HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "targetsCount": TargetsCount,
        "vagId": string
      }
    • Method: POST
    • Path: /ctrl/1.0/VagUpdate
    • Arguments: No arguments
    • JSON: VagUpdateDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Volume Templates

Templates are a set of rules used for creating many similar volumes.

List all volume templates (VolumeTemplatesList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeTemplatesList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeTemplatesList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      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,
          "limitType": LimitType /* Optional */,
          "name": VolumeTemplateName,
          "parentName": Either("", SnapshotName),
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "replication": Either("-", Replication),
          "reuseServer": bool /* Optional */,
          "size": Either("-", Size)
        }, ...]
      }
      
    • Response Data:
        Element type: VolumeTemplateDesc
        • bw: (Bandwidth): Bandwidth limit in KB.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • limitType: (Optional LimitType)
        • name: (VolumeTemplateName): The name of the template.
        • parentName: The name of the snapshot on which volumes will be based.The value must be of one of the following types: "", SnapshotName.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • replication: A default number of copies to be kept by StorPool.The value must be of one of the following types: "-", Replication.
        • reuseServer: (Optional bool): allow placement of replicas on same server.
        • size: A default size for the volumes (in bytes).The value must be of one of the following types: "-", Size.

List the status of all volume templates (VolumeTemplatesStatus)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeTemplatesStatus HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeTemplatesStatus
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "availablePlaceAll": int,
          "availablePlaceHead": int,
          "availablePlaceTail": int,
          "capacityPlaceAll": int,
          "capacityPlaceHead": int,
          "capacityPlaceTail": int,
          "id": int /* Internal */,
          "name": VolumeTemplateName,
          "onDiskSize": int,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "removingSnapshotsCount": int,
          "replication": Either("-", Replication),
          "size": Either(0, Size),
          "snapshotsCount": int,
          "snapshotsWithChildrenSize": Either(0, Size) /* Optional */,
          "snapshotsWithoutChildrenSize": Either(0, Size) /* Optional */,
          "stored": {
            "capacity": int,
            "free": int,
            "internal": {
              "u1": int,
              "u2": int,
              "u3": int
            } /* Internal */,
            "placeAll": {
              "capacity": int,
              "free": int,
              "internal": {
                "u1": int,
                "u2": int,
                "u3": int
              } /* Internal */
            },
            "placeHead": {
              "capacity": int,
              "free": int,
              "internal": {
                "u1": int,
                "u2": int,
                "u3": int
              } /* Internal */
            },
            "placeTail": {
              "capacity": int,
              "free": int,
              "internal": {
                "u1": int,
                "u2": int,
                "u3": int
              } /* Internal */
            }
          },
          "storedSize": int,
          "totalSize": Either(0, Size),
          "volumesCount": int,
          "volumesSize": Either(0, Size) /* Optional */
        }, ...]
      }
      
    • Response Data:
        Element type: VolumeTemplateStatusDesc
        • availablePlaceAll: (int): An estimate of the available space on all the disks in this template's
        • availablePlaceHead: (int): An estimate of the available space on all the disks in this template's
        • availablePlaceTail: (int): An estimate of the available space on all the disks in this template's
        • capacityPlaceAll: (int): An estimate of the total physical space on all the disks in this template's
        • capacityPlaceHead: (int): An estimate of the total physical space on all the disks in this template's
        • capacityPlaceTail: (int): An estimate of the total physical space on all the disks in this template's
        • id: (Internal int)
        • name: (VolumeTemplateName): The name of the template.
        • onDiskSize: (int): The actual on-disk number of bytes occupied by all the volumes based on this
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • removingSnapshotsCount: (int): The number of snapshots based on this template currently being deleted.
        • replication: The number of copies to be kept by StorPool if defined for this template,The value must be of one of the following types: "-", Replication.
        • size: The number of bytes of all volumes based on this template, not counting the StorPoolThe value must be of one of the following types: 0, Size.
        • snapshotsCount: (int): The number of snapshots based on this template
        • snapshotsWithChildrenSize: (Optional Either(0, Size)): The number of bytes provisioned for all snapshots in this template
        • snapshotsWithoutChildrenSize: (Optional Either(0, Size)): The number of bytes provisioned for all snapshots in this template
        • stored: Estimated client data capacity and free space.
          • capacity: (int): Estimated total client data capacity.
          • free: (int): Estimated free space remaining.
          • internal: (Internal VolumeTemplateSpaceEstInternal)
          • placeAll: placeAll placement group estimations.
          • placeHead: placeHead placement group estimations.
          • placeTail: placeTail placement group estimations.
        • storedSize: (int): The number of bytes of client data on all the volumes based on this template.
        • totalSize: The number of bytes of all volumes based on this template, including the StorPoolThe value must be of one of the following types: 0, Size.
        • volumesCount: (int): The number of volumes based on this template.
        • volumesSize: (Optional Either(0, Size)): The number of bytes provisioned for all volumes in this template.

Describe a single volume template (VolumeTemplateDescribe)

Same as VolumeTemplatesList but only return information about a given template.

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeTemplateDescribe/{templateName}
    • Arguments:
      • templateName - VolumeTemplateName: a string(200), matching ^[A-Za-z0-9_\-]+$, except {list}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      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,
          "limitType": LimitType /* Optional */,
          "name": VolumeTemplateName,
          "parentName": Either("", SnapshotName),
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "replication": Either("-", Replication),
          "reuseServer": bool /* Optional */,
          "size": Either("-", Size)
        }
      }
      
    • Response Data: VolumeTemplateDesc
      • bw: (Bandwidth): Bandwidth limit in KB.
      • id: (Internal int)
      • iops: (IOPS): iops limit.
      • limitType: (Optional LimitType)
      • name: (VolumeTemplateName): The name of the template.
      • parentName: The name of the snapshot on which volumes will be based.The value must be of one of the following types: "", SnapshotName.
      • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • replication: A default number of copies to be kept by StorPool.The value must be of one of the following types: "-", Replication.
      • reuseServer: (Optional bool): allow placement of replicas on same server.
      • size: A default size for the volumes (in bytes).The value must be of one of the following types: "-", Size.

Create a volume template (VolumeTemplateCreate)

  1. Request:
    • Example HTTP Request:
      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 */,
        "placeHead": PlacementGroupName /* Optional */,
        "placeTail": PlacementGroupName /* Optional */,
        "replication": Replication /* Optional */,
        "reuseServer": bool /* Optional */,
        "size": Size /* Optional */,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeTemplateCreate
    • Arguments: No arguments
    • JSON: VolumeTemplateCreateDesc
      • bw: (Optional Bandwidth): Bandwidth limit in KB.
      • iops: (Optional IOPS): iops limit.
      • name: (VolumeTemplateName): The name of the new template.
      • parent: (Optional SnapshotName): The name of the snapshot on which to base volumes created by this template.
      • placeAll: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • replication: (Optional Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): allow placement of replicas on same server.
      • size: (Optional Size): A default size for the volumes (in bytes).
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Optional name=value tags.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Update a volume template (VolumeTemplateUpdate)

Alter the configuration of an existing volume template.

  1. Request:
    • Example HTTP Request:
      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 */,
        "placeHead": PlacementGroupName /* Optional */,
        "placeTail": PlacementGroupName /* Optional */,
        "propagate": bool /* Optional */,
        "rename": VolumeTemplateName /* Optional */,
        "replication": Replication /* Optional */,
        "reuseServer": bool /* Optional */,
        "size": Size /* Optional */,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeTemplateUpdate/{templateName}
    • Arguments:
      • templateName - VolumeTemplateName: a string(200), matching ^[A-Za-z0-9_\-]+$, except {list}
    • JSON: VolumeTemplateUpdateDesc
      • bw: (Optional Bandwidth): Bandwidth limit in KB.
      • iops: (Optional IOPS): iops limit.
      • parent: (Optional SnapshotName): The name of the snapshot on which to base volumes created by this template.
      • placeAll: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • propagate: (Optional bool): Whether to propagate this change to all the volumes and snapshots using this template
      • rename: (Optional VolumeTemplateName): The new name of the template.
      • replication: (Optional Replication): The number of copies/replicas kept.
      • reuseServer: (Optional bool): allow placement of replicas on same server.
      • size: (Optional Size): A default size for the volumes (in bytes).
      • tags: (Optional {VolumeTagName: VolumeTagValue}): Optional name=value tags.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Delete a volume template (VolumeTemplateDelete)

  1. Request:
    • Example HTTP Request:
      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
      
    • Method: POST
    • Path: /ctrl/1.0/VolumeTemplateDelete/{templateName}
    • Arguments:
      • templateName - VolumeTemplateName: a string(200), matching ^[A-Za-z0-9_\-]+$, except {list}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Volume Relocator

This is a service that moves data when needed, e.g. when removing or adding disks.

Get the relocator's status (VolumeRelocatorStatus)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeRelocatorStatus HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeRelocatorStatus
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "recoveringFromRemote": int /* Optional */,
          "status": RelocatorStatus,
          "volumesToRelocate": int
        }
      }
      
    • Response Data: VolumeRelocatorStatus
      • recoveringFromRemote: (Optional int): Number of volumes currently being recovered from a remote location.
      • status: (RelocatorStatus)
      • volumesToRelocate: (int): Number of volumes currently being relocated.

List total per disk relocation estimates (VolumeRelocatorDisksList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeRelocatorDisksList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeRelocatorDisksList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "DiskID": Either({
            "generationLeft": -1,
            "id": DiskID,
            "objectsAllocated": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "objectsCount": int,
            "onDiskSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "serverId": ServerID,
            "storedSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            }
          }, {
            "generationLeft": int,
            "id": DiskID,
            "serverId": ServerID
          }), ...
        }
      }
      
    • Response Data: A dict from DiskID to Either(UpDiskTarget, DownDiskTarget)
      • Key type: DiskID
      • Value type: The value must be of one of the following types: UpDiskTarget, DownDiskTarget.
          Subtypes:
        • UpDiskTarget
          • generationLeft: (-1): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • objectsAllocated: Statistics about the amount of objects to be allocated on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • objectsCount: (int): The maximum amount of object that can exists on the disk.
          • onDiskSize: Statistics about the total amount of space occupied by the objects on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • serverId: (ServerID): The ID of the server this disk was last on.
          • storedSize: Statistics about the amount of cilent data to be stored on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
        • DownDiskTarget
          • generationLeft: (int): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • serverId: (ServerID): The ID of the server this disk was last on.

List per disk relocation estimates for a given volume (VolumeRelocatorVolumeDisks)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeRelocatorVolumeDisks/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeRelocatorVolumeDisks/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "DiskID": Either({
            "generationLeft": -1,
            "id": DiskID,
            "objectsAllocated": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "objectsCount": int,
            "onDiskSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "serverId": ServerID,
            "storedSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            }
          }, {
            "generationLeft": int,
            "id": DiskID,
            "serverId": ServerID
          }), ...
        }
      }
      
    • Response Data: A dict from DiskID to Either(UpDiskTarget, DownDiskTarget)
      • Key type: DiskID
      • Value type: The value must be of one of the following types: UpDiskTarget, DownDiskTarget.
          Subtypes:
        • UpDiskTarget
          • generationLeft: (-1): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • objectsAllocated: Statistics about the amount of objects to be allocated on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • objectsCount: (int): The maximum amount of object that can exists on the disk.
          • onDiskSize: Statistics about the total amount of space occupied by the objects on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • serverId: (ServerID): The ID of the server this disk was last on.
          • storedSize: Statistics about the amount of cilent data to be stored on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
        • DownDiskTarget
          • generationLeft: (int): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • serverId: (ServerID): The ID of the server this disk was last on.

List per disk relocation estimates for a given snapshot (VolumeRelocatorSnapshotDisks)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeRelocatorSnapshotDisks/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeRelocatorSnapshotDisks/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "DiskID": Either({
            "generationLeft": -1,
            "id": DiskID,
            "objectsAllocated": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "objectsCount": int,
            "onDiskSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "serverId": ServerID,
            "storedSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            }
          }, {
            "generationLeft": int,
            "id": DiskID,
            "serverId": ServerID
          }), ...
        }
      }
      
    • Response Data: A dict from DiskID to Either(UpDiskTarget, DownDiskTarget)
      • Key type: DiskID
      • Value type: The value must be of one of the following types: UpDiskTarget, DownDiskTarget.
          Subtypes:
        • UpDiskTarget
          • generationLeft: (-1): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • objectsAllocated: Statistics about the amount of objects to be allocated on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • objectsCount: (int): The maximum amount of object that can exists on the disk.
          • onDiskSize: Statistics about the total amount of space occupied by the objects on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • serverId: (ServerID): The ID of the server this disk was last on.
          • storedSize: Statistics about the amount of cilent data to be stored on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
        • DownDiskTarget
          • generationLeft: (int): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • serverId: (ServerID): The ID of the server this disk was last on.

Balancer

This is a service that decides when it is a good time to move data.

Get the balancer's status (VolumeBalancerStatus)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeBalancerStatus HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeBalancerStatus
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "auto": bool,
          "status": BalancerStatus
        }
      }
      
    • Response Data: VolumeBalancerStatus
      • auto: (bool): Is balancer running in automatic mode.
      • status: (BalancerStatus): The current balancer status.

Set the balancer's status (VolumeBalancerStatus)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/VolumeBalancerStatus HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "cmd": BalancerCommand
      }
    • Method: POST
    • Path: /ctrl/1.0/VolumeBalancerStatus
    • Arguments: No arguments
    • JSON: VolumeBalancerCommand
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

List balancer volume and snapshot status (VolumeBalancerVolumesStatus)

Show which volumes and snapshots will be reallocated by the current balancer run.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeBalancerVolumesStatus HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeBalancerVolumesStatus
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": [{
          "blocked": bool,
          "name": Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId),
          "objectsCount": int,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "reallocated": bool,
          "replication": Replication,
          "size": int,
          "snapshot": bool
        }, ...]
      }
      
    • Response Data:
        Element type: VolumeBalancerVolumeStatus
        • blocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current placement
        • name: The volume's name.The value must be of one of the following types: VolumeNameOrGlobalId, SnapshotNameOrGlobalId.
        • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
        • reallocated: (bool): is this volume/snapshot going to reallocated by the balancing procedure.
        • replication: (Replication): The number of copies/replicas kept.
        • size: (int): The volume's size in bytes.
        • snapshot: (bool): True if this response describes a snapshot instead of a volume.

List total per disk rebalancing estimates (VolumeBalancerDisksList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeBalancerDisksList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeBalancerDisksList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "DiskID": Either({
            "generationLeft": -1,
            "id": DiskID,
            "objectsAllocated": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "objectsCount": int,
            "onDiskSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "serverId": ServerID,
            "storedSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            }
          }, {
            "generationLeft": int,
            "id": DiskID,
            "serverId": ServerID
          }), ...
        }
      }
      
    • Response Data: A dict from DiskID to Either(UpDiskTarget, DownDiskTarget)
      • Key type: DiskID
      • Value type: The value must be of one of the following types: UpDiskTarget, DownDiskTarget.
          Subtypes:
        • UpDiskTarget
          • generationLeft: (-1): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • objectsAllocated: Statistics about the amount of objects to be allocated on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • objectsCount: (int): The maximum amount of object that can exists on the disk.
          • onDiskSize: Statistics about the total amount of space occupied by the objects on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • serverId: (ServerID): The ID of the server this disk was last on.
          • storedSize: Statistics about the amount of cilent data to be stored on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
        • DownDiskTarget
          • generationLeft: (int): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • serverId: (ServerID): The ID of the server this disk was last on.

List per disk rebalancing estimated for a given volume (VolumeBalancerVolumeDisks)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeBalancerVolumeDisks/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeBalancerVolumeDisks/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "DiskID": Either({
            "generationLeft": -1,
            "id": DiskID,
            "objectsAllocated": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "objectsCount": int,
            "onDiskSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "serverId": ServerID,
            "storedSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            }
          }, {
            "generationLeft": int,
            "id": DiskID,
            "serverId": ServerID
          }), ...
        }
      }
      
    • Response Data: A dict from DiskID to Either(UpDiskTarget, DownDiskTarget)
      • Key type: DiskID
      • Value type: The value must be of one of the following types: UpDiskTarget, DownDiskTarget.
          Subtypes:
        • UpDiskTarget
          • generationLeft: (-1): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • objectsAllocated: Statistics about the amount of objects to be allocated on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • objectsCount: (int): The maximum amount of object that can exists on the disk.
          • onDiskSize: Statistics about the total amount of space occupied by the objects on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • serverId: (ServerID): The ID of the server this disk was last on.
          • storedSize: Statistics about the amount of cilent data to be stored on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
        • DownDiskTarget
          • generationLeft: (int): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • serverId: (ServerID): The ID of the server this disk was last on.

List per disk rebalancing estimates for a given snapshot (VolumeBalancerSnapshotDisks)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeBalancerSnapshotDisks/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeBalancerSnapshotDisks/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "DiskID": Either({
            "generationLeft": -1,
            "id": DiskID,
            "objectsAllocated": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "objectsCount": int,
            "onDiskSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            },
            "serverId": ServerID,
            "storedSize": {
              "current": int,
              "delta": int,
              "target": int,
              "toRecover": int
            }
          }, {
            "generationLeft": int,
            "id": DiskID,
            "serverId": ServerID
          }), ...
        }
      }
      
    • Response Data: A dict from DiskID to Either(UpDiskTarget, DownDiskTarget)
      • Key type: DiskID
      • Value type: The value must be of one of the following types: UpDiskTarget, DownDiskTarget.
          Subtypes:
        • UpDiskTarget
          • generationLeft: (-1): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • objectsAllocated: Statistics about the amount of objects to be allocated on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • objectsCount: (int): The maximum amount of object that can exists on the disk.
          • onDiskSize: Statistics about the total amount of space occupied by the objects on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
          • serverId: (ServerID): The ID of the server this disk was last on.
          • storedSize: Statistics about the amount of cilent data to be stored on this disk.
            • current: (int): The current value.
            • delta: (int): The difference between the target and current values.
            • target: (int): The target value.
            • toRecover: (int): The amount that will have to be recovered to get from the current to the target state
        • DownDiskTarget
          • generationLeft: (int): The last cluster generation when the disk was active on a running server.
          • id: (DiskID): The ID of this disk.
          • serverId: (ServerID): The ID of the server this disk was last on.

Get the disk sets computed by the balancer for a given volume (VolumeBalancerVolumeDiskSets)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeBalancerVolumeDiskSets/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeBalancerVolumeDiskSets/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "balancerDiskSets": [[DiskID, ...], ...],
          "blocked": bool,
          "currentDiskSets": [[DiskID, ...], ...],
          "name": Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId),
          "objectsCount": int,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "reallocated": bool,
          "replication": Replication,
          "size": int,
          "snapshot": bool
        }
      }
      
    • Response Data: VolumeBalancerVolumeDiskSets
      • balancerDiskSets: The new sets of disks that the volume's data should be stored on according to
          Element type:
      • blocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current placement
      • currentDiskSets: The current sets of disks that the volume's data should be stored on.
          Element type:
      • name: The volume's name.The value must be of one of the following types: VolumeNameOrGlobalId, SnapshotNameOrGlobalId.
      • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
      • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • reallocated: (bool): is this volume/snapshot going to reallocated by the balancing procedure.
      • replication: (Replication): The number of copies/replicas kept.
      • size: (int): The volume's size in bytes.
      • snapshot: (bool): True if this response describes a snapshot instead of a volume.

Get the disk sets computed by the balancer for a given snapshot (VolumeBalancerSnapshotDiskSets)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeBalancerSnapshotDiskSets/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/VolumeBalancerSnapshotDiskSets/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "balancerDiskSets": [[DiskID, ...], ...],
          "blocked": bool,
          "currentDiskSets": [[DiskID, ...], ...],
          "name": Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId),
          "objectsCount": int,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "reallocated": bool,
          "replication": Replication,
          "size": int,
          "snapshot": bool
        }
      }
      
    • Response Data: VolumeBalancerVolumeDiskSets
      • balancerDiskSets: The new sets of disks that the volume's data should be stored on according to
          Element type:
      • blocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current placement
      • currentDiskSets: The current sets of disks that the volume's data should be stored on.
          Element type:
      • name: The volume's name.The value must be of one of the following types: VolumeNameOrGlobalId, SnapshotNameOrGlobalId.
      • objectsCount: (int): The number of objects that the volume/snapshot is comprised of.
      • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the
      • reallocated: (bool): is this volume/snapshot going to reallocated by the balancing procedure.
      • replication: (Replication): The number of copies/replicas kept.
      • size: (int): The volume's size in bytes.
      • snapshot: (bool): True if this response describes a snapshot instead of a volume.

iSCSI

Get the StorPool iSCSI configuration (iSCSIConfig)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/iSCSIConfig HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/iSCSIConfig
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "iscsi": {
            "baseName": iSCSI Name,
            "initiators": {
              "ISCSIId": {
                "exports": [{
                  "portalGroup": iSCSI Portal Group Name,
                  "target": iSCSI Name
                }, ...],
                "name": iSCSI Name,
                "nets": [string, ...],
                "secret": string,
                "username": string
              }, ...
            },
            "portalGroups": {
              "int": {
                "name": iSCSI Portal Group Name,
                "networks": [{
                  "address": string,
                  "prefix": int
                }, ...],
                "portals": [{
                  "controller": ISCSIId,
                  "ip": string,
                  "port": string
                }, ...]
              }, ...
            },
            "targets": {
              "int": {
                "currentControllerId": int,
                "name": iSCSI Name,
                "volume": VolumeName
              }, ...
            }
          }
        }
      }
      
    • Response Data: ISCSIConfig
      • iscsi: The actual configuration data
        • baseName: (iSCSI Name): The StorPool cluster's iSCSI base name.
        • initiators: The iSCSI initiators allowed to access the cluster.A dict from ISCSIId to ISCSIInitiator
          • Key type: ISCSIId
          • Value type: ISCSIInitiator
            • exports:
            • name: (iSCSI Name): The iSCSI initiator's IQN.
            • nets: The networks this initiator will contact the iSCSI cluster on.
            • secret: (string): The password to authenticate the initiator with.
            • username: (string)
        • portalGroups: The iSCSI portal groups defined for the cluster.A dict from int to ISCSIPortalGroup
          • Key type: int
          • Value type: ISCSIPortalGroup
            • name: (iSCSI Portal Group Name): The iSCSI portal group name.
            • networks: The networks this portal group is accessible on.
                Element type: ISCSIPGNetwork
                • address: (string): The dotted-quad network address.
                • prefix: (int): The network's CIDR prefix length.
            • portals: The list of portals defined in this group.
                Element type: ISCSIPortal
                • controller: (ISCSIId): The StorPool iSCSI target service handling this portal.
                • ip: (string): The IP address for the portal.
                • port: (string): The TCP port for the portal.
        • targets: A dict from int to ISCSITarget
          • Key type: int
          • Value type: ISCSITarget
            • currentControllerId: (int): the StorPool iSCSI target service handling this target.
            • name: (iSCSI Name): The iSCSI name that the target is exposed as.
            • volume: (VolumeName): The name of the StorPool volume being exposed.

Modify the StorPool iSCSI configuration (iSCSIConfig)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/iSCSIConfig HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "commands": [{
          "createInitiator": {
            "name": iSCSI Name,
            "secret": string,
            "username": string
          } /* Optional */,
          "createPortal": {
            "controller": ISCSIId,
            "ip": string,
            "port": int /* Optional */,
            "portalGroup": iSCSI Portal Group Name
          } /* Optional */,
          "createPortalGroup": {
            "name": iSCSI Portal Group Name
          } /* Optional */,
          "createTarget": {
            "volumeName": VolumeName
          } /* Optional */,
          "deleteInitiator": {
            "name": iSCSI Name
          } /* Optional */,
          "deletePortal": {
            "ip": string,
            "port": int /* Optional */
          } /* Optional */,
          "deletePortalGroup": {
            "name": iSCSI Portal Group Name
          } /* Optional */,
          "deleteTarget": {
            "volumeName": VolumeName
          } /* Optional */,
          "export": {
            "initiator": iSCSI Name,
            "portalGroup": iSCSI Portal Group Name,
            "volumeName": VolumeName
          } /* Optional */,
          "exportDelete": {
            "initiator": iSCSI Name,
            "portalGroup": iSCSI Portal Group Name,
            "volumeName": VolumeName
          } /* Optional */,
          "initiatorAddNetwork": {
            "initiator": iSCSI Name,
            "net": string
          } /* Optional */,
          "portalGroupAddNetwork": {
            "net": string,
            "portalGroup": iSCSI Portal Group Name
          } /* Optional */,
          "setBaseName": {
            "name": iSCSI Name
          } /* Optional */
        }, ...]
      }
    • Method: POST
    • Path: /ctrl/1.0/iSCSIConfig
    • Arguments: No arguments
    • JSON: ISCSIConfigChange
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Query iSCSI controllers for active sessions (iSCSISessionsInfo)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/iSCSISessionsInfo HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "controllerIds": [ISCSIId, ...] /* Optional */,
        "msecsTimeout": int /* Optional */
      } /* Optional */
    • Method: GET
    • Path: /ctrl/1.0/iSCSISessionsInfo
    • Arguments: No arguments
    • JSON: Optional ISCSIControllersQuery
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "sessions": [{
            "ISID": string /* Optional */,
            "connectionId": int /* Optional */,
            "controllerId": ISCSIId,
            "initiator": string /* Optional */,
            "stats": {
              "dataIn": int,
              "dataOut": int,
              "login": int,
              "loginRsp": int,
              "logout": int,
              "logoutRsp": int,
              "nopIn": int,
              "nopOut": int,
              "r2t": int,
              "reject": int,
              "scsi": int,
              "scsiRsp": int,
              "snack": int,
              "task": int,
              "taskRsp": int,
              "text": int,
              "textRsp": int
            } /* Optional */,
            "status": string,
            "target": string /* Optional */,
            "tasks": {
              "aborted": int,
              "dataOut": int,
              "dataResp": int,
              "inFreeList": int,
              "processing": int,
              "queued": int
            } /* Optional */,
            "tcp": {
              "hwPort": int,
              "initiatorIP": string,
              "initiatorPort": int,
              "localMSS": int,
              "portalIP": string,
              "portalPort": int,
              "remoteMSS": int,
              "remoteWindowSize": int,
              "stats": {
                "dataHoles": int,
                "discardedBytes": int,
                "discardedPackets": int,
                "newBytesIn": int,
                "newBytesOut": int,
                "newPacketsIn": int,
                "newPacketsOut": int,
                "retransmitsAcks": int,
                "retransmitsAcks2": int,
                "retransmitsTimeout": int,
                "retransmittedBytes": int,
                "retransmittedPackets": int,
                "totalBytesIn": int,
                "totalBytesOut": int,
                "totalPacketsIn": int,
                "totalPacketsOut": int
              },
              "wscale": int
            } /* Optional */,
            "timeCreated": int /* Optional */
          }, ...]
        }
      }
      
    • Response Data: ISCSISessionsInfo
      • sessions: list of sessions
          Element type: ISCSISessionInfo
          • ISID: (Optional string): session ISID
          • connectionId: (Optional int)
          • controllerId: (ISCSIId): controller id
          • initiator: (Optional string): iSCSI name of the initiator
          • stats: (Optional ISCSISessionStats): session stats
          • status: (string): ok or other
          • target: (Optional string)
          • tasks: (Optional ISCSISessionTasks): currently active tasks count by state
          • tcp: (Optional ISCSISessionTcp): session TCP info
          • timeCreated: (Optional int): unix timestamp when session was established

Query iSCSI controllers for interfaces state (iSCSInterfacesInfo)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/iSCSInterfacesInfo HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "controllerIds": [ISCSIId, ...] /* Optional */,
        "msecsTimeout": int /* Optional */
      } /* Optional */
    • Method: GET
    • Path: /ctrl/1.0/iSCSInterfacesInfo
    • Arguments: No arguments
    • JSON: Optional ISCSIControllersQuery
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "controllers": [{
            "controllerId": ISCSIId,
            "interfaces": [{
              "MAC": string,
              "interfaceName": string,
              "port": int,
              "resolveInterfaceName": string,
              "state": string
            }, ...] /* Optional */,
            "status": string
          }, ...]
        }
      }
      
    • Response Data: ISCSIControllersIntefacesInfo

Remote

List the registered remote locations (LocationsList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/LocationsList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/LocationsList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "str, default="locations"": [{
            "id": Global Location Id,
            "name": RemoteLocationName,
            "recvBufferSize": int,
            "sendBufferSize": int
          }, ...], ...
        }
      }
      
    • Response Data: A dict from str, default="locations" to [RemoteLocation]
      • Key type: str, default="locations"
      • Value type:
          Element type: RemoteLocation
          • id: (Global Location Id): A StorPool-provided unique location id.
          • name: (RemoteLocationName): The human-readable location name.
          • recvBufferSize: (int): the size of the TCP receive buffer for the location
          • sendBufferSize: (int): the size of the TCP send buffer for the location

Register a new remote location (LocationAdd)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/LocationAdd HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "id": Global Location Id,
        "name": RemoteLocationName
      }
    • Method: POST
    • Path: /ctrl/1.0/LocationAdd
    • Arguments: No arguments
    • JSON: RemoteLocationBase
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Remove a remote location (LocationRemove)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/LocationRemove HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "str, default="location"": RemoteLocationName, ...
      }
    • Method: POST
    • Path: /ctrl/1.0/LocationRemove
    • Arguments: No arguments
    • JSON: A dict from str, default="location" to RemoteLocationName
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Update a remote location (LocationUpdate)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/LocationUpdate HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "location": RemoteLocationName,
        "recvBufferSize": int /* Optional */,
        "sendBufferSize": int /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/LocationUpdate
    • Arguments: No arguments
    • JSON: RemoteLocationUpdateDesc
      • location: (RemoteLocationName): The human-readable location name.
      • recvBufferSize: (Optional int): the size of the TCP receive buffer for the location
      • sendBufferSize: (Optional int): the size of the TCP send buffer for the location
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Rename a remote location (LocationRename)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/LocationRename HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "location": RemoteLocationName,
        "name": RemoteLocationName
      }
    • Method: POST
    • Path: /ctrl/1.0/LocationRename
    • Arguments: No arguments
    • JSON: RemoteLocationRenameDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

List the registered remote clusters (ClustersList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/ClustersList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/ClustersList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "str, default="clusters"": [{
            "id": Subcluster Id,
            "location": RemoteLocationName,
            "name": RemoteClusterName
          }, ...], ...
        }
      }
      
    • Response Data: A dict from str, default="clusters" to [RemoteCluster]

Register a new remote cluster (ClusterAdd)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/ClusterAdd HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "id": Subcluster Id,
        "location": RemoteLocationName,
        "name": RemoteClusterName /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/ClusterAdd
    • Arguments: No arguments
    • JSON: RemoteClusterAddDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Remove a remote cluster (ClusterRemove)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/ClusterRemove HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "clusterWillNotBeComingBack": bool /* Optional */,
        "id": Subcluster Id /* Optional */,
        "location": RemoteLocationName /* Optional */,
        "name": RemoteClusterName /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/ClusterRemove
    • Arguments: No arguments
    • JSON: RemoteClusterRemoveDesc
      • clusterWillNotBeComingBack: (Optional bool): Set this flag if the remote cluster will not be registered again
      • id: (Optional Subcluster Id): A StorPool-provided unique cluster subid
      • location: (Optional RemoteLocationName): the cluster's location name
      • name: (Optional RemoteClusterName): The human-readable cluster name.
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Rename a remote cluster (ClusterRename)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/ClusterRename HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "cluster": RemoteClusterName,
        "name": RemoteClusterName
      }
    • Method: POST
    • Path: /ctrl/1.0/ClusterRename
    • Arguments: No arguments
    • JSON: RemoteClusterRenameDesc
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

List the registered remote bridges (RemoteBridgesList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/RemoteBridgesList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/RemoteBridgesList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "str, default="remoteBridges"": [{
            "cluster": RemoteClusterName /* Optional */,
            "ip": string,
            "location": RemoteLocationName,
            "minimumDeleteDelay": int /* Optional */,
            "noCrypto": bool /* Optional */,
            "publicKey": string,
            "remote": Either(RemoteClusterName, RemoteLocationName)
          }, ...], ...
        }
      }
      
    • Response Data: A dict from str, default="remoteBridges" to [RemoteBridge]
      • Key type: str, default="remoteBridges"
      • Value type:
          Element type: RemoteBridge
          • cluster: (Optional RemoteClusterName): the cluster of the remote bridge
          • ip: (string): the ip address of the remote bridge
          • location: (RemoteLocationName): the location of the remote bridge
          • minimumDeleteDelay: (Optional int): minimum value for the deferred deletion
          • noCrypto: (Optional bool): Set this flag if the connection with the remote bridge should not be encrypted
          • publicKey: (string): the public key of the remote bridge
          • remote: the cluster or the location of the remote bridgeThe value must be of one of the following types: RemoteClusterName, RemoteLocationName.

Register a new remote bridge (RemoteBridgeAdd)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/RemoteBridgeAdd HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      Either({
        "ip": string,
        "location": RemoteLocationName,
        "minimumDeleteDelay": int /* Optional */,
        "noCrypto": bool /* Optional */,
        "publicKey": string
      }, {
        "ip": string,
        "minimumDeleteDelay": int /* Optional */,
        "noCrypto": bool /* Optional */,
        "publicKey": string,
        "remote": RemoteClusterName
      })
    • Method: POST
    • Path: /ctrl/1.0/RemoteBridgeAdd
    • Arguments: No arguments
    • JSON: The value must be of one of the following types: RemoteBridgeAddLocationDesc, RemoteBridgeAddClusterDesc.
        Subtypes:
      • RemoteBridgeAddLocationDesc
        • ip: (string): the ip address of the remote bridge
        • location: (RemoteLocationName): the location of the remote bridge
        • minimumDeleteDelay: (Optional int): minimum value for the deferred deletion
        • noCrypto: (Optional bool): Set this flag if the connection with the remote bridge should not be encrypted
        • publicKey: (string): the public key of the remote bridge
      • RemoteBridgeAddClusterDesc
        • ip: (string): the ip address of the remote bridge
        • minimumDeleteDelay: (Optional int): minimum value for the deferred deletion
        • noCrypto: (Optional bool): Set this flag if the connection with the remote bridge should not be encrypted
        • publicKey: (string): the public key of the remote bridge
        • remote: (RemoteClusterName): the cluster of the remote bridge
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Deregister a remote bridge (RemoteBridgeRemove)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/RemoteBridgeRemove HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "ip": string
      }
    • Method: POST
    • Path: /ctrl/1.0/RemoteBridgeRemove
    • Arguments: No arguments
    • JSON: RemoteBridgeRemoveDesc
      • ip: (string): the ip address of the remote bridge
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Nodes in maintenance

List the nodes in maintenance (MaintenanceList)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MaintenanceList HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MaintenanceList
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "nodes": [{
            "description": string,
            "duration": int,
            "nodeId": int,
            "overrun": bool,
            "remaining": int /* Optional */,
            "started": int
          }, ...]
        }
      }
      
    • Response Data: MaintenanceNodesList
      • nodes:
          Element type: MaintenanceNodeDesc
          • description: (string): human-readable information
          • duration: (int): planned duration of the maintenance
          • nodeId: (int): The id of the node in maintenance,
          • overrun: (bool): true if the duration has passed
          • remaining: (Optional int)
          • started: (int): unix timestamp the maintenance was started

Set node in maintenance (MaintenanceSet)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MaintenanceSet HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "description": string,
        "duration": int,
        "maxNodesInMaintenance": int /* Optional */,
        "maxReplicationDecrease": int /* Optional */,
        "minOkReplicas": int /* Optional */,
        "nodeId": int,
        "votingSafetyMargin": int /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/MaintenanceSet
    • Arguments: No arguments
    • JSON: MaintenanceSetDesc
      • description: (string): human-readable information
      • duration: (int): Period of time after which the maintenance will expire automatically.
      • maxNodesInMaintenance: (Optional int): maximum number of nodes simultaneously in maintenance
      • maxReplicationDecrease: (Optional int): same as minOkReplicas = volume.replication - maxReplicationDecrease
      • minOkReplicas: (Optional int): the minimum ok copies of all data that has a copy on the node that must remain
      • nodeId: (int): The id of the node which will be set in maintenance.
      • votingSafetyMargin: (Optional int): number of voting nodes that must be alive above the 1/2 + 1 minimum
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Complete node's maintenance. (MaintenanceComplete)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MaintenanceComplete HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "nodeId": int
      }
    • Method: POST
    • Path: /ctrl/1.0/MaintenanceComplete
    • Arguments: No arguments
    • JSON: MaintenanceCompleteDesc
      • nodeId: (int): The id of the node to unset maintenance mode for
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Key Value Store

List all created key value buckets (KV)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/KV HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/KV
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "buckets": {
            "KvsName": int, ...
          }
        }
      }
      
    • Response Data: KeyValueBucketsList
      • buckets: A dict from KvsName to int

List a complete key value bucket (KV)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/KV/List/{bucketName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/KV/List/{bucketName}
    • Arguments:
      • bucketName - KvsName: a string(1023), matching ^\#?[A-Za-z0-9_\-.:]+$, except {}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "name": KvsName,
          "pairs": {
            "KvsKeyName": string, ...
          } /* Optional */,
          "version": int
        }
      }
      
    • Response Data: KeyValueBucket
      • name: (KvsName): name of the bucket
      • pairs: (Optional {KvsKeyName: str})
      • version: (int): change version of the bucket, increments with each change

List a specific key-value pair from a specific bucket (KV)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/KV/Get/{bucketName}/{keyName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/KV/Get/{bucketName}/{keyName}
    • Arguments:
      • bucketName - KvsName: a string(1023), matching ^\#?[A-Za-z0-9_\-.:]+$, except {}
      • keyName - KvsKeyName: a string with a max length of 1023
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "name": KvsName,
          "pairs": {
            "KvsKeyName": string, ...
          } /* Optional */,
          "version": int
        }
      }
      
    • Response Data: KeyValueBucket
      • name: (KvsName): name of the bucket
      • pairs: (Optional {KvsKeyName: str})
      • version: (int): change version of the bucket, increments with each change

Create a new bucket (KV)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/KV/Create/{bucketName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: POST
    • Path: /ctrl/1.0/KV/Create/{bucketName}
    • Arguments:
      • bucketName - KvsName: a string(1023), matching ^\#?[A-Za-z0-9_\-.:]+$, except {}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Delete a bucket (KV)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/KV/Delete/{bucketName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: POST
    • Path: /ctrl/1.0/KV/Delete/{bucketName}
    • Arguments:
      • bucketName - KvsName: a string(1023), matching ^\#?[A-Za-z0-9_\-.:]+$, except {}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Update a bucket (KV)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/KV/Set/{bucketName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      {
        "runIfVersionIs": int /* Optional */,
        "set": {
          "KvsKeyName": string, ...
        }
      }
    • Method: POST
    • Path: /ctrl/1.0/KV/Set/{bucketName}
    • Arguments:
      • bucketName - KvsName: a string(1023), matching ^\#?[A-Za-z0-9_\-.:]+$, except {}
    • JSON: KeyValueBucketSetDesc
      • runIfVersionIs: (Optional int): if versions don't match, don't execute the command
      • set: list of key-value pairs to set / update / delete (empty value = deletion)A dict from KvsKeyName to str
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Metadata volumes

Read the data from a metadata volume (MetadataVolumeRead)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MetadataVolumeRead/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MetadataVolumeRead/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": bytes
      }
      
    • Response Data: bytes

Read the data from a metadata snapshot (MetadataSnapshotRead)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/MetadataSnapshotRead/{snapshotName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/MetadataSnapshotRead/{snapshotName}
    • Arguments:
      • snapshotName - SnapshotNameOrGlobalId: a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": bytes
      }
      
    • Response Data: bytes

Write the data to a metadata volume. (MetadataVolumeWrite)

  1. Request:
    • Example HTTP Request:
      POST /ctrl/1.0/MetadataVolumeWrite/{volumeName} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      bytes
    • Method: POST
    • Path: /ctrl/1.0/MetadataVolumeWrite/{volumeName}
    • Arguments:
      • volumeName - VolumeNameOrGlobalId: a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
    • JSON: bytes
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "generation": int,
          "info": string /* Optional */,
          "ok": true
        }
      }
      
    • Response Data: ApiOk
      • generation: (int): The cluster generation based on the number of configuration changes since the
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

StorPool Features

Show information about StorPool features (Features)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/Features HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/Features
    • Arguments: No arguments
    • JSON: Either no JSON or {}
  2. Response:
    • Example HTTP Response:
      HTTP/1.0 200 OK
      Connection: close
      Content-Type: application/json
      Cache-control: private
      Content-Length: LENGTH
      
      {
        "generation": generation,
        "data": {
          "features": [{
            "canBeEnabled": bool /* Optional */,
            "enableBlockedBy": bool /* Optional */,
            "enabled": bool,
            "name": string,
            "upgradeCompleted": bool /* Optional */
          }, ...]
        }
      }
      
    • Response Data: FeaturesList
      • features: List of all the features and information about them
          Element type: Feature
          • canBeEnabled: (Optional bool): only shows if the feature is disabled, indicates if it can be enabled
          • enableBlockedBy: (Optional bool): indicates the reason the feature cannot be enabled
          • enabled: (bool): shows if the feature is enabled or not
          • name: (string): name of the feature
          • upgradeCompleted: (Optional bool)

Data Types

"":The constant value "".
"-":The constant value "-".
"all":The constant value "all".
"diskExpected":The constant value "diskExpected".
"diskState":The constant value "diskState".
"parent":The constant value "parent".
"request":The constant value "request".
-1:The constant value -1.
0:The constant value 0.
4294967294:The constant value 4294967294.
AttachmentPos:integer, 0 <= value <= 1023
AttachmentRights:One of {"rw", "ro"}
BalancerCommand:One of {"start", "stop", "commit"}
BalancerStatus:One of {"nothing to do", "blocked", "waiting", "working", "ready", "committing"}
Bandwidth:a positive integer or '-' for unlimited
BeaconClusterStatus:One of {"CNODE_DOWN", "CNODE_DAMPING", "CNODE_UP"}
BeaconNodeStatus:One of {"NODE_DOWN", "NODE_UP"}
BridgeId:integer, 1 <= value <= 4095
BridgeStatus:One of {"running", "joining", "down"}
ClientID:integer, 1 <= value <= 4095
ClientStatus:One of {"running", "down"}
ClusterName:a string(64), matching ^\#?[A-Za-z0-9_\-.:]+$, except {}
ClusterStatus:One of {"running", "waiting", "down"}
DeleteBlocked:One of {"not blocked", "pending", "rebasing", "flushing", "volume not found", "generation mismatch", "disk down", "multiple children", "peer down", "write not completed", "recovering from remote", "parent recovering from remote", "moving to remote", "unknown", "ec snapshot"}
DematerializationStatus:One of {"pending", "allObjectsUsed", "complete", "blockedRelocate", "blockedParentRelocate", "blockedParentRemoving", "blockedParentDifferentVag", "destroyed", "rebased"}
DiskDescritpion:string, regex ^[A-Za-z0-9_\- ]{,30}$
DiskID:integer, 0 <= value <= 4095
DiskSoftEjectStatus:One of {"on", "off", "paused"}
DiskState:One of {"DISK_NONE", "DISK_UNKNOWN", "DISK_DATA_INITIALIZING", "DISK_DATA_PENDING_INSERT", "DISK_DATA", "DISK_DATA_STOPPING", "DISK_DATA_FLUSH_WBC", "DISK_DATA_STOPPED", "DISK_STOPPING", "DISK_EJECTED", "DISK_JOURNAL", "DISK_JOURNAL_PENDING"}
GUID:string, regex ^0x[0-9a-fA-F]{2,16}$
Global Location Id:string, regex [a-z0-9]+$
Global Volume Id:string, regex [a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$
IOPS:a positive integer or '-' for unlimited
ISCSIId:integer, 0 <= value <= 4095
Id:One of {"bridge", "server", "iSCSI", "client", "unknown"}
KvsKeyName:a string with a max length of 1023
KvsName:a string(1023), matching ^\#?[A-Za-z0-9_\-.:]+$, except {}
LastState:One of {"up", "down"}
LimitType:One of {"total", "perGiB"}
MAC Address:string, regex ^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$
MgmtID:integer, 1 <= value <= 4095
MultiClusterState:One of {"owner", "ownerExported", "slaveCopy", "clusterLocal", "clusterLocalExported", "clusterLocalAutoReconcile", "clusterLocalAutoReconcileExported"}
NetID:integer, 0 <= value <= 3
NodeID:integer, 0 <= value <= 63
ObjectState:ObjectState, enumeration from 0 to 9
OnAttached:One of {"fail", "detach", "detachForce", "export"}
OverrideId:a positive integer or '-' for unlimited
PeerID:integer, 0 <= value <= 65535
PeerStatus:One of {"up", "down"}
PlacementGroupName:a string(128), matching ^[A-Za-z0-9_\-]+$, except {list}
RdmaState:One of {"Idle", "GidReceived", "Connecting", "Connected", "pendingError", "Error"}
RelocatorStatus:One of {"on", "off", "blocked"}
RemoteClusterName:a string(64), matching ^\#?[A-Za-z0-9_\-.:]+$, except {list}
RemoteLocationName:a string(64), matching ^\#?[A-Za-z0-9_\-.:]+$, except {list}
Replication:integer, 1 <= value <= 3
RequestOp:One of {"read", "write", "merge", "system", "entries flush", "#bad_state", "#bad_drOp", "idle", "error recovery", "transaction", "data recovery"}
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}
SnapshotNameOrGlobalId:a string(200), matching ^\*?[A-Za-z0-9_\-.:@]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
Status:One of {"peer_down", "peerDone", "timeout", "streamNotConnected", "streamOverfilled", "invalidResponse"}
Subcluster Id:string, regex [a-z0-9]+$
TargetsCount:One of {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768}
VagId:integer, 1 <= value <= 18446744073709551616
VolumeCurrentStatus:One of {"up", "up soon", "data lost", "down"}
VolumeName:a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$, except {list, status}
VolumeNameOrGlobalId:a string(200), matching ^\#?[A-Za-z0-9_\-.:]+$|^~[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+$, except {list, status}
VolumeTagName:a string(200), matching ^[A-Za-z0-9_\-.:]+$, except {}
VolumeTagValue:a string(200), matching ^[A-Za-z0-9_\-.:]*$, except {}
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.
bytes:Bytes sequence.
client status:One of {"ok", "updating", "down"}
float:A floating point number.
iSCSI Name:string, regex ^[a-z0-9\-.:]+$
iSCSI Portal Group Name:string, regex ^[A-Za-z0-9_\-.:]+$
int:An integer value.
iscsiTargetId:integer, 1 <= value <= 4095
iscsiTargetStatus:One of {"running", "joining", "down"}
mc:One of {"backup", "user"}
move:One of {"export"}
null:The constant value null.
str, default="clusters":A value of type str. Default value = clusters.
str, default="exports":A value of type str. Default value = exports.
str, default="location":A value of type str. Default value = location.
str, default="locations":A value of type str. Default value = locations.
str, default="remoteBridges":A value of type str. Default value = remoteBridges.
str, default="snapshots":A value of type str. Default value = snapshots.
str, default="volumes":A value of type str. Default value = volumes.
string:A string value.
true:The constant value true.