OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Reverse-spec · Services

nova — REST API

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):

#FilterCodeRole
1corsoslo_middleware.corsCORS headers
2http_proxy_to_wsgioslo_middleware.http_proxy_to_wsgihonours X-Forwarded-Proto behind a proxy
3compute_req_idnova/api/compute_req_id.pygenerates X-Compute-Request-Id / X-OpenStack-Request-Id
4faultwrapnova/api/openstack/__init__.py:49 FaultWrapperturns any uncaught exception into a JSON fault (500 if unknown)
5request_lognova/api/openstack/requestlog.pyone INFO access-log line per request
6sizelimitoslo_middleware.RequestBodySizeLimiter413 above [oslo_middleware]/max_request_body_size
7osprofilernova/profiler.pyoptional tracing
8authtokenkeystonemiddleware.auth_tokenvalidates X-Auth-Token against Keystone (401)
9keystonecontextnova/api/auth.py NovaKeystoneContextbuilds nova.context.RequestContext from the X-* headers
10appnova/api/openstack/compute/routes.py:860 APIRouterV21routes 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 …/action routes dispatch on the single top-level key of the JSON body (nova/api/openstack/wsgi.py:347 action_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 minimum 2.1 (DEFAULT_API_VERSION, nova/api/openstack/api_version_request.py:301); latest means 2.104. A version outside the range yields 406 InvalidGlobalAPIVersion (nova/api/openstack/wsgi.py:168-174).
  • Headers read: OpenStack-API-Version: compute 2.x and legacy X-OpenStack-Nova-API-Version: 2.x. Responses echo both, plus Vary (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 raises VersionNotFoundForAPIMethod, 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.json and in _rewrite/api-operations_stable-2026.2.json. Schema ranges must be contiguous: the Schemas container 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-keypairs returns 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_boot is 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 (additionalProperties in each query schema).
  • Policies (oslo.policy, 214 default rules, nova/policies/) are checked in the handler with context.can(rule, target); a refusal raises exception.Forbidden → 403 (nova/api/openstack/wsgi.py:383-385). Default rules are scoped with enforce_scope/enforce_new_defaults personas (admin, project member, project reader, service).
  • @wsgi.expected_errors(codes) (nova/api/openstack/wsgi.py:738) lets through webob HTTP errors whose code is listed, plus Forbidden, ValidationError, Unauthorized, and converts NotSupported to 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 names badRequest, unauthorized, forbidden, itemNotFound, badMethod, conflictingRequest, overLimit (413/429, with retryAfter), badMediaType, notImplemented, serviceUnavailable, otherwise computeFault (nova/api/openstack/wsgi.py:876-920). See 02-errors § 1.
  • Instance-state preconditions are enforced in nova/compute/api.py by decorators: check_instance_state(vm_state=…, task_state=(None,), must_have_launched=True) (nova/compute/api.py:142) — **the default requires task_state to be None, 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 if check_is_up and the source compute is down), check_instance_lock (nova/compute/api.py:247, 409 InstanceIsLocked unless admin). The handlers translate InstanceInvalidState into 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.

#MethodPathActionHandlerPolicy rulesMicroversionsSuccessExpected errors
1GET/nova/api/openstack/compute/versionsV21.py:31 VersionsController.show—all200404
2GET/versions/{id}nova/api/openstack/compute/versionsV21.py:31 VersionsController.show—all200404
3GET/extensionsnova/api/openstack/compute/extension_info.py:862 ExtensionInfoController.indexos_compute_api:extensionsall200—
4GET/extensions/{id}nova/api/openstack/compute/extension_info.py:877 ExtensionInfoController.showos_compute_api:extensionsall200404
5GET/flavorsnova/api/openstack/compute/flavors.py:147 FlavorsController.index—all200400
6POST/flavorsnova/api/openstack/compute/flavors.py:68 FlavorsController.createos_compute_api:os-flavor-extra-specs:index
os_compute_api:os-flavor-manage:create
all200400, 409
7GET/flavors/detailnova/api/openstack/compute/flavors.py:160 FlavorsController.detailos_compute_api:os-flavor-extra-specs:indexall200400
8GET/flavors/{id}nova/api/openstack/compute/flavors.py:181 FlavorsController.showos_compute_api:os-flavor-extra-specs:indexall200404
9PUT/flavors/{id}nova/api/openstack/compute/flavors.py:121 FlavorsController.updateos_compute_api:os-flavor-extra-specs:index
os_compute_api:os-flavor-manage:update
2.55–max200400, 404
10DELETE/flavors/{id}nova/api/openstack/compute/flavors.py:46 FlavorsController.deleteos_compute_api:os-flavor-manage:deleteall202404
11POST/flavors/{id}/actionaddTenantAccessnova/api/openstack/compute/flavor_access.py:71 FlavorActionController._add_tenant_accessos_compute_api:os-flavor-access:add_tenant_accessall200400, 403, 404, 409
12POST/flavors/{id}/actionremoveTenantAccessnova/api/openstack/compute/flavor_access.py:97 FlavorActionController._remove_tenant_accessos_compute_api:os-flavor-access:remove_tenant_accessall200400, 403, 404
13GET/flavors/{flavor_id}/os-extra_specsnova/api/openstack/compute/flavors_extraspecs.py:61 FlavorExtraSpecsController.indexos_compute_api:os-flavor-extra-specs:indexall200404
14POST/flavors/{flavor_id}/os-extra_specsnova/api/openstack/compute/flavors_extraspecs.py:74 FlavorExtraSpecsController.createos_compute_api:os-flavor-extra-specs:createall200400, 404, 409
15GET/flavors/{flavor_id}/os-extra_specs/{id}nova/api/openstack/compute/flavors_extraspecs.py:115 FlavorExtraSpecsController.showos_compute_api:os-flavor-extra-specs:showall200404
16PUT/flavors/{flavor_id}/os-extra_specs/{id}nova/api/openstack/compute/flavors_extraspecs.py:93 FlavorExtraSpecsController.updateos_compute_api:os-flavor-extra-specs:updateall200400, 404, 409
17DELETE/flavors/{flavor_id}/os-extra_specs/{id}nova/api/openstack/compute/flavors_extraspecs.py:134 FlavorExtraSpecsController.deleteos_compute_api:os-flavor-extra-specs:deleteall200404
18GET/flavors/{flavor_id}/os-flavor-accessnova/api/openstack/compute/flavor_access.py:48 FlavorAccessController.indexos_compute_api:os-flavor-accessall200404
19GET/imagesnova/api/openstack/compute/images.py:124 ImagesController.index—2.1–2.35200400
20GET/images/detailnova/api/openstack/compute/images.py:144 ImagesController.detail—2.1–2.35200400
21GET/images/{id}nova/api/openstack/compute/images.py:82 ImagesController.show—2.1–2.35200404
22DELETE/images/{id}nova/api/openstack/compute/images.py:102 ImagesController.delete—2.1–2.35204403, 404
23GET/images/{image_id}/metadatanova/api/openstack/compute/image_metadata.py:49 ImageMetadataController.index—2.1–2.38200403, 404
24POST/images/{image_id}/metadatanova/api/openstack/compute/image_metadata.py:71 ImageMetadataController.create—2.1–2.38200400, 403, 404
25PUT/images/{image_id}/metadatanova/api/openstack/compute/image_metadata.py:113 ImageMetadataController.update_all—2.1–2.38200400, 403, 404
26GET/images/{image_id}/metadata/{id}nova/api/openstack/compute/image_metadata.py:59 ImageMetadataController.show—2.1–2.38200403, 404
27PUT/images/{image_id}/metadata/{id}nova/api/openstack/compute/image_metadata.py:89 ImageMetadataController.update—2.1–2.38200400, 403, 404
28DELETE/images/{image_id}/metadata/{id}nova/api/openstack/compute/image_metadata.py:130 ImageMetadataController.delete—2.1–2.38204403, 404
29GET/limitsnova/api/openstack/compute/limits.py:50 LimitsController.indexos_compute_api:limits
os_compute_api:limits:other_project
all200—
30GET/os-agentsnova/api/openstack/compute/agents.py:39 AgentController.index—removed (410)200410
31POST/os-agentsnova/api/openstack/compute/agents.py:59 AgentController.create—removed (410)200410
32PUT/os-agents/{id}nova/api/openstack/compute/agents.py:46 AgentController.update—removed (410)200410
33DELETE/os-agents/{id}nova/api/openstack/compute/agents.py:52 AgentController.delete—removed (410)200410
34GET/os-aggregatesnova/api/openstack/compute/aggregates.py:57 AggregateController.indexos_compute_api:os-aggregates:indexall200—
35POST/os-aggregatesnova/api/openstack/compute/aggregates.py:72 AggregateController.createos_compute_api:os-aggregates:createall200400, 409
36GET/os-aggregates/{id}nova/api/openstack/compute/aggregates.py:108 AggregateController.showos_compute_api:os-aggregates:showall200400, 404
37PUT/os-aggregates/{id}nova/api/openstack/compute/aggregates.py:129 AggregateController.updateos_compute_api:os-aggregates:updateall200400, 404, 409
38DELETE/os-aggregates/{id}nova/api/openstack/compute/aggregates.py:158 AggregateController.deleteos_compute_api:os-aggregates:deleteall200400, 404
39POST/os-aggregates/{id}/actionadd_hostnova/api/openstack/compute/aggregates.py:183 AggregateController._add_hostos_compute_api:os-aggregates:add_hostall200400, 404, 409
40POST/os-aggregates/{id}/actionremove_hostnova/api/openstack/compute/aggregates.py:214 AggregateController._remove_hostos_compute_api:os-aggregates:remove_hostall200400, 404, 409
41POST/os-aggregates/{id}/actionset_metadatanova/api/openstack/compute/aggregates.py:248 AggregateController._set_metadataos_compute_api:os-aggregates:set_metadataall200400, 404
42POST/os-aggregates/{id}/imagesnova/api/openstack/compute/aggregates.py:299 AggregateController.imagescompute:aggregates:images2.81–max202400, 404
43POST/os-assisted-volume-snapshotsnova/api/openstack/compute/assisted_volume_snapshots.py:41 AssistedVolumeSnapshotsController.createos_compute_api:os-assisted-volume-snapshots:createall200400
44DELETE/os-assisted-volume-snapshots/{id}nova/api/openstack/compute/assisted_volume_snapshots.py:70 AssistedVolumeSnapshotsController.deleteos_compute_api:os-assisted-volume-snapshots:deleteall204400, 404
45GET/os-availability-zonenova/api/openstack/compute/availability_zone.py:112 AvailabilityZoneController.indexos_compute_api:os-availability-zone:listall200—
46GET/os-availability-zone/detailnova/api/openstack/compute/availability_zone.py:123 AvailabilityZoneController.detailos_compute_api:os-availability-zone:detailall200—
47GET/os-baremetal-nodesnova/api/openstack/compute/baremetal_nodes.py:69 BareMetalNodeController.indexos_compute_api:os-baremetal-nodes:list2.1–2.35200404, 501
48POST/os-baremetal-nodesnova/api/openstack/compute/baremetal_nodes.py:125 BareMetalNodeController.create—2.1–2.35200400
49GET/os-baremetal-nodes/{id}nova/api/openstack/compute/baremetal_nodes.py:94 BareMetalNodeController.showos_compute_api:os-baremetal-nodes:show2.1–2.35200404, 501
50DELETE/os-baremetal-nodes/{id}nova/api/openstack/compute/baremetal_nodes.py:131 BareMetalNodeController.delete—2.1–2.35200400
51POST/os-baremetal-nodes/{id}/actionadd_interfacenova/api/openstack/compute/baremetal_nodes.py:139 BareMetalNodeController._add_interface—2.1–2.35200400
52POST/os-baremetal-nodes/{id}/actionremove_interfacenova/api/openstack/compute/baremetal_nodes.py:147 BareMetalNodeController._remove_interface—2.1–2.35200400
53POST/os-cellsnova/api/openstack/compute/cells.py:83 CellsController.create—removed (410)200410
54GET/os-cellsnova/api/openstack/compute/cells.py:42 CellsController.index—removed (410)200410
55GET/os-cells/capacitiesnova/api/openstack/compute/cells.py:63 CellsController.capacities—removed (410)200410
56GET/os-cells/detailnova/api/openstack/compute/cells.py:49 CellsController.detail—removed (410)200410
57GET/os-cells/infonova/api/openstack/compute/cells.py:56 CellsController.info—removed (410)200410
58POST/os-cells/sync_instancesnova/api/openstack/compute/cells.py:97 CellsController.sync_instances—removed (410)200410
59GET/os-cells/{id}nova/api/openstack/compute/cells.py:70 CellsController.show—removed (410)200410
60PUT/os-cells/{id}nova/api/openstack/compute/cells.py:90 CellsController.update—removed (410)200410
61DELETE/os-cells/{id}nova/api/openstack/compute/cells.py:76 CellsController.delete—removed (410)200410
62GET/os-cells/{id}/capacitiesnova/api/openstack/compute/cells.py:63 CellsController.capacities—removed (410)200410
63POST/os-certificatesnova/api/openstack/compute/certificates.py:45 CertificatesController.create—removed (410)200410
64GET/os-certificates/{id}nova/api/openstack/compute/certificates.py:37 CertificatesController.show—removed (410)200410
65GET/os-cloudpipenova/api/openstack/compute/cloudpipe.py:46 CloudpipeController.index—removed (410)200410
66POST/os-cloudpipenova/api/openstack/compute/cloudpipe.py:38 CloudpipeController.create—removed (410)200410
67PUT/os-cloudpipe/{id}nova/api/openstack/compute/cloudpipe.py:54 CloudpipeController.update—removed (410)200410
68GET/os-console-auth-tokens/{id}nova/api/openstack/compute/console_auth_tokens.py:44 ConsoleAuthTokensController.showos_compute_api:os-console-auth-tokensall200400, 401, 404 (2.1–2.30); 400, 404 (2.31–2.98); 400, 404 (2.99–max)
69GET/os-fixed-ips/{id}nova/api/openstack/compute/fixed_ips.py:36 FixedIPController.show—removed (410)200410
70POST/os-fixed-ips/{id}/actionreservenova/api/openstack/compute/fixed_ips.py:44 FixedIPController.reserve—removed (410)200410
71POST/os-fixed-ips/{id}/actionunreservenova/api/openstack/compute/fixed_ips.py:52 FixedIPController.unreserve—removed (410)200410
72GET/os-floating-ip-dnsnova/api/openstack/compute/floating_ip_dns.py:37 FloatingIPDNSDomainController.index—removed (410)200410
73PUT/os-floating-ip-dns/{id}nova/api/openstack/compute/floating_ip_dns.py:44 FloatingIPDNSDomainController.update—removed (410)200410
74DELETE/os-floating-ip-dns/{id}nova/api/openstack/compute/floating_ip_dns.py:50 FloatingIPDNSDomainController.delete—removed (410)200410
75GET/os-floating-ip-dns/{domain_id}/entries/{id}nova/api/openstack/compute/floating_ip_dns.py:62 FloatingIPDNSEntryController.show—removed (410)200410
76PUT/os-floating-ip-dns/{domain_id}/entries/{id}nova/api/openstack/compute/floating_ip_dns.py:69 FloatingIPDNSEntryController.update—removed (410)200410
77DELETE/os-floating-ip-dns/{domain_id}/entries/{id}nova/api/openstack/compute/floating_ip_dns.py:75 FloatingIPDNSEntryController.delete—removed (410)200410
78GET/os-floating-ip-poolsnova/api/openstack/compute/floating_ip_pools.py:49 FloatingIPPoolsController.indexos_compute_api:os-floating-ip-pools2.1–2.35200—
79GET/os-floating-ipsnova/api/openstack/compute/floating_ips.py:110 FloatingIPController.indexos_compute_api:os-floating-ips:list2.1–2.35200—
80POST/os-floating-ipsnova/api/openstack/compute/floating_ips.py:125 FloatingIPController.createos_compute_api:os-floating-ips:create2.1–2.35200400, 403, 404
81GET/os-floating-ips/{id}nova/api/openstack/compute/floating_ips.py:90 FloatingIPController.showos_compute_api:os-floating-ips:show2.1–2.35200400, 404
82DELETE/os-floating-ips/{id}nova/api/openstack/compute/floating_ips.py:159 FloatingIPController.deleteos_compute_api:os-floating-ips:delete2.1–2.35202400, 403, 404, 409
83GET/os-floating-ips-bulknova/api/openstack/compute/floating_ips_bulk.py:36 FloatingIPBulkController.index—removed (410)200410
84POST/os-floating-ips-bulknova/api/openstack/compute/floating_ips_bulk.py:50 FloatingIPBulkController.create—removed (410)200410
85GET/os-floating-ips-bulk/{id}nova/api/openstack/compute/floating_ips_bulk.py:43 FloatingIPBulkController.show—removed (410)200410
86PUT/os-floating-ips-bulk/{id}nova/api/openstack/compute/floating_ips_bulk.py:57 FloatingIPBulkController.update—removed (410)200410
87GET/os-fpingnova/api/openstack/compute/fping.py:38 FpingController.index—removed (410)200410
88GET/os-fping/{id}nova/api/openstack/compute/fping.py:45 FpingController.show—removed (410)200410
89GET/os-hostsnova/api/openstack/compute/hosts.py:46 HostController.indexos_compute_api:os-hosts:list2.1–2.42200—
90GET/os-hosts/{id}nova/api/openstack/compute/hosts.py:269 HostController.showos_compute_api:os-hosts:show2.1–2.42200404
91PUT/os-hosts/{id}nova/api/openstack/compute/hosts.py:97 HostController.updateos_compute_api:os-hosts:update2.1–2.42200400, 404, 501
92GET/os-hosts/{id}/rebootnova/api/openstack/compute/hosts.py:210 HostController.rebootos_compute_api:os-hosts:reboot2.1–2.42200400, 404, 501
93GET/os-hosts/{id}/shutdownnova/api/openstack/compute/hosts.py:200 HostController.shutdownos_compute_api:os-hosts:shutdown2.1–2.42200400, 404, 501
94GET/os-hosts/{id}/startupnova/api/openstack/compute/hosts.py:190 HostController.startupos_compute_api:os-hosts:start2.1–2.42200400, 404, 501
95GET/os-hypervisorsnova/api/openstack/compute/hypervisors.py:235 HypervisorsController.indexos_compute_api:os-hypervisors:listall200(2.1–2.32); 400 (2.33–2.52); 400, 404 (2.53–max)
96GET/os-hypervisors/detailnova/api/openstack/compute/hypervisors.py:270 HypervisorsController.detail—all200(2.1–2.32); 400 (2.33–2.52); 400, 404 (2.53–max)
97GET/os-hypervisors/statisticsnova/api/openstack/compute/hypervisors.py:527 HypervisorsController.statisticsos_compute_api:os-hypervisors:statistics2.1–2.87200—
98GET/os-hypervisors/{id}nova/api/openstack/compute/hypervisors.py:326 HypervisorsController.showos_compute_api:os-hypervisors:showall200404 (2.1–2.52); 400, 404 (2.53–max)
99GET/os-hypervisors/{id}/searchnova/api/openstack/compute/hypervisors.py:440 HypervisorsController.searchos_compute_api:os-hypervisors:search2.1–2.52200404
100GET/os-hypervisors/{id}/serversnova/api/openstack/compute/hypervisors.py:480 HypervisorsController.serversos_compute_api:os-hypervisors:servers2.1–2.52200404
101GET/os-hypervisors/{id}/uptimenova/api/openstack/compute/hypervisors.py:386 HypervisorsController.uptimeos_compute_api:os-hypervisors:uptime2.1–2.87200400, 404, 501
102GET/os-instance_usage_audit_lognova/api/openstack/compute/instance_usage_audit_log.py:41 InstanceUsageAuditLogController.indexos_compute_api:os-instance-usage-audit-log:listall200—
103GET/os-instance_usage_audit_log/{id}nova/api/openstack/compute/instance_usage_audit_log.py:51 InstanceUsageAuditLogController.showos_compute_api:os-instance-usage-audit-log:showall200400
104GET/os-keypairsnova/api/openstack/compute/keypairs.py:186 KeypairController.indexos_compute_api:os-keypairs:indexall200(2.0–2.34); 400 (2.35–max)
105POST/os-keypairsnova/api/openstack/compute/keypairs.py:55 KeypairController.createos_compute_api:os-keypairs:createall201 (2.2–max), 200 (2.0–2.1)400, 403, 409
106GET/os-keypairs/{id}nova/api/openstack/compute/keypairs.py:152 KeypairController.showos_compute_api:os-keypairs:showall200404
107DELETE/os-keypairs/{id}nova/api/openstack/compute/keypairs.py:126 KeypairController.deleteos_compute_api:os-keypairs:deleteall204 (2.2–max), 202 (2.0–2.1)404
108GET/os-migrationsnova/api/openstack/compute/migrations.py:191 MigrationsController.indexos_compute_api:os-migrations:index
os_compute_api:os-migrations:index:all_projects
os_compute_api:os-migrations:index:host
all200(2.1–2.58); 400 (2.59–max)
109GET/os-networksnova/api/openstack/compute/networks.py:82 NetworkController.indexos_compute_api:os-networks:list2.1–2.35200—
110POST/os-networksnova/api/openstack/compute/networks.py:124 NetworkController.create—removed (410)200410
111POST/os-networks/addnova/api/openstack/compute/networks.py:131 NetworkController.add—removed (410)200410
112GET/os-networks/{id}nova/api/openstack/compute/networks.py:94 NetworkController.showos_compute_api:os-networks:show2.1–2.35200404
113DELETE/os-networks/{id}nova/api/openstack/compute/networks.py:117 NetworkController.delete—removed (410)200410
114POST/os-networks/{id}/actionassociate_hostnova/api/openstack/compute/networks_associate.py:53 NetworkAssociateActionController._associate_host—removed (410)200410
115POST/os-networks/{id}/actiondisassociatenova/api/openstack/compute/networks.py:111 NetworkController._disassociate_host_and_project—removed (410)200410
116POST/os-networks/{id}/actiondisassociate_hostnova/api/openstack/compute/networks_associate.py:37 NetworkAssociateActionController._disassociate_host_only—removed (410)200410
117POST/os-networks/{id}/actiondisassociate_projectnova/api/openstack/compute/networks_associate.py:45 NetworkAssociateActionController._disassociate_project_only—removed (410)200410
118GET/os-quota-class-sets/{id}nova/api/openstack/compute/quota_classes.py:95 QuotaClassSetsController.showos_compute_api:os-quota-class-sets:showall200—
119PUT/os-quota-class-sets/{id}nova/api/openstack/compute/quota_classes.py:116 QuotaClassSetsController.updateos_compute_api:os-quota-class-sets:updateall200400
120GET/os-quota-sets/{id}nova/api/openstack/compute/quota_sets.py:123 QuotaSetsController.showos_compute_api:os-quota-sets:showall200400
121PUT/os-quota-sets/{id}nova/api/openstack/compute/quota_sets.py:163 QuotaSetsController.updateos_compute_api:os-quota-sets:updateall200400
122DELETE/os-quota-sets/{id}nova/api/openstack/compute/quota_sets.py:244 QuotaSetsController.deleteos_compute_api:os-quota-sets:deleteall202—
123GET/os-quota-sets/{id}/detailnova/api/openstack/compute/quota_sets.py:142 QuotaSetsController.detailos_compute_api:os-quota-sets:detailall200400
124GET/os-quota-sets/{id}/defaultsnova/api/openstack/compute/quota_sets.py:226 QuotaSetsController.defaultsos_compute_api:os-quota-sets:defaults2.0–max200400
125GET/os-security-group-default-rulesnova/api/openstack/compute/security_group_default_rules.py:57 SecurityGroupDefaultRulesController.index—removed (410)200410
126POST/os-security-group-default-rulesnova/api/openstack/compute/security_group_default_rules.py:37 SecurityGroupDefaultRulesController.create—removed (410)200410
127GET/os-security-group-default-rules/{id}nova/api/openstack/compute/security_group_default_rules.py:44 SecurityGroupDefaultRulesController.show—removed (410)200410
128DELETE/os-security-group-default-rules/{id}nova/api/openstack/compute/security_group_default_rules.py:50 SecurityGroupDefaultRulesController.delete—removed (410)200410
129POST/os-security-group-rulesnova/api/openstack/compute/security_groups.py:269 SecurityGroupRulesController.createos_compute_api:os-security-groups:rule:create2.1–2.35200400, 403, 404
130DELETE/os-security-group-rules/{id}nova/api/openstack/compute/security_groups.py:343 SecurityGroupRulesController.deleteos_compute_api:os-security-groups:rule:delete2.1–2.35202400, 404, 409
131GET/os-security-groupsnova/api/openstack/compute/security_groups.py:182 SecurityGroupController.indexos_compute_api:os-security-groups:get2.1–2.35200404
132POST/os-security-groupsnova/api/openstack/compute/security_groups.py:207 SecurityGroupController.createos_compute_api:os-security-groups:create2.1–2.35200400, 403
133GET/os-security-groups/{id}nova/api/openstack/compute/security_groups.py:142 SecurityGroupController.showos_compute_api:os-security-groups:show2.1–2.35200400, 404
134PUT/os-security-groups/{id}nova/api/openstack/compute/security_groups.py:231 SecurityGroupController.updateos_compute_api:os-security-groups:update2.1–2.35200400, 404
135DELETE/os-security-groups/{id}nova/api/openstack/compute/security_groups.py:163 SecurityGroupController.deleteos_compute_api:os-security-groups:delete2.1–2.35202400, 404
136POST/os-server-external-eventsnova/api/openstack/compute/server_external_events.py:80 ServerExternalEventsController.createos_compute_api:os-server-external-events:createall200403
137GET/os-server-groupsnova/api/openstack/compute/server_groups.py:175 ServerGroupController.indexos_compute_api:os-server-groups:index
os_compute_api:os-server-groups:index:all_projects
all200—
138POST/os-server-groupsnova/api/openstack/compute/server_groups.py:216 ServerGroupController.createos_compute_api:os-server-groups:createall200400, 403, 409
139GET/os-server-groups/{id}nova/api/openstack/compute/server_groups.py:140 ServerGroupController.showos_compute_api:os-server-groups:showall200404
140DELETE/os-server-groups/{id}nova/api/openstack/compute/server_groups.py:154 ServerGroupController.deleteos_compute_api:os-server-groups:deleteall204404
141GET/os-servicesnova/api/openstack/compute/services.py:378 ServiceController.indexos_compute_api:os-services:listall200—
142PUT/os-services/{id}nova/api/openstack/compute/services.py:399 ServiceController.updateos_compute_api:os-services:updateall200400, 404
143DELETE/os-services/{id}nova/api/openstack/compute/services.py:245 ServiceController.deleteos_compute_api:os-services:deleteall204400, 404, 409
144GET/os-simple-tenant-usagenova/api/openstack/compute/simple_tenant_usage.py:271 SimpleTenantUsageController.indexos_compute_api:os-simple-tenant-usage:listall200400
145GET/os-simple-tenant-usage/{id}nova/api/openstack/compute/simple_tenant_usage.py:320 SimpleTenantUsageController.showos_compute_api:os-simple-tenant-usage:showall200400
146GET/os-snapshotsnova/api/openstack/compute/snapshots.py:98 SnapshotController.indexos_compute_api:os-volumes:snapshots:list2.1–2.35200—
147POST/os-snapshotsnova/api/openstack/compute/snapshots.py:131 SnapshotController.createos_compute_api:os-volumes:snapshots:create2.1–2.35200400, 403
148GET/os-snapshots/detailnova/api/openstack/compute/snapshots.py:110 SnapshotController.detailos_compute_api:os-volumes:snapshots:detail2.1–2.35200—
149GET/os-snapshots/{id}nova/api/openstack/compute/snapshots.py:64 SnapshotController.showos_compute_api:os-volumes:snapshots:show2.1–2.35200404
150DELETE/os-snapshots/{id}nova/api/openstack/compute/snapshots.py:82 SnapshotController.deleteos_compute_api:os-volumes:snapshots:delete2.1–2.35202404
151GET/os-tenant-networksnova/api/openstack/compute/tenant_networks.py:81 TenantNetworkController.indexos_compute_api:os-tenant-networks:list2.1–2.35200—
152POST/os-tenant-networksnova/api/openstack/compute/tenant_networks.py:116 TenantNetworkController.create—removed (410)200410
153GET/os-tenant-networks/{id}nova/api/openstack/compute/tenant_networks.py:95 TenantNetworkController.showos_compute_api:os-tenant-networks:show2.1–2.35200404
154DELETE/os-tenant-networks/{id}nova/api/openstack/compute/tenant_networks.py:109 TenantNetworkController.delete—removed (410)200410
155GET/os-volumesnova/api/openstack/compute/volumes.py:140 VolumeController.indexos_compute_api:os-volumes:list2.1–2.35200—
156POST/os-volumesnova/api/openstack/compute/volumes.py:173 VolumeController.createos_compute_api:os-volumes:create2.1–2.35200400, 403, 404
157GET/os-volumes/detailnova/api/openstack/compute/volumes.py:152 VolumeController.detailos_compute_api:os-volumes:detail2.1–2.35200—
158GET/os-volumes/{id}nova/api/openstack/compute/volumes.py:104 VolumeController.showos_compute_api:os-volumes:show2.1–2.35200404
159DELETE/os-volumes/{id}nova/api/openstack/compute/volumes.py:122 VolumeController.deleteos_compute_api:os-volumes:delete2.1–2.35202400, 404
160GET/os-volumes_bootnova/api/openstack/compute/volumes_boot.py:31 VolumesBootController.index—2.1–2.102200400, 403
161POST/os-volumes_bootnova/api/openstack/compute/volumes_boot.py:98 VolumesBootController.create—2.1–2.102202400, 403, 409
162GET/os-volumes_boot/detailnova/api/openstack/compute/volumes_boot.py:55 VolumesBootController.detail—2.1–2.102200400, 403
163GET/os-volumes_boot/{id}nova/api/openstack/compute/volumes_boot.py:77 VolumesBootController.show—2.1–2.102200404
164PUT/os-volumes_boot/{id}nova/api/openstack/compute/volumes_boot.py:127 VolumesBootController.update—2.1–2.102200404
165DELETE/os-volumes_boot/{id}nova/api/openstack/compute/volumes_boot.py:105 VolumesBootController.delete—2.1–2.102204404, 409
166POST/os-volumes_boot/{id}/actionconfirmResizenova/api/openstack/compute/volumes_boot.py:136 VolumesBootController._confirm_resize—2.1–2.102204400, 404, 409
167POST/os-volumes_boot/{id}/actioncreateImagenova/api/openstack/compute/volumes_boot.py:203 VolumesBootController._create_image—2.1–2.102202400, 403, 404, 409
168POST/os-volumes_boot/{id}/actionos-startnova/api/openstack/compute/volumes_boot.py:212 VolumesBootController._start—2.1–2.102202404, 409
169POST/os-volumes_boot/{id}/actionos-stopnova/api/openstack/compute/volumes_boot.py:221 VolumesBootController._stop—2.1–2.102202404, 409
170POST/os-volumes_boot/{id}/actionrebootnova/api/openstack/compute/volumes_boot.py:154 VolumesBootController._reboot—2.1–2.102202404, 409
171POST/os-volumes_boot/{id}/actionrebuildnova/api/openstack/compute/volumes_boot.py:192 VolumesBootController._rebuild—2.1–2.102202400, 403, 404, 409
172POST/os-volumes_boot/{id}/actionresizenova/api/openstack/compute/volumes_boot.py:163 VolumesBootController._resize—2.1–2.102202400, 401, 403, 404, 409
173POST/os-volumes_boot/{id}/actionrevertResizenova/api/openstack/compute/volumes_boot.py:145 VolumesBootController._revert_resize—2.1–2.102202400, 404, 409
174POST/os-volumes_boot/{id}/actiontrigger_crash_dumpnova/api/openstack/compute/volumes_boot.py:230 VolumesBootController._trigger_crash_dump—2.17–2.102202400, 404, 409
175GET/serversnova/api/openstack/compute/servers.py:128 ServersController.indexos_compute_api:servers:index
os_compute_api:servers:index:get_all_tenants
os_compute_api:servers:allow_all_filters
all200400, 403
176POST/serversnova/api/openstack/compute/servers.py:717 ServersController.createos_compute_api:servers:create
os_compute_api:servers:create:forced_host
compute:servers:create:requested_destination
os_compute_api:servers:create:attach_volume
os_compute_api:servers:create:attach_network
os_compute_api:servers:create:trusted_certs
os_compute_api:servers:create:zero_disk_flavor
network:attach_external_network
all202400, 403, 409
177GET/servers/detailnova/api/openstack/compute/servers.py:158 ServersController.detailos_compute_api:os-extended-server-attributes
os_compute_api:servers:detail
os_compute_api:servers:detail:get_all_tenants
os_compute_api:servers:allow_all_filters
os_compute_api:servers:show:flavor-extra-specs
os_compute_api:servers:show:host_status
os_compute_api:servers:show:host_status:unknown-only
all200400, 403
178GET/servers/{id}nova/api/openstack/compute/servers.py:498 ServersController.showos_compute_api:os-extended-server-attributes
os_compute_api:servers:show
os_compute_api:servers:show:flavor-extra-specs
os_compute_api:servers:show:host_status
os_compute_api:servers:show:host_status:unknown-only
all200404
179PUT/servers/{id}nova/api/openstack/compute/servers.py:978 ServersController.updateos_compute_api:os-extended-server-attributes
os_compute_api:servers:show:flavor-extra-specs
os_compute_api:servers:show:host_status
os_compute_api:servers:show:host_status:unknown-only
os_compute_api:servers:update
all200404, 409
180DELETE/servers/{id}nova/api/openstack/compute/servers.py:928 ServersController.deleteos_compute_api:servers:deleteall204404, 409
181POST/servers/{id}/actionaddFixedIpnova/api/openstack/compute/multinic.py:43 MultinicController._add_fixed_ipos_compute_api:os-multinic:add2.1–2.43202400, 404
182POST/servers/{id}/actionaddFloatingIpnova/api/openstack/compute/floating_ips.py:200 FloatingIPActionController._add_floating_ipos_compute_api:os-floating-ips:add2.1–2.43200400, 403, 404
183POST/servers/{id}/actionaddSecurityGroupnova/api/openstack/compute/security_groups.py:429 SecurityGroupActionController._addSecurityGroupos_compute_api:os-security-groups:addall202400, 404, 409
184POST/servers/{id}/actionchangePasswordnova/api/openstack/compute/admin_password.py:42 AdminPasswordController.change_passwordos_compute_api:os-admin-passwordall202404, 409, 501
185POST/servers/{id}/actionconfirmResizenova/api/openstack/compute/servers.py:1086 ServersController._confirm_resizeos_compute_api:servers:confirm_resizeall204400, 404, 409
186POST/servers/{id}/actioncreateBackupnova/api/openstack/compute/create_backup.py:45 CreateBackupController._create_backupos_compute_api:os-create-backupall202400, 403, 404, 409
187POST/servers/{id}/actioncreateImagenova/api/openstack/compute/servers.py:1432 ServersController._create_imageos_compute_api:servers:create_image
os_compute_api:servers:create_image:allow_volume_backed
all202400, 403, 404, 409
188POST/servers/{id}/actionevacuatenova/api/openstack/compute/evacuate.py:91 EvacuateController._evacuateos_compute_api:os-evacuateall200400, 403, 404, 409
189POST/servers/{id}/actionforceDeletenova/api/openstack/compute/deferred_delete.py:59 DeferredDeleteController._force_deleteos_compute_api:os-deferred-delete:forceall202404, 409
190POST/servers/{id}/actioninjectNetworkInfonova/api/openstack/compute/admin_actions.py:55 AdminActionsController._inject_network_infoos_compute_api:os-admin-actions:inject_network_infoall202404, 409
191POST/servers/{id}/actionlocknova/api/openstack/compute/lock_server.py:37 LockServerController._lockos_compute_api:os-lock-server:lockall202404
192POST/servers/{id}/actionmigratenova/api/openstack/compute/migrate_server.py:45 MigrateServerController._migrateos_compute_api:os-migrate-server:migrate
os_compute_api:os-migrate-server:migrate:host
all202400, 403, 404, 409
193POST/servers/{id}/actionos-getConsoleOutputnova/api/openstack/compute/console_output.py:40 ConsoleOutputController.get_console_outputos_compute_api:os-console-outputall200404, 409, 501
194POST/servers/{id}/actionos-getRDPConsolenova/api/openstack/compute/remote_consoles.py:108 RemoteConsolesController.get_rdp_console—removed (410)200410
195POST/servers/{id}/actionos-getSPICEConsolenova/api/openstack/compute/remote_consoles.py:78 RemoteConsolesController.get_spice_consoleos_compute_api:os-remote-consoles2.1–2.5200400, 404, 409, 501
196POST/servers/{id}/actionos-getSerialConsolenova/api/openstack/compute/remote_consoles.py:119 RemoteConsolesController.get_serial_consoleos_compute_api:os-remote-consoles2.1–2.5200400, 404, 409, 501
197POST/servers/{id}/actionos-getVNCConsolenova/api/openstack/compute/remote_consoles.py:46 RemoteConsolesController.get_vnc_consoleos_compute_api:os-remote-consoles2.1–2.5200400, 404, 409, 501
198POST/servers/{id}/actionos-migrateLivenova/api/openstack/compute/migrate_server.py:101 MigrateServerController._migrate_liveos_compute_api:os-migrate-server:migrate_live
os_compute_api:os-migrate-server:migrate_live:host
all202400, 403, 404, 409
199POST/servers/{id}/actionos-resetStatenova/api/openstack/compute/admin_actions.py:71 AdminActionsController._reset_stateos_compute_api:os-admin-actions:reset_stateall202404
200POST/servers/{id}/actionos-startnova/api/openstack/compute/servers.py:1541 ServersController._startos_compute_api:servers:startall202404, 409
201POST/servers/{id}/actionos-stopnova/api/openstack/compute/servers.py:1561 ServersController._stopos_compute_api:servers:stopall202404, 409
202POST/servers/{id}/actionpausenova/api/openstack/compute/pause_server.py:38 PauseServerController._pauseos_compute_api:os-pause-server:pauseall202404, 409, 501
203POST/servers/{id}/actionrebootnova/api/openstack/compute/servers.py:1134 ServersController._rebootos_compute_api:servers:rebootall202404, 409
204POST/servers/{id}/actionrebuildnova/api/openstack/compute/servers.py:1264 ServersController._rebuildos_compute_api:os-extended-server-attributes
os_compute_api:servers:show:flavor-extra-specs
os_compute_api:servers:show:host_status
os_compute_api:servers:show:host_status:unknown-only
os_compute_api:servers:rebuild
os_compute_api:servers:rebuild:trusted_certs
all202400, 403, 404, 409
205POST/servers/{id}/actionremoveFixedIpnova/api/openstack/compute/multinic.py:62 MultinicController._remove_fixed_ipos_compute_api:os-multinic:remove2.1–2.43202400, 404
206POST/servers/{id}/actionremoveFloatingIpnova/api/openstack/compute/floating_ips.py:281 FloatingIPActionController._remove_floating_ipos_compute_api:os-floating-ips:remove2.1–2.43200400, 403, 404, 409
207POST/servers/{id}/actionremoveSecurityGroupnova/api/openstack/compute/security_groups.py:453 SecurityGroupActionController._removeSecurityGroupos_compute_api:os-security-groups:removeall202400, 404, 409
208POST/servers/{id}/actionrescuenova/api/openstack/compute/rescue.py:46 RescueController._rescueos_compute_api:os-rescueall200400, 404, 409, 501
209POST/servers/{id}/actionresetNetworknova/api/openstack/compute/admin_actions.py:46 AdminActionsController._reset_network—removed (410)200410
210POST/servers/{id}/actionresizenova/api/openstack/compute/servers.py:1154 ServersController._resizeos_compute_api:servers:resize
compute:servers:resize:cross_cell
all202400, 401, 403, 404, 409
211POST/servers/{id}/actionrestorenova/api/openstack/compute/deferred_delete.py:40 DeferredDeleteController._restoreos_compute_api:os-deferred-delete:restoreall202403, 404, 409
212POST/servers/{id}/actionresumenova/api/openstack/compute/suspend_server.py:63 SuspendServerController._resumeos_compute_api:os-suspend-server:resumeall202404, 409
213POST/servers/{id}/actionrevertResizenova/api/openstack/compute/servers.py:1110 ServersController._revert_resizeos_compute_api:servers:revert_resizeall202400, 404, 409
214POST/servers/{id}/actionshelvenova/api/openstack/compute/shelve.py:43 ShelveController._shelveos_compute_api:os-shelve:shelveall202404, 403, 409, 400
215POST/servers/{id}/actionshelveOffloadnova/api/openstack/compute/shelve.py:73 ShelveController._shelve_offloados_compute_api:os-shelve:shelve_offloadall202400, 404, 409
216POST/servers/{id}/actionsuspendnova/api/openstack/compute/suspend_server.py:37 SuspendServerController._suspendos_compute_api:os-suspend-server:suspendall202403, 404, 409, 400
217POST/servers/{id}/actiontrigger_crash_dumpnova/api/openstack/compute/servers.py:1583 ServersController._trigger_crash_dumpos_compute_api:servers:trigger_crash_dump2.17–max202400, 404, 409
218POST/servers/{id}/actionunlocknova/api/openstack/compute/lock_server.py:57 LockServerController._unlockos_compute_api:os-lock-server:unlock
os_compute_api:os-lock-server:unlock:unlock_override
all202404
219POST/servers/{id}/actionunpausenova/api/openstack/compute/pause_server.py:62 PauseServerController._unpauseos_compute_api:os-pause-server:unpauseall202404, 409, 501
220POST/servers/{id}/actionunrescuenova/api/openstack/compute/rescue.py:92 RescueController._unrescueos_compute_api:os-unrescueall202404, 409, 501
221POST/servers/{id}/actionunshelvenova/api/openstack/compute/shelve.py:106 ShelveController._unshelveos_compute_api:os-shelve:unshelve
os_compute_api:os-shelve:unshelve_to_host
all202400, 403, 404, 409
222GET/servers/{server_id}/consolesnova/api/openstack/compute/consoles.py:41 ConsolesController.index—removed (410)200410
223POST/servers/{server_id}/consolesnova/api/openstack/compute/consoles.py:48 ConsolesController.create—removed (410)200410
224GET/servers/{server_id}/consoles/{id}nova/api/openstack/compute/consoles.py:55 ConsolesController.show—removed (410)200410
225DELETE/servers/{server_id}/consoles/{id}nova/api/openstack/compute/consoles.py:61 ConsolesController.delete—removed (410)200410
226GET/servers/{server_id}/diagnosticsnova/api/openstack/compute/server_diagnostics.py:42 ServerDiagnosticsController.indexos_compute_api:os-server-diagnosticsall200400, 404, 409, 501
227GET/servers/{server_id}/ipsnova/api/openstack/compute/ips.py:41 IPsController.indexos_compute_api:ips:indexall200404
228GET/servers/{server_id}/ips/{id}nova/api/openstack/compute/ips.py:53 IPsController.showos_compute_api:ips:showall200404
229GET/servers/{server_id}/metadatanova/api/openstack/compute/server_metadata.py:55 ServerMetadataController.indexos_compute_api:server-metadata:indexall200404
230POST/servers/{server_id}/metadatanova/api/openstack/compute/server_metadata.py:68 ServerMetadataController.createos_compute_api:server-metadata:createall200403, 404, 409
231PUT/servers/{server_id}/metadatanova/api/openstack/compute/server_metadata.py:104 ServerMetadataController.update_allos_compute_api:server-metadata:update_allall200403, 404, 409
232GET/servers/{server_id}/metadata/{id}nova/api/openstack/compute/server_metadata.py:133 ServerMetadataController.showos_compute_api:server-metadata:showall200404
233PUT/servers/{server_id}/metadata/{id}nova/api/openstack/compute/server_metadata.py:84 ServerMetadataController.updateos_compute_api:server-metadata:updateall200400, 403, 404, 409
234DELETE/servers/{server_id}/metadata/{id}nova/api/openstack/compute/server_metadata.py:150 ServerMetadataController.deleteos_compute_api:server-metadata:deleteall204404, 409
235GET/servers/{server_id}/migrationsnova/api/openstack/compute/server_migrations.py:127 ServerMigrationsController.indexos_compute_api:servers:migrations:index
os_compute_api:servers:migrations:index:host
2.23–max200404
236GET/servers/{server_id}/migrations/{id}nova/api/openstack/compute/server_migrations.py:157 ServerMigrationsController.showos_compute_api:servers:migrations:show2.23–max200404
237DELETE/servers/{server_id}/migrations/{id}nova/api/openstack/compute/server_migrations.py:197 ServerMigrationsController.deleteos_compute_api:servers:migrations:delete2.24–max202400, 404, 409
238POST/servers/{server_id}/migrations/{id}/actionforce_completenova/api/openstack/compute/server_migrations.py:100 ServerMigrationsController._force_completeos_compute_api:servers:migrations:force_complete2.22–max202400, 403, 404, 409
239GET/servers/{server_id}/os-instance-actionsnova/api/openstack/compute/instance_actions.py:89 InstanceActionsController.indexos_compute_api:os-instance-actions:listall200404 (2.1–2.57); 400, 404 (2.58–max)
240GET/servers/{server_id}/os-instance-actions/{id}nova/api/openstack/compute/instance_actions.py:149 InstanceActionsController.showos_compute_api:os-instance-actions:events:details
os_compute_api:os-instance-actions:events
os_compute_api:os-instance-actions:show
all200404
241GET/servers/{server_id}/os-interfacenova/api/openstack/compute/attach_interfaces.py:72 InterfaceAttachmentController.indexos_compute_api:os-attach-interfaces:listall200404, 501
242POST/servers/{server_id}/os-interfacenova/api/openstack/compute/attach_interfaces.py:149 InterfaceAttachmentController.createos_compute_api:os-attach-interfaces:create
network:attach_external_network
all200400, 403, 404, 409, 500, 501
243GET/servers/{server_id}/os-interface/{id}nova/api/openstack/compute/attach_interfaces.py:118 InterfaceAttachmentController.showos_compute_api:os-attach-interfaces:showall200403, 404
244DELETE/servers/{server_id}/os-interface/{id}nova/api/openstack/compute/attach_interfaces.py:219 InterfaceAttachmentController.deleteos_compute_api:os-attach-interfaces:deleteall202400, 404, 409, 501
245GET/servers/{server_id}/os-server-passwordnova/api/openstack/compute/server_password.py:39 ServerPasswordController.indexos_compute_api:os-server-password:showall200404
246DELETE/servers/{server_id}/os-server-passwordnova/api/openstack/compute/server_password.py:51 ServerPasswordController.clearos_compute_api:os-server-password:clearall204404
247GET/servers/{server_id}/os-virtual-interfacesnova/api/openstack/compute/virtual_interfaces.py:39 ServerVirtualInterfaceController.index—removed (410)200410
248GET/servers/{server_id}/os-volume_attachmentsnova/api/openstack/compute/volume_attachments.py:113 VolumeAttachmentController.indexos_compute_api:os-volumes-attachments:indexall200404
249POST/servers/{server_id}/os-volume_attachmentsnova/api/openstack/compute/volume_attachments.py:205 VolumeAttachmentController.createos_compute_api:os-volumes-attachments:createall200400, 403, 404, 409
250GET/servers/{server_id}/os-volume_attachments/{id}nova/api/openstack/compute/volume_attachments.py:153 VolumeAttachmentController.showos_compute_api:os-volumes-attachments:showall200404
251PUT/servers/{server_id}/os-volume_attachments/{id}nova/api/openstack/compute/volume_attachments.py:364 VolumeAttachmentController.updateos_compute_api:os-volumes-attachments:update
os_compute_api:os-volumes-attachments:swap
all202400, 404, 409
252DELETE/servers/{server_id}/os-volume_attachments/{id}nova/api/openstack/compute/volume_attachments.py:395 VolumeAttachmentController.deleteos_compute_api:os-volumes-attachments:deleteall202400, 403, 404, 409
253POST/servers/{server_id}/remote-consolesnova/api/openstack/compute/remote_consoles.py:153 RemoteConsolesController.createos_compute_api:os-remote-consoles2.6–max200400, 404, 409, 501
254GET/servers/{server_id}/os-security-groupsnova/api/openstack/compute/security_groups.py:372 ServerSecurityGroupController.indexos_compute_api:os-security-groups:listall200404
255GET/servers/{server_id}/sharesnova/api/openstack/compute/server_shares.py:79 ServerSharesController.indexos_compute_api:os-server-shares:index2.97–max200400, 403, 404
256POST/servers/{server_id}/sharesnova/api/openstack/compute/server_shares.py:100 ServerSharesController.createos_compute_api:os-server-shares:create2.97–max201400, 403, 404, 409
257GET/servers/{server_id}/shares/{id}nova/api/openstack/compute/server_shares.py:206 ServerSharesController.showos_compute_api:os-server-shares:show2.97–max200400, 403, 404
258DELETE/servers/{server_id}/shares/{id}nova/api/openstack/compute/server_shares.py:236 ServerSharesController.deleteos_compute_api:os-server-shares:delete2.97–max200400, 403, 404, 409
259GET/servers/{server_id}/tagsnova/api/openstack/compute/server_tags.py:90 ServerTagsController.indexos_compute_api:os-server-tags:index2.26–max200404
260PUT/servers/{server_id}/tagsnova/api/openstack/compute/server_tags.py:162 ServerTagsController.update_allos_compute_api:os-server-tags:update_all2.26–max200404, 409
261DELETE/servers/{server_id}/tagsnova/api/openstack/compute/server_tags.py:214 ServerTagsController.delete_allos_compute_api:os-server-tags:delete_all2.26–max204404, 409
262GET/servers/{server_id}/tags/{id}nova/api/openstack/compute/server_tags.py:69 ServerTagsController.showos_compute_api:os-server-tags:show2.26–max204404
263PUT/servers/{server_id}/tags/{id}nova/api/openstack/compute/server_tags.py:108 ServerTagsController.updateos_compute_api:os-server-tags:update2.26–max200400, 404, 409
264DELETE/servers/{server_id}/tags/{id}nova/api/openstack/compute/server_tags.py:188 ServerTagsController.deleteos_compute_api:os-server-tags:delete2.26–max204404, 409
265GET/servers/{server_id}/topologynova/api/openstack/compute/server_topology.py:34 ServerTopologyController.indexcompute:server:topology:index
compute:server:topology:host:index
2.78–max200404

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 in availability_zone, admin), compute:servers:create:requested_destination (host/hypervisor_hostname from 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 allow min_count instances (nova/compute/api.py:1441); when a server group is given in os:scheduler_hints.group, its member quota allows the new members (nova/compute/api.py:1570-1583).
  • Business rules:
    • min_count ≤ max_count, default min_count = 1 and max_count = min_count (nova/api/openstack/compute/servers.py:758-762); quotas may lower the number actually built down to min_count (nova/compute/api.py:1441).
    • availability_zone may carry zone:host:node to force a host (admin) (nova/compute/api.py:655 parse_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 by nova/compute/api.py:480 and nova/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_attach is 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+) and description (2.19+) are optional.
  • Flow:
    1. (synchronous, nova-api) schema validation per microversion, policies, parsing of networks/BDMs/hints (nova/api/openstack/compute/servers.py:717-861).
    2. (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).
    3. (synchronous) for each instance: a request_specs, a build_requests and an instance_mappings row (with cell_id NULL) 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).
    4. (synchronous) RPC cast schedule_and_build_instances to nova-conductor (nova/compute/api.py:1836), then 202 with the server id, links and adminPass (if [api]/enable_instance_password) and a Location header (nova/api/openstack/compute/servers.py:913-923). With return_reservation_id the response is only {"reservation_id": …}.
    5. (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_instance to the compute host. See 05-async-processing and 04-scenarios § 1.
    6. (asynchronous, nova-compute) ports bound in Neutron, volumes attached in Cinder, image fetched, guest spawned, waits for network-vif-plugged from Neutron, then vm_state=active.
  • Outcome: status: BUILD in the response; final ACTIVE, or ERROR with a fault (no valid host: instance lands in cell0 with vm_state=error). Clients poll GET /servers/{id} or consume instance.create.end notifications.
  • Errors: 400 (schema; >40 business exceptions converted at nova/api/openstack/compute/servers.py:835-911), 403 (quota OverQuota, 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 > 1 with 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_tenants for all_tenants; non-admin filters are restricted.
  • Business rules: changes-since/changes-before include recently deleted servers; otherwise deleted=False is forced (nova/api/openstack/compute/servers.py:234-258); listing vm_state=deleted requires admin (403, nova/api/openstack/compute/servers.py:280-285); ip/ip6 filters 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:3086 get_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 servers and servers_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): changes name, description (2.19+), hostname (2.90+) and, from 2.104, pinned_availability_zone (null unpins 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_instance saves the instance (nova/compute/api.py:3340). No state precondition.
  • Delete (nova/api/openstack/compute/servers.py:928): policy servers:delete. If [DEFAULT]/reclaim_instance_interval > 0 the server is soft-deleted (restorable with restore until 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):
    1. if a build_requests row still exists, it is deleted and the build is cancelled (nova/compute/api.py:2444, nova/compute/api.py:2484);
    2. otherwise vm_state is kept, task_state=deleting, an instance action delete is recorded, and if the compute service is up an RPC cast terminate_instance (nova/compute/api.py:2780) is sent;
    3. 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).
    4. 204 on success; 409 if locked, if Placement allocation deletion fails (AllocationDeleteFailed) or the state forbids it.

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:

GroupActionsWhat happens after the 202Final state
Poweros-start, os-stop, reboot (SOFT/HARD), trigger_crash_dumpcast to the compute host (start_instance, stop_instance, reboot_instance, trigger_crash_dump)ACTIVE / SHUTOFF
Pause / suspendpause, unpause, suspend, resumecast to the host; the driver freezes the guest or saves its memory to diskPAUSED / SUSPENDED / ACTIVE
Rescuerescue, unrescueboots the guest from a rescue image (rescue_image_ref, else the image's or the server's own image) with the original disk attachedRESCUE / ACTIVE
Locklock (locked_reason 2.73+), unlocksynchronous DB update only; a locked server rejects most actions for non-admins with 409 (nova/compute/api.py:247)—
Resize / migrateresize, migrate (cold), confirmResize, revertResizecast 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 migrationos-migrateLive (host, block_migration, force)cast live_migrate_instance to conductor (pre-checks + scheduling) → live_migration on the source; progress via /servers/{id}/migrationsMIGRATING then ACTIVE
Evacuateevacuate (admin)source host must be down; conductor rebuilds the server on another host (rebuild_instance with recreate=True)REBUILD then ACTIVE
Rebuildrebuild (new image, optional key_name, user_data, hostname, reimage_boot_volume 2.93+)conductor → rebuild_instance on the same host; root disk recreatedREBUILD then original state
Shelveshelve, 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 againSHELVED → SHELVED_OFFLOADED → ACTIVE
ImagecreateImage, 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
Adminos-resetState (state: active/error), injectNetworkInfo, forceDelete, restore, changePasswordresetState 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-getConsoleOutputRPC 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, removeSecurityGroupimplemented 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 in active, paused, stopped, resized, soft_deleted, shelved, shelved_offloaded with no task in progress (nova/compute/api.py:5210-5215). For a server that is not offloaded: RPC call attach_volume to the conductor (nova/compute/api.py:5263), which reserves the device name on the host (RPC call reserve_block_device_name, creating the BDM), creates the Cinder attachment (3.44) and casts attach_volume to 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+) and delete_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 update delete_on_termination.
  • Detach (DELETE, nova/api/openstack/compute/volume_attachments.py:395): Cinder begin_detaching, then cast detach_volume to 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_id or fixed_ips; allowed in active, paused, stopped with no task (nova/compute/api.py:5477-5486); RPC call attach_interface to 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): cast detach_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-extended 2.51+, power-update 2.76+, accelerator-request-bound 2.82+, volume-reimaged 2.93+) (nova/api/openstack/compute/schemas/server_external_events.py:29-71).
  • Actor: service user (os_compute_api:os-server-external-events:create, role service by default).
  • Flow (nova/api/openstack/compute/server_external_events.py:80): instances are looked up across cells; per event: unknown server → event code: 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-update events 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 waiting wait_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): policy affinity, anti-affinity, soft-affinity, soft-anti-affinity; from 2.64 a single policy plus rules.max_server_per_host for anti-affinity, only when all computes are at service version ≥ 33 (nova/api/openstack/compute/server_groups.py:78). Quota server_groups checked 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.group at 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.92 public_key is mandatory (server-side generation removed); type ssh or x509 (2.2+); admins may act for another user_id (2.10+). Quota key_pairs is 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): list nova-compute, nova-conductor, nova-scheduler records from every cell, with state computed by the servicegroup driver (heartbeat age vs [DEFAULT]/service_down_time). PUT (2.53+, by service UUID) enables/disables a compute (disabled_reason) or sets forced_down (fencing, used with evacuate) (nova/api/openstack/compute/services.py:399). Disabling also toggles the COMPUTE_STATUS_DISABLED trait 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): read compute_nodes of all cells; UUIDs as ids from 2.53; statistics and uptime removed after 2.87 (404). servers/search sub-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_host mirror 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). Setting availability_zone metadata defines AZs. POST /os-aggregates/{id}/images (2.81+) casts cache_images to 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_zone for 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.DbQuotaDriver limits 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). With nova.quota.UnifiedLimitsDriver, limits come from Keystone unified limits and PUT/DELETE are refused (400) (nova/api/openstack/compute/quota_sets.py:181).
  • Resources hidden by microversion: floating_ips, fixed_ips, security_groups, security_group_rules, networks disappear 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+) casts live_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

