REST API — cinder — branch stable/2026.2
Branch
stable/2026.2@c117f9cf08b4(29.0.0-1-gc117f9cf0) — repository https://opendev.org/openstack/cinder — analysed on 2026-10-28
This file describes the Block Storage API v3 as the code serves it. The operation table (§ 3) was extracted from the live router (cinder.api.v3.router.APIRouter with the contrib extensions loaded) rather than from the api-ref, so it lists what a client can really call. The machine-readable version is [_rewrite/routes_stable-2026.2.json](_rewrite/routes_stable-2026.2.json) and [_rewrite/openapi_stable-2026.2.json](_rewrite/openapi_stable-2026.2.json). Errors are detailed in 02-errors_stable-2026.2.md, and the asynchronous follow-up of each operation in 05-async-processing_stable-2026.2.md.
1. Conventions shared by every endpoint
1.1 Entry point and pipeline
- Root:
osapi_volumecomposite (etc/cinder/api-paste.ini:5-8):/→ version list,/healthcheck→ oslo.middleware health check (disabled by the file/etc/cinder/healthcheck_disable,etc/cinder/api-paste.ini:55),/v3→ the API./v1and/v2are removed and only produce a log warning (cinder/api/__init__.py:30-44). - v3 pipeline with
auth_strategy = keystone(etc/cinder/api-paste.ini:15):request_id→cors→http_proxy_to_wsgi→faultwrap→sizelimit→osprofiler→authtoken(keystonemiddleware) →keystonecontext→apiv3. The pipeline is chosen bypipeline_factoryfrom[DEFAULT]/auth_strategy(cinder/api/middleware/auth.py:47-58);noauthreplaces the last two filters by a fake authentication that trustsX-Auth-Token: user:projectand setsis_admin=True(cinder/api/middleware/auth.py:132-176). - Request context:
CinderKeystoneContextbuildscinder.contextfrom the headers set by keystonemiddleware and answers 401 without body when no user is identified (cinder/api/middleware/auth.py:105-126).X-Forwarded-Foris trusted only with[DEFAULT]/use_forwarded_for(cinder/api/middleware/auth.py:33-37).
1.2 URLs
- Every resource exists twice:
/v3/{project_id}/<resource>and/v3/<resource>(cinder/api/v3/router.py:60-95,cinder/api/openstack/wsgi.py:1289-1307). The project-less form is accepted at every microversion: microversion 3.67 only announces it, nothing checks it. {project_id}must match[DEFAULT]/project_id_regex(default[0-9a-f\-]+,cinder/api/openstack/__init__.py:25-29). When present, it must equal the project of the token, otherwise 400 "Malformed request url" (cinder/api/openstack/wsgi.py:897-901).- A trailing
.jsonis accepted and forces JSON (cinder/api/openstack/wsgi.py:232-254,cinder/api/openstack/wsgi.py:1281-1287).
1.3 Microversions
- Header
OpenStack-API-Version: volume 3.x(cinder/api/openstack/wsgi.py:62-64). Without it the request is served at 3.0, the minimum, not the maximum (cinder/api/openstack/wsgi.py:326-327).latestmeans 3.71. - Range 3.0 – 3.71 (
cinder/api/openstack/api_version_request.py:165-166); history in [_rewrite/microversions_stable-2026.2.md](_rewrite/microversions_stable-2026.2.md). - Out of range → 406; malformed → 400; header present without a
volumeentry →VersionNotFoundForAPIMethod(cinder/api/openstack/wsgi.py:292-327,cinder/api/openstack/wsgi.py:820-829). - A versioned method called outside its range → 404 without explanation, as if the route did not exist (
cinder/api/openstack/wsgi.py:1001-1010). - Every response carries
OpenStack-API-Version: volume <served version>andVary: OpenStack-API-Version(cinder/api/openstack/wsgi.py:957-964).
1.4 Body-dispatched actions
POST …/{id}/action dispatches on the single key of the JSON body ({"os-extend": {...}}): action_peek_json rejects a body with more than one key ("too many body keys", 400) and an unknown key gives 400 "There is no such action: …" (cinder/api/openstack/wsgi.py:565-580, cinder/api/openstack/wsgi.py:858-866, cinder/api/openstack/wsgi.py:968-999). The same fallback also maps POST /types, PUT /types/{id}, DELETE /types/{id} and DELETE /groups/{id} to @wsgi.action methods named create, update, delete (cinder/api/openstack/wsgi.py:977-985).
1.5 Request validation
- JSON-schema validation through
@validation.schema(schema, min, max), which applies a schema only inside its microversion range (cinder/api/validation/__init__.py:27-63). The 112 schemas are in [_rewrite/request-schemas_stable-2026.2.json](_rewrite/request-schemas_stable-2026.2.json); which one applies per operation and microversion is inroutes_stable-2026.2.json(variants[].schemas). - Accepted content types:
application/jsonandapplication/vnd.openstack.volume+json; anything else → 415 (cinder/api/openstack/wsgi.py:46-55,cinder/api/openstack/wsgi.py:836-843). - Body size limited by oslo.middleware
sizelimit([oslo_middleware]/max_request_body_size).
1.6 Responses
- Error body:
{"<faultName>": {"code": <status>, "message": "<text>"}}withfaultNameamongbadRequest,unauthorized,forbidden,itemNotFound,badMethod,conflictingRequest,overLimit,badMediaType,notImplemented,serviceUnavailable, otherwisecomputeFault(cinder/api/openstack/wsgi.py:1310-1363). - Request ID:
x-openstack-request-id(osloRequestId,cinder/api/middleware/request_id.py:25-71) and the legacyx-compute-request-id(cinder/api/openstack/wsgi.py:1369-1372). - Lists:
limit(bounded by[DEFAULT]/osapi_max_limit, default 1000),marker,offset,sort/sort_key/sort_dir,with_count(3.45); filters allowed per resource byresource_filters.json(cinder/api/common.py:38-45,cinder/api/common.py:63-141). Next-page links arevolumes_links,snapshots_links…
1.7 Authorisation
Policies (167 default rules in [_rewrite/policies_stable-2026.2.json](_rewrite/policies_stable-2026.2.json)) are checked in the business layer (context.authorize(...) in cinder/volume/api.py, cinder/backup/api.py…), not in the router. Defaults on this branch:
rule:xena_system_admin_or_project_member=(role:admin) or (role:member and project_id:%(project_id)s)for writes (56 rules);rule:xena_system_admin_or_project_readerfor reads (27 rules);rule:admin_api=is_admin:True or (role:admin and is_admin_project:True)for operator actions (78 rules).
So role:admin in any project is a cloud administrator by default (cinder/policies/base.py:69-184). A denial gives 403 Policy doesn't allow <rule> to be performed..
2. Functional description by area
2.1 Volumes (/volumes)
POST /volumes — create a volume
- Purpose: allocate a block device of
sizeGiB, empty or populated from a snapshot, another volume, an image or a backup. - Actor: project member (
volume:create, orvolume:create_from_imagewhenimageRefis set,cinder/volume/api.py:240-243). - Preconditions: the source (snapshot, volume, backup) is visible to the caller; a volume type is resolved: the requested one, otherwise the project default type (
default_volume_typestable, API 3.62), otherwise[DEFAULT]/default_volume_type. A misconfigured default gives 500VolumeTypeDefaultMisconfiguredError(cinder/volume/volume_types.py:214-240,cinder/api/v3/volumes.py:468-473). - Business rules:
sizemust be a positive integer, or is taken from the source when omitted (cinder/api/v3/volumes.py:444-450,cinder/volume/api.py:261-267); it must be ≥ the source size (cinder/volume/flows/api/create_volume.py:174-205), and within the volume type'sprovisioning:min_vol_size/max_vol_size(cinder/volume/api.py:269-270).- The
multiattachparameter is refused: multi-attach comes from the volume type (cinder/api/v3/volumes.py:454-461). - A different type from the source's is allowed only if a retype between both types would be possible (
cinder/volume/api.py:295-314). - Availability zone: requested, otherwise the source's, otherwise
default_availability_zone/storage_availability_zone; it must be one of the zones of livecinder-volumeservices (and of the type'sRESKEY:availability_zones), unlessallow_availability_zone_fallback(cinder/volume/flows/api/create_volume.py:260-350). - Metadata keys and values are limited to 255 characters (
cinder/volume/api.py:325). - Quotas
volumes,gigabytes,volumes_<type>,gigabytes_<type>are reserved, andper_volume_gigabytesis checked (cinder/volume/flows/api/create_volume.py:676-731).
- Flow:
- (synchronous) Validation, quota reservation,
INSERT volumeswith statuscreating, quota commit, then RPC castcreate_volumetocinder-scheduler(cinder/volume/flows/api/create_volume.py:889-922). - (asynchronous) The scheduler filters and weighs the backends and casts
create_volumeto the chosencinder-volume(05 § 2.1). - (asynchronous) The volume manager runs its create flow (raw, from snapshot, clone, image with image-volume cache, backup), and sets
availableorerror(05 § 3.1).
- (synchronous) Validation, quota reservation,
- Outcome:
202with the volume increating; the client pollsGET /volumes/{id}untilavailableorerror. Onerror, the reason is inGET /messages(API ≥ 3.3). - Effects visible elsewhere: notifications
volume.create.start/end; Glance download when created from an image; Barbican key creation for an encrypted type. - Limitations: when the scheduler finds no backend, the volume goes to
errorwith user messageVOLUME_001_003(no HTTP error).
GET /volumes, /volumes/detail, /volumes/{id}, /volumes/summary
- Purpose: list or show volumes;
summary(3.12) returns the total count and size, and metadata keys (3.36). - Rules: non-admins only see their project;
all_tenants, host and migration attributes are admin-only (policiesvolume_extension:volume_host_attribute,…mig_status_attribute,…tenant_attribute). Filters are checked againstresource_filters.json; time comparisons oncreated_at/updated_atusegt/gte/eq/neq/lt/lte(3.60) (cinder/api/v3/volumes.py:114-213). - Response by microversion:
group_id(3.13),provider_id(3.21),service_uuidandshared_targets(3.48),cluster_name(3.61),volume_type_id(3.63),encryption_key_id(3.64),consumes_quota(3.65);shared_targetsmay benullfrom 3.69 (cinder/api/v3/views/volumes.py:201).
PUT /volumes/{id}
Updates name, description, metadata (cinder/volume/api.py:571-593); notification volume.update.start/end.
DELETE /volumes/{id}[?cascade=true&force=true]
- Preconditions (one conditional
UPDATE): not attached, not migrating, not in a group, no snapshot (unlesscascade), status inavailable, error, error_restoring, error_extending, error_managing(unlessforce, 3.23 and policyvolume:force_delete) (cinder/volume/api.py:414-566,cinder/api/v3/volumes.py:68-95). - Flow: status →
deleting; cascaded snapshots →deleting; image-volume cache entry evicted; the encryption key is deleted from the key manager before the RPC, which makes the deletion irreversible; castdelete_volumeto the volume's backend (cinder/volume/api.py:532-566). A volume never scheduled (nohost) is deleted directly in the API, quota released (cinder/volume/api.py:423-455). - Outcome:
202; the volume disappears from lists when the manager finishes, or ends inerror_deleting.
POST /volumes/{id}/action — the volume actions
| Action | Purpose | Preconditions / rules | Asynchronous part |
|---|---|---|---|
os-extend | grow the volume | new_size > size; status available, or in-use from 3.42 (policy volume:extend_attached_volume); quota on the size increase; status → extending (cinder/api/contrib/volume_actions.py:274-289, cinder/volume/api.py:1551-1660) | scheduler checks the capacity (extend_volume), then the manager extends and, for an attached volume, sends Nova the volume-extended external event (05 § 3.4) |
os-extend_volume_completion | Nova reports the end of a driver-assisted extend | admin/service only; status must be extending; reads extend_new_size and extend_reservations from the admin metadata (cinder/api/contrib/admin_actions.py:205-214, cinder/volume/api.py:1681-1720) | cast extend_volume_completion. Not gated by microversion 3.71 although the history says it was added there |
os-attach, os-detach, os-reserve, os-unreserve, os-begin_detaching, os-roll_detaching, os-initialize_connection, os-terminate_connection | legacy attach flow (before the attachments API) | status checks done by conditional updates; os-initialize_connection and os-terminate_connection are synchronous RPC calls to the volume service, which returns the connection info (cinder/volume/api.py:751-931) | none beyond the call |
os-force_detach | admin cleanup of an attachment | admin | call terminate_connection + detach_volume |
os-reset_status | admin overrides status, attach_status, migration_status | admin; no backend action (cinder/api/contrib/admin_actions.py:59-125) | none |
os-force_delete | delete whatever the status | admin | as DELETE |
os-migrate_volume, os-migrate_volume_completion | move a volume to another backend; Nova completes a migration of an attached volume | admin; target host or cluster (3.16) | scheduler migrate_volume, manager migrate_volume (05) |
os-retype | change the volume type, migrating if needed (migration_policy never/on-demand) | policy volume:retype; quota moved between types (cinder/volume/api.py:1880-2041) | scheduler retype → manager retype |
os-volume_upload_image | copy the volume into a new Glance image | status available (or in-use with force, [DEFAULT]/enable_force_upload); policy upload_public for public images; status → uploading (cinder/volume/api.py:1480-1660) | cast copy_volume_to_image; the manager uploads to Glance and restores the status |
os-set_bootable, os-update_readonly_flag, os-set_image_metadata, os-unset_image_metadata, os-show_image_metadata | flags and image metadata | — | none |
os-unmanage | forget the volume without deleting it on the backend | not encrypted (cinder/volume/api.py:466-475) | cast delete_volume(unmanage_only=True) |
revert (3.40) | revert to the latest snapshot | volume and snapshot available → reverting / restoring (cinder/volume/api.py:387-412) | cast revert_to_snapshot |
os-reimage (3.68) | rewrite the volume from an image (rebuild of a boot volume) | status available/error, or reserved with reimage_reserved (Nova) (cinder/volume/api.py:2696-2749) | cast reimage; Nova is notified with volume-reimaged |
2.2 Attachments (/attachments, 3.27+) — what Nova uses
- POST /attachments: reserve the volume for an instance (
volume:attachment_create). The volume must not be in an error status; status →reservedwith an attachment rowreserved(cinder/volume/api.py:2476-2523). With aconnector, the volume service is called synchronously (attachment_update) to export the volume and returnsconnection_info. A driver exception becomes 500 "Unable to create attachment for volume" (cinder/api/v3/attachments.py:200-211).mode(rw/ro) from 3.54. - PUT /attachments/{id}: give the connector of the compute host (
attachment_update, serialised by a lockattachment_update-<volume_id>-<host>); 409 when the volume is in error or when a non-multiattach volume already has a connection on another host (cinder/volume/api.py:2525-2586). - **POST /attachments/{id}/action
os-complete** (3.44): attachment →attached, volume →in-use, notificationvolume.attach.end(cinder/api/v3/attachments.py:289-306). - DELETE /attachments/{id}: allowed for a connected attachment only if the request carries a service token (Nova) or if Nova no longer knows the attachment; otherwise **409
ConflictNovaUsingAttachment** (bug 2004555,cinder/volume/api.py:2588-2661). Callsattachment_deleteon the volume service, which unexports and returns the remaining attachments.
2.3 Snapshots (/snapshots, /snapshots/{id}/metadata)
- POST /snapshots: volume
available, orin-usewithforce; quotassnapshots,gigabytes; statuscreating; castcreate_snapshotto the volume's backend (cinder/volume/api.py:980-1223). Snapshots of a volumein-useare refused whenforceis false. - DELETE /snapshots/{id}: status
availableorerror, not part of a group snapshot; castdelete_snapshot(cinder/volume/api.py:1225-1257). - Actions:
os-reset_status,os-force_delete(admin),os-update_snapshot_status(used by Nova for assisted snapshots),os-unmanage.
2.4 Backups (/backups)
- POST /backups: volume
available(orin-usewithforce) or a snapshotavailable;incrementalrequires a previousavailablebackup; quotasbackups,backup_gigabytes; volume →backing-up; backupcreating; castcreate_backupto the scheduler, which picks acinder-backuphost in the same AZ (cinder/backup/api.py:218-374). Metadata (3.43), availability zone (3.51). - POST /backups/{id}/restore: into a new or existing volume (
restoring-backup); GET /backups/{id}/export_record, POST /backups/import_record (admin): move backup records between deployments (cinder/backup/api.py:376-648). - DELETE /backups/{id}:
availableorerror, no dependent incremental backup.
2.5 Volume types, extra specs, encryption, access, QoS, default types
/types(admin writes throughtypes_manage,cinder/api/contrib/types_manage.py:54-160);/types/{id}/extra_specs;/types/{id}/encryption(provider, cipher, key size, control location);/types/{id}/os-volume-type-accessand theaddProjectAccess/removeProjectAccessactions for private types;/qos-specswithassociate/disassociateas GET requests with a query string (cinder/api/contrib/qos_specs_manage.py:229-370)./default-types(3.62): per-project default type; the project is checked in Keystone (cinder/api/api_utils.py:238-262,cinder/api/v3/default_types.py:42-116).- Group types and group specs (3.11).
2.6 Groups and group snapshots (3.13 / 3.14), consistency groups (deprecated)
Generic volume groups bound to a backend; actions delete (with delete-volumes), create-from-src, reset_status, enable_replication, disable_replication, failover_replication, list_replication_targets (3.38). Consistency groups (/consistencygroups, /cgsnapshots) are kept for compatibility and map to the same group code (cinder/group/api.py:109-1151).
2.7 Transfers (/volume-transfers 3.55, /os-volume-transfer)
- Create: volume
available→awaiting-transfer; returns once anauth_key(16 hex characters by default) stored asHMAC-SHA1(salt, auth_key)with an 8-character salt (cinder/transfer/api.py:106-176).no_snapshots(3.55); encrypted volumes allowed from 3.70 (cinder/api/v3/volume_transfer.py:100). - Accept
POST …/{id}/accept: compares the HMAC (else **400InvalidAuthKey), reserves quota in the recipient project and releases it in the donor project, then **callsaccept_transferon the volume service (cinder/transfer/api.py:235-330).
2.8 Quotas and limits
/os-quota-sets/{project_id} (show with ?usage=true, update, delete = reset to defaults, defaults), /os-quota-class-sets/{class}; /limits returns absolute limits and usage (cinder/api/contrib/quotas.py:69-160, cinder/api/v3/limits.py:27). Resources: volumes, snapshots, gigabytes, backups, backup_gigabytes, groups, per_volume_gigabytes, plus per-type volumes_<type>, snapshots_<type>, gigabytes_<type>.
2.9 Operator APIs
/os-services (list, enable, disable, freeze/thaw, failover_host, get-log/set-log 3.32), /clusters (3.7), /workers/cleanup (3.24, re-run cleanup of resources left by a dead service), /scheduler-stats/get_pools, /capabilities/{host}, /os-hosts (deprecated), /manageable_volumes and /manageable_snapshots (list unmanaged backend objects), /os-volume-manage and /os-snapshot-manage (adopt them), /messages (3.3, user-facing asynchronous errors), /resource_filters (3.33), /os-availability-zone, /extensions.
3. Operation table
218 operations (the 52 body actions counted separately), extracted from the router. "Microversion" gives the range of each implementation (3.27+, or 3.0–3.15 / 3.16+ when the handler changes). An empty cell means available from 3.0. "Policy rule(s)" comes from the operations declared by the policy rules; the code may check more rules than these.
| Method | Path (after /v3/{project_id}) | Handler | Policy rule(s) from operations | Microversion | Body schema(s) (cinder/api/schemas/) | Success |
|---|---|---|---|---|---|---|
| GET | /volumes/detail | cinder/api/v3/volumes.py:219 | volume:get_allvolume_extension:volume_host_attributevolume_extension:volume_image_metadata:showvolume_extension:volume_mig_status_attributevolume_extension:volume_tenant_attribute | — | 200 | |
| GET | /volumes/summary | cinder/api/v3/volumes.py:224 | volume:get_all | 3.12+ | — | 200 |
| POST | /volumes | cinder/api/v3/volumes.py:360 | volume:createvolume:create_from_imagevolume:multiattach | volumes.create@3.0, volumes.create_volume_v313@3.13, volumes.create_volume_v347@3.47, volumes.create_volume_v353@3.53 | 202 | |
| GET | /volumes | cinder/api/v3/volumes.py:215 | volume:get_all | — | 200 | |
| POST | /volumes/{id}/action {"os-attach"} | cinder/api/contrib/volume_actions.py:55 | volume:update_volume_admin_metadatavolume_extension:volume_actions:attach | volume_actions.attach | 202 | |
| POST | /volumes/{id}/action {"os-begin_detaching"} | cinder/api/contrib/volume_actions.py:139 | volume_extension:volume_actions:begin_detaching | volume_actions.begin_detaching | 202 | |
| POST | /volumes/{id}/action {"os-detach"} | cinder/api/contrib/volume_actions.py:91 | volume_extension:volume_actions:detach | volume_actions.detach | 202 | |
| POST | /volumes/{id}/action {"os-extend"} | cinder/api/contrib/volume_actions.py:274 | volume:extendvolume:extend_attached_volume | volume_actions.extend | 202 | |
| POST | /volumes/{id}/action {"os-extend_volume_completion"} | cinder/api/contrib/admin_actions.py:205 | volume_extension:volume_admin_actions:extend_volume_completion | admin_actions.extend_volume_completion | 202 | |
| POST | /volumes/{id}/action {"os-force_delete"} | cinder/api/contrib/admin_actions.py:218 | volume_extension:volume_admin_actions:force_delete | admin_actions.force_delete_volume | 202 | |
| POST | /volumes/{id}/action {"os-force_detach"} | cinder/api/contrib/admin_actions.py:130 | volume_extension:volume_admin_actions:force_detach | admin_actions.force_detach | 202 | |
| POST | /volumes/{id}/action {"os-initialize_connection"} | cinder/api/contrib/volume_actions.py:160 | volume_extension:volume_actions:initialize_connection | volume_actions.initialize_connection | 200 | |
| POST | /volumes/{id}/action {"os-migrate_volume"} | cinder/api/contrib/admin_actions.py:168 | volume_extension:volume_admin_actions:migrate_volume | admin_actions.migrate_volume@3.0, admin_actions.migrate_volume_v316@3.16 | 202 | |
| POST | /volumes/{id}/action {"os-migrate_volume_completion"} | cinder/api/contrib/admin_actions.py:187 | volume_extension:volume_admin_actions:migrate_volume_completion | admin_actions.migrate_volume_completion | 200 | |
| POST | /volumes/{id}/action {"os-reimage"} | cinder/api/contrib/volume_actions.py:375 | volume:reimagevolume:reimage_reserved | 3.68+ | volume_actions.reimage@3.68 | 202 |
| POST | /volumes/{id}/action {"os-reserve"} | cinder/api/contrib/volume_actions.py:117 | volume_extension:volume_actions:reserve | volume_actions.reserve | 202 | |
| POST | /volumes/{id}/action {"os-reset_status"} | cinder/api/contrib/admin_actions.py:59 | volume_extension:volume_admin_actions:reset_status | admin_actions.reset_status_volume | 202 | |
| POST | /volumes/{id}/action {"os-retype"} | cinder/api/contrib/volume_actions.py:310 | volume:retype | volume_actions.retype | 202 | |
| POST | /volumes/{id}/action {"os-roll_detaching"} | cinder/api/contrib/volume_actions.py:150 | volume_extension:volume_actions:roll_detaching | volume_actions.roll_detaching | 202 | |
| POST | /volumes/{id}/action {"os-set_bootable"} | cinder/api/contrib/volume_actions.py:322 | volume:update | volume_actions.set_bootable | 200 | |
| POST | /volumes/{id}/action {"os-set_image_metadata"} | cinder/api/contrib/volume_image_metadata.py:89 | volume_extension:volume_image_metadata:set | volume_image_metadata.set_image_metadata | 200 | |
| POST | /volumes/{id}/action {"os-show_image_metadata"} | cinder/api/contrib/volume_image_metadata.py:125 | volume:get_volume_metadata | volume_image_metadata.index | 200 | |
| POST | /volumes/{id}/action {"os-terminate_connection"} | cinder/api/contrib/volume_actions.py:187 | volume_extension:volume_actions:terminate_connection | volume_actions.terminate_connection | 202 | |
| POST | /volumes/{id}/action {"os-unmanage"} | cinder/api/contrib/volume_unmanage.py:37 | volume_extension:volume_unmanage | volume_unmanage.unmanage | 202 | |
| POST | /volumes/{id}/action {"os-unreserve"} | cinder/api/contrib/volume_actions.py:128 | volume_extension:volume_actions:unreserve | volume_actions.unreserve | 202 | |
| POST | /volumes/{id}/action {"os-unset_image_metadata"} | cinder/api/contrib/volume_image_metadata.py:131 | volume_extension:volume_image_metadata:remove | volume_image_metadata.unset_image_metadata | 200 | |
| POST | /volumes/{id}/action {"os-update_readonly_flag"} | cinder/api/contrib/volume_actions.py:294 | volume:update_readonly_flagvolume:update_volume_admin_metadata | volume_actions.volume_readonly_update | 202 | |
| POST | /volumes/{id}/action {"os-volume_upload_image"} | cinder/api/contrib/volume_actions.py:205 | volume_extension:volume_actions:upload_imagevolume_extension:volume_actions:upload_public | volume_actions.volume_upload_image@3.0, volume_actions.volume_upload_image_v31@3.1 | 202 | |
| POST | /volumes/{id}/action {"revert"} | cinder/api/v3/volumes.py:251 | volume:revert_to_snapshot | 3.40+ | volumes.revert | 202 |
| PUT | /volumes/{id} | cinder/api/v3/volumes.py:482 | — | volumes.update@3.0, volumes.update_v353@3.53 | 200 | |
| DELETE | /volumes/{id} | cinder/api/v3/volumes.py:68 | volume:deletevolume:force_delete | — | 202 | |
| GET | /volumes/{id} | cinder/api/v3/volumes.py:97 | volume:getvolume_extension:volume_host_attributevolume_extension:volume_image_metadata:showvolume_extension:volume_mig_status_attributevolume_extension:volume_tenant_attribute | — | 200 | |
| GET | /messages | cinder/api/v3/messages.py:78 | message:get_all | 3.3+ | — | 200 |
| DELETE | /messages/{id} | cinder/api/v3/messages.py:66 | message:delete | 3.3+ | — | 204 |
| GET | /messages/{id} | cinder/api/v3/messages.py:53 | message:get | 3.3+ | — | 200 |
| GET | /clusters | cinder/api/v3/clusters.py:49 | clusters:get_all | 3.7+ | — | 200 |
| GET | /clusters/detail | cinder/api/v3/clusters.py:57 | clusters:get_all | 3.7+ | — | 200 |
| GET | /clusters/{id} | cinder/api/v3/clusters.py:36 | clusters:get | 3.7+ | — | 200 |
| PUT | /clusters/enable | cinder/api/v3/clusters.py:142 | — | 3.7+ | clusters.enable_cluster | 200 |
| PUT | /clusters/disable | cinder/api/v3/clusters.py:118 | — | 3.7+ | clusters.disable_cluster | 200 |
| POST | /types | cinder/api/contrib/types_manage.py:54 | volume_extension:type_createvolume_extension:volume_type_access | volume_types.create | 200 | |
| GET | /types | cinder/api/v3/types.py:41 | volume_extension:access_types_extra_specsvolume_extension:access_types_qos_specs_idvolume_extension:type_get_allvolume_extension:types_extra_specs:read_sensitivevolume_extension:volume_type_access | — | 200 | |
| POST | /types/{id}/action {"addProjectAccess"} | cinder/api/contrib/volume_type_access.py:100 | volume_extension:volume_type_access:addProjectAccess | volume_type_access.add_project_access | 202 | |
| POST | /types/{id}/action {"create"} | cinder/api/contrib/types_manage.py:54 | — | volume_types.create | 200 | |
| POST | /types/{id}/action {"delete"} | cinder/api/contrib/types_manage.py:150 | — | — | 202 | |
| POST | /types/{id}/action {"removeProjectAccess"} | cinder/api/contrib/volume_type_access.py:114 | volume_extension:volume_type_access:removeProjectAccess | volume_type_access.remove_project_access | 202 | |
| POST | /types/{id}/action {"update"} | cinder/api/contrib/types_manage.py:89 | — | volume_types.update | 200 | |
| PUT | /types/{id} | cinder/api/contrib/types_manage.py:89 | — | volume_types.update | 200 | |
| DELETE | /types/{id} | cinder/api/contrib/types_manage.py:150 | — | — | 202 | |
| GET | /types/{id} | cinder/api/v3/types.py:50 | volume_extension:access_types_extra_specsvolume_extension:access_types_qos_specs_idvolume_extension:type_getvolume_extension:types_extra_specs:read_sensitivevolume_extension:volume_type_access | — | 200 | |
| POST | /group_types | cinder/api/v3/group_types.py:57 | group:group_types:create | 3.11+ | group_types.create | 202 |
| GET | /group_types | cinder/api/v3/group_types.py:165 | — | 3.11+ | — | 200 |
| PUT | /group_types/{id} | cinder/api/v3/group_types.py:93 | group:group_types:update | 3.11+ | group_types.update | 200 |
| DELETE | /group_types/{id} | cinder/api/v3/group_types.py:142 | group:group_types:delete | 3.11+ | — | 202 |
| GET | /group_types/{id} | cinder/api/v3/group_types.py:172 | group:access_group_types_specs | 3.11+ | — | 200 |
| POST | /group_types/{group_type_id}/group_specs | cinder/api/v3/group_specs.py:59 | group:group_types_specs:create | 3.11+ | group_specs.create | 202 |
| GET | /group_types/{group_type_id}/group_specs | cinder/api/v3/group_specs.py:49 | group:group_types_specs:get_all | 3.11+ | — | 200 |
| PUT | /group_types/{group_type_id}/group_specs/{id} | cinder/api/v3/group_specs.py:76 | group:group_types_specs:update | 3.11+ | group_specs.update | 200 |
| DELETE | /group_types/{group_type_id}/group_specs/{id} | cinder/api/v3/group_specs.py:111 | group:group_types_specs:delete | 3.11+ | — | 202 |
| GET | /group_types/{group_type_id}/group_specs/{id} | cinder/api/v3/group_specs.py:96 | group:group_types_specs:get | 3.11+ | — | 200 |
| GET | /groups/detail | cinder/api/v3/groups.py:144 | group:get_allgroup:group_project_attribute | 3.13+ | — | 200 |
| POST | /groups | cinder/api/v3/groups.py:188 | group:create | 3.13+ | groups.create | 202 |
| GET | /groups | cinder/api/v3/groups.py:139 | group:get_all | 3.13+ | — | 200 |
| POST | /groups/{id}/action {"create-from-src"} | cinder/api/v3/groups.py:229 | — | 3.14+ | groups.create_from_source | 202 |
| POST | /groups/{id}/action {"delete"} | cinder/api/v3/groups.py:112 | group:delete | 3.13+ | groups.delete | 200 |
| POST | /groups/{id}/action {"disable_replication"} | cinder/api/v3/groups.py:362 | group:disable_replication | 3.38+ | groups.disable_replication | 202 |
| POST | /groups/{id}/action {"enable_replication"} | cinder/api/v3/groups.py:342 | group:enable_replication | 3.38+ | groups.enable_replication | 202 |
| POST | /groups/{id}/action {"failover_replication"} | cinder/api/v3/groups.py:382 | group:failover_replication | 3.38+ | groups.failover_replication | 202 |
| POST | /groups/{id}/action {"list_replication_targets"} | cinder/api/v3/groups.py:409 | group:list_replication_targets | 3.38+ | groups.list_replication | 200 |
| POST | /groups/{id}/action {"reset_status"} | cinder/api/v3/groups.py:73 | group:reset_status | 3.20+ | groups.reset_status | 200 |
| PUT | /groups/{id} | cinder/api/v3/groups.py:284 | group:update | 3.13+ | groups.update | 202 |
| DELETE | /groups/{id} | cinder/api/v3/groups.py:112 | — | 3.13+ | groups.delete | 200 |
| GET | /groups/{id} | cinder/api/v3/groups.py:56 | group:getgroup:group_project_attribute | 3.13+ | — | 200 |
| POST | /groups/action {"create-from-src"} | cinder/api/v3/groups.py:229 | — | 3.14+ | groups.create_from_source | 202 |
| POST | /groups/action {"delete"} | cinder/api/v3/groups.py:112 | — | 3.13+ | groups.delete | 200 |
| POST | /groups/action {"disable_replication"} | cinder/api/v3/groups.py:362 | — | 3.38+ | groups.disable_replication | 202 |
| POST | /groups/action {"enable_replication"} | cinder/api/v3/groups.py:342 | — | 3.38+ | groups.enable_replication | 202 |
| POST | /groups/action {"failover_replication"} | cinder/api/v3/groups.py:382 | — | 3.38+ | groups.failover_replication | 202 |
| POST | /groups/action {"list_replication_targets"} | cinder/api/v3/groups.py:409 | — | 3.38+ | groups.list_replication | 200 |
| POST | /groups/action {"reset_status"} | cinder/api/v3/groups.py:73 | — | 3.20+ | groups.reset_status | 200 |
| GET | /group_snapshots/detail | cinder/api/v3/group_snapshots.py:103 | group:get_all_group_snapshotsgroup:group_snapshot_project_attribute | 3.14+ | — | 200 |
| POST | /group_snapshots | cinder/api/v3/group_snapshots.py:152 | group:create_group_snapshot | 3.14+ | group_snapshots.create | 202 |
| GET | /group_snapshots | cinder/api/v3/group_snapshots.py:98 | group:get_all_group_snapshots | 3.14+ | — | 200 |
| POST | /group_snapshots/{id}/action {"reset_status"} | cinder/api/v3/group_snapshots.py:185 | group:reset_group_snapshot_status | 3.19+ | group_snapshots.reset_status | 200 |
| DELETE | /group_snapshots/{id} | cinder/api/v3/group_snapshots.py:70 | group:delete_group_snapshot | 3.14+ | — | 202 |
| GET | /group_snapshots/{id} | cinder/api/v3/group_snapshots.py:56 | group:get_group_snapshotgroup:group_snapshot_project_attribute | 3.14+ | — | 200 |
| GET | /snapshots/detail | cinder/api/v3/snapshots.py:179 | volume:get_all_snapshotsvolume_extension:extended_snapshot_attributes | — | 200 | |
| POST | /snapshots | cinder/api/v3/snapshots.py:185 | volume:create_snapshot | snapshots.create | 202 | |
| GET | /snapshots | cinder/api/v3/snapshots.py:175 | volume:get_all_snapshots | — | 200 | |
| POST | /snapshots/{id}/action {"os-force_delete"} | cinder/api/contrib/admin_actions.py:289 | volume_extension:snapshot_admin_actions:force_delete | admin_actions.force_delete_snapshot | 202 | |
| POST | /snapshots/{id}/action {"os-reset_status"} | cinder/api/contrib/admin_actions.py:248 | volume_extension:snapshot_admin_actions:reset_status | admin_actions.reset_status_snapshot | 202 | |
| POST | /snapshots/{id}/action {"os-unmanage"} | cinder/api/contrib/snapshot_unmanage.py:39 | snapshot_extension:snapshot_unmanage | snapshot_unmanage.unmanage | 202 | |
| POST | /snapshots/{id}/action {"os-update_snapshot_status"} | cinder/api/contrib/snapshot_actions.py:37 | snapshot_extension:snapshot_actions:update_snapshot_status | snapshot_actions.update_snapshot_status | 202 | |
| PUT | /snapshots/{id} | cinder/api/v3/snapshots.py:236 | volume:update_snapshot | snapshots.update | 200 | |
| DELETE | /snapshots/{id} | cinder/api/v3/snapshots.py:67 | volume:delete_snapshot | — | 202 | |
| GET | /snapshots/{id} | cinder/api/v3/snapshots.py:57 | volume:get_snapshotvolume_extension:extended_snapshot_attributes | — | 200 | |
| GET | /limits | cinder/api/v3/limits.py:27 | limits_extension:used_limits | — | 200 | |
| POST | /snapshots/{snapshot_id}/metadata | cinder/api/v3/snapshot_metadata.py:50 | volume:update_snapshot_metadata | snapshot_metadata.create | 200 | |
| GET | /snapshots/{snapshot_id}/metadata | cinder/api/v3/snapshot_metadata.py:44 | volume:get_snapshot_metadata | — | 200 | |
| PUT | /snapshots/{snapshot_id}/metadata/{id} | cinder/api/v3/snapshot_metadata.py:62 | volume:update_snapshot_metadata | snapshot_metadata.update | 200 | |
| DELETE | /snapshots/{snapshot_id}/metadata/{id} | cinder/api/v3/snapshot_metadata.py:124 | volume:delete_snapshot_metadata | — | 200 | |
| GET | /snapshots/{snapshot_id}/metadata/{id} | cinder/api/v3/snapshot_metadata.py:113 | volume:get_snapshot_metadata | — | 200 | |
| PUT | /snapshots/{snapshot_id}/metadata | cinder/api/v3/snapshot_metadata.py:82 | — | snapshot_metadata.create | 200 | |
| POST | /volumes/{volume_id}/metadata | cinder/api/v3/volume_metadata.py:76 | volume:create_volume_metadata | volume_metadata.create | 200 | |
| GET | /volumes/{volume_id}/metadata | cinder/api/v3/volume_metadata.py:62 | volume:get_volume_metadata | — | 200 | |
| PUT | /volumes/{volume_id}/metadata/{id} | cinder/api/v3/volume_metadata.py:108 | volume:update_volume_metadata | volume_metadata.update | HTTPStatus.PRECONDITION_FAILED | |
| DELETE | /volumes/{volume_id}/metadata/{id} | cinder/api/v3/volume_metadata.py:157 | volume:delete_volume_metadata | — | 200 | |
| GET | /volumes/{volume_id}/metadata/{id} | cinder/api/v3/volume_metadata.py:146 | volume:get_volume_metadata | — | 200 | |
| PUT | /volumes/{volume_id}/metadata | cinder/api/v3/volume_metadata.py:132 | volume:update_volume_metadata | volume_metadata.create | HTTPStatus.PRECONDITION_FAILED | |
| GET | /consistencygroups/detail | cinder/api/contrib/consistencygroups.py:98 | — | — | 200 | |
| POST | /consistencygroups | cinder/api/contrib/consistencygroups.py:141 | — | consistencygroups.create | 202 | |
| GET | /consistencygroups | cinder/api/contrib/consistencygroups.py:93 | — | — | 200 | |
| PUT | /consistencygroups/{id} | cinder/api/v3/consistencygroups.py:56 | — | consistencygroups.update | 202 | |
| DELETE | /consistencygroups/{id} | cinder/api/contrib/consistencygroups.py:64 | — | consistencygroups.delete | 202 | |
| GET | /consistencygroups/{id} | cinder/api/contrib/consistencygroups.py:52 | — | — | 200 | |
| GET | /manageable_volumes/detail | cinder/api/v3/resource_common_manage.py:83 | volume_extension:list_manageable | — | 200 | |
| POST | /manageable_volumes | cinder/api/v3/volume_manage.py:37 | volume_extension:volume_manage | volume_manage.volume_manage_create@3.0, volume_manage.volume_manage_create_v316@3.16 | 202 | |
| GET | /manageable_volumes | cinder/api/v3/resource_common_manage.py:78 | volume_extension:list_manageable | — | 200 | |
| GET | /manageable_snapshots/detail | cinder/api/v3/resource_common_manage.py:83 | snapshot_extension:list_manageable | — | 200 | |
| POST | /manageable_snapshots | cinder/api/v3/snapshot_manage.py:34 | snapshot_extension:snapshot_manage | snapshot_manage.create | 202 | |
| GET | /manageable_snapshots | cinder/api/v3/resource_common_manage.py:78 | snapshot_extension:list_manageable | — | 200 | |
| GET | /backups/detail | cinder/api/v3/backups.py:93 | backup:backup_project_attributebackup:get_all | — | 200 | |
| POST | /backups | cinder/api/contrib/backups.py:153 | backup:create | backups.create@3.0, backups.create_backup_v343@3.43, backups.create_backup_v351@3.51 | 202 | |
| GET | /backups | cinder/api/contrib/backups.py:76 | backup:get_all | — | 200 | |
| PUT | /backups/{id} | cinder/api/v3/backups.py:41 | backup:update | 3.9+ | backups.update@3.9, backups.update_backup_v343@3.43 | 200 |
| DELETE | /backups/{id} | cinder/api/contrib/backups.py:63 | backup:delete | — | 202 | |
| GET | /backups/{id} | cinder/api/v3/backups.py:73 | backup:backup_project_attributebackup:get | — | 200 | |
| GET | /attachments/detail | cinder/api/v3/attachments.py:71 | — | 3.27+ | — | 200 |
| POST | /attachments | cinder/api/v3/attachments.py:113 | volume:attachment_createvolume:multiattach_bootable_volume | 3.27+ | attachments.create@3.27, attachments.create_v354@3.54 | 200 |
| GET | /attachments | cinder/api/v3/attachments.py:65 | — | 3.27+ | — | 200 |
| POST | /attachments/{id}/action {"os-complete"} | cinder/api/v3/attachments.py:289 | volume:attachment_complete | 3.44+ | attachments.complete | 204 |
| PUT | /attachments/{id} | cinder/api/v3/attachments.py:215 | volume:attachment_update | 3.27+ | attachments.update | 200 |
| DELETE | /attachments/{id} | cinder/api/v3/attachments.py:271 | volume:attachment_delete | 3.27+ | — | 200 |
| GET | /attachments/{id} | cinder/api/v3/attachments.py:53 | — | 3.27+ | — | 200 |
| POST | /workers/cleanup | cinder/api/v3/workers.py:43 | workers:cleanup | 3.24+ | workers.cleanup | 202 |
| GET | /resource_filters | cinder/api/v3/resource_filters.py:32 | — | 3.33+ | — | 200 |
| GET | /volume-transfers/detail | cinder/api/v3/volume_transfer.py:75 | volume:get_all_transfers | — | 200 | |
| POST | /volume-transfers | cinder/api/v3/volume_transfer.py:83 | — | volume_transfer.create@3.0, volume_transfer.create_v355@3.55 | 202 | |
| GET | /volume-transfers | cinder/api/v3/volume_transfer.py:71 | — | — | 200 | |
| POST | /volume-transfers/{id}/accept | cinder/api/contrib/volume_transfer.py:112 | volume:accept_transfer | volume_transfer.accept | 202 | |
| DELETE | /volume-transfers/{id} | cinder/api/contrib/volume_transfer.py:137 | volume:delete_transfer | — | 202 | |
| GET | /volume-transfers/{id} | cinder/api/contrib/volume_transfer.py:42 | volume:get_transfer | — | 200 | |
| PUT | /default-types/{id} | cinder/api/v3/default_types.py:45 | — | 3.62+ | default_types.create_or_update | 200 |
| GET | /default-types | cinder/api/v3/default_types.py:84 | volume_extension:default_get_all | 3.62+ | — | 200 |
| GET | /default-types/{id} | cinder/api/v3/default_types.py:68 | volume_extension:default_get | 3.62+ | — | 200 |
| DELETE | /default-types/{id} | cinder/api/v3/default_types.py:100 | volume_extension:default_unset | 3.62+ | — | 204 |
| GET | /os-services | cinder/api/v3/services.py:54 | volume_extension:services:index | — | 200 | |
| PUT | /os-services/enable | cinder/api/v3/services.py:277 | — | services.enable_and_disable | 200 | |
| PUT | /os-services/disable | cinder/api/v3/services.py:302 | — | services.enable_and_disable | 200 | |
| PUT | /os-services/disable-log-reason | cinder/api/v3/services.py:243 | — | services.disable_log_reason | 200 | |
| PUT | /os-services/get-log | cinder/api/v3/services.py:212 | — | 3.32+ | services.get_log | 200 |
| PUT | /os-services/set-log | cinder/api/v3/services.py:190 | — | 3.32+ | services.set_log | 202 |
| PUT | /os-services/freeze | cinder/api/v3/services.py:130 | volume:freeze_host | services.freeze_and_thaw | 200 | |
| PUT | /os-services/thaw | cinder/api/v3/services.py:142 | volume:thaw_host | services.freeze_and_thaw | 200 | |
| PUT | /os-services/failover_host | cinder/api/v3/services.py:152 | volume:failover_host | services.failover_host | 202 | |
| GET | /extensions | cinder/api/extensions.py:95 | — | — | 200 | |
| GET | /extensions/{id} | cinder/api/extensions.py:101 | — | — | 200 | |
| GET | /cgsnapshots/detail | cinder/api/contrib/cgsnapshots.py:87 | — | — | 200 | |
| POST | /cgsnapshots | cinder/api/contrib/cgsnapshots.py:123 | — | cgsnapshots.create | 202 | |
| GET | /cgsnapshots | cinder/api/contrib/cgsnapshots.py:82 | — | — | 200 | |
| DELETE | /cgsnapshots/{id} | cinder/api/contrib/cgsnapshots.py:60 | — | — | 202 | |
| GET | /cgsnapshots/{id} | cinder/api/contrib/cgsnapshots.py:49 | — | — | 200 | |
| GET | /volumes/{volume_id}/encryption | cinder/api/contrib/volume_encryption_metadata.py:28 | volume_extension:volume_encryption_metadata | — | 200 | |
| GET | /volumes/{volume_id}/encryption/{id} | cinder/api/contrib/volume_encryption_metadata.py:36 | volume_extension:volume_encryption_metadata | — | 200 | |
| POST | /backups/import_record | cinder/api/contrib/backups.py:257 | — | backups.import_record | 201 | |
| POST | /backups/{id}/restore | cinder/api/contrib/backups.py:206 | backup:restore | backups.restore | 202 | |
| POST | /backups/{id}/action {"os-force_delete"} | cinder/api/contrib/admin_actions.py:338 | volume_extension:backup_admin_actions:force_delete | admin_actions.force_delete_backup | 202 | |
| POST | /backups/{id}/action {"os-reset_status"} | cinder/api/contrib/admin_actions.py:319 | volume_extension:backup_admin_actions:reset_status | admin_actions.reset_status_backup | 202 | |
| GET | /backups/{id}/export_record | cinder/api/contrib/backups.py:239 | — | — | 200 | |
| GET | /os-volume-transfer/detail | cinder/api/contrib/volume_transfer.py:55 | volume:get_all_transfers | — | 200 | |
| POST | /os-volume-transfer | cinder/api/contrib/volume_transfer.py:83 | volume:create_transfer | volume_transfer.create | 202 | |
| GET | /os-volume-transfer | cinder/api/contrib/volume_transfer.py:51 | volume:get_all_transfers | — | 200 | |
| POST | /os-volume-transfer/{id}/accept | cinder/api/contrib/volume_transfer.py:112 | volume:accept_transfer | volume_transfer.accept | 202 | |
| DELETE | /os-volume-transfer/{id} | cinder/api/contrib/volume_transfer.py:137 | volume:delete_transfer | — | 202 | |
| GET | /os-volume-transfer/{id} | cinder/api/contrib/volume_transfer.py:42 | volume:get_transfer | — | 200 | |
| GET | /types/{type_id}/os-volume-type-access | cinder/api/contrib/volume_type_access.py:41 | volume_extension:volume_type_access:get_all_for_type | — | 200 | |
| GET | /scheduler-stats/get_pools | cinder/api/contrib/scheduler_stats.py:42 | scheduler_extension:scheduler_stats:get_pools | — | 200 | |
| POST | /qos-specs | cinder/api/contrib/qos_specs_manage.py:80 | volume_extension:qos_specs_manage:create | qos_specs.create | 200 | |
| GET | /qos-specs | cinder/api/contrib/qos_specs_manage.py:59 | volume_extension:qos_specs_manage:get_all | — | 200 | |
| GET | /qos-specs/{id}/associations | cinder/api/contrib/qos_specs_manage.py:229 | volume_extension:qos_specs_manage:get_all | — | 200 | |
| GET | /qos-specs/{id}/associate | cinder/api/contrib/qos_specs_manage.py:262 | volume_extension:qos_specs_manage:update | — | 202 | |
| GET | /qos-specs/{id}/disassociate | cinder/api/contrib/qos_specs_manage.py:314 | volume_extension:qos_specs_manage:update | — | 202 | |
| GET | /qos-specs/{id}/disassociate_all | cinder/api/contrib/qos_specs_manage.py:357 | volume_extension:qos_specs_manage:update | — | 202 | |
| PUT | /qos-specs/{id}/delete_keys | cinder/api/contrib/qos_specs_manage.py:202 | volume_extension:qos_specs_manage:delete | qos_specs.unset | 202 | |
| PUT | /qos-specs/{id} | cinder/api/contrib/qos_specs_manage.py:119 | volume_extension:qos_specs_manage:update | qos_specs.set | 200 | |
| DELETE | /qos-specs/{id} | cinder/api/contrib/qos_specs_manage.py:162 | volume_extension:qos_specs_manage:delete | — | 202 | |
| GET | /qos-specs/{id} | cinder/api/contrib/qos_specs_manage.py:152 | volume_extension:qos_specs_manage:get | — | 200 | |
| PUT | /os-hosts | cinder/api/contrib/hosts.py:110 | — | hosts.update | 200 | |
| GET | /os-hosts | cinder/api/contrib/hosts.py:103 | volume_extension:hosts | — | 200 | |
| PUT | /os-hosts/{id} | cinder/api/contrib/hosts.py:110 | volume_extension:hosts | hosts.update | 200 | |
| GET | /os-hosts/{id} | cinder/api/contrib/hosts.py:146 | volume_extension:hosts | — | 200 | |
| POST | /types/{type_id}/extra_specs | cinder/api/contrib/types_extra_specs.py:86 | volume_extension:types_extra_specs:create | types_extra_specs.create | 200 | |
| GET | /types/{type_id}/extra_specs | cinder/api/contrib/types_extra_specs.py:55 | volume_extension:types_extra_specs:indexvolume_extension:types_extra_specs:read_sensitive | — | 200 | |
| PUT | /types/{type_id}/extra_specs/{id} | cinder/api/contrib/types_extra_specs.py:115 | volume_extension:types_extra_specs:update | types_extra_specs.update | 200 | |
| DELETE | /types/{type_id}/extra_specs/{id} | cinder/api/contrib/types_extra_specs.py:161 | volume_extension:types_extra_specs:delete | — | 202 | |
| GET | /types/{type_id}/extra_specs/{id} | cinder/api/contrib/types_extra_specs.py:148 | volume_extension:types_extra_specs:read_sensitivevolume_extension:types_extra_specs:show | — | 200 | |
| GET | /os-volume-manage/detail | cinder/api/contrib/volume_manage.py:170 | — | — | 200 | |
| POST | /os-volume-manage | cinder/api/contrib/volume_manage.py:54 | — | volume_manage.volume_manage_create@3.0, volume_manage.volume_manage_create_v316@3.16 | 202 | |
| GET | /os-volume-manage | cinder/api/contrib/volume_manage.py:161 | — | — | 200 | |
| PUT | /os-quota-class-sets/{id} | cinder/api/contrib/quota_classes.py:56 | volume_extension:quota_classes:update | quota_classes.update_quota_class | 200 | |
| GET | /os-quota-class-sets/{id} | cinder/api/contrib/quota_classes.py:42 | volume_extension:quota_classes:get | — | 200 | |
| GET | /os-snapshot-manage/detail | cinder/api/contrib/snapshot_manage.py:122 | — | — | 200 | |
| POST | /os-snapshot-manage | cinder/api/contrib/snapshot_manage.py:43 | — | snapshot_manage.create | 202 | |
| GET | /os-snapshot-manage | cinder/api/contrib/snapshot_manage.py:113 | — | — | 200 | |
| GET | /capabilities/{id} | cinder/api/contrib/capabilities.py:41 | volume_extension:capabilities | — | 200 | |
| GET | /os-availability-zone | cinder/api/contrib/availability_zones.py:31 | — | — | 200 | |
| POST | /consistencygroups/create_from_src | cinder/api/contrib/consistencygroups.py:188 | — | consistencygroups.create_from_src | 202 | |
| POST | /consistencygroups/{id}/delete | cinder/api/contrib/consistencygroups.py:64 | — | consistencygroups.delete | 202 | |
| PUT | /consistencygroups/{id}/update | cinder/api/contrib/consistencygroups.py:267 | — | consistencygroups.update | 202 | |
| GET | /os-quota-sets/{id}/defaults | cinder/api/contrib/quotas.py:145 | — | — | 200 | |
| PUT | /os-quota-sets/{id} | cinder/api/contrib/quotas.py:90 | volume_extension:quotas:update | quotas.update | 200 | |
| DELETE | /os-quota-sets/{id} | cinder/api/contrib/quotas.py:153 | volume_extension:quotas:delete | — | 200 | |
| GET | /os-quota-sets/{id} | cinder/api/contrib/quotas.py:69 | volume_extension:quotas:show | — | 200 | |
| POST | /types/{type_id}/encryption | cinder/api/contrib/volume_type_encryption.py:69 | volume_extension:volume_type_encryption:create | volume_type_encryption.create | 200 | |
| GET | /types/{type_id}/encryption | cinder/api/contrib/volume_type_encryption.py:60 | volume_extension:volume_type_encryption:get | — | 200 | |
| PUT | /types/{type_id}/encryption/{id} | cinder/api/contrib/volume_type_encryption.py:97 | volume_extension:volume_type_encryption:update | volume_type_encryption.update | 200 | |
| DELETE | /types/{type_id}/encryption/{id} | cinder/api/contrib/volume_type_encryption.py:135 | volume_extension:volume_type_encryption:delete | — | 202 | |
| GET | /types/{type_id}/encryption/{id} | cinder/api/contrib/volume_type_encryption.py:121 | volume_extension:volume_type_encryption:get | — | 200 |
Plus GET / (version list, 300, cinder/api/versions.py:87-92) and GET /v3/ (version document, cinder/api/versions.py:76-79). The router also declares routes whose controller has no method (for example GET /volumes/new, PUT /limits/{id}): they answer 404, or 400 "There is no such action" when the controller has body actions. They are listed in [_rewrite/routes-unimplemented_stable-2026.2.json](_rewrite/routes-unimplemented_stable-2026.2.json) and must not be implemented by a rewrite.
Spec/code mismatches
os-extend_volume_completionis documented as added in 3.71, butmv.EXTEND_VOLUME_COMPLETIONis never used: the action exists at every microversion for whoever passes the policy (cinder/api/microversions.py:182,cinder/api/contrib/admin_actions.py:205-214).- The policy
operationscontain 13 entries that match no route (PUT /clusters/{id},POST /backups/{id}/export_recordinstead ofGET,GET /os-quota-sets/{id}/defaultinstead ofdefaults,/volume_transfersinstead of/volume-transfers…), listed in [_rewrite/policy-operations-unmatched_stable-2026.2.json](_rewrite/policy-operations-unmatched_stable-2026.2.json). 58 operations have no policy rule in anyoperationslist; their checks are in the code. associate,disassociateanddisassociate_allon QoS specs change data with GET (cinder/api/contrib/qos_specs_manage.py:262-370).os-hostsandconsistencygroups/cgsnapshotsare deprecated but routed.
4. Lifecycles
Volume
stateDiagram-v2
[*] --> creating: POST /volumes (API)
creating --> available: create flow done (cinder-volume)
creating --> error: no valid backend (scheduler) / driver failure (cinder-volume)
creating --> downloading: create from image (cinder-volume)
downloading --> available: image copied
available --> reserved: POST /attachments or os-reserve (API)
reserved --> attaching: os-attach (API)
reserved --> in_use: attachments os-complete (API)
attaching --> in_use: attach_volume (RPC call)
in_use --> detaching: os-begin_detaching (API)
detaching --> available: detach_volume / attachment_delete (RPC call)
available --> extending: os-extend (API)
in_use --> extending: os-extend >= 3.42 (API)
extending --> available: extend_volume (cinder-volume)
extending --> in_use: extend_volume (attached)
extending --> error_extending: driver failure
available --> retyping: os-retype (API)
retyping --> available: retype done
available --> uploading: os-volume_upload_image (API)
uploading --> available: copy_volume_to_image done
available --> backing_up: POST /backups (API)
backing_up --> available: backup done (cinder-backup)
available --> restoring_backup: POST /backups/{id}/restore (API)
restoring_backup --> available: restore done
restoring_backup --> error_restoring: restore failure
available --> awaiting_transfer: POST /volume-transfers (API)
awaiting_transfer --> available: accept or DELETE transfer
available --> reverting: revert (API)
reverting --> available: revert_to_snapshot (cinder-volume)
available --> deleting: DELETE (API)
error --> deleting: DELETE (API)
deleting --> [*]: delete_volume (cinder-volume)
deleting --> error_deleting: driver failure
available --> maintenance: migration (cinder-volume)in_use, backing_up, restoring_backup, awaiting_transfer stand for in-use, backing-up, restoring-backup, awaiting-transfer (Mermaid identifiers cannot contain -). The statuses are listed in cinder/objects/fields.py:162-191; os-reset_status can set any of them.
Attachment (volume_attachment.attach_status)
stateDiagram-v2
[*] --> reserved: POST /attachments without connector
reserved --> attaching: PUT /attachments/{id} with connector (connection_info returned)
[*] --> attaching: POST /attachments with connector
attaching --> attached: os-complete
attached --> detached: DELETE /attachments/{id}
reserved --> detached: DELETE /attachments/{id}
attaching --> error_attaching: driver failure
detached --> [*]Statuses from cinder/objects/fields.py:145-152. [inferred] The intermediate attaching value is written by the volume manager's attachment_update.
Snapshot and backup
stateDiagram-v2 [*] --> creating: POST /snapshots creating --> available: create_snapshot (cinder-volume) creating --> error: driver failure available --> deleting: DELETE error --> deleting: DELETE deleting --> [*] deleting --> error_deleting: driver failure available --> backing_up: backup of the snapshot backing_up --> available available --> restoring: revert (volume) restoring --> available
stateDiagram-v2
[*] --> creating: POST /backups
creating --> available: create_backup (cinder-backup)
creating --> error: driver failure / backup service down
available --> restoring: POST /backups/{id}/restore
restoring --> available: restore done
available --> deleting: DELETE
error --> deleting: DELETE
deleting --> deleted: delete_backup (cinder-backup)
deleting --> error_deleting: driver failureStatuses from cinder/objects/fields.py:25-36 and cinder/objects/fields.py:113-127.
Source: reverse-spec-cinder/01-rest-api_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.