REST API

StorPool API Reference

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

  1. General
  2. Peers
    1. List the network peers
  3. Tasks
    1. List tasks
  4. Services
    1. List all StorPool services
    2. List all blocked StorPool servers
  5. Servers
    1. List all Storpool servers
    2. List all disks on a server
    3. Describe a disk on a server
  6. 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
  7. Disks
    1. List all disks
    2. Describe a disk
    3. Get disk info
    4. Eject a disk
    5. Forget a disk
    6. Ignore a disk
    7. Soft-eject a disk
    8. Pause a disk's soft-eject operation
    9. Cancel a disk's soft-eject operation
    10. Set a disk's description
    11. List all the active requests on a disk
    12. Start scrubbing process
    13. Pause scrubbing process
    14. Continue paused scrubbing process
    15. Retrim disk
  8. Volumes
    1. List all volumes
    2. Get volume and snapshot status
    3. List total used space by each volume
    4. List a single volume
    5. Describe a volume
    6. Get volume info
    7. List the parent snapshots of a volume
    8. Create a new volume
    9. Update a volume
    10. Freeze a volume
    11. Rebase a volume
    12. Abandon disk
    13. Delete a volume
    14. Backup a volume to a remote location
    15. Backup a group of volumes to a remote location
    16. Move a volume from local cluster to a remote cluster
    17. Export a volume to another cluster, so it can be attached when allowRemoteExports is true
    18. move the volume from its current remote cluster to the local one. Noop if already here. Multicluster only call
    19. Create a volume from a snapshot from a remote location
  9. 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 a snapshot by global id
    12. Create consistent snapshots of a group of volumes
    13. Copy a snapshot from a remote location
    14. Allow a remote location to access a local snapshot
    15. Revoke a remote location's access to a local snapshot
    16. List exported snapshots
    17. List exported volumes
    18. List the available remote snapshots
    19. List the available remote volumes
    20. Instruct the remote location that we will no longer use those snapshots
  10. Attachments
    1. List all attachments
    2. Reassign volumes and/or snapshots
    3. Reassign volumes and/or snapshots with confirmation from the clients
  11. 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
  12. Volume 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
  13. 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
  14. 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
    9. List balancer allocation groups
  15. iSCSI
    1. Get the StorPool iSCSI configuration
    2. Modify the StorPool iSCSI configuration
  16. Remote
    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
    13. query iSCSI controllers for active sessions
    14. query iSCSI controllers for interfaces state
    15. query all peers for their status and active requests
    16. List the nodes in maintenance
    17. Set node in maintenance
    18. complete node's maintenance.
    19. revert volume to a snapshot discarding all its current data
  17. 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 'pypi install storpool' to install them):

# Use the default StorPool configuration settings

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

# 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'
          }
        }
  }
}

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/<clusterName>/" 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

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 disk ID 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 tasks running on different disks but initiated by the same action (e.g. when reallocating a volume, all tasks associated with that volume will have the same ID).
        • 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,
          "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): The current status of the whole cluster. running - At least one running server; a cluster is formed. waiting - In quorum but negotiations between servers are not over yet. down - No quorum; most likely because more beacons are needed.
      • 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 active at any given time.
          • 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. This happens in the case of simultaneous failure of the whole cluster (power failure); the servers keep track of where the most recent configuration and data was stored.
          • 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 missing ones.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ServerStatus): down - There is no storpool_server daemon running or it is still recovering its drives from a crashed state. waiting - storpool_server is running but waiting for some disks to appear to prevent split-brain situations. booting - No missing disks; the server is in the process of joining the cluster ...
          • 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,
          "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): The current status of the whole cluster. running - At least one running server; a cluster is formed. waiting - In quorum but negotiations between servers are not over yet. down - No quorum; most likely because more beacons are needed.
      • 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 active at any given time.
          • 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. This happens in the case of simultaneous failure of the whole cluster (power failure); the servers keep track of where the most recent configuration and data was stored.
          • 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 missing ones.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ServerStatus): down - There is no storpool_server daemon running or it is still recovering its drives from a crashed state. waiting - storpool_server is running but waiting for some disks to appear to prevent split-brain situations. booting - No missing disks; the server is in the process of joining the cluster ...
          • version: (string): The version of the running StorPool service.

Servers

List all Storpool servers (ServersList)

