REST API — nova — branch stable/2026.2
Branch
stable/2026.2@8df1922926dd(34.0.0+ 7 commits) — repository https://opendev.org/openstack/nova — analysed on 2026-10-28
Scope of this file: the compute API (nova-api, paste app osapi_compute). The metadata API (nova-metadata-api) is summarised in § 9. The flavor, extra-spec and flavor-access endpoints are specified in depth in the flavors-scoped spec (01-flavors-api_stable-2026.2.md); this file only lists them.
Related files: errors · interactions · scenarios · async processing · summary.
1. How the API is built
1.1 Request pipeline
etc/nova/api-paste.ini mounts the compute API under /v2.1 (and a legacy-v2 compatibility pipeline under /v2). For /v2.1/+ the pipeline is, outermost first (etc/nova/api-paste.ini:31-33):
| # | Filter | Code | Role |
|---|---|---|---|
| 1 | cors | oslo_middleware.cors | CORS headers |
| 2 | http_proxy_to_wsgi | oslo_middleware.http_proxy_to_wsgi | honours X-Forwarded-Proto behind a proxy |
| 3 | compute_req_id | nova/api/compute_req_id.py | generates X-Compute-Request-Id / X-OpenStack-Request-Id |
| 4 | faultwrap | nova/api/openstack/__init__.py:49 FaultWrapper | turns any uncaught exception into a JSON fault (500 if unknown) |
| 5 | request_log | nova/api/openstack/requestlog.py | one INFO access-log line per request |
| 6 | sizelimit | oslo_middleware.RequestBodySizeLimiter | 413 above [oslo_middleware]/max_request_body_size |
| 7 | osprofiler | nova/profiler.py | optional tracing |
| 8 | authtoken | keystonemiddleware.auth_token | validates X-Auth-Token against Keystone (401) |
| 9 | keystonecontext | nova/api/auth.py NovaKeystoneContext | builds nova.context.RequestContext from the X-* headers |
| 10 | app | nova/api/openstack/compute/routes.py:860 APIRouterV21 | routes ROUTE_LIST (nova/api/openstack/compute/routes.py) |
Because authtoken sits inside faultwrap and sizelimit, an oversize body yields 413 before authentication, and an invalid token yields 401 before routing (so an unknown path with a bad token is a 401, not a 404).
1.2 Routing and actions
- Routes are a static list of
(path, {method: [controller_factory, 'method']})tuples,nova/api/openstack/compute/routes.py(ROUTE_LIST). Each controller factory wraps one main controller and, for/servers, 25+ extension controllers that only contribute body actions (nova/api/openstack/compute/routes.py:251). POST …/actionroutes dispatch on the single top-level key of the JSON body (nova/api/openstack/wsgi.py:347action_peek): more than one key → 400 "too many body keys"; an unknown key → 400 "There is no such action: %s" (nova/api/openstack/wsgi.py:538).- A project id in the URL (
/v2.1/{project_id}/servers) is optional; when present it must equal the token's project, otherwise 400 "Malformed request URL" (nova/api/openstack/wsgi.py:566-572).
1.3 Microversions
- Supported range:
2.1…2.104(nova/api/openstack/api_version_request.py:299-300). Without a header the request runs at the minimum2.1(DEFAULT_API_VERSION,nova/api/openstack/api_version_request.py:301);latestmeans2.104. A version outside the range yields 406InvalidGlobalAPIVersion(nova/api/openstack/wsgi.py:168-174). - Headers read:
OpenStack-API-Version: compute 2.xand legacyX-OpenStack-Nova-API-Version: 2.x. Responses echo both, plusVary(nova/api/openstack/wsgi.py:609-615). - Per-method bounds come from
@wsgi.api_version(min, max)(nova/api/openstack/wsgi.py:698). Calling a method outside its range raisesVersionNotFoundForAPIMethod, which the resource turns into a bare 404 "as if the method did not exist" (nova/api/openstack/wsgi.py:658-667). - Request body schemas (
@validation.schema), query schemas (@validation.query_schema) and response body schemas (@validation.response_body_schema) are all microversion-ranged and are listed per handler in_rewrite/schema-selection_stable-2026.2.jsonand in_rewrite/api-operations_stable-2026.2.json. Schema ranges must be contiguous: theSchemascontainer asserts it at import time (nova/api/validation/__init__.py:122-137). - Success codes can be microversion-dependent (
@wsgi.response(code, min, max),nova/api/openstack/wsgi.py:222-260); e.g.POST /os-keypairsreturns 200 up to 2.1 and 201 from 2.2. - Removed APIs (
@wsgi.removed,nova/api/openstack/wsgi.py:685) keep their routes and answer 410 Gone at every microversion (54 operations: cells v1, nova-network proxies, agents, certificates, cloudpipe, fping, fixed IPs, floating IP DNS/bulk, virtual interfaces, security group default rules, consoles,os-getRDPConsole,resetNetwork…). - Proxy APIs to Neutron, Glance, Cinder and Ironic (
/os-networks,/os-security-groups,/os-floating-ips,/images,/os-volumes,/os-snapshots,/os-baremetal-nodes,/os-hosts…) are capped at 2.35 (2.38 for image metadata, 2.42 for/os-hosts) and then 404 (nova/api/openstack/api_version_request.py:305-311). /os-volumes_bootis a legacy alias of/servers, capped at 2.102.
1.4 Validation, policy, errors
- JSON-schema failures yield 400 with the jsonschema message (
nova/api/validation/validators.py). Query-parameter schemas reject unknown parameters only for some APIs and microversions (additionalPropertiesin each query schema). - Policies (oslo.policy, 214 default rules,
nova/policies/) are checked in the handler withcontext.can(rule, target); a refusal raisesexception.Forbidden→ 403 (nova/api/openstack/wsgi.py:383-385). Default rules are scoped withenforce_scope/enforce_new_defaultspersonas (admin, project member, project reader, service). @wsgi.expected_errors(codes)(nova/api/openstack/wsgi.py:738) lets throughwebobHTTP errors whose code is listed, plusForbidden,ValidationError,Unauthorized, and convertsNotSupportedto 400; anything else becomes 500 "Unexpected API Error" and is logged with "Unexpected exception in API method" (nova/api/openstack/wsgi.py:806-813).- Error body:
{"<faultName>": {"code": <status>, "message": "<explanation>"}}, with fault namesbadRequest,unauthorized,forbidden,itemNotFound,badMethod,conflictingRequest,overLimit(413/429, withretryAfter),badMediaType,notImplemented,serviceUnavailable, otherwisecomputeFault(nova/api/openstack/wsgi.py:876-920). See 02-errors § 1. - Instance-state preconditions are enforced in
nova/compute/api.pyby decorators:check_instance_state(vm_state=…, task_state=(None,), must_have_launched=True)(nova/compute/api.py:142) — **the default requirestask_stateto beNone, i.e. no operation in progress, and the server to have been launched once** —,reject_instance_state(nova/compute/api.py:187),check_instance_host(nova/compute/api.py:216, 409 if the server has no host; 503 ifcheck_is_upand the source compute is down),check_instance_lock(nova/compute/api.py:247, 409InstanceIsLockedunless admin). The handlers translateInstanceInvalidStateinto 409 "Cannot '<action>' instance <id> while it is in <attr> <state>" (nova/api/openstack/common.py:330-346).
1.5 Server status shown to clients
The API never exposes vm_state/task_state directly in status: it maps them through _STATE_MAP (nova/api/openstack/common.py:44, nova/api/openstack/common.py:114 status_from_state). Examples: building → BUILD; active + rebooting → REBOOT; active + rebooting_hard → HARD_REBOOT; active + resize_prep → RESIZE; resized → VERIFY_RESIZE; active + migrating → MIGRATING; stopped → SHUTOFF; soft-delete → SOFT_DELETED; shelved_offloaded → SHELVED_OFFLOADED; error → ERROR. Raw states are visible to admins as OS-EXT-STS:vm_state / OS-EXT-STS:task_state.
1.6 Where an instance lives (cells v2)
Every server lookup (common.get_instance, nova/api/openstack/common.py:463) goes through compute.API.get (nova/compute/api.py:3054): it reads instance_mappings in the API database to find the cell, then reads the cell database; before scheduling has finished, the instance only exists as a build_requests row and is served from there. A missing mapping or row is a 404. From 2.69 list/show can return a partial "down cell" record (status: UNKNOWN) when a cell database is unreachable (nova/api/openstack/compute/servers.py:169 _is_cell_down_supported).
2. Operation table
265 operations: 201 method/path routes plus 64 body actions (41 on /servers/{id}/action, of which 2 removed — the 39 live ones are in § 4 —, and 23 on /os-volumes_boot/{id}/action, flavors, aggregates, networks, fixed IPs, bare-metal nodes and migrations). 211 are live and 54 answer 410. "Microversions" is the @wsgi.api_version range of the handler (all = 2.1–2.104); "Expected errors" is the @wsgi.expected_errors list (other exceptions become 500). Handler references point at the def line. The same data, with schemas, is in _rewrite/api-operations_stable-2026.2.json.
| # | Method | Path | Action | Handler | Policy rules | Microversions | Success | Expected errors |
|---|---|---|---|---|---|---|---|---|
| 1 | GET | / | nova/api/openstack/compute/versionsV21.py:31 VersionsController.show | — | all | 200 | 404 | |
| 2 | GET | /versions/{id} | nova/api/openstack/compute/versionsV21.py:31 VersionsController.show | — | all | 200 | 404 | |
| 3 | GET | /extensions | nova/api/openstack/compute/extension_info.py:862 ExtensionInfoController.index | os_compute_api:extensions | all | 200 | — | |
| 4 | GET | /extensions/{id} | nova/api/openstack/compute/extension_info.py:877 ExtensionInfoController.show | os_compute_api:extensions | all | 200 | 404 | |
| 5 | GET | /flavors | nova/api/openstack/compute/flavors.py:147 FlavorsController.index | — | all | 200 | 400 | |
| 6 | POST | /flavors | nova/api/openstack/compute/flavors.py:68 FlavorsController.create | os_compute_api:os-flavor-extra-specs:indexos_compute_api:os-flavor-manage:create | all | 200 | 400, 409 | |
| 7 | GET | /flavors/detail | nova/api/openstack/compute/flavors.py:160 FlavorsController.detail | os_compute_api:os-flavor-extra-specs:index | all | 200 | 400 | |
| 8 | GET | /flavors/{id} | nova/api/openstack/compute/flavors.py:181 FlavorsController.show | os_compute_api:os-flavor-extra-specs:index | all | 200 | 404 | |
| 9 | PUT | /flavors/{id} | nova/api/openstack/compute/flavors.py:121 FlavorsController.update | os_compute_api:os-flavor-extra-specs:indexos_compute_api:os-flavor-manage:update | 2.55–max | 200 | 400, 404 | |
| 10 | DELETE | /flavors/{id} | nova/api/openstack/compute/flavors.py:46 FlavorsController.delete | os_compute_api:os-flavor-manage:delete | all | 202 | 404 | |
| 11 | POST | /flavors/{id}/action | addTenantAccess | nova/api/openstack/compute/flavor_access.py:71 FlavorActionController._add_tenant_access | os_compute_api:os-flavor-access:add_tenant_access | all | 200 | 400, 403, 404, 409 |
| 12 | POST | /flavors/{id}/action | removeTenantAccess | nova/api/openstack/compute/flavor_access.py:97 FlavorActionController._remove_tenant_access | os_compute_api:os-flavor-access:remove_tenant_access | all | 200 | 400, 403, 404 |
| 13 | GET | /flavors/{flavor_id}/os-extra_specs | nova/api/openstack/compute/flavors_extraspecs.py:61 FlavorExtraSpecsController.index | os_compute_api:os-flavor-extra-specs:index | all | 200 | 404 | |
| 14 | POST | /flavors/{flavor_id}/os-extra_specs | nova/api/openstack/compute/flavors_extraspecs.py:74 FlavorExtraSpecsController.create | os_compute_api:os-flavor-extra-specs:create | all | 200 | 400, 404, 409 | |
| 15 | GET | /flavors/{flavor_id}/os-extra_specs/{id} | nova/api/openstack/compute/flavors_extraspecs.py:115 FlavorExtraSpecsController.show | os_compute_api:os-flavor-extra-specs:show | all | 200 | 404 | |
| 16 | PUT | /flavors/{flavor_id}/os-extra_specs/{id} | nova/api/openstack/compute/flavors_extraspecs.py:93 FlavorExtraSpecsController.update | os_compute_api:os-flavor-extra-specs:update | all | 200 | 400, 404, 409 | |
| 17 | DELETE | /flavors/{flavor_id}/os-extra_specs/{id} | nova/api/openstack/compute/flavors_extraspecs.py:134 FlavorExtraSpecsController.delete | os_compute_api:os-flavor-extra-specs:delete | all | 200 | 404 | |
| 18 | GET | /flavors/{flavor_id}/os-flavor-access | nova/api/openstack/compute/flavor_access.py:48 FlavorAccessController.index | os_compute_api:os-flavor-access | all | 200 | 404 | |
| 19 | GET | /images | nova/api/openstack/compute/images.py:124 ImagesController.index | — | 2.1–2.35 | 200 | 400 | |
| 20 | GET | /images/detail | nova/api/openstack/compute/images.py:144 ImagesController.detail | — | 2.1–2.35 | 200 | 400 | |
| 21 | GET | /images/{id} | nova/api/openstack/compute/images.py:82 ImagesController.show | — | 2.1–2.35 | 200 | 404 | |
| 22 | DELETE | /images/{id} | nova/api/openstack/compute/images.py:102 ImagesController.delete | — | 2.1–2.35 | 204 | 403, 404 | |
| 23 | GET | /images/{image_id}/metadata | nova/api/openstack/compute/image_metadata.py:49 ImageMetadataController.index | — | 2.1–2.38 | 200 | 403, 404 | |
| 24 | POST | /images/{image_id}/metadata | nova/api/openstack/compute/image_metadata.py:71 ImageMetadataController.create | — | 2.1–2.38 | 200 | 400, 403, 404 | |
| 25 | PUT | /images/{image_id}/metadata | nova/api/openstack/compute/image_metadata.py:113 ImageMetadataController.update_all | — | 2.1–2.38 | 200 | 400, 403, 404 | |
| 26 | GET | /images/{image_id}/metadata/{id} | nova/api/openstack/compute/image_metadata.py:59 ImageMetadataController.show | — | 2.1–2.38 | 200 | 403, 404 | |
| 27 | PUT | /images/{image_id}/metadata/{id} | nova/api/openstack/compute/image_metadata.py:89 ImageMetadataController.update | — | 2.1–2.38 | 200 | 400, 403, 404 | |
| 28 | DELETE | /images/{image_id}/metadata/{id} | nova/api/openstack/compute/image_metadata.py:130 ImageMetadataController.delete | — | 2.1–2.38 | 204 | 403, 404 | |
| 29 | GET | /limits | nova/api/openstack/compute/limits.py:50 LimitsController.index | os_compute_api:limitsos_compute_api:limits:other_project | all | 200 | — | |
| 30 | GET | /os-agents | nova/api/openstack/compute/agents.py:39 AgentController.index | — | removed (410) | 200 | 410 | |
| 31 | POST | /os-agents | nova/api/openstack/compute/agents.py:59 AgentController.create | — | removed (410) | 200 | 410 | |
| 32 | PUT | /os-agents/{id} | nova/api/openstack/compute/agents.py:46 AgentController.update | — | removed (410) | 200 | 410 | |
| 33 | DELETE | /os-agents/{id} | nova/api/openstack/compute/agents.py:52 AgentController.delete | — | removed (410) | 200 | 410 | |
| 34 | GET | /os-aggregates | nova/api/openstack/compute/aggregates.py:57 AggregateController.index | os_compute_api:os-aggregates:index | all | 200 | — | |
| 35 | POST | /os-aggregates | nova/api/openstack/compute/aggregates.py:72 AggregateController.create | os_compute_api:os-aggregates:create | all | 200 | 400, 409 | |
| 36 | GET | /os-aggregates/{id} | nova/api/openstack/compute/aggregates.py:108 AggregateController.show | os_compute_api:os-aggregates:show | all | 200 | 400, 404 | |
| 37 | PUT | /os-aggregates/{id} | nova/api/openstack/compute/aggregates.py:129 AggregateController.update | os_compute_api:os-aggregates:update | all | 200 | 400, 404, 409 | |
| 38 | DELETE | /os-aggregates/{id} | nova/api/openstack/compute/aggregates.py:158 AggregateController.delete | os_compute_api:os-aggregates:delete | all | 200 | 400, 404 | |
| 39 | POST | /os-aggregates/{id}/action | add_host | nova/api/openstack/compute/aggregates.py:183 AggregateController._add_host | os_compute_api:os-aggregates:add_host | all | 200 | 400, 404, 409 |
| 40 | POST | /os-aggregates/{id}/action | remove_host | nova/api/openstack/compute/aggregates.py:214 AggregateController._remove_host | os_compute_api:os-aggregates:remove_host | all | 200 | 400, 404, 409 |
| 41 | POST | /os-aggregates/{id}/action | set_metadata | nova/api/openstack/compute/aggregates.py:248 AggregateController._set_metadata | os_compute_api:os-aggregates:set_metadata | all | 200 | 400, 404 |
| 42 | POST | /os-aggregates/{id}/images | nova/api/openstack/compute/aggregates.py:299 AggregateController.images | compute:aggregates:images | 2.81–max | 202 | 400, 404 | |
| 43 | POST | /os-assisted-volume-snapshots | nova/api/openstack/compute/assisted_volume_snapshots.py:41 AssistedVolumeSnapshotsController.create | os_compute_api:os-assisted-volume-snapshots:create | all | 200 | 400 | |
| 44 | DELETE | /os-assisted-volume-snapshots/{id} | nova/api/openstack/compute/assisted_volume_snapshots.py:70 AssistedVolumeSnapshotsController.delete | os_compute_api:os-assisted-volume-snapshots:delete | all | 204 | 400, 404 | |
| 45 | GET | /os-availability-zone | nova/api/openstack/compute/availability_zone.py:112 AvailabilityZoneController.index | os_compute_api:os-availability-zone:list | all | 200 | — | |
| 46 | GET | /os-availability-zone/detail | nova/api/openstack/compute/availability_zone.py:123 AvailabilityZoneController.detail | os_compute_api:os-availability-zone:detail | all | 200 | — | |
| 47 | GET | /os-baremetal-nodes | nova/api/openstack/compute/baremetal_nodes.py:69 BareMetalNodeController.index | os_compute_api:os-baremetal-nodes:list | 2.1–2.35 | 200 | 404, 501 | |
| 48 | POST | /os-baremetal-nodes | nova/api/openstack/compute/baremetal_nodes.py:125 BareMetalNodeController.create | — | 2.1–2.35 | 200 | 400 | |
| 49 | GET | /os-baremetal-nodes/{id} | nova/api/openstack/compute/baremetal_nodes.py:94 BareMetalNodeController.show | os_compute_api:os-baremetal-nodes:show | 2.1–2.35 | 200 | 404, 501 | |
| 50 | DELETE | /os-baremetal-nodes/{id} | nova/api/openstack/compute/baremetal_nodes.py:131 BareMetalNodeController.delete | — | 2.1–2.35 | 200 | 400 | |
| 51 | POST | /os-baremetal-nodes/{id}/action | add_interface | nova/api/openstack/compute/baremetal_nodes.py:139 BareMetalNodeController._add_interface | — | 2.1–2.35 | 200 | 400 |
| 52 | POST | /os-baremetal-nodes/{id}/action | remove_interface | nova/api/openstack/compute/baremetal_nodes.py:147 BareMetalNodeController._remove_interface | — | 2.1–2.35 | 200 | 400 |
| 53 | POST | /os-cells | nova/api/openstack/compute/cells.py:83 CellsController.create | — | removed (410) | 200 | 410 | |
| 54 | GET | /os-cells | nova/api/openstack/compute/cells.py:42 CellsController.index | — | removed (410) | 200 | 410 | |
| 55 | GET | /os-cells/capacities | nova/api/openstack/compute/cells.py:63 CellsController.capacities | — | removed (410) | 200 | 410 | |
| 56 | GET | /os-cells/detail | nova/api/openstack/compute/cells.py:49 CellsController.detail | — | removed (410) | 200 | 410 | |
| 57 | GET | /os-cells/info | nova/api/openstack/compute/cells.py:56 CellsController.info | — | removed (410) | 200 | 410 | |
| 58 | POST | /os-cells/sync_instances | nova/api/openstack/compute/cells.py:97 CellsController.sync_instances | — | removed (410) | 200 | 410 | |
| 59 | GET | /os-cells/{id} | nova/api/openstack/compute/cells.py:70 CellsController.show | — | removed (410) | 200 | 410 | |
| 60 | PUT | /os-cells/{id} | nova/api/openstack/compute/cells.py:90 CellsController.update | — | removed (410) | 200 | 410 | |
| 61 | DELETE | /os-cells/{id} | nova/api/openstack/compute/cells.py:76 CellsController.delete | — | removed (410) | 200 | 410 | |
| 62 | GET | /os-cells/{id}/capacities | nova/api/openstack/compute/cells.py:63 CellsController.capacities | — | removed (410) | 200 | 410 | |
| 63 | POST | /os-certificates | nova/api/openstack/compute/certificates.py:45 CertificatesController.create | — | removed (410) | 200 | 410 | |
| 64 | GET | /os-certificates/{id} | nova/api/openstack/compute/certificates.py:37 CertificatesController.show | — | removed (410) | 200 | 410 | |
| 65 | GET | /os-cloudpipe | nova/api/openstack/compute/cloudpipe.py:46 CloudpipeController.index | — | removed (410) | 200 | 410 | |
| 66 | POST | /os-cloudpipe | nova/api/openstack/compute/cloudpipe.py:38 CloudpipeController.create | — | removed (410) | 200 | 410 | |
| 67 | PUT | /os-cloudpipe/{id} | nova/api/openstack/compute/cloudpipe.py:54 CloudpipeController.update | — | removed (410) | 200 | 410 | |
| 68 | GET | /os-console-auth-tokens/{id} | nova/api/openstack/compute/console_auth_tokens.py:44 ConsoleAuthTokensController.show | os_compute_api:os-console-auth-tokens | all | 200 | 400, 401, 404 (2.1–2.30); 400, 404 (2.31–2.98); 400, 404 (2.99–max) | |
| 69 | GET | /os-fixed-ips/{id} | nova/api/openstack/compute/fixed_ips.py:36 FixedIPController.show | — | removed (410) | 200 | 410 | |
| 70 | POST | /os-fixed-ips/{id}/action | reserve | nova/api/openstack/compute/fixed_ips.py:44 FixedIPController.reserve | — | removed (410) | 200 | 410 |
| 71 | POST | /os-fixed-ips/{id}/action | unreserve | nova/api/openstack/compute/fixed_ips.py:52 FixedIPController.unreserve | — | removed (410) | 200 | 410 |
| 72 | GET | /os-floating-ip-dns | nova/api/openstack/compute/floating_ip_dns.py:37 FloatingIPDNSDomainController.index | — | removed (410) | 200 | 410 | |
| 73 | PUT | /os-floating-ip-dns/{id} | nova/api/openstack/compute/floating_ip_dns.py:44 FloatingIPDNSDomainController.update | — | removed (410) | 200 | 410 | |
| 74 | DELETE | /os-floating-ip-dns/{id} | nova/api/openstack/compute/floating_ip_dns.py:50 FloatingIPDNSDomainController.delete | — | removed (410) | 200 | 410 | |
| 75 | GET | /os-floating-ip-dns/{domain_id}/entries/{id} | nova/api/openstack/compute/floating_ip_dns.py:62 FloatingIPDNSEntryController.show | — | removed (410) | 200 | 410 | |
| 76 | PUT | /os-floating-ip-dns/{domain_id}/entries/{id} | nova/api/openstack/compute/floating_ip_dns.py:69 FloatingIPDNSEntryController.update | — | removed (410) | 200 | 410 | |
| 77 | DELETE | /os-floating-ip-dns/{domain_id}/entries/{id} | nova/api/openstack/compute/floating_ip_dns.py:75 FloatingIPDNSEntryController.delete | — | removed (410) | 200 | 410 | |
| 78 | GET | /os-floating-ip-pools | nova/api/openstack/compute/floating_ip_pools.py:49 FloatingIPPoolsController.index | os_compute_api:os-floating-ip-pools | 2.1–2.35 | 200 | — | |
| 79 | GET | /os-floating-ips | nova/api/openstack/compute/floating_ips.py:110 FloatingIPController.index | os_compute_api:os-floating-ips:list | 2.1–2.35 | 200 | — | |
| 80 | POST | /os-floating-ips | nova/api/openstack/compute/floating_ips.py:125 FloatingIPController.create | os_compute_api:os-floating-ips:create | 2.1–2.35 | 200 | 400, 403, 404 | |
| 81 | GET | /os-floating-ips/{id} | nova/api/openstack/compute/floating_ips.py:90 FloatingIPController.show | os_compute_api:os-floating-ips:show | 2.1–2.35 | 200 | 400, 404 | |
| 82 | DELETE | /os-floating-ips/{id} | nova/api/openstack/compute/floating_ips.py:159 FloatingIPController.delete | os_compute_api:os-floating-ips:delete | 2.1–2.35 | 202 | 400, 403, 404, 409 | |
| 83 | GET | /os-floating-ips-bulk | nova/api/openstack/compute/floating_ips_bulk.py:36 FloatingIPBulkController.index | — | removed (410) | 200 | 410 | |
| 84 | POST | /os-floating-ips-bulk | nova/api/openstack/compute/floating_ips_bulk.py:50 FloatingIPBulkController.create | — | removed (410) | 200 | 410 | |
| 85 | GET | /os-floating-ips-bulk/{id} | nova/api/openstack/compute/floating_ips_bulk.py:43 FloatingIPBulkController.show | — | removed (410) | 200 | 410 | |
| 86 | PUT | /os-floating-ips-bulk/{id} | nova/api/openstack/compute/floating_ips_bulk.py:57 FloatingIPBulkController.update | — | removed (410) | 200 | 410 | |
| 87 | GET | /os-fping | nova/api/openstack/compute/fping.py:38 FpingController.index | — | removed (410) | 200 | 410 | |
| 88 | GET | /os-fping/{id} | nova/api/openstack/compute/fping.py:45 FpingController.show | — | removed (410) | 200 | 410 | |
| 89 | GET | /os-hosts | nova/api/openstack/compute/hosts.py:46 HostController.index | os_compute_api:os-hosts:list | 2.1–2.42 | 200 | — | |
| 90 | GET | /os-hosts/{id} | nova/api/openstack/compute/hosts.py:269 HostController.show | os_compute_api:os-hosts:show | 2.1–2.42 | 200 | 404 | |
| 91 | PUT | /os-hosts/{id} | nova/api/openstack/compute/hosts.py:97 HostController.update | os_compute_api:os-hosts:update | 2.1–2.42 | 200 | 400, 404, 501 | |
| 92 | GET | /os-hosts/{id}/reboot | nova/api/openstack/compute/hosts.py:210 HostController.reboot | os_compute_api:os-hosts:reboot | 2.1–2.42 | 200 | 400, 404, 501 | |
| 93 | GET | /os-hosts/{id}/shutdown | nova/api/openstack/compute/hosts.py:200 HostController.shutdown | os_compute_api:os-hosts:shutdown | 2.1–2.42 | 200 | 400, 404, 501 | |
| 94 | GET | /os-hosts/{id}/startup | nova/api/openstack/compute/hosts.py:190 HostController.startup | os_compute_api:os-hosts:start | 2.1–2.42 | 200 | 400, 404, 501 | |
| 95 | GET | /os-hypervisors | nova/api/openstack/compute/hypervisors.py:235 HypervisorsController.index | os_compute_api:os-hypervisors:list | all | 200 | (2.1–2.32); 400 (2.33–2.52); 400, 404 (2.53–max) | |
| 96 | GET | /os-hypervisors/detail | nova/api/openstack/compute/hypervisors.py:270 HypervisorsController.detail | — | all | 200 | (2.1–2.32); 400 (2.33–2.52); 400, 404 (2.53–max) | |
| 97 | GET | /os-hypervisors/statistics | nova/api/openstack/compute/hypervisors.py:527 HypervisorsController.statistics | os_compute_api:os-hypervisors:statistics | 2.1–2.87 | 200 | — | |
| 98 | GET | /os-hypervisors/{id} | nova/api/openstack/compute/hypervisors.py:326 HypervisorsController.show | os_compute_api:os-hypervisors:show | all | 200 | 404 (2.1–2.52); 400, 404 (2.53–max) | |
| 99 | GET | /os-hypervisors/{id}/search | nova/api/openstack/compute/hypervisors.py:440 HypervisorsController.search | os_compute_api:os-hypervisors:search | 2.1–2.52 | 200 | 404 | |
| 100 | GET | /os-hypervisors/{id}/servers | nova/api/openstack/compute/hypervisors.py:480 HypervisorsController.servers | os_compute_api:os-hypervisors:servers | 2.1–2.52 | 200 | 404 | |
| 101 | GET | /os-hypervisors/{id}/uptime | nova/api/openstack/compute/hypervisors.py:386 HypervisorsController.uptime | os_compute_api:os-hypervisors:uptime | 2.1–2.87 | 200 | 400, 404, 501 | |
| 102 | GET | /os-instance_usage_audit_log | nova/api/openstack/compute/instance_usage_audit_log.py:41 InstanceUsageAuditLogController.index | os_compute_api:os-instance-usage-audit-log:list | all | 200 | — | |
| 103 | GET | /os-instance_usage_audit_log/{id} | nova/api/openstack/compute/instance_usage_audit_log.py:51 InstanceUsageAuditLogController.show | os_compute_api:os-instance-usage-audit-log:show | all | 200 | 400 | |
| 104 | GET | /os-keypairs | nova/api/openstack/compute/keypairs.py:186 KeypairController.index | os_compute_api:os-keypairs:index | all | 200 | (2.0–2.34); 400 (2.35–max) | |
| 105 | POST | /os-keypairs | nova/api/openstack/compute/keypairs.py:55 KeypairController.create | os_compute_api:os-keypairs:create | all | 201 (2.2–max), 200 (2.0–2.1) | 400, 403, 409 | |
| 106 | GET | /os-keypairs/{id} | nova/api/openstack/compute/keypairs.py:152 KeypairController.show | os_compute_api:os-keypairs:show | all | 200 | 404 | |
| 107 | DELETE | /os-keypairs/{id} | nova/api/openstack/compute/keypairs.py:126 KeypairController.delete | os_compute_api:os-keypairs:delete | all | 204 (2.2–max), 202 (2.0–2.1) | 404 | |
| 108 | GET | /os-migrations | nova/api/openstack/compute/migrations.py:191 MigrationsController.index | os_compute_api:os-migrations:indexos_compute_api:os-migrations:index:all_projectsos_compute_api:os-migrations:index:host | all | 200 | (2.1–2.58); 400 (2.59–max) | |
| 109 | GET | /os-networks | nova/api/openstack/compute/networks.py:82 NetworkController.index | os_compute_api:os-networks:list | 2.1–2.35 | 200 | — | |
| 110 | POST | /os-networks | nova/api/openstack/compute/networks.py:124 NetworkController.create | — | removed (410) | 200 | 410 | |
| 111 | POST | /os-networks/add | nova/api/openstack/compute/networks.py:131 NetworkController.add | — | removed (410) | 200 | 410 | |
| 112 | GET | /os-networks/{id} | nova/api/openstack/compute/networks.py:94 NetworkController.show | os_compute_api:os-networks:show | 2.1–2.35 | 200 | 404 | |
| 113 | DELETE | /os-networks/{id} | nova/api/openstack/compute/networks.py:117 NetworkController.delete | — | removed (410) | 200 | 410 | |
| 114 | POST | /os-networks/{id}/action | associate_host | nova/api/openstack/compute/networks_associate.py:53 NetworkAssociateActionController._associate_host | — | removed (410) | 200 | 410 |
| 115 | POST | /os-networks/{id}/action | disassociate | nova/api/openstack/compute/networks.py:111 NetworkController._disassociate_host_and_project | — | removed (410) | 200 | 410 |
| 116 | POST | /os-networks/{id}/action | disassociate_host | nova/api/openstack/compute/networks_associate.py:37 NetworkAssociateActionController._disassociate_host_only | — | removed (410) | 200 | 410 |
| 117 | POST | /os-networks/{id}/action | disassociate_project | nova/api/openstack/compute/networks_associate.py:45 NetworkAssociateActionController._disassociate_project_only | — | removed (410) | 200 | 410 |
| 118 | GET | /os-quota-class-sets/{id} | nova/api/openstack/compute/quota_classes.py:95 QuotaClassSetsController.show | os_compute_api:os-quota-class-sets:show | all | 200 | — | |
| 119 | PUT | /os-quota-class-sets/{id} | nova/api/openstack/compute/quota_classes.py:116 QuotaClassSetsController.update | os_compute_api:os-quota-class-sets:update | all | 200 | 400 | |
| 120 | GET | /os-quota-sets/{id} | nova/api/openstack/compute/quota_sets.py:123 QuotaSetsController.show | os_compute_api:os-quota-sets:show | all | 200 | 400 | |
| 121 | PUT | /os-quota-sets/{id} | nova/api/openstack/compute/quota_sets.py:163 QuotaSetsController.update | os_compute_api:os-quota-sets:update | all | 200 | 400 | |
| 122 | DELETE | /os-quota-sets/{id} | nova/api/openstack/compute/quota_sets.py:244 QuotaSetsController.delete | os_compute_api:os-quota-sets:delete | all | 202 | — | |
| 123 | GET | /os-quota-sets/{id}/detail | nova/api/openstack/compute/quota_sets.py:142 QuotaSetsController.detail | os_compute_api:os-quota-sets:detail | all | 200 | 400 | |
| 124 | GET | /os-quota-sets/{id}/defaults | nova/api/openstack/compute/quota_sets.py:226 QuotaSetsController.defaults | os_compute_api:os-quota-sets:defaults | 2.0–max | 200 | 400 | |
| 125 | GET | /os-security-group-default-rules | nova/api/openstack/compute/security_group_default_rules.py:57 SecurityGroupDefaultRulesController.index | — | removed (410) | 200 | 410 | |
| 126 | POST | /os-security-group-default-rules | nova/api/openstack/compute/security_group_default_rules.py:37 SecurityGroupDefaultRulesController.create | — | removed (410) | 200 | 410 | |
| 127 | GET | /os-security-group-default-rules/{id} | nova/api/openstack/compute/security_group_default_rules.py:44 SecurityGroupDefaultRulesController.show | — | removed (410) | 200 | 410 | |
| 128 | DELETE | /os-security-group-default-rules/{id} | nova/api/openstack/compute/security_group_default_rules.py:50 SecurityGroupDefaultRulesController.delete | — | removed (410) | 200 | 410 | |
| 129 | POST | /os-security-group-rules | nova/api/openstack/compute/security_groups.py:269 SecurityGroupRulesController.create | os_compute_api:os-security-groups:rule:create | 2.1–2.35 | 200 | 400, 403, 404 | |
| 130 | DELETE | /os-security-group-rules/{id} | nova/api/openstack/compute/security_groups.py:343 SecurityGroupRulesController.delete | os_compute_api:os-security-groups:rule:delete | 2.1–2.35 | 202 | 400, 404, 409 | |
| 131 | GET | /os-security-groups | nova/api/openstack/compute/security_groups.py:182 SecurityGroupController.index | os_compute_api:os-security-groups:get | 2.1–2.35 | 200 | 404 | |
| 132 | POST | /os-security-groups | nova/api/openstack/compute/security_groups.py:207 SecurityGroupController.create | os_compute_api:os-security-groups:create | 2.1–2.35 | 200 | 400, 403 | |
| 133 | GET | /os-security-groups/{id} | nova/api/openstack/compute/security_groups.py:142 SecurityGroupController.show | os_compute_api:os-security-groups:show | 2.1–2.35 | 200 | 400, 404 | |
| 134 | PUT | /os-security-groups/{id} | nova/api/openstack/compute/security_groups.py:231 SecurityGroupController.update | os_compute_api:os-security-groups:update | 2.1–2.35 | 200 | 400, 404 | |
| 135 | DELETE | /os-security-groups/{id} | nova/api/openstack/compute/security_groups.py:163 SecurityGroupController.delete | os_compute_api:os-security-groups:delete | 2.1–2.35 | 202 | 400, 404 | |
| 136 | POST | /os-server-external-events | nova/api/openstack/compute/server_external_events.py:80 ServerExternalEventsController.create | os_compute_api:os-server-external-events:create | all | 200 | 403 | |
| 137 | GET | /os-server-groups | nova/api/openstack/compute/server_groups.py:175 ServerGroupController.index | os_compute_api:os-server-groups:indexos_compute_api:os-server-groups:index:all_projects | all | 200 | — | |
| 138 | POST | /os-server-groups | nova/api/openstack/compute/server_groups.py:216 ServerGroupController.create | os_compute_api:os-server-groups:create | all | 200 | 400, 403, 409 | |
| 139 | GET | /os-server-groups/{id} | nova/api/openstack/compute/server_groups.py:140 ServerGroupController.show | os_compute_api:os-server-groups:show | all | 200 | 404 | |
| 140 | DELETE | /os-server-groups/{id} | nova/api/openstack/compute/server_groups.py:154 ServerGroupController.delete | os_compute_api:os-server-groups:delete | all | 204 | 404 | |
| 141 | GET | /os-services | nova/api/openstack/compute/services.py:378 ServiceController.index | os_compute_api:os-services:list | all | 200 | — | |
| 142 | PUT | /os-services/{id} | nova/api/openstack/compute/services.py:399 ServiceController.update | os_compute_api:os-services:update | all | 200 | 400, 404 | |
| 143 | DELETE | /os-services/{id} | nova/api/openstack/compute/services.py:245 ServiceController.delete | os_compute_api:os-services:delete | all | 204 | 400, 404, 409 | |
| 144 | GET | /os-simple-tenant-usage | nova/api/openstack/compute/simple_tenant_usage.py:271 SimpleTenantUsageController.index | os_compute_api:os-simple-tenant-usage:list | all | 200 | 400 | |
| 145 | GET | /os-simple-tenant-usage/{id} | nova/api/openstack/compute/simple_tenant_usage.py:320 SimpleTenantUsageController.show | os_compute_api:os-simple-tenant-usage:show | all | 200 | 400 | |
| 146 | GET | /os-snapshots | nova/api/openstack/compute/snapshots.py:98 SnapshotController.index | os_compute_api:os-volumes:snapshots:list | 2.1–2.35 | 200 | — | |
| 147 | POST | /os-snapshots | nova/api/openstack/compute/snapshots.py:131 SnapshotController.create | os_compute_api:os-volumes:snapshots:create | 2.1–2.35 | 200 | 400, 403 | |
| 148 | GET | /os-snapshots/detail | nova/api/openstack/compute/snapshots.py:110 SnapshotController.detail | os_compute_api:os-volumes:snapshots:detail | 2.1–2.35 | 200 | — | |
| 149 | GET | /os-snapshots/{id} | nova/api/openstack/compute/snapshots.py:64 SnapshotController.show | os_compute_api:os-volumes:snapshots:show | 2.1–2.35 | 200 | 404 | |
| 150 | DELETE | /os-snapshots/{id} | nova/api/openstack/compute/snapshots.py:82 SnapshotController.delete | os_compute_api:os-volumes:snapshots:delete | 2.1–2.35 | 202 | 404 | |
| 151 | GET | /os-tenant-networks | nova/api/openstack/compute/tenant_networks.py:81 TenantNetworkController.index | os_compute_api:os-tenant-networks:list | 2.1–2.35 | 200 | — | |
| 152 | POST | /os-tenant-networks | nova/api/openstack/compute/tenant_networks.py:116 TenantNetworkController.create | — | removed (410) | 200 | 410 | |
| 153 | GET | /os-tenant-networks/{id} | nova/api/openstack/compute/tenant_networks.py:95 TenantNetworkController.show | os_compute_api:os-tenant-networks:show | 2.1–2.35 | 200 | 404 | |
| 154 | DELETE | /os-tenant-networks/{id} | nova/api/openstack/compute/tenant_networks.py:109 TenantNetworkController.delete | — | removed (410) | 200 | 410 | |
| 155 | GET | /os-volumes | nova/api/openstack/compute/volumes.py:140 VolumeController.index | os_compute_api:os-volumes:list | 2.1–2.35 | 200 | — | |
| 156 | POST | /os-volumes | nova/api/openstack/compute/volumes.py:173 VolumeController.create | os_compute_api:os-volumes:create | 2.1–2.35 | 200 | 400, 403, 404 | |
| 157 | GET | /os-volumes/detail | nova/api/openstack/compute/volumes.py:152 VolumeController.detail | os_compute_api:os-volumes:detail | 2.1–2.35 | 200 | — | |
| 158 | GET | /os-volumes/{id} | nova/api/openstack/compute/volumes.py:104 VolumeController.show | os_compute_api:os-volumes:show | 2.1–2.35 | 200 | 404 | |
| 159 | DELETE | /os-volumes/{id} | nova/api/openstack/compute/volumes.py:122 VolumeController.delete | os_compute_api:os-volumes:delete | 2.1–2.35 | 202 | 400, 404 | |
| 160 | GET | /os-volumes_boot | nova/api/openstack/compute/volumes_boot.py:31 VolumesBootController.index | — | 2.1–2.102 | 200 | 400, 403 | |
| 161 | POST | /os-volumes_boot | nova/api/openstack/compute/volumes_boot.py:98 VolumesBootController.create | — | 2.1–2.102 | 202 | 400, 403, 409 | |
| 162 | GET | /os-volumes_boot/detail | nova/api/openstack/compute/volumes_boot.py:55 VolumesBootController.detail | — | 2.1–2.102 | 200 | 400, 403 | |
| 163 | GET | /os-volumes_boot/{id} | nova/api/openstack/compute/volumes_boot.py:77 VolumesBootController.show | — | 2.1–2.102 | 200 | 404 | |
| 164 | PUT | /os-volumes_boot/{id} | nova/api/openstack/compute/volumes_boot.py:127 VolumesBootController.update | — | 2.1–2.102 | 200 | 404 | |
| 165 | DELETE | /os-volumes_boot/{id} | nova/api/openstack/compute/volumes_boot.py:105 VolumesBootController.delete | — | 2.1–2.102 | 204 | 404, 409 | |
| 166 | POST | /os-volumes_boot/{id}/action | confirmResize | nova/api/openstack/compute/volumes_boot.py:136 VolumesBootController._confirm_resize | — | 2.1–2.102 | 204 | 400, 404, 409 |
| 167 | POST | /os-volumes_boot/{id}/action | createImage | nova/api/openstack/compute/volumes_boot.py:203 VolumesBootController._create_image | — | 2.1–2.102 | 202 | 400, 403, 404, 409 |
| 168 | POST | /os-volumes_boot/{id}/action | os-start | nova/api/openstack/compute/volumes_boot.py:212 VolumesBootController._start | — | 2.1–2.102 | 202 | 404, 409 |
| 169 | POST | /os-volumes_boot/{id}/action | os-stop | nova/api/openstack/compute/volumes_boot.py:221 VolumesBootController._stop | — | 2.1–2.102 | 202 | 404, 409 |
| 170 | POST | /os-volumes_boot/{id}/action | reboot | nova/api/openstack/compute/volumes_boot.py:154 VolumesBootController._reboot | — | 2.1–2.102 | 202 | 404, 409 |
| 171 | POST | /os-volumes_boot/{id}/action | rebuild | nova/api/openstack/compute/volumes_boot.py:192 VolumesBootController._rebuild | — | 2.1–2.102 | 202 | 400, 403, 404, 409 |
| 172 | POST | /os-volumes_boot/{id}/action | resize | nova/api/openstack/compute/volumes_boot.py:163 VolumesBootController._resize | — | 2.1–2.102 | 202 | 400, 401, 403, 404, 409 |
| 173 | POST | /os-volumes_boot/{id}/action | revertResize | nova/api/openstack/compute/volumes_boot.py:145 VolumesBootController._revert_resize | — | 2.1–2.102 | 202 | 400, 404, 409 |
| 174 | POST | /os-volumes_boot/{id}/action | trigger_crash_dump | nova/api/openstack/compute/volumes_boot.py:230 VolumesBootController._trigger_crash_dump | — | 2.17–2.102 | 202 | 400, 404, 409 |
| 175 | GET | /servers | nova/api/openstack/compute/servers.py:128 ServersController.index | os_compute_api:servers:indexos_compute_api:servers:index:get_all_tenantsos_compute_api:servers:allow_all_filters | all | 200 | 400, 403 | |
| 176 | POST | /servers | nova/api/openstack/compute/servers.py:717 ServersController.create | os_compute_api:servers:createos_compute_api:servers:create:forced_hostcompute:servers:create:requested_destinationos_compute_api:servers:create:attach_volumeos_compute_api:servers:create:attach_networkos_compute_api:servers:create:trusted_certsos_compute_api:servers:create:zero_disk_flavornetwork:attach_external_network | all | 202 | 400, 403, 409 | |
| 177 | GET | /servers/detail | nova/api/openstack/compute/servers.py:158 ServersController.detail | os_compute_api:os-extended-server-attributesos_compute_api:servers:detailos_compute_api:servers:detail:get_all_tenantsos_compute_api:servers:allow_all_filtersos_compute_api:servers:show:flavor-extra-specsos_compute_api:servers:show:host_statusos_compute_api:servers:show:host_status:unknown-only | all | 200 | 400, 403 | |
| 178 | GET | /servers/{id} | nova/api/openstack/compute/servers.py:498 ServersController.show | os_compute_api:os-extended-server-attributesos_compute_api:servers:showos_compute_api:servers:show:flavor-extra-specsos_compute_api:servers:show:host_statusos_compute_api:servers:show:host_status:unknown-only | all | 200 | 404 | |
| 179 | PUT | /servers/{id} | nova/api/openstack/compute/servers.py:978 ServersController.update | os_compute_api:os-extended-server-attributesos_compute_api:servers:show:flavor-extra-specsos_compute_api:servers:show:host_statusos_compute_api:servers:show:host_status:unknown-onlyos_compute_api:servers:update | all | 200 | 404, 409 | |
| 180 | DELETE | /servers/{id} | nova/api/openstack/compute/servers.py:928 ServersController.delete | os_compute_api:servers:delete | all | 204 | 404, 409 | |
| 181 | POST | /servers/{id}/action | addFixedIp | nova/api/openstack/compute/multinic.py:43 MultinicController._add_fixed_ip | os_compute_api:os-multinic:add | 2.1–2.43 | 202 | 400, 404 |
| 182 | POST | /servers/{id}/action | addFloatingIp | nova/api/openstack/compute/floating_ips.py:200 FloatingIPActionController._add_floating_ip | os_compute_api:os-floating-ips:add | 2.1–2.43 | 200 | 400, 403, 404 |
| 183 | POST | /servers/{id}/action | addSecurityGroup | nova/api/openstack/compute/security_groups.py:429 SecurityGroupActionController._addSecurityGroup | os_compute_api:os-security-groups:add | all | 202 | 400, 404, 409 |
| 184 | POST | /servers/{id}/action | changePassword | nova/api/openstack/compute/admin_password.py:42 AdminPasswordController.change_password | os_compute_api:os-admin-password | all | 202 | 404, 409, 501 |
| 185 | POST | /servers/{id}/action | confirmResize | nova/api/openstack/compute/servers.py:1086 ServersController._confirm_resize | os_compute_api:servers:confirm_resize | all | 204 | 400, 404, 409 |
| 186 | POST | /servers/{id}/action | createBackup | nova/api/openstack/compute/create_backup.py:45 CreateBackupController._create_backup | os_compute_api:os-create-backup | all | 202 | 400, 403, 404, 409 |
| 187 | POST | /servers/{id}/action | createImage | nova/api/openstack/compute/servers.py:1432 ServersController._create_image | os_compute_api:servers:create_imageos_compute_api:servers:create_image:allow_volume_backed | all | 202 | 400, 403, 404, 409 |
| 188 | POST | /servers/{id}/action | evacuate | nova/api/openstack/compute/evacuate.py:91 EvacuateController._evacuate | os_compute_api:os-evacuate | all | 200 | 400, 403, 404, 409 |
| 189 | POST | /servers/{id}/action | forceDelete | nova/api/openstack/compute/deferred_delete.py:59 DeferredDeleteController._force_delete | os_compute_api:os-deferred-delete:force | all | 202 | 404, 409 |
| 190 | POST | /servers/{id}/action | injectNetworkInfo | nova/api/openstack/compute/admin_actions.py:55 AdminActionsController._inject_network_info | os_compute_api:os-admin-actions:inject_network_info | all | 202 | 404, 409 |
| 191 | POST | /servers/{id}/action | lock | nova/api/openstack/compute/lock_server.py:37 LockServerController._lock | os_compute_api:os-lock-server:lock | all | 202 | 404 |
| 192 | POST | /servers/{id}/action | migrate | nova/api/openstack/compute/migrate_server.py:45 MigrateServerController._migrate | os_compute_api:os-migrate-server:migrateos_compute_api:os-migrate-server:migrate:host | all | 202 | 400, 403, 404, 409 |
| 193 | POST | /servers/{id}/action | os-getConsoleOutput | nova/api/openstack/compute/console_output.py:40 ConsoleOutputController.get_console_output | os_compute_api:os-console-output | all | 200 | 404, 409, 501 |
| 194 | POST | /servers/{id}/action | os-getRDPConsole | nova/api/openstack/compute/remote_consoles.py:108 RemoteConsolesController.get_rdp_console | — | removed (410) | 200 | 410 |
| 195 | POST | /servers/{id}/action | os-getSPICEConsole | nova/api/openstack/compute/remote_consoles.py:78 RemoteConsolesController.get_spice_console | os_compute_api:os-remote-consoles | 2.1–2.5 | 200 | 400, 404, 409, 501 |
| 196 | POST | /servers/{id}/action | os-getSerialConsole | nova/api/openstack/compute/remote_consoles.py:119 RemoteConsolesController.get_serial_console | os_compute_api:os-remote-consoles | 2.1–2.5 | 200 | 400, 404, 409, 501 |
| 197 | POST | /servers/{id}/action | os-getVNCConsole | nova/api/openstack/compute/remote_consoles.py:46 RemoteConsolesController.get_vnc_console | os_compute_api:os-remote-consoles | 2.1–2.5 | 200 | 400, 404, 409, 501 |
| 198 | POST | /servers/{id}/action | os-migrateLive | nova/api/openstack/compute/migrate_server.py:101 MigrateServerController._migrate_live | os_compute_api:os-migrate-server:migrate_liveos_compute_api:os-migrate-server:migrate_live:host | all | 202 | 400, 403, 404, 409 |
| 199 | POST | /servers/{id}/action | os-resetState | nova/api/openstack/compute/admin_actions.py:71 AdminActionsController._reset_state | os_compute_api:os-admin-actions:reset_state | all | 202 | 404 |
| 200 | POST | /servers/{id}/action | os-start | nova/api/openstack/compute/servers.py:1541 ServersController._start | os_compute_api:servers:start | all | 202 | 404, 409 |
| 201 | POST | /servers/{id}/action | os-stop | nova/api/openstack/compute/servers.py:1561 ServersController._stop | os_compute_api:servers:stop | all | 202 | 404, 409 |
| 202 | POST | /servers/{id}/action | pause | nova/api/openstack/compute/pause_server.py:38 PauseServerController._pause | os_compute_api:os-pause-server:pause | all | 202 | 404, 409, 501 |
| 203 | POST | /servers/{id}/action | reboot | nova/api/openstack/compute/servers.py:1134 ServersController._reboot | os_compute_api:servers:reboot | all | 202 | 404, 409 |
| 204 | POST | /servers/{id}/action | rebuild | nova/api/openstack/compute/servers.py:1264 ServersController._rebuild | os_compute_api:os-extended-server-attributesos_compute_api:servers:show:flavor-extra-specsos_compute_api:servers:show:host_statusos_compute_api:servers:show:host_status:unknown-onlyos_compute_api:servers:rebuildos_compute_api:servers:rebuild:trusted_certs | all | 202 | 400, 403, 404, 409 |
| 205 | POST | /servers/{id}/action | removeFixedIp | nova/api/openstack/compute/multinic.py:62 MultinicController._remove_fixed_ip | os_compute_api:os-multinic:remove | 2.1–2.43 | 202 | 400, 404 |
| 206 | POST | /servers/{id}/action | removeFloatingIp | nova/api/openstack/compute/floating_ips.py:281 FloatingIPActionController._remove_floating_ip | os_compute_api:os-floating-ips:remove | 2.1–2.43 | 200 | 400, 403, 404, 409 |
| 207 | POST | /servers/{id}/action | removeSecurityGroup | nova/api/openstack/compute/security_groups.py:453 SecurityGroupActionController._removeSecurityGroup | os_compute_api:os-security-groups:remove | all | 202 | 400, 404, 409 |
| 208 | POST | /servers/{id}/action | rescue | nova/api/openstack/compute/rescue.py:46 RescueController._rescue | os_compute_api:os-rescue | all | 200 | 400, 404, 409, 501 |
| 209 | POST | /servers/{id}/action | resetNetwork | nova/api/openstack/compute/admin_actions.py:46 AdminActionsController._reset_network | — | removed (410) | 200 | 410 |
| 210 | POST | /servers/{id}/action | resize | nova/api/openstack/compute/servers.py:1154 ServersController._resize | os_compute_api:servers:resizecompute:servers:resize:cross_cell | all | 202 | 400, 401, 403, 404, 409 |
| 211 | POST | /servers/{id}/action | restore | nova/api/openstack/compute/deferred_delete.py:40 DeferredDeleteController._restore | os_compute_api:os-deferred-delete:restore | all | 202 | 403, 404, 409 |
| 212 | POST | /servers/{id}/action | resume | nova/api/openstack/compute/suspend_server.py:63 SuspendServerController._resume | os_compute_api:os-suspend-server:resume | all | 202 | 404, 409 |
| 213 | POST | /servers/{id}/action | revertResize | nova/api/openstack/compute/servers.py:1110 ServersController._revert_resize | os_compute_api:servers:revert_resize | all | 202 | 400, 404, 409 |
| 214 | POST | /servers/{id}/action | shelve | nova/api/openstack/compute/shelve.py:43 ShelveController._shelve | os_compute_api:os-shelve:shelve | all | 202 | 404, 403, 409, 400 |
| 215 | POST | /servers/{id}/action | shelveOffload | nova/api/openstack/compute/shelve.py:73 ShelveController._shelve_offload | os_compute_api:os-shelve:shelve_offload | all | 202 | 400, 404, 409 |
| 216 | POST | /servers/{id}/action | suspend | nova/api/openstack/compute/suspend_server.py:37 SuspendServerController._suspend | os_compute_api:os-suspend-server:suspend | all | 202 | 403, 404, 409, 400 |
| 217 | POST | /servers/{id}/action | trigger_crash_dump | nova/api/openstack/compute/servers.py:1583 ServersController._trigger_crash_dump | os_compute_api:servers:trigger_crash_dump | 2.17–max | 202 | 400, 404, 409 |
| 218 | POST | /servers/{id}/action | unlock | nova/api/openstack/compute/lock_server.py:57 LockServerController._unlock | os_compute_api:os-lock-server:unlockos_compute_api:os-lock-server:unlock:unlock_override | all | 202 | 404 |
| 219 | POST | /servers/{id}/action | unpause | nova/api/openstack/compute/pause_server.py:62 PauseServerController._unpause | os_compute_api:os-pause-server:unpause | all | 202 | 404, 409, 501 |
| 220 | POST | /servers/{id}/action | unrescue | nova/api/openstack/compute/rescue.py:92 RescueController._unrescue | os_compute_api:os-unrescue | all | 202 | 404, 409, 501 |
| 221 | POST | /servers/{id}/action | unshelve | nova/api/openstack/compute/shelve.py:106 ShelveController._unshelve | os_compute_api:os-shelve:unshelveos_compute_api:os-shelve:unshelve_to_host | all | 202 | 400, 403, 404, 409 |
| 222 | GET | /servers/{server_id}/consoles | nova/api/openstack/compute/consoles.py:41 ConsolesController.index | — | removed (410) | 200 | 410 | |
| 223 | POST | /servers/{server_id}/consoles | nova/api/openstack/compute/consoles.py:48 ConsolesController.create | — | removed (410) | 200 | 410 | |
| 224 | GET | /servers/{server_id}/consoles/{id} | nova/api/openstack/compute/consoles.py:55 ConsolesController.show | — | removed (410) | 200 | 410 | |
| 225 | DELETE | /servers/{server_id}/consoles/{id} | nova/api/openstack/compute/consoles.py:61 ConsolesController.delete | — | removed (410) | 200 | 410 | |
| 226 | GET | /servers/{server_id}/diagnostics | nova/api/openstack/compute/server_diagnostics.py:42 ServerDiagnosticsController.index | os_compute_api:os-server-diagnostics | all | 200 | 400, 404, 409, 501 | |
| 227 | GET | /servers/{server_id}/ips | nova/api/openstack/compute/ips.py:41 IPsController.index | os_compute_api:ips:index | all | 200 | 404 | |
| 228 | GET | /servers/{server_id}/ips/{id} | nova/api/openstack/compute/ips.py:53 IPsController.show | os_compute_api:ips:show | all | 200 | 404 | |
| 229 | GET | /servers/{server_id}/metadata | nova/api/openstack/compute/server_metadata.py:55 ServerMetadataController.index | os_compute_api:server-metadata:index | all | 200 | 404 | |
| 230 | POST | /servers/{server_id}/metadata | nova/api/openstack/compute/server_metadata.py:68 ServerMetadataController.create | os_compute_api:server-metadata:create | all | 200 | 403, 404, 409 | |
| 231 | PUT | /servers/{server_id}/metadata | nova/api/openstack/compute/server_metadata.py:104 ServerMetadataController.update_all | os_compute_api:server-metadata:update_all | all | 200 | 403, 404, 409 | |
| 232 | GET | /servers/{server_id}/metadata/{id} | nova/api/openstack/compute/server_metadata.py:133 ServerMetadataController.show | os_compute_api:server-metadata:show | all | 200 | 404 | |
| 233 | PUT | /servers/{server_id}/metadata/{id} | nova/api/openstack/compute/server_metadata.py:84 ServerMetadataController.update | os_compute_api:server-metadata:update | all | 200 | 400, 403, 404, 409 | |
| 234 | DELETE | /servers/{server_id}/metadata/{id} | nova/api/openstack/compute/server_metadata.py:150 ServerMetadataController.delete | os_compute_api:server-metadata:delete | all | 204 | 404, 409 | |
| 235 | GET | /servers/{server_id}/migrations | nova/api/openstack/compute/server_migrations.py:127 ServerMigrationsController.index | os_compute_api:servers:migrations:indexos_compute_api:servers:migrations:index:host | 2.23–max | 200 | 404 | |
| 236 | GET | /servers/{server_id}/migrations/{id} | nova/api/openstack/compute/server_migrations.py:157 ServerMigrationsController.show | os_compute_api:servers:migrations:show | 2.23–max | 200 | 404 | |
| 237 | DELETE | /servers/{server_id}/migrations/{id} | nova/api/openstack/compute/server_migrations.py:197 ServerMigrationsController.delete | os_compute_api:servers:migrations:delete | 2.24–max | 202 | 400, 404, 409 | |
| 238 | POST | /servers/{server_id}/migrations/{id}/action | force_complete | nova/api/openstack/compute/server_migrations.py:100 ServerMigrationsController._force_complete | os_compute_api:servers:migrations:force_complete | 2.22–max | 202 | 400, 403, 404, 409 |
| 239 | GET | /servers/{server_id}/os-instance-actions | nova/api/openstack/compute/instance_actions.py:89 InstanceActionsController.index | os_compute_api:os-instance-actions:list | all | 200 | 404 (2.1–2.57); 400, 404 (2.58–max) | |
| 240 | GET | /servers/{server_id}/os-instance-actions/{id} | nova/api/openstack/compute/instance_actions.py:149 InstanceActionsController.show | os_compute_api:os-instance-actions:events:detailsos_compute_api:os-instance-actions:eventsos_compute_api:os-instance-actions:show | all | 200 | 404 | |
| 241 | GET | /servers/{server_id}/os-interface | nova/api/openstack/compute/attach_interfaces.py:72 InterfaceAttachmentController.index | os_compute_api:os-attach-interfaces:list | all | 200 | 404, 501 | |
| 242 | POST | /servers/{server_id}/os-interface | nova/api/openstack/compute/attach_interfaces.py:149 InterfaceAttachmentController.create | os_compute_api:os-attach-interfaces:createnetwork:attach_external_network | all | 200 | 400, 403, 404, 409, 500, 501 | |
| 243 | GET | /servers/{server_id}/os-interface/{id} | nova/api/openstack/compute/attach_interfaces.py:118 InterfaceAttachmentController.show | os_compute_api:os-attach-interfaces:show | all | 200 | 403, 404 | |
| 244 | DELETE | /servers/{server_id}/os-interface/{id} | nova/api/openstack/compute/attach_interfaces.py:219 InterfaceAttachmentController.delete | os_compute_api:os-attach-interfaces:delete | all | 202 | 400, 404, 409, 501 | |
| 245 | GET | /servers/{server_id}/os-server-password | nova/api/openstack/compute/server_password.py:39 ServerPasswordController.index | os_compute_api:os-server-password:show | all | 200 | 404 | |
| 246 | DELETE | /servers/{server_id}/os-server-password | nova/api/openstack/compute/server_password.py:51 ServerPasswordController.clear | os_compute_api:os-server-password:clear | all | 204 | 404 | |
| 247 | GET | /servers/{server_id}/os-virtual-interfaces | nova/api/openstack/compute/virtual_interfaces.py:39 ServerVirtualInterfaceController.index | — | removed (410) | 200 | 410 | |
| 248 | GET | /servers/{server_id}/os-volume_attachments | nova/api/openstack/compute/volume_attachments.py:113 VolumeAttachmentController.index | os_compute_api:os-volumes-attachments:index | all | 200 | 404 | |
| 249 | POST | /servers/{server_id}/os-volume_attachments | nova/api/openstack/compute/volume_attachments.py:205 VolumeAttachmentController.create | os_compute_api:os-volumes-attachments:create | all | 200 | 400, 403, 404, 409 | |
| 250 | GET | /servers/{server_id}/os-volume_attachments/{id} | nova/api/openstack/compute/volume_attachments.py:153 VolumeAttachmentController.show | os_compute_api:os-volumes-attachments:show | all | 200 | 404 | |
| 251 | PUT | /servers/{server_id}/os-volume_attachments/{id} | nova/api/openstack/compute/volume_attachments.py:364 VolumeAttachmentController.update | os_compute_api:os-volumes-attachments:updateos_compute_api:os-volumes-attachments:swap | all | 202 | 400, 404, 409 | |
| 252 | DELETE | /servers/{server_id}/os-volume_attachments/{id} | nova/api/openstack/compute/volume_attachments.py:395 VolumeAttachmentController.delete | os_compute_api:os-volumes-attachments:delete | all | 202 | 400, 403, 404, 409 | |
| 253 | POST | /servers/{server_id}/remote-consoles | nova/api/openstack/compute/remote_consoles.py:153 RemoteConsolesController.create | os_compute_api:os-remote-consoles | 2.6–max | 200 | 400, 404, 409, 501 | |
| 254 | GET | /servers/{server_id}/os-security-groups | nova/api/openstack/compute/security_groups.py:372 ServerSecurityGroupController.index | os_compute_api:os-security-groups:list | all | 200 | 404 | |
| 255 | GET | /servers/{server_id}/shares | nova/api/openstack/compute/server_shares.py:79 ServerSharesController.index | os_compute_api:os-server-shares:index | 2.97–max | 200 | 400, 403, 404 | |
| 256 | POST | /servers/{server_id}/shares | nova/api/openstack/compute/server_shares.py:100 ServerSharesController.create | os_compute_api:os-server-shares:create | 2.97–max | 201 | 400, 403, 404, 409 | |
| 257 | GET | /servers/{server_id}/shares/{id} | nova/api/openstack/compute/server_shares.py:206 ServerSharesController.show | os_compute_api:os-server-shares:show | 2.97–max | 200 | 400, 403, 404 | |
| 258 | DELETE | /servers/{server_id}/shares/{id} | nova/api/openstack/compute/server_shares.py:236 ServerSharesController.delete | os_compute_api:os-server-shares:delete | 2.97–max | 200 | 400, 403, 404, 409 | |
| 259 | GET | /servers/{server_id}/tags | nova/api/openstack/compute/server_tags.py:90 ServerTagsController.index | os_compute_api:os-server-tags:index | 2.26–max | 200 | 404 | |
| 260 | PUT | /servers/{server_id}/tags | nova/api/openstack/compute/server_tags.py:162 ServerTagsController.update_all | os_compute_api:os-server-tags:update_all | 2.26–max | 200 | 404, 409 | |
| 261 | DELETE | /servers/{server_id}/tags | nova/api/openstack/compute/server_tags.py:214 ServerTagsController.delete_all | os_compute_api:os-server-tags:delete_all | 2.26–max | 204 | 404, 409 | |
| 262 | GET | /servers/{server_id}/tags/{id} | nova/api/openstack/compute/server_tags.py:69 ServerTagsController.show | os_compute_api:os-server-tags:show | 2.26–max | 204 | 404 | |
| 263 | PUT | /servers/{server_id}/tags/{id} | nova/api/openstack/compute/server_tags.py:108 ServerTagsController.update | os_compute_api:os-server-tags:update | 2.26–max | 200 | 400, 404, 409 | |
| 264 | DELETE | /servers/{server_id}/tags/{id} | nova/api/openstack/compute/server_tags.py:188 ServerTagsController.delete | os_compute_api:os-server-tags:delete | 2.26–max | 204 | 404, 409 | |
| 265 | GET | /servers/{server_id}/topology | nova/api/openstack/compute/server_topology.py:34 ServerTopologyController.index | compute:server:topology:indexcompute:server:topology:host:index | 2.78–max | 200 | 404 |
3. Functional descriptions
3.1 POST /servers — create one or several servers
- Purpose: boot one or more virtual machines from an image or a volume, on a flavor, attached to networks.
- Actor: project member (
os_compute_api:servers:create); extra rules apply to optional features:create:forced_host(target host/node inavailability_zone, admin),compute:servers:create:requested_destination(host/hypervisor_hostnamefrom 2.74, admin),create:attach_volume,create:attach_network,create:trusted_certs,create:zero_disk_flavor,network:attach_external_network(nova/api/openstack/compute/servers.py:778-797). - Preconditions: the flavor exists and is not disabled; the image is
active(or a bootable volume is given); the key pair exists; networks/ports exist and are usable; quotas allowmin_countinstances (nova/compute/api.py:1441); when a server group is given inos:scheduler_hints.group, its member quota allows the new members (nova/compute/api.py:1570-1583). - Business rules:
min_count ≤ max_count, defaultmin_count = 1andmax_count = min_count(nova/api/openstack/compute/servers.py:758-762); quotas may lower the number actually built down tomin_count(nova/compute/api.py:1441).availability_zonemay carryzone:host:nodeto force a host (admin) (nova/compute/api.py:655parse_availability_zone).- Image/flavor compatibility (min disk/RAM, zero-disk flavors, NUMA/PCI/CPU-policy extra specs) is checked by
_validate_flavor_image(nova/compute/api.py:723) and_checks_for_create_and_rebuild(nova/compute/api.py:1077); metadata and injected-file quotas bynova/compute/api.py:480andnova/compute/api.py:531. - Block device mappings are merged from the image, the flavor and the request, then validated (boot index, sizes, volume AZ, volume type, local disk limit) (
nova/compute/api.py:1977_validate_bdm); volumes must be in the instance AZ unless[cinder]/cross_az_attachis true (nova/compute/api.py:1331). - Port resource requests (QoS minimum bandwidth/packet rate) are read from Neutron and stored in the RequestSpec (
nova/compute/api.py:1184). - Server names are stripped of surrounding blanks (
nova/api/openstack/common.py:474);hostname(2.90+) anddescription(2.19+) are optional.
- Flow:
- (synchronous, nova-api) schema validation per microversion, policies, parsing of networks/BDMs/hints (
nova/api/openstack/compute/servers.py:717-861). - (synchronous)
compute.API.create→_create_instance(nova/compute/api.py:1707): image GET from Glance, port/network checks in Neutron, volume GETs in Cinder, quota checks (legacy DB counting or Keystone unified limits,nova/compute/api.py:1408). - (synchronous) for each instance: a
request_specs, abuild_requestsand aninstance_mappingsrow (withcell_idNULL) are inserted in one API-database transaction (nova/compute/api.py:1256,nova/compute/api.py:1540-1567); server-group membership is recorded (nova/compute/api.py:1585). - (synchronous) RPC cast
schedule_and_build_instancestonova-conductor(nova/compute/api.py:1836), then 202 with the server id, links andadminPass(if[api]/enable_instance_password) and aLocationheader (nova/api/openstack/compute/servers.py:913-923). Withreturn_reservation_idthe response is only{"reservation_id": …}. - (asynchronous) conductor asks the scheduler for hosts (Placement allocation candidates + filters/weighers), claims allocations in Placement, creates the instance in the chosen cell DB, deletes the build request, and casts
build_and_run_instanceto the compute host. See 05-async-processing and 04-scenarios § 1. - (asynchronous, nova-compute) ports bound in Neutron, volumes attached in Cinder, image fetched, guest spawned, waits for
network-vif-pluggedfrom Neutron, thenvm_state=active.
- (synchronous, nova-api) schema validation per microversion, policies, parsing of networks/BDMs/hints (
- Outcome:
status: BUILDin the response; finalACTIVE, orERRORwith afault(no valid host: instance lands in cell0 withvm_state=error). Clients pollGET /servers/{id}or consumeinstance.create.endnotifications. - Errors: 400 (schema; >40 business exceptions converted at
nova/api/openstack/compute/servers.py:835-911), 403 (quotaOverQuota, zero-disk flavor, external network), 409 (port in use, ambiguous network,InstanceExists), plus the 404 of a missing flavor converted to 400. See 02-errors § 3. - Limitations: scheduling failures are never returned synchronously;
max_count > 1with a fixed IP or a port is refused (InvalidFixedIpAndMaxCountRequest,MultiplePortsNotApplicable).
3.2 GET /servers, GET /servers/detail — list servers
- Purpose: list servers of the project (or all projects for admins with
all_tenants) with filtering, sorting and paging. - Actor: project reader (
os_compute_api:servers:index/:detail);index:get_all_tenants/detail:get_all_tenantsforall_tenants; non-admin filters are restricted. - Business rules:
changes-since/changes-beforeinclude recently deleted servers; otherwisedeleted=Falseis forced (nova/api/openstack/compute/servers.py:234-258); listingvm_state=deletedrequires admin (403,nova/api/openstack/compute/servers.py:280-285);ip/ip6filters are delegated to Neutron when the substring-port-filtering extension is present (nova/compute/api.py:3169-3180); page size is capped by[api]/max_limit(default 1000) (nova/conf/api.py:219). - Flow: build requests and cell0 first, then a scatter-gather over all cells merged in sort order (
nova/compute/api.py:3086get_all,nova/compute/instance_list.py); unreachable cells are skipped or returned as minimal records depending on 2.69 and[api]/list_records_by_skipping_down_cells(nova/conf/api.py:309). - Outcome: 200 with
serversandservers_links(next marker).
3.3 GET /servers/{id}, PUT /servers/{id}, DELETE /servers/{id}
- Show (
nova/api/openstack/compute/servers.py:498): reads the instance through the mapping (§ 1.6); 404 if unknown. Fields depend on the microversion (_rewrite/schema-selection_stable-2026.2.json: 15 response schemas from 2.0 to 2.100). - Update (
nova/api/openstack/compute/servers.py:978): changesname,description(2.19+),hostname(2.90+) and, from 2.104,pinned_availability_zone(nullunpins the server; re-pinning to another AZ than the current one is a 409) (nova/api/openstack/compute/rest_api_version_history.rst:1341);compute.API.update_instancesaves the instance (nova/compute/api.py:3340). No state precondition. - Delete (
nova/api/openstack/compute/servers.py:928): policyservers:delete. If[DEFAULT]/reclaim_instance_interval > 0the server is soft-deleted (restorable withrestoreuntil the periodic reclaim, see 05) and falls back to a hard delete if it never ran (nova/api/openstack/compute/servers.py:948-957).compute.API._delete(nova/compute/api.py:2464):- if a
build_requestsrow still exists, it is deleted and the build is cancelled (nova/compute/api.py:2444,nova/compute/api.py:2484); - otherwise
vm_stateis kept,task_state=deleting, an instance actiondeleteis recorded, and if the compute service is up an RPC castterminate_instance(nova/compute/api.py:2780) is sent; - if the host is down or the instance is shelved-offloaded, a local delete happens in nova-api: volumes detached in Cinder, Placement allocations deleted, instance row destroyed (
nova/compute/api.py:2731_local_delete). - 204 on success; 409 if locked, if Placement allocation deletion fails (
AllocationDeleteFailed) or the state forbids it.
- if a
3.4 Server actions — POST /servers/{id}/action
All actions answer 202 (except os-getConsoleOutput, the console getters and createImage ≥ 2.45 which answer 200) and are asynchronous: the API sets a task_state, records an instance action (instance_actions / instance_actions_events, readable through /servers/{id}/os-instance-actions), and casts to nova-compute or nova-conductor. The full matrix of preconditions is in § 4. Functional groups:
| Group | Actions | What happens after the 202 | Final state |
|---|---|---|---|
| Power | os-start, os-stop, reboot (SOFT/HARD), trigger_crash_dump | cast to the compute host (start_instance, stop_instance, reboot_instance, trigger_crash_dump) | ACTIVE / SHUTOFF |
| Pause / suspend | pause, unpause, suspend, resume | cast to the host; the driver freezes the guest or saves its memory to disk | PAUSED / SUSPENDED / ACTIVE |
| Rescue | rescue, unrescue | boots the guest from a rescue image (rescue_image_ref, else the image's or the server's own image) with the original disk attached | RESCUE / ACTIVE |
| Lock | lock (locked_reason 2.73+), unlock | synchronous DB update only; a locked server rejects most actions for non-admins with 409 (nova/compute/api.py:247) | — |
| Resize / migrate | resize, migrate (cold), confirmResize, revertResize | cast resize_instance/migrate_server to conductor → scheduler → prep_resize on the target, resize_instance on the source, finish_resize on the target; confirm/revert finishes on the source or target; automatic confirmation after [DEFAULT]/resize_confirm_window (nova/conf/compute.py:1400, see 05) | VERIFY_RESIZE then ACTIVE/SHUTOFF |
| Live migration | os-migrateLive (host, block_migration, force) | cast live_migrate_instance to conductor (pre-checks + scheduling) → live_migration on the source; progress via /servers/{id}/migrations | MIGRATING then ACTIVE |
| Evacuate | evacuate (admin) | source host must be down; conductor rebuilds the server on another host (rebuild_instance with recreate=True) | REBUILD then ACTIVE |
| Rebuild | rebuild (new image, optional key_name, user_data, hostname, reimage_boot_volume 2.93+) | conductor → rebuild_instance on the same host; root disk recreated | REBUILD then original state |
| Shelve | shelve, shelveOffload, unshelve (availability_zone, host 2.91+) | shelve snapshots the guest to Glance and stops it; offload frees the host (allocations removed); unshelve goes through conductor + scheduler again | SHELVED → SHELVED_OFFLOADED → ACTIVE |
| Image | createImage, createBackup (backup_type, rotation) | snapshot uploaded to Glance by the compute host; volume-backed servers are snapshotted in Cinder synchronously by nova-api (nova/compute/api.py:3504) | unchanged |
| Admin | os-resetState (state: active/error), injectNetworkInfo, forceDelete, restore, changePassword | resetState is a direct DB write of vm_state with task_state=None (nova/api/openstack/compute/admin_actions.py:66) | — |
| Consoles (≤ 2.5) | os-getVNCConsole, os-getSPICEConsole, os-getSerialConsole, os-getConsoleOutput | RPC call to the host, which creates a token in console_auth_tokens and returns the proxy URL | — |
| Network (legacy) | addFixedIp, removeFixedIp, addFloatingIp, removeFloatingIp (≤ 2.43), addSecurityGroup, removeSecurityGroup | implemented by Neutron calls from nova-api (nova/network/neutron.py, nova/network/security_group_api.py) | — |
3.5 Volume attachments — /servers/{server_id}/os-volume_attachments
- Attach (
POST,nova/api/openstack/compute/volume_attachments.py:205): allowed inactive,paused,stopped,resized,soft_deleted,shelved,shelved_offloadedwith no task in progress (nova/compute/api.py:5210-5215). For a server that is not offloaded: RPC callattach_volumeto the conductor (nova/compute/api.py:5263), which reserves the device name on the host (RPC callreserve_block_device_name, creating the BDM), creates the Cinder attachment (3.44) and castsattach_volumeto the host (nova/conductor/manager.py:2267); the response is 200 with the BDM; for a shelved-offloaded server the BDM is created in the database only and the attachment completed immediately (nova/compute/api.py:5162). Tag (2.49+) anddelete_on_termination(2.79+) are stored on the BDM. - Swap / update (
PUT,nova/api/openstack/compute/volume_attachments.py:364): admin/service only; before 2.85 only swaps the volume (swap_volume,nova/compute/api.py:5371, used by Cinder volume migration); from 2.85 can also updatedelete_on_termination. - Detach (
DELETE,nova/api/openstack/compute/volume_attachments.py:395): Cinderbegin_detaching, then castdetach_volumeto the host (nova/compute/api.py:5299); the root volume cannot be detached (409).
3.6 Interfaces — /servers/{server_id}/os-interface
- Attach (
POST,nova/api/openstack/compute/attach_interfaces.py:149):net_id,port_idorfixed_ips; allowed inactive,paused,stoppedwith no task (nova/compute/api.py:5477-5486); RPC callattach_interfaceto the host (nova/compute/api.py:5511), which creates/binds the port in Neutron and hot-plugs it. Ports with QoS resource requests need a compute able to update Placement allocations (nova/compute/api.py:5445). - Detach (
DELETE,nova/api/openstack/compute/attach_interfaces.py:219): castdetach_interface(nova/compute/api.py:5536). - List/show read Neutron ports filtered by
device_id(nova/api/openstack/compute/attach_interfaces.py:72).
3.7 Server external events — POST /os-server-external-events
- Purpose: let Neutron, Cinder and Cyborg tell Nova that something happened to a server (
network-vif-plugged,network-changed,network-vif-unplugged,network-vif-deleted,volume-extended2.51+,power-update2.76+,accelerator-request-bound2.82+,volume-reimaged2.93+) (nova/api/openstack/compute/schemas/server_external_events.py:29-71). - Actor: service user (
os_compute_api:os-server-external-events:create, roleserviceby default). - Flow (
nova/api/openstack/compute/server_external_events.py:80): instances are looked up across cells; per event: unknown server → eventcode: 404; missing required tag →400; server without host →422; otherwise accepted (200). Accepted events are grouped per host (both source and destination during a migration) and cast to each compute (external_instance_event,nova/compute/api.py:5949-6022).power-updateevents also record an instance action. - Outcome: 200 if all accepted, 207 if at least one failed, with per-event
status/code. The compute side wakes the waitingwait_for_instance_event(boot, migration) or refreshes the network info cache.
3.8 Server groups — /os-server-groups
- Create (
nova/api/openstack/compute/server_groups.py:216): policyaffinity,anti-affinity,soft-affinity,soft-anti-affinity; from 2.64 a singlepolicyplusrules.max_server_per_hostfor anti-affinity, only when all computes are at service version ≥ 33 (nova/api/openstack/compute/server_groups.py:78). Quotaserver_groupschecked before and re-checked after creation when[quota]/recheck_quota(nova/api/openstack/compute/server_groups.py:263-277). Stored in the API DB (instance_groups,instance_group_policy,instance_group_member). - Use: the group is passed in
os:scheduler_hints.groupat boot; the scheduler filters enforce it, and the compute host re-checks hard (anti-)affinity at build time (late check, see 05). - Delete removes the group but not its servers.
3.9 Key pairs — /os-keypairs
- Create/import (
nova/api/openstack/compute/keypairs.py:55): from 2.92public_keyis mandatory (server-side generation removed);typesshorx509(2.2+); admins may act for anotheruser_id(2.10+). Quotakey_pairsis checked per user (nova/compute/api.py:6981). Key pairs live in the API DB (key_pairs), scoped to the user, not the project. 409 if the name exists (nova/api/openstack/compute/keypairs.py:107). - At boot, the key pair is copied into the instance (
instance_extra.keypairs); later deletion of the key pair does not affect existing servers.
3.10 Services, hypervisors, aggregates, availability zones (admin)
- Services (
/os-services): listnova-compute,nova-conductor,nova-schedulerrecords from every cell, withstatecomputed by the servicegroup driver (heartbeat age vs[DEFAULT]/service_down_time).PUT(2.53+, by service UUID) enables/disables a compute (disabled_reason) or setsforced_down(fencing, used with evacuate) (nova/api/openstack/compute/services.py:399). Disabling also toggles theCOMPUTE_STATUS_DISABLEDtrait in Placement through the compute host [inferred].DELETE(nova/api/openstack/compute/services.py:245) refuses a compute that still hosts instances (409), removes it from its aggregates, deletes its Placement resource providers, then deletes the service and compute node rows. - Hypervisors (
/os-hypervisors): readcompute_nodesof all cells; UUIDs as ids from 2.53;statisticsanduptimeremoved after 2.87 (404).servers/searchsub-routes replaced by query parameters from 2.53. - Aggregates (
/os-aggregates,nova/api/openstack/compute/aggregates.py:57): host aggregates in the API DB.add_host/remove_hostmirror the membership into Placement aggregates of the host's resource provider (nova/compute/api.py:6833,nova/compute/api.py:6939) and refuse changes that would move existing instances to another AZ (nova/compute/api.py:6752). Settingavailability_zonemetadata defines AZs.POST /os-aggregates/{id}/images(2.81+) castscache_imagesto every host of the aggregate through conductor (image pre-caching). - Availability zones (
/os-availability-zone,/detail): derived from aggregate metadata and services;[DEFAULT]/default_availability_zonefor hosts in no AZ.
3.11 Quotas and limits
/os-quota-sets/{project_id}show/detail/update/delete/defaults and/os-quota-class-sets/{id}(nova/api/openstack/compute/quota_sets.py:123). With the default[quota]/driver = nova.quota.DbQuotaDriverlimits live in the API DB (quotas,project_user_quotas,quota_classes) and usage is counted from cell databases and Placement at check time (no reservations). Withnova.quota.UnifiedLimitsDriver, limits come from Keystone unified limits andPUT/DELETEare refused (400) (nova/api/openstack/compute/quota_sets.py:181).- Resources hidden by microversion:
floating_ips,fixed_ips,security_groups,security_group_rules,networksdisappear at 2.36;injected_file*at 2.57 (nova/api/openstack/compute/quota_sets.py:109). GET /limits(nova/api/openstack/compute/limits.py:50) returns absolute limits and usage of the project.
3.12 Migrations and instance actions
GET /os-migrations(admin,nova/api/openstack/compute/migrations.py:191): migrations of all cells with filters, paging (2.59+),user_id/project_id(2.80+)./servers/{id}/migrations(2.23+): in-progress live migrations;POST …/{mid}/action {"force_complete": null}(2.22+) castslive_migration_force_complete(nova/compute/api.py:5642);DELETE …/{mid}(2.24+) aborts a running or (2.65+) queued live migration (nova/compute/api.py:5672)./servers/{id}/os-instance-actions[/{request_id}]: history of actions and their events (compute-side steps with tracebacks for admins); works for deleted servers from 2.21.
3.13 Other server sub-resources
| Resource | What it does | Handler |
|---|---|---|
/servers/{id}/metadata[/{key}] | key/value metadata stored in instance_metadata; update allowed in active/paused/suspended/stopped with no task; database update only, the guest sees it through the metadata API or config drive | nova/api/openstack/compute/server_metadata.py:68, nova/compute/api.py:5555 |
/servers/{id}/tags[/{tag}] (2.26+) | simple tags in tags, max 50 per server (nova/objects/instance.py:81) | nova/api/openstack/compute/server_tags.py:108 |
/servers/{id}/ips[/{network}] | addresses from the network info cache (instance_info_caches), not from Neutron | nova/api/openstack/compute/ips.py:41 |
/servers/{id}/os-server-password | password set by the guest through the metadata API (instance_system_metadata), DELETE clears it | nova/api/openstack/compute/server_password.py:39 |
/servers/{id}/diagnostics | RPC call to the host (get_instance_diagnostics from 2.48) | nova/api/openstack/compute/server_diagnostics.py:42 |
/servers/{id}/topology (2.78+) | NUMA topology and pinning from instance_extra | nova/api/openstack/compute/server_topology.py:34 |
/servers/{id}/remote-consoles (2.6+) | protocol vnc/spice/serial/mks; RPC call to the host which returns a tokenised URL; rdp refused | nova/api/openstack/compute/remote_consoles.py:153 |
/os-console-auth-tokens/{token} | admin validation of a console token (used by console proxies) | nova/api/openstack/compute/console_auth_tokens.py:44 |
/servers/{id}/shares[/{share_id}] (2.97+) | attach a Manila share (virtiofs); server must be stopped (or in error for detach) (nova/api/openstack/compute/server_shares.py:58-63); allow_share cast | nova/api/openstack/compute/server_shares.py:100 |
/servers/{id}/os-security-groups | security groups of the server's ports, read from Neutron | nova/api/openstack/compute/security_groups.py:372 |
/os-assisted-volume-snapshots | service-only callback from Cinder (NFS/GlusterFS drivers) to snapshot an attached file-based volume on the host | nova/api/openstack/compute/assisted_volume_snapshots.py:41 |
/os-simple-tenant-usage[/{project}] | usage (hours × resources) over a period, computed from instance rows of all cells | nova/api/openstack/compute/simple_tenant_usage.py:271 |
/os-instance_usage_audit_log | status of the _instance_usage_audit periodic task (task_log) | nova/api/openstack/compute/instance_usage_audit_log.py:41 |
/, /versions/{id}, /extensions | version document (min/max microversion) and static extension list | nova/api/openstack/compute/versionsV21.py:31 |
4. Server action matrix
Generated from the nova/compute/api.py decorators of the method each action calls. In state(...), an omitted task_state means **task_state must be None** (no operation in progress) and the server must have been launched once (nova/compute/api.py:142). check_instance_lock → 409 for non-admins on a locked server; check_instance_host() → 409 if the server has no host, check_is_up=True → 503 if its compute service is down; reject_*/block_* decorators refuse features the operation does not support (vTPM, vDPA, memory encryption, accelerators, extended resource requests, shares) with 400/409. Several actions call other compute.API methods internally; the precise path is noted below the table.
| Action key | Handler | compute.API method | Preconditions (decorators) | task_state set | Instance action | Downstream call |
|---|---|---|---|---|---|---|
addFixedIp | nova/api/openstack/compute/multinic.py:43 | nova/compute/api.py:4825 API.add_fixed_ip | check_instance_lock | — | — | compute_rpcapi.add_fixed_ip_to_instance |
addFloatingIp | nova/api/openstack/compute/floating_ips.py:200 | network_api.associate_floating_ip | — | — | — | — |
addSecurityGroup | nova/api/openstack/compute/security_groups.py:429 | — | — | — | — | — |
changePassword | nova/api/openstack/compute/admin_password.py:42 | nova/compute/api.py:4972 API.set_admin_password | check_instance_lockstate(vm_state=[ACTIVE]) | UPDATING_PASSWORD | CHANGE_PASSWORD | compute_rpcapi.set_admin_password |
confirmResize | nova/api/openstack/compute/servers.py:1086 | nova/compute/api.py:4117 API.confirm_resize | check_instance_lockstate(vm_state=[RESIZED]) | — | CONFIRM_RESIZE | compute_rpcapi.confirm_resize, compute_task_api.confirm_snapshot_based_resize |
createBackup | nova/api/openstack/compute/create_backup.py:45 | nova/compute/api.py:3406 API.backup | state(vm_state=[ACTIVE, STOPPED, PAUSED, SUSPENDED]) | IMAGE_BACKUP | BACKUP | compute_rpcapi.backup_instance |
createImage | nova/api/openstack/compute/servers.py:1432 | nova/compute/api.py:3447 API.snapshot / nova/compute/api.py:3504 API.snapshot_volume_backed | state(vm_state=[ACTIVE, STOPPED, PAUSED, SUSPENDED]) | — | CREATE_IMAGE | compute_rpcapi.quiesce_instance, compute_rpcapi.unquiesce_instance |
evacuate | nova/api/openstack/compute/evacuate.py:91 | nova/compute/api.py:5720 API.evacuate | block_shares_not_supported()block_extended_resource_requestblock_port_accelerators()reject_vtpm_instances(instance_actions.EVACUATE)block_accelerators(until_service=SUPPORT_ACCELERATOR_SERVICE_FOR_REBUILD)state(vm_state=[ACTIVE, STOPPED, ERROR], task_state=None) | REBUILDING | EVACUATE | compute_task_api.rebuild_instance |
forceDelete | nova/api/openstack/compute/deferred_delete.py:59 | nova/compute/api.py:2853 API.force_delete | check_instance_lockstate(task_state=None, must_have_launched=False) | — | — | — |
injectNetworkInfo | nova/api/openstack/compute/admin_actions.py:55 | nova/compute/api.py:5086 API.inject_network_info | check_instance_lock | — | — | compute_rpcapi.inject_network_info |
lock | nova/api/openstack/compute/lock_server.py:37 | nova/compute/api.py:5031 API.lock | — | — | LOCK | — |
migrate | nova/api/openstack/compute/migrate_server.py:45 | nova/compute/api.py:4295 API.resize | block_extended_resource_requestblock_port_accelerators()block_accelerators()check_instance_lockstate(vm_state=[ACTIVE, STOPPED])check_instance_host(check_is_up=True) | RESIZE_PREP | MIGRATE, RESIZE | compute_task_api.resize_instance |
os-getConsoleOutput | nova/api/openstack/compute/console_output.py:40 | nova/compute/api.py:5026 API.get_console_output | check_instance_host() | — | — | compute_rpcapi.get_console_output |
os-getSPICEConsole | nova/api/openstack/compute/remote_consoles.py:78 | nova/compute/api.py:5001 API.get_spice_console | check_instance_host()reject_instance_state(task_state=[DELETING, MIGRATING]) | — | — | compute_rpcapi.get_spice_console |
os-getSerialConsole | nova/api/openstack/compute/remote_consoles.py:119 | nova/compute/api.py:5010 API.get_serial_console | check_instance_host()reject_instance_state(task_state=[DELETING, MIGRATING]) | — | — | compute_rpcapi.get_serial_console |
os-getVNCConsole | nova/api/openstack/compute/remote_consoles.py:46 | nova/compute/api.py:4992 API.get_vnc_console | check_instance_host()reject_instance_state(task_state=[DELETING, MIGRATING]) | — | — | compute_rpcapi.get_vnc_console |
os-migrateLive | nova/api/openstack/compute/migrate_server.py:101 | nova/compute/api.py:5587 API.live_migrate | block_shares_not_supported()block_extended_resource_requestblock_port_accelerators()reject_vdpa_instances(instance_actions.LIVE_MIGRATION, until=MIN_COMPUTE_VDPA_HOTPLUG_LIVE_MIGRATION)block_accelerators()reject_legacy_vtpm_live_migrationreject_mem_enc_instances(instance_actions.LIVE_MIGRATION)check_instance_lockstate(vm_state=[ACTIVE, PAUSED]) | MIGRATING | LIVE_MIGRATION | compute_task_api.live_migrate_instance |
os-resetState | nova/api/openstack/compute/admin_actions.py:71 | — | — | — | — | — |
os-start | nova/api/openstack/compute/servers.py:1541 | nova/compute/api.py:2880 API.start | check_instance_lockcheck_instance_host()state(vm_state=[STOPPED]) | POWERING_ON | START | compute_rpcapi.start_instance |
os-stop | nova/api/openstack/compute/servers.py:1561 | nova/compute/api.py:2873 API.stop | check_instance_lockcheck_instance_host()state(vm_state=[ACTIVE, ERROR]) | — | — | — |
pause | nova/api/openstack/compute/pause_server.py:38 | nova/compute/api.py:4838 API.pause | check_instance_lockstate(vm_state=[ACTIVE]) | PAUSING | PAUSE | compute_rpcapi.pause_instance |
reboot | nova/api/openstack/compute/servers.py:1134 | nova/compute/api.py:3644 API.reboot | check_instance_lock | — | — | — |
rebuild | nova/api/openstack/compute/servers.py:1264 | nova/compute/api.py:3689 API.rebuild | block_shares_not_supported()reject_vtpm_instances(instance_actions.REBUILD)block_accelerators(until_service=SUPPORT_ACCELERATOR_SERVICE_FOR_REBUILD)check_instance_lockstate(vm_state=[ACTIVE, STOPPED, ERROR]) | REBUILDING | REBUILD | compute_task_api.rebuild_instance |
removeFixedIp | nova/api/openstack/compute/multinic.py:62 | nova/compute/api.py:4831 API.remove_fixed_ip | check_instance_lock | — | — | compute_rpcapi.remove_fixed_ip_from_instance |
removeFloatingIp | nova/api/openstack/compute/floating_ips.py:281 | network_api.get_floating_ip_by_address | — | — | — | — |
removeSecurityGroup | nova/api/openstack/compute/security_groups.py:453 | — | — | — | — | — |
rescue | nova/api/openstack/compute/rescue.py:46 | nova/compute/api.py:4897 API.rescue | reject_vtpm_instances(instance_actions.RESCUE)check_instance_lockstate(vm_state=[ACTIVE, STOPPED, ERROR]) | RESCUING | RESCUE | compute_rpcapi.rescue_instance |
resize | nova/api/openstack/compute/servers.py:1154 | nova/compute/api.py:4295 API.resize | block_extended_resource_requestblock_port_accelerators()block_accelerators()check_instance_lockstate(vm_state=[ACTIVE, STOPPED])check_instance_host(check_is_up=True) | RESIZE_PREP | MIGRATE, RESIZE | compute_task_api.resize_instance |
restore | nova/api/openstack/compute/deferred_delete.py:40 | nova/compute/api.py:2820 API.restore | check_instance_lockstate(vm_state=[SOFT_DELETED]) | None, RESTORING | RESTORE | compute_rpcapi.restore_instance |
resume | nova/api/openstack/compute/suspend_server.py:63 | nova/compute/api.py:4886 API.resume | check_instance_lockreject_vdpa_instances(instance_actions.RESUME, until=MIN_COMPUTE_VDPA_HOTPLUG_LIVE_MIGRATION)state(vm_state=[SUSPENDED]) | RESUMING | RESUME | compute_rpcapi.resume_instance |
revertResize | nova/api/openstack/compute/servers.py:1110 | nova/compute/api.py:4006 API.revert_resize | check_instance_lockstate(vm_state=[RESIZED]) | RESIZE_REVERTING | REVERT_RESIZE | compute_rpcapi.revert_resize, compute_task_api.revert_snapshot_based_resize |
shelve | nova/api/openstack/compute/shelve.py:43 | nova/compute/api.py:4558 API.shelve | block_shares_not_supported()block_port_accelerators()reject_vtpm_instances(instance_actions.SHELVE)block_accelerators(until_service=54)check_instance_lockstate(vm_state=[ACTIVE, STOPPED, PAUSED, SUSPENDED]) | SHELVING | SHELVE | compute_rpcapi.shelve_instance, compute_rpcapi.shelve_offload_instance |
shelveOffload | nova/api/openstack/compute/shelve.py:73 | nova/compute/api.py:4597 API.shelve_offload | block_port_accelerators()check_instance_lockstate(vm_state=[SHELVED]) | SHELVING_OFFLOADING | SHELVE_OFFLOAD | compute_rpcapi.shelve_offload_instance |
suspend | nova/api/openstack/compute/suspend_server.py:37 | nova/compute/api.py:4874 API.suspend | block_shares_not_supported()block_port_accelerators()reject_vdpa_instances(instance_actions.SUSPEND, until=MIN_COMPUTE_VDPA_HOTPLUG_LIVE_MIGRATION)block_accelerators()reject_mem_enc_instances(instance_actions.SUSPEND)check_instance_lockstate(vm_state=[ACTIVE]) | SUSPENDING | SUSPEND | compute_rpcapi.suspend_instance |
trigger_crash_dump | nova/api/openstack/compute/servers.py:1583 | nova/compute/api.py:2893 API.trigger_crash_dump | check_instance_lockcheck_instance_host()state(vm_state=ALLOW_TRIGGER_CRASH_DUMP) | — | TRIGGER_CRASH_DUMP | compute_rpcapi.trigger_crash_dump |
unlock | nova/api/openstack/compute/lock_server.py:57 | nova/compute/api.py:5065 API.unlock | — | — | UNLOCK | — |
unpause | nova/api/openstack/compute/pause_server.py:62 | nova/compute/api.py:4847 API.unpause | check_instance_lockstate(vm_state=[PAUSED]) | UNPAUSING | UNPAUSE | compute_rpcapi.unpause_instance |
unrescue | nova/api/openstack/compute/rescue.py:92 | nova/compute/api.py:4961 API.unrescue | check_instance_lockstate(vm_state=[RESCUED]) | UNRESCUING | UNRESCUE | compute_rpcapi.unrescue_instance |
unshelve | nova/api/openstack/compute/shelve.py:106 | nova/compute/api.py:4718 API.unshelve | block_extended_resource_requestcheck_instance_lockstate(vm_state=[SHELVED, SHELVED_OFFLOADED]) | UNSHELVING | UNSHELVE | compute_task_api.unshelve_instance |
Notes on rows the generator cannot resolve by itself:
reboot→_soft_rebootrequiresvm_stateinALLOW_SOFT_REBOOT(active) and no task;_hard_rebootacceptsactive,stopped,paused,suspended,errorand an in-progress reboot or resume (ALLOW_REBOOT), so a hard reboot can interrupt a stuck soft reboot (nova/compute/api.py:3644-3671,nova/compute/vm_states.py:70-73). Task statesrebooting/rebooting_hard, instance actionreboot, castreboot_instance.os-stop→force_stopsetspowering-off, recordsstop, castsstop_instance(nova/compute/api.py:2858-2867).createImage(nova/api/openstack/compute/servers.py:1456-1463) → for an image-backed servercompute.API.snapshot(nova/compute/api.py:3447) setsimage_snapshot_pendingand castssnapshot_instance; for a volume-backed serversnapshot_volume_backedquiesces the guest (RPC call), creates Cinder snapshots and registers an image in Glance inside the API request (nova/compute/api.py:3504-3631). From 2.45 the response body carriesimage_idand the code stays 202.os-resetStatewritesvm_state(activeorerror) and clearstask_statedirectly (nova/api/openstack/compute/admin_actions.py:71-92); no RPC.addSecurityGroup/removeSecurityGroupupdate the security groups of every port of the server in Neutron (nova/network/security_group_api.py) [inferred: one call per port].addFloatingIp/removeFloatingIp(≤ 2.43) associate a Neutron floating IP with the server's port (nova/api/openstack/compute/floating_ips.py:200).
5. Lifecycle of a server
vm_state is the stable state, task_state the operation in progress; the API status is derived from both (§ 1.5). Simplified (main transitions):
stateDiagram-v2 [*] --> BUILD: POST /servers (API, build_requests row) BUILD --> ACTIVE: build_and_run_instance succeeded (RPC cast conductor→compute) BUILD --> ERROR: no valid host (conductor, instance in cell0) / spawn failure (compute) ACTIVE --> SHUTOFF: os-stop (API→cast stop_instance) / guest shut down (compute _sync_power_states) SHUTOFF --> ACTIVE: os-start (cast start_instance) ACTIVE --> PAUSED: pause PAUSED --> ACTIVE: unpause ACTIVE --> SUSPENDED: suspend SUSPENDED --> ACTIVE: resume ACTIVE --> RESCUE: rescue RESCUE --> ACTIVE: unrescue ACTIVE --> VERIFY_RESIZE: resize / migrate (conductor + scheduler, finish_resize on target) SHUTOFF --> VERIFY_RESIZE: resize / migrate VERIFY_RESIZE --> ACTIVE: confirmResize / revertResize / auto-confirm (periodic _poll_unconfirmed_resizes) ACTIVE --> SHELVED: shelve (snapshot to Glance) SHELVED --> SHELVED_OFFLOADED: shelveOffload / periodic _poll_shelved_instances SHELVED_OFFLOADED --> ACTIVE: unshelve (conductor + scheduler) ACTIVE --> SOFT_DELETED: DELETE with reclaim_instance_interval > 0 SOFT_DELETED --> ACTIVE: restore SOFT_DELETED --> DELETED: forceDelete / periodic _reclaim_queued_deletes ACTIVE --> DELETED: DELETE (cast terminate_instance, or local delete if host down) ERROR --> ACTIVE: os-resetState / rebuild / hard reboot DELETED --> [*]
Live migration, evacuation, rebuild, reboot, snapshot and backup keep the vm_state and only move task_state (migrating, rebuilding, rebooting, image_snapshot…); a failure during them either restores the previous state or sets ERROR with an instance fault, depending on the step (see 02-errors § 4).
6. Other resources with states
- Migration (
migrations.status):pre-migrating→migrating→post-migrating→finished→confirmed/reverted, orerror/failed; live migrations:accepted/queued→preparing→running→completed, orcancelled/failed/error. Read through/os-migrationsand/servers/{id}/migrations. - Service:
enabled/disabled(+disabled_reason) set by the API;up/downcomputed from the heartbeat (nova/servicegroup/drivers/db.py);forced_downset by the API (2.11+). - Instance action events:
start/finishwithresultSuccess/Error, written by the compute and conductorwrap_instance_eventdecorator (see 05).
7. Deprecated and removed families
| Family | Paths | Behaviour on stable/2026.2 |
|---|---|---|
| nova-network proxies | /os-networks, /os-tenant-networks, /os-security-groups, /os-security-group-rules, /os-floating-ips, /os-floating-ip-pools | proxied to Neutron up to 2.35, 404 after; network create/delete/associate → 410 |
| Image proxy | /images, /images/{id}/metadata | proxied to Glance up to 2.35 (2.38 for metadata), 404 after |
| Volume proxy | /os-volumes, /os-snapshots | proxied to Cinder up to 2.35, 404 after |
| Bare-metal proxy | /os-baremetal-nodes | proxied to Ironic up to 2.35; interface actions → 410 |
| Hosts | /os-hosts | up to 2.42; replaced by /os-services and /os-hypervisors |
| Cells v1, agents, certificates, cloudpipe, fping, fixed IPs, floating IP DNS/bulk, virtual interfaces, security group default rules, consoles (v1) | various | 410 Gone at every microversion |
8. Spec/code gaps
- The api-ref documents 251 operations (
_rewrite/api-ref_stable-2026.2.json) while the code exposes 265 (actions counted one by one). Differences come from: removed (410) APIs that are not all documented, the/os-volumes_bootalias (code only), and action keys documented underPOST /servers/{server_id}/actionwith onerest_methodper action. The detailed comparison is in_rewrite/rewrite-pack-index_stable-2026.2.md(part 5). GET /os-hypervisors/detaildeclares no policyoperationsentry matching its path: the ruleos_compute_api:os-hypervisors:list-detaildocuments/os-hypervisors/details(nova/policies/hypervisors.py:56); the rule is still enforced in the handler (nova/api/openstack/compute/hypervisors.py:290), only the documented path is wrong.GET /flavorshas no policy check at all (public), consistent with the api-ref.
9. Metadata API (nova-metadata-api)
A second WSGI application (etc/nova/api-paste.ini:4, nova/api/metadata/handler.py:47) serves /openstack/* and EC2-style /latest/meta-data/* to guests:
- Behind the Neutron metadata proxy (
[neutron]/service_metadata_proxy = True): the instance is identified byX-Instance-ID,X-Tenant-IDandX-Instance-ID-Signature(HMAC-SHA256 of the instance id with[neutron]/metadata_proxy_shared_secret); missing headers → 400, bad signature → 403 (nova/api/metadata/handler.py:159,nova/api/metadata/handler.py:298-315). - Direct (no proxy): the instance is found by its fixed IP (
X-Forwarded-Forwhen[api]/use_forwarded_for) (nova/api/metadata/handler.py:141). - Responses are cached in oslo.cache (
metadata-<address>/metadata-<instance_id>keys) for[api]/metadata_cache_expirationseconds (nova/api/metadata/handler.py:51-93). - Content: instance metadata, user data, key pair, network data (from the info cache), vendor data (static JSON and/or a dynamic REST call to configured vendordata services,
nova/api/metadata/vendordata_dynamic.py), password (POST by the guest).
Source: reverse-spec-nova/01-rest-api_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.