diff --git a/docs/manuals/api.md b/docs/manuals/api.md
index 7f4087e..e40d7fd 100644
--- a/docs/manuals/api.md
+++ b/docs/manuals/api.md
@@ -4,7 +4,7 @@ The PVC API is a standalone client application for PVC. It interfaces directly w
The API is built using Flask and is packaged in the Debian package `pvc-client-api`. The API depends on the common client functions of the `pvc-client-common` package as does the CLI client.
-Details of the API interface can be found in [the manual](/manuals/api).
+The full API endpoint and schema documentation [can be found here](/en/latest/manuals/api-reference.html).
# PVC HTTP API manual
@@ -349,7 +349,3 @@ The Ceph monitor port. Should always be `6789`.
* *required*
The Libvirt storage secret UUID for the Ceph cluster.
-
-## API Endpoint Documentation
-
-The full API endpoint and schema documentation [can be found here](/manuals/api-reference.html).
diff --git a/docs/manuals/swagger.json b/docs/manuals/swagger.json
index 60ee26f..c201c9a 100644
--- a/docs/manuals/swagger.json
+++ b/docs/manuals/swagger.json
@@ -1185,131 +1185,7 @@
"storagebenchmark": {
"properties": {
"benchmark_result": {
- "description": "A format 0 test result",
- "properties": {
- "test_name": {
- "properties": {
- "bandwidth": {
- "properties": {
- "max": {
- "description": "The maximum bandwidth (KiB/s) measurement",
- "type": "string (integer)"
- },
- "mean": {
- "description": "The mean bandwidth (KiB/s) measurement",
- "type": "string (float)"
- },
- "min": {
- "description": "The minimum bandwidth (KiB/s) measurement",
- "type": "string (integer)"
- },
- "numsamples": {
- "description": "The number of samples taken during the test",
- "type": "string (integer)"
- },
- "stdev": {
- "description": "The standard deviation of bandwidth",
- "type": "string (float)"
- }
- },
- "type": "object"
- },
- "cpu": {
- "properties": {
- "ctxsw": {
- "description": "The number of context switches during the test",
- "type": "string (integer)"
- },
- "majfault": {
- "description": "The number of major page faults during the test",
- "type": "string (integer)"
- },
- "minfault": {
- "description": "The number of minor page faults during the test",
- "type": "string (integer)"
- },
- "system": {
- "description": "The percentage of test time spent in system (kernel) space",
- "type": "string (float percentage)"
- },
- "user": {
- "description": "The percentage of test time spent in user space",
- "type": "string (float percentage)"
- }
- },
- "type": "object"
- },
- "iops": {
- "properties": {
- "max": {
- "description": "The maximum IOPS measurement",
- "type": "string (integer)"
- },
- "mean": {
- "description": "The mean IOPS measurement",
- "type": "string (float)"
- },
- "min": {
- "description": "The minimum IOPS measurement",
- "type": "string (integer)"
- },
- "numsamples": {
- "description": "The number of samples taken during the test",
- "type": "string (integer)"
- },
- "stdev": {
- "description": "The standard deviation of IOPS",
- "type": "string (float)"
- }
- },
- "type": "object"
- },
- "latency": {
- "properties": {
- "max": {
- "description": "The maximum latency measurement",
- "type": "string (integer)"
- },
- "mean": {
- "description": "The mean latency measurement",
- "type": "string (float)"
- },
- "min": {
- "description": "The minimum latency measurement",
- "type": "string (integer)"
- },
- "stdev": {
- "description": "The standard deviation of latency",
- "type": "string (float)"
- }
- },
- "type": "object"
- },
- "overall": {
- "properties": {
- "bandwidth": {
- "description": "The average bandwidth (KiB/s)",
- "type": "string (integer)"
- },
- "iops": {
- "description": "The average IOPS",
- "type": "string (integer)"
- },
- "iosize": {
- "description": "The total size of the benchmark data",
- "type": "string (integer)"
- },
- "runtime": {
- "description": "The total test time in milliseconds",
- "type": "string (integer)"
- }
- },
- "type": "object"
- }
- },
- "type": "object"
- }
- },
+ "description": "A benchmark test result; format not documented due to complexity",
"type": "object"
},
"id": {
@@ -3275,16 +3151,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "properties": {
- "task_id": {
- "description": "Task ID for the provisioner Celery worker",
- "type": "string"
- }
- },
- "type": "object"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -5424,15 +5295,28 @@
"name": "pool",
"required": true,
"type": "string"
+ },
+ {
+ "description": "An optional override name for the job",
+ "in": "query",
+ "name": "name",
+ "required": false,
+ "type": "string"
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "description": "The Celery job ID of the benchmark (unused elsewhere)",
+ "description": "The Celery job ID of the task",
"type": "string"
}
+ },
+ "400": {
+ "description": "Bad request",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
}
},
"summary": "Execute a storage benchmark against a storage pool",
@@ -5559,10 +5443,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -5586,7 +5471,7 @@
"description": "Force removal even if some step(s) fail",
"in": "query",
"name": "force",
- "required": "flase",
+ "required": false,
"type": "boolean"
},
{
@@ -5598,10 +5483,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -5677,10 +5563,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -5707,10 +5594,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -5793,10 +5681,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -6426,7 +6315,7 @@
"type": "string"
},
{
- "default": "flase",
+ "default": false,
"description": "Force action if volume creation would violate 80% full soft cap on the pool",
"in": "query",
"name": "force",
@@ -6508,7 +6397,7 @@
"type": "string"
},
{
- "default": "flase",
+ "default": false,
"description": "Force action if volume creation would violate 80% full soft cap on the pool",
"in": "query",
"name": "force",
@@ -6547,7 +6436,7 @@
{
"description": "The new volume size in bytes (or with a metric suffix, i.e. k/M/G/T); must be greater than the previous size (shrinking not supported)",
"in": "query",
- "name": "size",
+ "name": "new_size",
"required": false,
"type": "string"
},
@@ -6559,7 +6448,7 @@
"type": "string"
},
{
- "default": "flase",
+ "default": false,
"description": "Force action if new volume size would violate 80% full soft cap on the pool",
"in": "query",
"name": "force",
@@ -6605,7 +6494,7 @@
"type": "string"
},
{
- "default": "flase",
+ "default": false,
"description": "Force action if clone volume size would violate 80% full soft cap on the pool",
"in": "query",
"name": "force",
@@ -6981,16 +6870,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "properties": {
- "task_id": {
- "description": "Task ID for the provisioner Celery worker",
- "type": "string"
- }
- },
- "type": "object"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -7350,10 +7234,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -7380,10 +7265,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -7404,7 +7290,7 @@
"description": "",
"responses": {
"202": {
- "description": "OK",
+ "description": "Accepted",
"schema": {
"description": "The Celery job ID of the task",
"type": "string"
@@ -7706,10 +7592,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -7742,10 +7629,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -7790,14 +7678,15 @@
"in": "query",
"name": "incremental_parent",
"required": false,
- "type": "boolean"
+ "type": "string"
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -7847,10 +7736,11 @@
}
],
"responses": {
- "200": {
- "description": "OK",
+ "202": {
+ "description": "Accepted",
"schema": {
- "$ref": "#/definitions/Message"
+ "description": "The Celery job ID of the task",
+ "type": "string"
}
},
"400": {
@@ -7872,14 +7762,28 @@
]
}
},
- "/api/v1/vm/{vm}/snapshot/rollback": {
- "post": {
- "description": "",
+ "/api/v1/vm/{vm}/snapshot/receive/block": {
+ "patch": {
+ "description": "
NOTICE: This is an API-internal endpoint used by /vm//snapshot/send; it should never be called by a client.",
"parameters": [
{
- "description": "The name of the snapshot to roll back to",
+ "description": "The name of the destination Ceph RBD data pool",
"in": "query",
- "name": "snapshot_name",
+ "name": "pool",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume",
+ "in": "query",
+ "name": "volume",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume snapshot",
+ "in": "query",
+ "name": "snapshot",
"required": true,
"type": "string"
}
@@ -7904,12 +7808,307 @@
}
}
},
+ "summary": "Create the block snapshot at snapshot of volume",
+ "tags": [
+ "vm"
+ ]
+ },
+ "post": {
+ "description": "
NOTICE: This is an API-internal endpoint used by /vm//snapshot/send; it should never be called by a client.",
+ "parameters": [
+ {
+ "description": "The name of the destination Ceph RBD data pool",
+ "in": "query",
+ "name": "pool",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume",
+ "in": "query",
+ "name": "volume",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume snapshot",
+ "in": "query",
+ "name": "snapshot",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The size in bytes of the Ceph RBD volume",
+ "in": "query",
+ "name": "size",
+ "required": true,
+ "type": "integer"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ },
+ "400": {
+ "description": "Execution error",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ }
+ },
+ "summary": "Receive a full snapshot of a single RBD volume from another PVC cluster",
+ "tags": [
+ "vm"
+ ]
+ },
+ "put": {
+ "description": "
NOTICE: This is an API-internal endpoint used by /vm//snapshot/send; it should never be called by a client.",
+ "parameters": [
+ {
+ "description": "The name of the destination Ceph RBD data pool",
+ "in": "query",
+ "name": "pool",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume",
+ "in": "query",
+ "name": "volume",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume snapshot",
+ "in": "query",
+ "name": "snapshot",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume snapshot parent",
+ "in": "query",
+ "name": "source_snapshot",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ },
+ "400": {
+ "description": "Execution error",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ }
+ },
+ "summary": "Receive a single diff element from a snapshot of a single RBD volume from another PVC cluster",
+ "tags": [
+ "vm"
+ ]
+ }
+ },
+ "/api/v1/vm/{vm}/snapshot/receive/config": {
+ "post": {
+ "description": "
NOTICE: This is an API-internal endpoint used by /vm//snapshot/send; it should never be called by a client.",
+ "parameters": [
+ {
+ "description": "The name of the destination Ceph RBD data pool",
+ "in": "query",
+ "name": "pool",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume",
+ "in": "query",
+ "name": "volume",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume snapshot",
+ "in": "query",
+ "name": "snapshot",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The size in bytes of the Ceph RBD volume",
+ "in": "query",
+ "name": "size",
+ "required": true,
+ "type": "integer"
+ },
+ {
+ "description": "The name of the destination Ceph RBD volume snapshot parent for incremental transfers",
+ "in": "query",
+ "name": "source_snapshot",
+ "required": false,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ },
+ "400": {
+ "description": "Execution error",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ }
+ },
+ "summary": "Receive a snapshot of a VM configuration from another PVC cluster",
+ "tags": [
+ "vm"
+ ]
+ }
+ },
+ "/api/v1/vm/{vm}/snapshot/rollback": {
+ "post": {
+ "description": "",
+ "parameters": [
+ {
+ "description": "The name of the snapshot to roll back to",
+ "in": "query",
+ "name": "snapshot_name",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "202": {
+ "description": "Accepted",
+ "schema": {
+ "description": "The Celery job ID of the task",
+ "type": "string"
+ }
+ },
+ "400": {
+ "description": "Execution error",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ }
+ },
"summary": "Roll back to a snapshot of a VM's disks and configuration",
"tags": [
"vm"
]
}
},
+ "/api/v1/vm/{vm}/snapshot/send": {
+ "post": {
+ "description": "",
+ "parameters": [
+ {
+ "description": "The name of the snapshot to export (must exist)",
+ "in": "query",
+ "name": "snapshot_name",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The base API URI of the destination PVC cluster (with prefix if applicable)",
+ "in": "query",
+ "name": "destination_api_uri",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "description": "The API authentication key of the destination PVC cluster",
+ "in": "query",
+ "name": "destination_api_key",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "default": true,
+ "description": "Whether or not to validate SSL certificates for an SSL-enabled destination API",
+ "in": "query",
+ "name": "destination_api_verify_ssl",
+ "required": false,
+ "type": "boolean"
+ },
+ {
+ "description": "A snapshot name to generate an incremental diff from; incremental send only if unset",
+ "in": "query",
+ "name": "incremental_parent",
+ "required": false,
+ "type": "string"
+ },
+ {
+ "default": "source storage pool name",
+ "description": "The remote cluster storage pool to create RBD volumes in, if different from the source storage pool",
+ "in": "query",
+ "name": "destination_storage_pool",
+ "required": false,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "202": {
+ "description": "Accepted",
+ "schema": {
+ "description": "The Celery job ID of the task",
+ "type": "string"
+ }
+ },
+ "400": {
+ "description": "Execution error",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "schema": {
+ "$ref": "#/definitions/Message"
+ }
+ }
+ },
+ "summary": "Send a snapshot of a VM's disks and configuration to another PVC cluster",
+ "tags": [
+ "vm"
+ ]
+ }
+ },
"/api/v1/vm/{vm}/state": {
"get": {
"description": "",