Returns the the same output as ServicesList but ommits 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,
          "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): The current status of the whole cluster. running - At least one running server; a cluster is formed. waiting - In quorum but negotiations between servers are not over yet. down - No quorum; most likely because more beacons are needed.
      • 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 active at any given time.
          • 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. This happens in the case of simultaneous failure of the whole cluster (power failure); the servers keep track of where the most recent configuration and data was stored.
          • 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 missing ones.
          • startTime: The start time of this service (UNIX timestamp).The value must be of one of the following types: null, int.
          • status: (ServerStatus): down - There is no storpool_server daemon running or it is still recovering its drives from a crashed state. waiting - storpool_server is running but waiting for some disks to appear to prevent split-brain situations. booting - No missing disks; the server is in the process of joining the cluster ...
          • 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 if the disk is currently active.
          • 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.
          • 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. In essence, this is the estimated disk usage by StorPool.
          • scrubbedBytes: (int): For current scrubbing job run.
          • scrubbingBW: (int): Estimate of the disk BS used for scrubbing B/s.
          • scrubbingFinishAfter: (int): Extimate of when the scrubbing job is expected to finish based on scrubbingBW and current disk usage.
          • 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 amount of 512-byte sectors on the disk.
          • serial: (string): The drive's serial.
          • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down, the last known server ID is reported.
          • 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 if the disk is currently active.
          • 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.
          • serial: (string): The drive's serial.
          • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down, the last known server ID is reported.
          • 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 if the disk is currently active.
      • 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.
      • 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. In essence, this is the estimated disk usage by StorPool.
      • scrubbedBytes: (int): For current scrubbing job run.
      • scrubbingBW: (int): Estimate of the disk BS used for scrubbing B/s.
      • scrubbingFinishAfter: (int): Extimate of when the scrubbing job is expected to finish based on scrubbingBW and current disk usage.
      • 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 amount of 512-byte sectors on the disk.
      • serial: (string): The drive's serial.
      • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down, the last known server ID is reported.
      • 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. Only applicable to ClientConfigWait. Always 0 in ClientsConfigDump.
        • generation: (int): The cluster generation based on the number of configuration changes since the cluster was created.
        • 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. Only applicable to ClientConfigWait. Always 0 in ClientsConfigDump.
        • generation: (int): The cluster generation based on the number of configuration changes since the cluster was created.
        • 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. We strongly recommend that you do not use this attribute in any kind of automation.
          • msecActive: (int): Time in microseconds since the request was submitted.
          • op: (RequestOp): The type of the requested operation; one of read, write, system, merge, entries flush, #bad_state, #bad_drOp, idle, error recovery, transaction, data recovery
          • prevState: (Internal string): An internal attribute used only for debugging. We strongly recommend that you do not use this attribute in any kind of automation.
          • 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. We strongly recommend that you do not use this attribute in any kind of automation.
          • 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 if the disk is currently active.
          • 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.
          • 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. In essence, this is the estimated disk usage by StorPool.
          • scrubbedBytes: (int): For current scrubbing job run.
          • scrubbingBW: (int): Estimate of the disk BS used for scrubbing B/s.
          • scrubbingFinishAfter: (int): Extimate of when the scrubbing job is expected to finish based on scrubbingBW and current disk usage.
          • 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 amount of 512-byte sectors on the disk.
          • serial: (string): The drive's serial.
          • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down, the last known server ID is reported.
          • 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 if the disk is currently active.
          • 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.
          • serial: (string): The drive's serial.
          • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down, the last known server ID is reported.
          • 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 if the disk is currently active.
      • 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.
      • 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. In essence, this is the estimated disk usage by StorPool.
      • scrubbedBytes: (int): For current scrubbing job run.
      • scrubbingBW: (int): Estimate of the disk BS used for scrubbing B/s.
      • scrubbingFinishAfter: (int): Extimate of when the scrubbing job is expected to finish based on scrubbingBW and current disk usage.
      • 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 amount of 512-byte sectors on the disk.
      • serial: (string): The drive's serial.
      • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down, the last known server ID is reported.
      • softEject: (DiskSoftEjectStatus): The status of the soft-eject process.
      • ssd: (bool): Whether the device is an SSD.
      • wbc: (Internal Either(null, DiskWbcStats))

Get disk info (DiskGetInfo)

