diff --git a/api-ref/source/servers-actions.inc b/api-ref/source/servers-actions.inc index df10bd030b..e36c4a1680 100644 --- a/api-ref/source/servers-actions.inc +++ b/api-ref/source/servers-actions.inc @@ -647,6 +647,7 @@ Response - updated: updated - user_id: user_id - adminPass: adminPass_response + - pinned_availability_zone: pinned_availability_zone - progress: progress - locked: locked - description: server_description_resp @@ -689,6 +690,11 @@ Response .. literalinclude:: ../../doc/api_samples/servers/v2.98/server-action-rebuild-resp.json :language: javascript +**Example Rebuild Server (rebuild Action) (v2.96)** + +.. literalinclude:: ../../doc/api_samples/servers/v2.96/server-action-rebuild-resp.json + :language: javascript + **Example Rebuild Server (rebuild Action) (v2.75)** .. literalinclude:: ../../doc/api_samples/servers/v2.75/server-action-rebuild-resp.json diff --git a/api-ref/source/servers.inc b/api-ref/source/servers.inc index aa9cdfd881..ae2073ae5c 100644 --- a/api-ref/source/servers.inc +++ b/api-ref/source/servers.inc @@ -926,6 +926,7 @@ Response - fault.created: fault_created - fault.message: fault_message - fault.details: fault_details + - pinned_availability_zone: pinned_availability_zone - progress: progress - locked: locked - description: server_description_resp @@ -958,6 +959,11 @@ Response - host_status: host_status_update_rebuild - key_name: key_name_resp_update +**Example Update Server Details (2.96)** + +.. literalinclude:: ../../doc/api_samples/servers/v2.96/server-update-resp.json + :language: javascript + **Example Update Server (2.75)** .. literalinclude:: ../../doc/api_samples/servers/v2.75/server-update-resp.json diff --git a/doc/api_samples/servers/v2.96/server-action-rebuild-resp.json b/doc/api_samples/servers/v2.96/server-action-rebuild-resp.json new file mode 100644 index 0000000000..399c3c7dab --- /dev/null +++ b/doc/api_samples/servers/v2.96/server-action-rebuild-resp.json @@ -0,0 +1,81 @@ +{ + "server": { + "OS-DCF:diskConfig": "AUTO", + "OS-EXT-AZ:availability_zone": "us-west", + "OS-EXT-SRV-ATTR:hostname": "updated-hostname.example.com", + "OS-EXT-STS:power_state": 1, + "OS-EXT-STS:task_state": null, + "OS-EXT-STS:vm_state": "active", + "OS-SRV-USG:launched_at": "2025-02-27T01:27:30.210952", + "OS-SRV-USG:terminated_at": null, + "accessIPv4": "1.2.3.4", + "accessIPv6": "80fe::", + "addresses": { + "private": [ + { + "OS-EXT-IPS-MAC:mac_addr": "00:0c:29:0d:11:74", + "OS-EXT-IPS:type": "fixed", + "addr": "192.168.1.30", + "version": 4 + } + ] + }, + "adminPass": "seekr3t", + "config_drive": "", + "created": "2025-02-27T01:27:28Z", + "description": null, + "flavor": { + "disk": 1, + "ephemeral": 0, + "extra_specs": {}, + "original_name": "m1.tiny", + "ram": 512, + "swap": 0, + "vcpus": 1 + }, + "hostId": "2091634baaccdc4c5a1d57069c833e402921df696b7f970791b12ec6", + "id": "a7920f90-14be-4c71-a6f9-6182f5df17c2", + "image": { + "id": "70a599e0-31e7-49b7-b260-868f441e862b", + "links": [ + { + "href": "http://openstack.example.com/6f70656e737461636b20342065766572/images/70a599e0-31e7-49b7-b260-868f441e862b", + "rel": "bookmark" + } + ] + }, + "key_name": null, + "links": [ + { + "href": "http://openstack.example.com/v2.1/6f70656e737461636b20342065766572/servers/a7920f90-14be-4c71-a6f9-6182f5df17c2", + "rel": "self" + }, + { + "href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/a7920f90-14be-4c71-a6f9-6182f5df17c2", + "rel": "bookmark" + } + ], + "locked": false, + "locked_reason": null, + "metadata": { + "meta_var": "meta_val" + }, + "name": "foobar", + "os-extended-volumes:volumes_attached": [], + "pinned_availability_zone": "us-west", + "progress": 0, + "security_groups": [ + { + "name": "default" + } + ], + "server_groups": [], + "status": "ACTIVE", + "tags": [], + "tenant_id": "6f70656e737461636b20342065766572", + "trusted_image_certificates": null, + "updated": "2025-02-27T01:27:30Z", + "user_data": "ZWNobyAiaGVsbG8gd29ybGQi", + "user_id": "fake" + } +} diff --git a/doc/api_samples/servers/v2.96/server-action-rebuild.json b/doc/api_samples/servers/v2.96/server-action-rebuild.json new file mode 100644 index 0000000000..3bea3dd5e2 --- /dev/null +++ b/doc/api_samples/servers/v2.96/server-action-rebuild.json @@ -0,0 +1,15 @@ +{ + "rebuild" : { + "accessIPv4" : "1.2.3.4", + "accessIPv6" : "80fe::", + "OS-DCF:diskConfig": "AUTO", + "imageRef" : "70a599e0-31e7-49b7-b260-868f441e862b", + "name" : "foobar", + "adminPass" : "seekr3t", + "hostname": "updated-hostname.example.com", + "metadata" : { + "meta_var" : "meta_val" + }, + "user_data": "ZWNobyAiaGVsbG8gd29ybGQi" + } +} \ No newline at end of file diff --git a/doc/api_samples/servers/v2.96/server-update-req.json b/doc/api_samples/servers/v2.96/server-update-req.json new file mode 100644 index 0000000000..32bc2ddde6 --- /dev/null +++ b/doc/api_samples/servers/v2.96/server-update-req.json @@ -0,0 +1,8 @@ +{ + "server": { + "accessIPv4": "1.2.3.4", + "accessIPv6": "80fe::", + "OS-DCF:diskConfig": "AUTO", + "hostname": "new-server-hostname.example.com" + } +} \ No newline at end of file diff --git a/doc/api_samples/servers/v2.96/server-update-resp.json b/doc/api_samples/servers/v2.96/server-update-resp.json new file mode 100644 index 0000000000..58918af864 --- /dev/null +++ b/doc/api_samples/servers/v2.96/server-update-resp.json @@ -0,0 +1,79 @@ +{ + "server": { + "OS-DCF:diskConfig": "AUTO", + "OS-EXT-AZ:availability_zone": "us-west", + "OS-EXT-SRV-ATTR:hostname": "new-server-hostname.example.com", + "OS-EXT-STS:power_state": 1, + "OS-EXT-STS:task_state": null, + "OS-EXT-STS:vm_state": "active", + "OS-SRV-USG:launched_at": "2025-02-27T01:17:47.110181", + "OS-SRV-USG:terminated_at": null, + "accessIPv4": "1.2.3.4", + "accessIPv6": "80fe::", + "addresses": { + "private": [ + { + "OS-EXT-IPS-MAC:mac_addr": "00:0c:29:0d:11:74", + "OS-EXT-IPS:type": "fixed", + "addr": "192.168.1.30", + "version": 4 + } + ] + }, + "config_drive": "", + "created": "2025-02-27T01:17:46Z", + "description": null, + "flavor": { + "disk": 1, + "ephemeral": 0, + "extra_specs": {}, + "original_name": "m1.tiny", + "ram": 512, + "swap": 0, + "vcpus": 1 + }, + "hostId": "2091634baaccdc4c5a1d57069c833e402921df696b7f970791b12ec6", + "id": "374b76b3-d46b-48bc-b36e-6ab70b0ea217", + "image": { + "id": "70a599e0-31e7-49b7-b260-868f441e862b", + "links": [ + { + "href": "http://openstack.example.com/6f70656e737461636b20342065766572/images/70a599e0-31e7-49b7-b260-868f441e862b", + "rel": "bookmark" + } + ] + }, + "key_name": null, + "links": [ + { + "href": "http://openstack.example.com/v2.1/6f70656e737461636b20342065766572/servers/374b76b3-d46b-48bc-b36e-6ab70b0ea217", + "rel": "self" + }, + { + "href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/374b76b3-d46b-48bc-b36e-6ab70b0ea217", + "rel": "bookmark" + } + ], + "locked": false, + "locked_reason": null, + "metadata": { + "My Server Name": "Apache1" + }, + "name": "new-server-test", + "os-extended-volumes:volumes_attached": [], + "pinned_availability_zone": "us-west", + "progress": 0, + "security_groups": [ + { + "name": "default" + } + ], + "server_groups": [], + "status": "ACTIVE", + "tags": [], + "tenant_id": "6f70656e737461636b20342065766572", + "trusted_image_certificates": null, + "updated": "2025-02-27T01:17:47Z", + "user_id": "fake" + } +} diff --git a/nova/api/openstack/api_version_request.py b/nova/api/openstack/api_version_request.py index 8bbeb8306c..4864c60134 100644 --- a/nova/api/openstack/api_version_request.py +++ b/nova/api/openstack/api_version_request.py @@ -256,7 +256,8 @@ REST_API_VERSION_HISTORY = """REST API Version History: * 2.94 - Allow FQDN in server hostname. * 2.95 - Evacuate will now stop instance at destination. * 2.96 - Add support for returning pinned_availability_zone in - ``server show`` and ``server list --long`` responses. + ``server show``, ``server list --long``, ``server update``, and + ``server rebuild`` responses. * 2.97 - Adds new API ``GET /servers/{server_id}/shares`` which shows shares attachments of a given server. ``GET /servers/{server_id}/shares/{share_id} which gives details diff --git a/nova/api/openstack/compute/rest_api_version_history.rst b/nova/api/openstack/compute/rest_api_version_history.rst index e8d1f1f1fb..f86acf172d 100644 --- a/nova/api/openstack/compute/rest_api_version_history.rst +++ b/nova/api/openstack/compute/rest_api_version_history.rst @@ -1253,8 +1253,8 @@ behavior. 2.96 (Maximum in 2024.1 Caracal and 2024.2 Dalmatian) ----------------------------------------------------- -The ``server show`` and ``server list --long`` responses now include the -pinned availability zone as well. +The ``server show``, ``server list --long``, ``server update``, and +``server rebuild`` responses now include the pinned availability zone as well. .. _microversion 2.97: diff --git a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-action-rebuild-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-action-rebuild-resp.json.tpl new file mode 100644 index 0000000000..053fd6539f --- /dev/null +++ b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-action-rebuild-resp.json.tpl @@ -0,0 +1,81 @@ +{ + "server": { + "OS-DCF:diskConfig": "AUTO", + "OS-EXT-AZ:availability_zone": "us-west", + "OS-EXT-SRV-ATTR:hostname": "%(hostname)s", + "OS-EXT-STS:power_state": 1, + "OS-EXT-STS:task_state": null, + "OS-EXT-STS:vm_state": "active", + "OS-SRV-USG:launched_at": "%(strtime)s", + "OS-SRV-USG:terminated_at": null, + "accessIPv4": "1.2.3.4", + "accessIPv6": "80fe::", + "addresses": { + "private": [ + { + "OS-EXT-IPS-MAC:mac_addr": "00:0c:29:0d:11:74", + "OS-EXT-IPS:type": "fixed", + "addr": "192.168.1.30", + "version": 4 + } + ] + }, + "adminPass": "seekr3t", + "config_drive": "", + "created": "%(isotime)s", + "description": null, + "flavor": { + "disk": 1, + "ephemeral": 0, + "extra_specs": {}, + "original_name": "m1.tiny", + "ram": 512, + "swap": 0, + "vcpus": 1 + }, + "hostId": "2091634baaccdc4c5a1d57069c833e402921df696b7f970791b12ec6", + "id": "%(id)s", + "image": { + "id": "%(uuid)s", + "links": [ + { + "href": "%(compute_endpoint)s/images/%(uuid)s", + "rel": "bookmark" + } + ] + }, + "key_name": null, + "links": [ + { + "href": "%(versioned_compute_endpoint)s/servers/%(uuid)s", + "rel": "self" + }, + { + "href": "%(compute_endpoint)s/servers/%(id)s", + "rel": "bookmark" + } + ], + "locked": false, + "locked_reason": null, + "metadata": { + "meta_var": "meta_val" + }, + "name": "foobar", + "os-extended-volumes:volumes_attached": [], + "pinned_availability_zone": "us-west", + "progress": 0, + "security_groups": [ + { + "name": "default" + } + ], + "server_groups": [], + "status": "ACTIVE", + "tags": [], + "tenant_id": "6f70656e737461636b20342065766572", + "trusted_image_certificates": null, + "updated": "%(isotime)s", + "user_data": "ZWNobyAiaGVsbG8gd29ybGQi", + "user_id": "fake" + } +} diff --git a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-action-rebuild.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-action-rebuild.json.tpl new file mode 100644 index 0000000000..3becc83fba --- /dev/null +++ b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-action-rebuild.json.tpl @@ -0,0 +1,15 @@ +{ + "rebuild" : { + "accessIPv4" : "%(access_ip_v4)s", + "accessIPv6" : "%(access_ip_v6)s", + "OS-DCF:diskConfig": "AUTO", + "imageRef" : "%(uuid)s", + "name" : "%(name)s", + "adminPass" : "%(pass)s", + "hostname": "%(hostname)s", + "metadata" : { + "meta_var" : "meta_val" + }, + "user_data": "ZWNobyAiaGVsbG8gd29ybGQi" + } +} diff --git a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-create-req.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-create-req.json.tpl deleted file mode 100644 index 286c9ed4ae..0000000000 --- a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-create-req.json.tpl +++ /dev/null @@ -1,21 +0,0 @@ -{ - "server" : { - "accessIPv4": "%(access_ip_v4)s", - "accessIPv6": "%(access_ip_v6)s", - "name" : "new-server-test", - "imageRef" : "%(image_id)s", - "flavorRef" : "1", - "OS-DCF:diskConfig": "AUTO", - "metadata" : { - "My Server Name" : "Apache1" - }, - "security_groups": [ - { - "name": "default" - } - ], - "user_data" : "%(user_data)s", - "networks": "auto", - "hostname": "new-server-test" - } -} diff --git a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-create-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-create-resp.json.tpl deleted file mode 100644 index 4b30e0cfbd..0000000000 --- a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-create-resp.json.tpl +++ /dev/null @@ -1,22 +0,0 @@ -{ - "server": { - "OS-DCF:diskConfig": "AUTO", - "adminPass": "%(password)s", - "id": "%(id)s", - "links": [ - { - "href": "%(versioned_compute_endpoint)s/servers/%(uuid)s", - "rel": "self" - }, - { - "href": "%(compute_endpoint)s/servers/%(uuid)s", - "rel": "bookmark" - } - ], - "security_groups": [ - { - "name": "default" - } - ] - } -} diff --git a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-update-req.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-update-req.json.tpl new file mode 100644 index 0000000000..bc4be64a8e --- /dev/null +++ b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-update-req.json.tpl @@ -0,0 +1,8 @@ +{ + "server": { + "accessIPv4": "%(access_ip_v4)s", + "accessIPv6": "%(access_ip_v6)s", + "OS-DCF:diskConfig": "AUTO", + "hostname": "new-server-hostname.example.com" + } +} diff --git a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-update-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-update-resp.json.tpl new file mode 100644 index 0000000000..9a7292ddce --- /dev/null +++ b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-update-resp.json.tpl @@ -0,0 +1,79 @@ +{ + "server": { + "accessIPv4": "%(access_ip_v4)s", + "accessIPv6": "%(access_ip_v6)s", + "addresses": { + "private": [ + { + "addr": "%(ip)s", + "OS-EXT-IPS-MAC:mac_addr": "00:0c:29:0d:11:74", + "OS-EXT-IPS:type": "fixed", + "version": 4 + } + ] + }, + "created": "%(isotime)s", + "description": null, + "locked": false, + "locked_reason": null, + "flavor": { + "disk": 1, + "ephemeral": 0, + "extra_specs": {}, + "original_name": "m1.tiny", + "ram": 512, + "swap": 0, + "vcpus": 1 + }, + "hostId": "%(hostid)s", + "id": "%(id)s", + "image": { + "id": "%(uuid)s", + "links": [ + { + "href": "%(compute_endpoint)s/images/%(uuid)s", + "rel": "bookmark" + } + ] + }, + "key_name": null, + "links": [ + { + "href": "%(versioned_compute_endpoint)s/servers/%(uuid)s", + "rel": "self" + }, + { + "href": "%(compute_endpoint)s/servers/%(uuid)s", + "rel": "bookmark" + } + ], + "metadata": { + "My Server Name": "Apache1" + }, + "name": "new-server-test", + "config_drive": "", + "OS-DCF:diskConfig": "AUTO", + "OS-EXT-AZ:availability_zone": "us-west", + "OS-EXT-SRV-ATTR:hostname": "new-server-hostname.example.com", + "OS-EXT-STS:power_state": 1, + "OS-EXT-STS:task_state": null, + "OS-EXT-STS:vm_state": "active", + "os-extended-volumes:volumes_attached": [], + "OS-SRV-USG:launched_at": "%(strtime)s", + "OS-SRV-USG:terminated_at": null, + "pinned_availability_zone": "us-west", + "progress": 0, + "security_groups": [ + { + "name": "default" + } + ], + "server_groups": [], + "status": "ACTIVE", + "tags": [], + "tenant_id": "6f70656e737461636b20342065766572", + "trusted_image_certificates": null, + "updated": "%(isotime)s", + "user_id": "fake" + } +} diff --git a/nova/tests/functional/api_sample_tests/test_servers.py b/nova/tests/functional/api_sample_tests/test_servers.py index 2fc4fd925e..20c4a1b457 100644 --- a/nova/tests/functional/api_sample_tests/test_servers.py +++ b/nova/tests/functional/api_sample_tests/test_servers.py @@ -630,6 +630,40 @@ class ServersSampleJson296Test(ServersSampleJsonTest): scenarios = [('v2_96', {'api_major_version': 'v2.1'})] ADMIN_API = False + def test_server_rebuild(self): + uuid = self._post_server( + use_common_server_api_samples=self.use_common_server_post + ) + params = { + 'uuid': self.glance.auto_disk_config_enabled_image['id'], + 'name': 'foobar', + 'pass': 'seekr3t', + 'hostid': '[a-f0-9]+', + 'access_ip_v4': '1.2.3.4', + 'access_ip_v6': '80fe::', + 'hostname': 'updated-hostname.example.com', + } + + resp = self._do_post( + 'servers/%s/action' % uuid, + 'server-action-rebuild', + params, + ) + subs = params.copy() + del subs['uuid'] + self._verify_response('server-action-rebuild-resp', subs, resp, 202) + + def test_update_server(self): + uuid = self._post_server( + use_common_server_api_samples=self.use_common_server_post) + subs = {} + subs['hostid'] = '[a-f0-9]+' + subs['access_ip_v4'] = '1.2.3.4' + subs['access_ip_v6'] = '80fe::' + response = self._do_put('servers/%s' % uuid, + 'server-update-req', subs) + self._verify_response('server-update-resp', subs, response, 200) + class ServerSampleJson298Test(ServersSampleJsonTest): microversion = '2.98' diff --git a/releasenotes/notes/microversion-2-96-ca56e1e5a4ee4e02.yaml b/releasenotes/notes/microversion-2-96-ca56e1e5a4ee4e02.yaml index 4758e3620d..6b3faa3294 100644 --- a/releasenotes/notes/microversion-2-96-ca56e1e5a4ee4e02.yaml +++ b/releasenotes/notes/microversion-2-96-ca56e1e5a4ee4e02.yaml @@ -2,6 +2,6 @@ features: - | The 2.96 microversion has been added. This microversion adds - pinned_availability_zone in `server show` and `server list --long` - responses. + pinned_availability_zone in `server show`, `server list --long`, + `server update`, and `server rebuild` responses.