ResourceWhat it doesHandler
/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 drivenova/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 Neutronnova/api/openstack/compute/ips.py:41
/servers/{id}/os-server-passwordpassword set by the guest through the metadata API (instance_system_metadata), DELETE clears itnova/api/openstack/compute/server_password.py:39
/servers/{id}/diagnosticsRPC 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_extranova/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 refusednova/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 castnova/api/openstack/compute/server_shares.py:100
/servers/{id}/os-security-groupssecurity groups of the server's ports, read from Neutronnova/api/openstack/compute/security_groups.py:372
/os-assisted-volume-snapshotsservice-only callback from Cinder (NFS/GlusterFS drivers) to snapshot an attached file-based volume on the hostnova/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 cellsnova/api/openstack/compute/simple_tenant_usage.py:271
/os-instance_usage_audit_logstatus of the _instance_usage_audit periodic task (task_log)nova/api/openstack/compute/instance_usage_audit_log.py:41
/, /versions/{id}, /extensionsversion document (min/max microversion) and static extension listnova/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 keyHandlercompute.API methodPreconditions (decorators)task_state setInstance actionDownstream call
addFixedIpnova/api/openstack/compute/multinic.py:43nova/compute/api.py:4825 API.add_fixed_ipcheck_instance_lock——compute_rpcapi.add_fixed_ip_to_instance
addFloatingIpnova/api/openstack/compute/floating_ips.py:200network_api.associate_floating_ip————
addSecurityGroupnova/api/openstack/compute/security_groups.py:429—————
changePasswordnova/api/openstack/compute/admin_password.py:42nova/compute/api.py:4972 API.set_admin_passwordcheck_instance_lock
state(vm_state=[ACTIVE])
UPDATING_PASSWORDCHANGE_PASSWORDcompute_rpcapi.set_admin_password
confirmResizenova/api/openstack/compute/servers.py:1086nova/compute/api.py:4117 API.confirm_resizecheck_instance_lock
state(vm_state=[RESIZED])
—CONFIRM_RESIZEcompute_rpcapi.confirm_resize, compute_task_api.confirm_snapshot_based_resize
createBackupnova/api/openstack/compute/create_backup.py:45nova/compute/api.py:3406 API.backupstate(vm_state=[ACTIVE, STOPPED, PAUSED, SUSPENDED])IMAGE_BACKUPBACKUPcompute_rpcapi.backup_instance
createImagenova/api/openstack/compute/servers.py:1432nova/compute/api.py:3447 API.snapshot / nova/compute/api.py:3504 API.snapshot_volume_backedstate(vm_state=[ACTIVE, STOPPED, PAUSED, SUSPENDED])—CREATE_IMAGEcompute_rpcapi.quiesce_instance, compute_rpcapi.unquiesce_instance
evacuatenova/api/openstack/compute/evacuate.py:91nova/compute/api.py:5720 API.evacuateblock_shares_not_supported()
block_extended_resource_request
block_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)
REBUILDINGEVACUATEcompute_task_api.rebuild_instance
forceDeletenova/api/openstack/compute/deferred_delete.py:59nova/compute/api.py:2853 API.force_deletecheck_instance_lock
state(task_state=None, must_have_launched=False)
———
injectNetworkInfonova/api/openstack/compute/admin_actions.py:55nova/compute/api.py:5086 API.inject_network_infocheck_instance_lock——compute_rpcapi.inject_network_info
locknova/api/openstack/compute/lock_server.py:37nova/compute/api.py:5031 API.lock——LOCK—
migratenova/api/openstack/compute/migrate_server.py:45nova/compute/api.py:4295 API.resizeblock_extended_resource_request
block_port_accelerators()
block_accelerators()
check_instance_lock
state(vm_state=[ACTIVE, STOPPED])
check_instance_host(check_is_up=True)
RESIZE_PREPMIGRATE, RESIZEcompute_task_api.resize_instance
os-getConsoleOutputnova/api/openstack/compute/console_output.py:40nova/compute/api.py:5026 API.get_console_outputcheck_instance_host()——compute_rpcapi.get_console_output
os-getSPICEConsolenova/api/openstack/compute/remote_consoles.py:78nova/compute/api.py:5001 API.get_spice_consolecheck_instance_host()
reject_instance_state(task_state=[DELETING, MIGRATING])
——compute_rpcapi.get_spice_console
os-getSerialConsolenova/api/openstack/compute/remote_consoles.py:119nova/compute/api.py:5010 API.get_serial_consolecheck_instance_host()
reject_instance_state(task_state=[DELETING, MIGRATING])
——compute_rpcapi.get_serial_console
os-getVNCConsolenova/api/openstack/compute/remote_consoles.py:46nova/compute/api.py:4992 API.get_vnc_consolecheck_instance_host()
reject_instance_state(task_state=[DELETING, MIGRATING])
——compute_rpcapi.get_vnc_console
os-migrateLivenova/api/openstack/compute/migrate_server.py:101nova/compute/api.py:5587 API.live_migrateblock_shares_not_supported()
block_extended_resource_request
block_port_accelerators()
reject_vdpa_instances(instance_actions.LIVE_MIGRATION, until=MIN_COMPUTE_VDPA_HOTPLUG_LIVE_MIGRATION)
block_accelerators()
reject_legacy_vtpm_live_migration
reject_mem_enc_instances(instance_actions.LIVE_MIGRATION)
check_instance_lock
state(vm_state=[ACTIVE, PAUSED])
MIGRATINGLIVE_MIGRATIONcompute_task_api.live_migrate_instance
os-resetStatenova/api/openstack/compute/admin_actions.py:71—————
os-startnova/api/openstack/compute/servers.py:1541nova/compute/api.py:2880 API.startcheck_instance_lock
check_instance_host()
state(vm_state=[STOPPED])
POWERING_ONSTARTcompute_rpcapi.start_instance
os-stopnova/api/openstack/compute/servers.py:1561nova/compute/api.py:2873 API.stopcheck_instance_lock
check_instance_host()
state(vm_state=[ACTIVE, ERROR])
———
pausenova/api/openstack/compute/pause_server.py:38nova/compute/api.py:4838 API.pausecheck_instance_lock
state(vm_state=[ACTIVE])
PAUSINGPAUSEcompute_rpcapi.pause_instance
rebootnova/api/openstack/compute/servers.py:1134nova/compute/api.py:3644 API.rebootcheck_instance_lock———
rebuildnova/api/openstack/compute/servers.py:1264nova/compute/api.py:3689 API.rebuildblock_shares_not_supported()
reject_vtpm_instances(instance_actions.REBUILD)
block_accelerators(until_service=SUPPORT_ACCELERATOR_SERVICE_FOR_REBUILD)
check_instance_lock
state(vm_state=[ACTIVE, STOPPED, ERROR])
REBUILDINGREBUILDcompute_task_api.rebuild_instance
removeFixedIpnova/api/openstack/compute/multinic.py:62nova/compute/api.py:4831 API.remove_fixed_ipcheck_instance_lock——compute_rpcapi.remove_fixed_ip_from_instance
removeFloatingIpnova/api/openstack/compute/floating_ips.py:281network_api.get_floating_ip_by_address————
removeSecurityGroupnova/api/openstack/compute/security_groups.py:453—————
rescuenova/api/openstack/compute/rescue.py:46nova/compute/api.py:4897 API.rescuereject_vtpm_instances(instance_actions.RESCUE)
check_instance_lock
state(vm_state=[ACTIVE, STOPPED, ERROR])
RESCUINGRESCUEcompute_rpcapi.rescue_instance
resizenova/api/openstack/compute/servers.py:1154nova/compute/api.py:4295 API.resizeblock_extended_resource_request
block_port_accelerators()
block_accelerators()
check_instance_lock
state(vm_state=[ACTIVE, STOPPED])
check_instance_host(check_is_up=True)
RESIZE_PREPMIGRATE, RESIZEcompute_task_api.resize_instance
restorenova/api/openstack/compute/deferred_delete.py:40nova/compute/api.py:2820 API.restorecheck_instance_lock
state(vm_state=[SOFT_DELETED])
None, RESTORINGRESTOREcompute_rpcapi.restore_instance
resumenova/api/openstack/compute/suspend_server.py:63nova/compute/api.py:4886 API.resumecheck_instance_lock
reject_vdpa_instances(instance_actions.RESUME, until=MIN_COMPUTE_VDPA_HOTPLUG_LIVE_MIGRATION)
state(vm_state=[SUSPENDED])
RESUMINGRESUMEcompute_rpcapi.resume_instance
revertResizenova/api/openstack/compute/servers.py:1110nova/compute/api.py:4006 API.revert_resizecheck_instance_lock
state(vm_state=[RESIZED])
RESIZE_REVERTINGREVERT_RESIZEcompute_rpcapi.revert_resize, compute_task_api.revert_snapshot_based_resize
shelvenova/api/openstack/compute/shelve.py:43nova/compute/api.py:4558 API.shelveblock_shares_not_supported()
block_port_accelerators()
reject_vtpm_instances(instance_actions.SHELVE)
block_accelerators(until_service=54)
check_instance_lock
state(vm_state=[ACTIVE, STOPPED, PAUSED, SUSPENDED])
SHELVINGSHELVEcompute_rpcapi.shelve_instance, compute_rpcapi.shelve_offload_instance
shelveOffloadnova/api/openstack/compute/shelve.py:73nova/compute/api.py:4597 API.shelve_offloadblock_port_accelerators()
check_instance_lock
state(vm_state=[SHELVED])
SHELVING_OFFLOADINGSHELVE_OFFLOADcompute_rpcapi.shelve_offload_instance
suspendnova/api/openstack/compute/suspend_server.py:37nova/compute/api.py:4874 API.suspendblock_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_lock
state(vm_state=[ACTIVE])
SUSPENDINGSUSPENDcompute_rpcapi.suspend_instance
trigger_crash_dumpnova/api/openstack/compute/servers.py:1583nova/compute/api.py:2893 API.trigger_crash_dumpcheck_instance_lock
check_instance_host()
state(vm_state=ALLOW_TRIGGER_CRASH_DUMP)
—TRIGGER_CRASH_DUMPcompute_rpcapi.trigger_crash_dump
unlocknova/api/openstack/compute/lock_server.py:57nova/compute/api.py:5065 API.unlock——UNLOCK—
unpausenova/api/openstack/compute/pause_server.py:62nova/compute/api.py:4847 API.unpausecheck_instance_lock
state(vm_state=[PAUSED])
UNPAUSINGUNPAUSEcompute_rpcapi.unpause_instance
unrescuenova/api/openstack/compute/rescue.py:92nova/compute/api.py:4961 API.unrescuecheck_instance_lock
state(vm_state=[RESCUED])
UNRESCUINGUNRESCUEcompute_rpcapi.unrescue_instance
unshelvenova/api/openstack/compute/shelve.py:106nova/compute/api.py:4718 API.unshelveblock_extended_resource_request
check_instance_lock
state(vm_state=[SHELVED, SHELVED_OFFLOADED])
UNSHELVINGUNSHELVEcompute_task_api.unshelve_instance