List all disks including information about the volumes stored on each disk.

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/DiskGetInfo/{diskId} HTTP/1.0
      Host: SP_API_HOST:SP_API_PORT
      Authorization: Storpool v1:SP_AUTH_TOKEN
      Content-Length: LENGTH
      
    • Method: GET
    • Path: /ctrl/1.0/DiskGetInfo/{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,
          "objectStates": {
            "ObjectState": int, ...
          },
          "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,
          "volumeInfos": {
            "string": {
              "name": string,
              "objectStates": {
                "ObjectState": int, ...
              },
              "objectsCount": int,
              "onDiskSize": int,
              "storedSize": int
            }, ...
          },
          "wbc": Either(null, {
            "maxPages": int,
            "pages": int,
            "pagesPending": int
          }) /* Internal */
        }
      }
      
    • Response Data: DiskInfo
      • 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 if the disk is currently active.
      • 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.
      • 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.
      • objectStates: A dict from ObjectState to 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. In essence, this is the estimated disk usage by StorPool.
      • scrubbedBytes: (int): For current scrubbing job run.
      • scrubbingBW: (int): Estimate of the disk BS used for scrubbing B/s.
      • scrubbingFinishAfter: (int): Extimate of when the scrubbing job is expected to finish based on scrubbingBW and current disk usage.
      • 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 amount of 512-byte sectors on the disk.
      • serial: (string): The drive's serial.
      • serverId: (ServerID): The ID of the server this disk is currently on. In case the disk is currently down, the last known server ID is reported.
      • softEject: (DiskSoftEjectStatus): The status of the soft-eject process.
      • ssd: (bool): Whether the device is an SSD.
      • volumeInfos: Detailed information about the volumes that have data stored on the disk.A dict from str to DiskVolumeInfo
        • Key type: string
        • Value type: DiskVolumeInfo
          • name: (string)
          • objectStates: For each state, the number of objects that are in that state. 0-undefined 1-ok 2-outdated 3-in_recovery 4-waiting_for_version 5-waiting_for_disk 6-data_not_present 7-data_lost 8-waiting_for_chain 9-wait_idleA dict from ObjectState to int
          • objectsCount: (int): The number of objects of the volume stored on this disk.
          • onDiskSize: (int): The space allocated on the disk for the object. This can go up to 32MB.
          • storedSize: (int): The size of the actual data in that object (<= onDiskSize).
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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. We strongly recommend that you do not use this attribute in any kind of automation.
          • msecActive: (int): Time in microseconds since the request was submitted.
          • op: (RequestOp): The type of the requested operation; one of read, write, system, merge, entries flush, #bad_state, #bad_drOp, idle, error recovery, transaction, data recovery
          • prevState: (Internal string): An internal attribute used only for debugging. We strongly recommend that you do not use this attribute in any kind of automation.
          • 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. We strongly recommend that you do not use this attribute in any kind of automation.
          • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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,
          "name": VolumeNameOrGlobalId,
          "objectsCount": int,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "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 recides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides in
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The global identifier.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • 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 last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • 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 taken 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 (VolumesGetStatus)

