List a cluster's persistent volumes
const url = 'https://api.aetherplatform.cloud/api/v1/organizations/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/clusters/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/volumes';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.aetherplatform.cloud/api/v1/organizations/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/clusters/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/volumes \ --header 'Authorization: Bearer <token>'Read-only inventory of the cluster’s PersistentVolumes, read from the organization’s StorageInventory on the management cluster (nothing here calls the tenant cluster’s own apiserver, and there is no delete path — volume lifecycle stays a kubectl delete pvc inside the tenant).
Both byte figures are reported for every volume, and billed_on says which of the two is charged: aether-block volumes bill on provisioned_bytes (RBD space is reserved, so an empty claim costs what a full one does), aether-shared volumes bill on used_bytes (CephFS is thin-provisioned). used_percent is computed server-side and is not clamped — CephFS enforces its per-subvolume quota lazily, so a value above 100 is legitimate — and is 0 when there is no quota to divide by.
When the management read fails, the snapshot is stale or not Ready, or the cluster is not provisioned far enough to be identified, inventory_available is false and volumes is an empty array: “you have no volumes” and “we could not look” are different answers.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Organization UUID.
Cluster UUID.
Responses
Section titled “Responses”The cluster’s volumes, plus the organization-wide shared-pool figures and the freshness of the underlying snapshot.
object
object
The CSI volume handle (block) or subvolume name (shared).
The volume’s display name.
The RBD image size for block volumes, or the subvolume’s quota for shared ones — where 0 means an INFINITE quota, not an empty volume.
Used over provisioned, in percent. Unclamped (may exceed 100), and 0 when provisioned is 0.
Which of the two byte figures this volume is charged on.
The volume’s state as reported by the management cluster.
Open RBD watchers (0 means nothing has the image mapped).
The hard, OSD-enforced quota on the ORGANIZATION’s CephFS data pool, which every cluster in the org shares. 0 means unlimited/unset. Display only — nothing in billing reads it.
How much of that org-wide pool is occupied — not the sum of this cluster’s volumes.
false when the management read failed or the snapshot is not provably current, in which case volumes is empty.
When the organization’s inventory last completed a full sync. The zero time when inventory_available is false.
Example
{ "volumes": [ { "type": "block", "storage_class": "aether-block", "billed_on": "provisioned" } ]}Malformed request — e.g. an invalid path UUID or an unparseable JSON body.
object
object
A stable, machine-readable error code.
object
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": [ { "field": "example", "code": "example", "message": "example" } ] }}Missing or invalid credentials.
object
object
A stable, machine-readable error code.
object
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": [ { "field": "example", "code": "example", "message": "example" } ] }}The requested resource was not found.
object
object
A stable, machine-readable error code.
object
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": [ { "field": "example", "code": "example", "message": "example" } ] }}