Notes on rows the generator cannot resolve by itself:

  • reboot → _soft_reboot requires vm_state in ALLOW_SOFT_REBOOT (active) and no task; _hard_reboot accepts active, stopped, paused, suspended, error and 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 states rebooting / rebooting_hard, instance action reboot, cast reboot_instance.
  • os-stop → force_stop sets powering-off, records stop, casts stop_instance (nova/compute/api.py:2858-2867).
  • createImage (nova/api/openstack/compute/servers.py:1456-1463) → for an image-backed server compute.API.snapshot (nova/compute/api.py:3447) sets image_snapshot_pending and casts snapshot_instance; for a volume-backed server snapshot_volume_backed quiesces 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 carries image_id and the code stays 202.
  • os-resetState writes vm_state (active or error) and clears task_state directly (nova/api/openstack/compute/admin_actions.py:71-92); no RPC.
  • addSecurityGroup / removeSecurityGroup update 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, or error/failed; live migrations: accepted/queued → preparing → running → completed, or cancelled/failed/error. Read through /os-migrations and /servers/{id}/migrations.
  • Service: enabled/disabled (+ disabled_reason) set by the API; up/down computed from the heartbeat (nova/servicegroup/drivers/db.py); forced_down set by the API (2.11+).
  • Instance action events: start/finish with result Success/Error, written by the compute and conductor wrap_instance_event decorator (see 05).

7. Deprecated and removed families

FamilyPathsBehaviour 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-poolsproxied to Neutron up to 2.35, 404 after; network create/delete/associate → 410
Image proxy/images, /images/{id}/metadataproxied to Glance up to 2.35 (2.38 for metadata), 404 after
Volume proxy/os-volumes, /os-snapshotsproxied to Cinder up to 2.35, 404 after
Bare-metal proxy/os-baremetal-nodesproxied to Ironic up to 2.35; interface actions → 410
Hosts/os-hostsup 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)various410 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_boot alias (code only), and action keys documented under POST /servers/{server_id}/action with one rest_method per action. The detailed comparison is in _rewrite/rewrite-pack-index_stable-2026.2.md (part 5).
  • GET /os-hypervisors/detail declares no policy operations entry matching its path: the rule os_compute_api:os-hypervisors:list-detail documents /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 /flavors has 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 by X-Instance-ID, X-Tenant-ID and X-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-For when [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_expiration seconds (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.