Return the status 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(VolumeName, SnapshotName)": {
            "balancerBlocked": bool,
            "clusterId": Global Location Id /* Optional */,
            "clusterName": ClusterName /* Optional */,
            "decreasedRedundancy": bool,
            "downBytes": int,
            "downDrives": [DiskID, ...],
            "migrating": bool,
            "missingDrives": [DiskID, ...],
            "missingTargetDrives": [DiskID, ...],
            "name": Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId),
            "onDiskSize": int,
            "replication": Replication,
            "size": Size,
            "snapshot": bool,
            "softEjectingDrives": [DiskID, ...],
            "status": VolumeCurentStatus,
            "storedSize": int,
            "syncingDataBytes": int,
            "syncingMetaObjects": int,
            "tags": {
              "VolumeTagName": VolumeTagValue, ...
            } /* Optional */
          }, ...
        }
      }
      
    • Response Data: A dict from Either(VolumeName, SnapshotName) to VolumeStatus
      • Key type: The value must be of one of the following types: VolumeName, SnapshotName.
      • Value type: VolumeStatus
        • balancerBlocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current placement policy due to for example missing or soft-ejecting drives.
        • clusterId: (Optional Global Location Id): multicluster call only - the id of the cluster volume currently recides in
        • clusterName: (Optional ClusterName): multicluster call only - the name of the cluster volume currently recides in
        • 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 volume. The volume will be in the 'down' status until all or some of these drives reappear.
        • 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 the needed data on the rest of the disks and can continue serving requests but it is in the 'degraded' status.
        • missingTargetDrives:
        • name: The volume's name.The value must be of one of the following types: VolumeNameOrGlobalId, SnapshotNameOrGlobalId.
        • onDiskSize: (int): The actual size that the objects of this volume occupy on the disks.
        • replication: (Replication): The number of copies/replicas kept.
        • size: (Size): The volume's size in bytes.
        • snapshot: (bool): True if this response describes a snapshot instead of a volume.
        • softEjectingDrives:
        • status: (VolumeCurentStatus): up - The volume is operational. up soon - Synchronizing versions of objects after a disk has come back up. data lost - The last copy of some of the data in the volume has been lost. down - Some or all of the objects of the volume are missing and the volume is not in a state to continue serving operations.
        • storedSize: (int): The number of bytes of client data on the volume. This does not take into account the StorPool replication and overhead, thus it is never larger than the volume size.
        • syncingDataBytes: (int): The total number of bytes in objects currently being synchronized (degraded objects or objects with not yet known version)
        • syncingMetaObjects: (int): The number of objects currently being synchronized (degraded objects or objects with not yet known version)
        • tags: (Optional {VolumeTagName: VolumeTagValue}): Arbitrary short name/value pairs stored with the volume.

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,
          "name": VolumeNameOrGlobalId,
          "objectsCount": int,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "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 recides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides in
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The global identifier.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • 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 last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • 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 is stored in all the volume's parents
        • storedSize: (int): The number of bytes of client data on this volume. This does not take into account the StorPool replication and overhead, thus it is never larger than the volume size.
        • 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 taken 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,
          "name": VolumeNameOrGlobalId,
          "objectsCount": int,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "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 recides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides in
        • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The global identifier.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • 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 last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • 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 taken 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,
          "name": VolumeNameOrGlobalId,
          "objects": [[DiskID, ...], ...],
          "objectsCount": int,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "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 recides in
      • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides in
      • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
      • firstNotParentObjectId: (Internal int)
      • flags: (Internal int)
      • globalId: (Global Volume Id): The global identifier.
      • id: (Internal int)
      • iops: (IOPS): iops limit.
      • 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 last replica.
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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 taken 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,
          "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,
          "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 recides in
      • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides in
      • creationTimestamp: (int): The volume's creation timestamp (UNIX timestamp)
      • disksCount: (int)
      • firstNotParentObjectId: (Internal int)
      • flags: (Internal int)
      • globalId: (Global Volume Id): The global identifier.
      • id: (Internal int)
      • iops: (IOPS): iops limit.
      • 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 last replica.
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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 taken 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": not blocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": pending /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "mcState": owner /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objectsCount": int,
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "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 this snapshot.
        • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain childless and are no longer attached.
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently recides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides 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)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The global identifier.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • mcState: (Optional Internal)
        • mcStateVal: (Optional Internal)
        • 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 last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location.
        • 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 taken 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 cloning a volume. They cannot be attached as they may be garbage-collected at any time.
        • 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 */,
        "name": VolumeName,
        "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.
      • name: (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 last replica.
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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,
          "info": string /* 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 cluster was created.
      • 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 (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": 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 last replica.
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • rename: (Optional 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 cluster was created.
      • 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 cluster was created.
      • 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
      • parentName: (Optional SnapshotNameOrGlobalId): The name of one of the volume's parents on which to re-base. If left out, it will be re-based to base.
  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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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,
          "info": string /* 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 cluster was created.
      • info: (Optional string): May contain additional information about the request.
      • 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 cluster was created.
      • 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 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": fail /* 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 fail): 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 cluster was created.
      • 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 cluster was created.
      • 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": fail /* 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 fail): 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 cluster was created.
      • 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": 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: (VolumeName): The name of the new volume.
      • placeAll: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for all but the last replica.
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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 cluster was created.
      • 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": not blocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": pending /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "mcState": owner /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objectsCount": int,
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "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 this snapshot.
        • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain childless and are no longer attached.
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently recides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides 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)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The global identifier.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • mcState: (Optional Internal)
        • mcStateVal: (Optional Internal)
        • 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 last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location.
        • 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 taken 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 cloning a volume. They cannot be attached as they may be garbage-collected at any time.
        • 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": not blocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": pending /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "mcState": owner /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objectsCount": int,
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "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 this snapshot.
        • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain childless and are no longer attached.
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently recides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides 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)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The global identifier.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • mcState: (Optional Internal)
        • mcStateVal: (Optional Internal)
        • 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 last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location.
        • 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 the StorPool replication and overhead, thus it is never larger than the volume size.
        • 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 taken 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 cloning a volume. They cannot be attached as they may be garbage-collected at any time.
        • 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": not blocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": pending /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "mcState": owner /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* Optional */,
          "name": SnapshotNameOrGlobalId,
          "objectsCount": int,
          "onVolume": VolumeNameOrGlobalId,
          "originalParentVolumeId": int /* Internal */,
          "parentName": Either("", SnapshotNameOrGlobalId),
          "parentVolumeId": int /* Internal */,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "recoveringFromRemote": bool,
          "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 this snapshot.
        • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain childless and are no longer attached.
        • bw: (Bandwidth): Bandwidth limit in KB.
        • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently recides in
        • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides 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)
        • firstNotParentObjectId: (Internal int)
        • flags: (Internal int)
        • globalId: (Global Volume Id): The global identifier.
        • id: (Internal int)
        • iops: (IOPS): iops limit.
        • mcState: (Optional Internal)
        • mcStateVal: (Optional Internal)
        • 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 last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location.
        • 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 taken 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 cloning a volume. They cannot be attached as they may be garbage-collected at any time.
        • 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": not blocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": pending /* Internal */ /* Optional */,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "mcState": owner /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* 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,
          "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 this snapshot.
      • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain childless and are no longer attached.
      • bw: (Bandwidth): Bandwidth limit in KB.
      • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently recides in
      • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides 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)
      • firstNotParentObjectId: (Internal int)
      • flags: (Internal int)
      • globalId: (Global Volume Id): The global identifier.
      • id: (Internal int)
      • iops: (IOPS): iops limit.
      • mcState: (Optional Internal)
      • mcStateVal: (Optional Internal)
      • 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 last replica.
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location.
      • 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 taken 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 cloning a volume. They cannot be attached as they may be garbage-collected at any time.
      • 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": not blocked /* Internal */ /* Optional */,
          "deleted": bool,
          "dematerializationStatus": pending /* Internal */ /* Optional */,
          "disksCount": int,
          "firstNotParentObjectId": int /* Internal */,
          "flags": int /* Internal */,
          "globalId": Global Volume Id,
          "id": int /* Internal */,
          "iops": IOPS,
          "mcState": owner /* Internal */ /* Optional */,
          "mcStateVal": int /* Internal */ /* 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,
          "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 this snapshot.
      • bound: (bool): Is this a bound snapshot. Bound snapshots are garbage-collected as soon as they remain childless and are no longer attached.
      • bw: (Bandwidth): Bandwidth limit in KB.
      • clusterId: (Optional Global Location Id): multicluster calls only - the id of the cluster volume currently recides in
      • clusterName: (Optional ClusterName): multicluster calls only - the name of the cluster volume currently recides 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)
      • disksCount: (int)
      • firstNotParentObjectId: (Internal int)
      • flags: (Internal int)
      • globalId: (Global Volume Id): The global identifier.
      • id: (Internal int)
      • iops: (IOPS): iops limit.
      • mcState: (Optional Internal)
      • mcStateVal: (Optional Internal)
      • 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 last replica.
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • recoveringFromRemote: (bool): Is this snapshot's data currently being transferred from a remote location.
      • 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 taken 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 cloning a volume. They cannot be attached as they may be garbage-collected at any time.
      • 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": 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 its children. As soon as it remains childless the snapshot will be garbage-collected.
      • deleteAfter: (Optional int): If not 0 set targetDeleteDate relative to the current time on the mgmt node. This value will be added to the current time as seconds and set as targetDeleteDate.
      • name: (Optional VolumeName): The name of the newly created snapshot. If not specified, a name will be auto-generated by the StorPool management service.
      • 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. targetDeleteDate can not be set in the past
  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 cluster was created.
      • 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/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": VolumeName /* Optional */,
        "replication": Replication /* Optional */,
        "reuseServer": bool /* Optional */,
        "tags": {
          "VolumeTagName": VolumeTagValue, ...
        } /* Optional */,
        "targetDeleteDate": int /* Optional */
      }
    • Method: POST
    • Path: /ctrl/1.0/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 this value will be added to the current time as seconds and set as targetDeleteDate. If 0 it will discard previous targetDeleteDate
      • 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 last replica.
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • rename: (Optional 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. Unix timestamp. targetDeleteDate can not be set in the past
  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 cluster was created.
      • 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
      • parentName: (Optional SnapshotNameOrGlobalId): The name of one of the volume's parents on which to re-base. If left out, it will be re-based to base.
  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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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": [{
          "name": 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": 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 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 last replica.
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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,
            "name": VolumeNameOrGlobalId,
            "onVolume": VolumeNameOrGlobalId /* Optional */,
            "remoteId": Global Volume Id,
            "size": Size,
            "tags": {
              "VolumeTagName": VolumeTagValue, ...
            } /* Optional */
          }, ...], ...
        }
      }
      
    • Response Data: A dict from str, default="snapshots" to [RemoteSnapshot]

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,
            "name": VolumeNameOrGlobalId,
            "onVolume": VolumeNameOrGlobalId /* Optional */,
            "remoteId": Global Volume Id,
            "size": Size,
            "tags": {
              "VolumeTagName": VolumeTagValue, ...
            } /* Optional */
          }, ...], ...
        }
      }
      
    • Response Data: A dict from str, default="volumes" to [RemoteSnapshot]

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,
          "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 current time on the mgmt node
          • globalSnapshotId: (Global Volume Id): the id of the snapshot to be unexported
          • location: (RemoteLocationName): name of the location to unexport from
          • targetDeleteDate: (Optional int): if not 0 instruct the remote location to delete the snapshot at the specified date. Remote side may not allow this due to configuration or the snapshot beeeing used
  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 cluster was created.
      • 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 */,
          "pos": AttachmentPos,
          "rights": AttachmentRights,
          "snapshot": bool,
          "volume": VolumeNameOrGlobalId
        }, ...]
      }
      
    • Response Data:
        Element type: AttachmentDesc
        • client: (ClientID): The ID of the client on which it 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
        • pos: (AttachmentPos): The attachment position on the client; used by the StorPool client to form the name of the internal /dev/spN device node.
        • rights: (AttachmentRights): Whether the volume is attached as read only or read/write; always ro for snapshots.
        • snapshot: (bool): Whether it is a snapshot or a 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,
        "onRemoteAttached": fail /* 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.
          • onRemoteAttached: (Optional fail): mutlicluster only. What to do if volume is attached in the remote cluster. "export" if not specified
          • 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 cluster was created.
      • 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,
          "onRemoteAttached": fail /* 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 them. If not specified, wait indefinitely. If explicitly set to 0, immediately return successfully even if any clients are missing.
      • 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.
            • onRemoteAttached: (Optional fail): mutlicluster only. What to do if volume is attached in the remote cluster. "export" if not specified
            • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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

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,
          "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.
        • 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 last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • 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,
          "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
        }, ...]
      }
      
    • Response Data:
        Element type: VolumeTemplateStatusDesc
        • availablePlaceAll: (int): An estimate of the available space on all the disks in this template's placeAll placement group.
        • availablePlaceHead: (int): An estimate of the available space on all the disks in this template's placeHead placement group.
        • availablePlaceTail: (int): An estimate of the available space on all the disks in this template's placeTail placement group.
        • capacityPlaceAll: (int): An estimate of the total physical space on all the disks in this template's placeAll placement group.
        • capacityPlaceHead: (int): An estimate of the total physical space on all the disks in this template's placeHead placement group.
        • capacityPlaceTail: (int): An estimate of the total physical space on all the disks in this template's placeTail placement group.
        • 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 template.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • 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, otherwise "-".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 StorPool replication and checksums overhead.The value must be of one of the following types: 0, Size.
        • snapshotsCount: (int): The number of snapshots based on this template (incl. snapshots currently being deleted).
        • 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. This does not take into account the StorPool replication and overhead, thus it is never larger than the volume size.
        • totalSize: The number of bytes of all volumes based on this template, including the StorPool replication overhead.The value must be of one of the following types: 0, Size.
        • volumesCount: (int): The number of volumes based on 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,
          "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.
      • 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 last replica.
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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 last replica.
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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 cluster was created.
      • 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 last replica.
      • placeHead: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (Optional PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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": {
          "status": RelocatorStatus,
          "volumesToRelocate": int
        }
      }
      
    • Response Data: VolumeRelocatorStatus
      • status: (RelocatorStatus): 'off' - relocator is currently turned off. 'on' - relocator is on. 'blocked' - relocation is blocked, most likely due to missing drives.
      • 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. -1 since the disk is currently up.
          • 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. -1 since the disk is currently up.
          • 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. -1 since the disk is currently up.
          • 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
      • cmd: (BalancerCommand): The command for the balacer to execute. 'start' - run the balancer. 'stop' - abort current run. 'commit' - commit volume allocation changes.
  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 cluster was created.
      • 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 policy due to for example missing or soft-ejecting drives.
        • 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 last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • 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. -1 since the disk is currently up.
          • 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. -1 since the disk is currently up.
          • 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. -1 since the disk is currently up.
          • 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 the rebalancing algorithm.
          Element type:
      • blocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current placement policy due to for example missing or soft-ejecting drives.
      • 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 last replica.
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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 the rebalancing algorithm.
          Element type:
      • blocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current placement policy due to for example missing or soft-ejecting drives.
      • 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 last replica.
      • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
      • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
      • 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 balancer allocation groups (VolumeBalancerGroups)

  1. Request:
    • Example HTTP Request:
      GET /ctrl/1.0/VolumeBalancerGroups 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/VolumeBalancerGroups
    • 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,
          "feasible": bool,
          "objectsCount": int,
          "placeAll": PlacementGroupName,
          "placeHead": PlacementGroupName,
          "placeTail": PlacementGroupName,
          "replication": Replication,
          "reuseServer": bool /* Optional */,
          "root": Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId),
          "size": int,
          "slots": [{
            "objectsCount": int,
            "storedSize": int
          }, ...],
          "storedSize": int,
          "targetDiskSets": [[DiskID, ...], ...],
          "volumes": [Either(VolumeNameOrGlobalId, SnapshotNameOrGlobalId), ...]
        }, ...]
      }
      
    • Response Data:
        Element type: VolumeBalancerAllocationGroup
        • blocked: (bool): Can this volume be rebalanced, or is rebalancing impossible with the current placement policy due to for example missing or soft-ejecting drives.
        • feasible: (bool): Can new volumes be allocated with the current placement policy and redundancy constraints.
        • objectsCount: (int): The total number of objects of all volumes and snapshots in the group.
        • placeAll: (PlacementGroupName): The name of a placement group which describes the disks to be used for all but the last replica.
        • placeHead: (PlacementGroupName): The name of a placement group which describes the disks to be used for the first replica.
        • placeTail: (PlacementGroupName): The name of a placement group which describes the disks to be used for the last replica, the one used for reading.
        • replication: (Replication): The number of copies/replicas kept.
        • reuseServer: (Optional bool): allow placement of replicas on same server
        • root: The name of this group's root volume or snapshotThe value must be of one of the following types: VolumeNameOrGlobalId, SnapshotNameOrGlobalId.
        • size: (int): The total size of all volumes and snapshots in the group.
        • slots: Statistics about each of the current disk sets.
            Element type: VolumeBalancerSlot
            • objectsCount: (int): Number of objects on the corresponding disk set.
            • storedSize: (int): Number of bytes of client data stored on the corresponding disk set.
        • storedSize: (int): The total number of bytes of client data on all volumes and snapshots in this group.
        • targetDiskSets: The current sets of disks that the volume's data should be stored on.
            Element type:
        • volumes: The names of all volumes and snapshots in this group.

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": str, default="^[a-z0-9\\-.:]+$",
            "initiators": {
              "iSCSIId": {
                "exports": [{
                  "portalGroup": str, default="^[A-Za-z0-9_\\-.:]+$",
                  "target": str, default="^[a-z0-9\\-.:]+$"
                }, ...],
                "name": str, default="^[a-z0-9\\-.:]+$",
                "nets": [string, ...],
                "secret": string,
                "username": string
              }, ...
            },
            "portalGroups": {
              "int": {
                "name": str, default="^[A-Za-z0-9_\\-.:]+$",
                "networks": [{
                  "address": string,
                  "prefix": int
                }, ...],
                "portals": [{
                  "controller": iSCSIId,
                  "ip": string,
                  "port": string
                }, ...]
              }, ...
            },
            "targets": {
              "int": {
                "currentControllerId": int,
                "name": str, default="^[a-z0-9\\-.:]+$",
                "volume": VolumeName
              }, ...
            }
          }
        }
      }
      
    • Response Data: iSCSIConfig
      • iscsi: The actual configuration data
        • baseName: (str, default="^[a-z0-9\\-.:]+$"): The StorPool cluster's iSCSI base name.
        • initiators: The iSCSI initiators allowed to access the cluster.A dict from iSCSIId to iSCSIInitiator
        • portalGroups: The iSCSI portal groups defined for the cluster.A dict from int to iSCSIPortalGroup
          • Key type: int
          • Value type: iSCSIPortalGroup
            • name: (str, default="^[A-Za-z0-9_\\-.:]+$"): 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: (str, default="^[a-z0-9\\-.:]+$"): 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": str, default="^[a-z0-9\\-.:]+$",
            "secret": string,
            "username": string
          } /* Optional */,
          "createPortal": {
            "controller": iSCSIId,
            "ip": string,
            "port": int /* Optional */,
            "portalGroup": str, default="^[A-Za-z0-9_\\-.:]+$"
          } /* Optional */,
          "createPortalGroup": {
            "name": str, default="^[A-Za-z0-9_\\-.:]+$"
          } /* Optional */,
          "createTarget": {
            "volumeName": VolumeName
          } /* Optional */,
          "deleteInitiator": {
            "name": str, default="^[a-z0-9\\-.:]+$"
          } /* Optional */,
          "deletePortal": {
            "ip": string,
            "port": int /* Optional */
          } /* Optional */,
          "deletePortalGroup": {
            "name": str, default="^[A-Za-z0-9_\\-.:]+$"
          } /* Optional */,
          "deleteTarget": {
            "volumeName": VolumeName
          } /* Optional */,
          "export": {
            "initiator": str, default="^[a-z0-9\\-.:]+$",
            "portalGroup": str, default="^[A-Za-z0-9_\\-.:]+$",
            "volumeName": VolumeName
          } /* Optional */,
          "exportDelete": {
            "initiator": str, default="^[a-z0-9\\-.:]+$",
            "portalGroup": str, default="^[A-Za-z0-9_\\-.:]+$",
            "volumeName": VolumeName
          } /* Optional */,
          "initiatorAddNetwork": {
            "initiator": str, default="^[a-z0-9\\-.:]+$",
            "net": string
          } /* Optional */,
          "portalGroupAddNetwork": {
            "net": string,
            "portalGroup": str, default="^[A-Za-z0-9_\\-.:]+$"
          } /* Optional */,
          "setBaseName": {
            "name": str, default="^[a-z0-9\\-.:]+$"
          } /* 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 cluster was created.
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

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 recieve 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 cluster was created.
      • 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 cluster was created.
      • 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 recieve 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 in the future. Default is false.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 cluster was created.
      • 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)
          • 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

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"
          }, {
            "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
            • diskId: (DiskID): disk id
            • diskState: (DiskState)
            • objectsOutdated: (Internal int): An internal attribute used only for debugging. We strongly recommend that you do not use this attribute in any kind of automation.
            • objectsOutdatedRemote: (Internal int): An internal attribute used only for debugging. We strongly recommend that you do not use this attribute in any kind of automation.
            • objectsWaitingForVersion: (Internal int): An internal attribute used only for debugging. We strongly recommend that you do not use this attribute in any kind of automation.
            • 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. We strongly recommend that you do not use this attribute in any kind of automation.
            • op: (RequestOp): The type of the requested operation; one of read, write, system, merge, entries flush, #bad_state, #bad_drOp, idle, error recovery, transaction, data recovery
            • 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. We strongly recommend that you do not use this attribute in any kind of automation.
            • 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. We strongly recommend that you do not use this attribute in any kind of automation.
            • 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

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, but for each volume
      • minOkReplicas: (Optional int): the minimum ok copies of all data that has a copy on the node that must remain while the node is down
      • 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 cluster was created.
      • 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 cluster was created.
      • 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 volume to a snapshot discarding all its current data (VolumeRevert)

  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
      {
        "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
  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 cluster was created.
      • info: (Optional string): May contain additional information about the request.
      • ok: (true): Always returns true. If something goes wrong, an ApiError is returned instead.

Data Types

"":The constant value "".
"-":The constant value "-".
"all":The constant value "all".
"diskExpected":The constant value "diskExpected".
"diskState":The constant value "diskState".
"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", "commiting"}
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"}
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
Id:One of {"bridge", "server", "iSCSI", "client", "unknown"}
LastState:One of {"up", "down"}
MAC Address:string, regex ^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$
MgmtID:integer, 1 <= value <= 4095
NetID:integer, 0 <= value <= 3
NodeID:integer, 0 <= value <= 63
ObjectState:ObjectState, enumeration from 0 to 9
PeerID:integer, 0 <= value <= 65535
PeerStatus:One of {"up", "down"}
PlacementGroupName:a string(128), matching ^[A-Za-z0-9_\-]+$, except {list}
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 {"too_old", "peer_down", "peerDone", "timeout", "streamNotConnected", "streamOverfilled", "invalidResponse"}
Subcluster Id:string, regex [a-z0-9]+$
VolumeCurentStatus: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.
client status:One of {"ok", "updating", "down"}
fail:One of {"detach", "detachForce", "export"}
float:A floating point number.
iSCSIId:integer, 0 <= value <= 4095
int:An integer value.
not blocked:One of {"pending", "rebasing", "flushing", "volume not found", "generation mismatch", "disk down", "multiple children", "peer down", "write not completed", "recovering from remote", "parent recovering from remote", "unknown"}
null:The constant value null.
owner:One of {"ownerExported", "slaveCopy", "clusterLocal", "clusterLocalExported", "clusterLocalAutoReconcile", "clusterLocalAutoReconcileExported"}
pending:One of {"allObjectsUsed", "complete", "blockedRelocate", "blockedParentRelocate", "blockedParentRemoving", "blockedParentDifferentVag"}
str, default="^[A-Za-z0-9_\\-.:]+$":A value of type str. Default value = ^[A-Za-z0-9_\-.:]+$.
str, default="^[a-z0-9\\-.:]+$":A value of type str. Default value = ^[a-z0-9\-.:]+$.
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.