From f9e89bc0d1002d022d234ce0b616646e2e79c280 Mon Sep 17 00:00:00 2001 From: Ghanshyam Mann Date: Wed, 26 Feb 2025 18:02:55 -0800 Subject: [PATCH] Fix microversion 2.96 for update/rebuild APIs microversion 2.96 changed the GET and GET list details APi response to add a new field 'pinned_availability_zone' - https://review.opendev.org/c/openstack/nova/+/904568 but when we change the views/servers.py then update server and rebuild server API response also gets updated. - https://review.opendev.org/c/openstack/nova/+/904568/17/nova/api/openstack/compute/views/servers.py#309 The microversion change actually changed the response for the update and rebuild API but did not update the documentation about this change. Neither added test for rebuild and update which verify the response change. Since microversion 2.75, we have made all these 4 APIs response consistent. Change-Id: I31fbb3c5e689302713bfb7a254c5d0cc12de2dc4 --- api-ref/source/servers-actions.inc | 6 ++ api-ref/source/servers.inc | 6 ++ .../v2.96/server-action-rebuild-resp.json | 81 +++++++++++++++++++ .../servers/v2.96/server-action-rebuild.json | 15 ++++ .../servers/v2.96/server-update-req.json | 8 ++ .../servers/v2.96/server-update-resp.json | 79 ++++++++++++++++++ nova/api/openstack/api_version_request.py | 3 +- .../compute/rest_api_version_history.rst | 4 +- .../v2.96/server-action-rebuild-resp.json.tpl | 81 +++++++++++++++++++ .../v2.96/server-action-rebuild.json.tpl | 15 ++++ .../servers/v2.96/server-create-req.json.tpl | 21 ----- .../servers/v2.96/server-create-resp.json.tpl | 22 ----- .../servers/v2.96/server-update-req.json.tpl | 8 ++ .../servers/v2.96/server-update-resp.json.tpl | 79 ++++++++++++++++++ .../api_sample_tests/test_servers.py | 34 ++++++++ .../microversion-2-96-ca56e1e5a4ee4e02.yaml | 4 +- 16 files changed, 418 insertions(+), 48 deletions(-) create mode 100644 doc/api_samples/servers/v2.96/server-action-rebuild-resp.json create mode 100644 doc/api_samples/servers/v2.96/server-action-rebuild.json create mode 100644 doc/api_samples/servers/v2.96/server-update-req.json create mode 100644 doc/api_samples/servers/v2.96/server-update-resp.json create mode 100644 nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-action-rebuild-resp.json.tpl create mode 100644 nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-action-rebuild.json.tpl delete mode 100644 nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-create-req.json.tpl delete mode 100644 nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-create-resp.json.tpl create mode 100644 nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-update-req.json.tpl create mode 100644 nova/tests/functional/api_sample_tests/api_samples/servers/v2.96/server-update-resp.json.tpl diff --git a/api-ref/source/servers-actions.inc b/api-ref/source/servers-actions.inc index df10bd030bac..e36c4a16802f 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 aa9cdfd8812e..ae2073ae5c98 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 000000000000..399c3c7dab7d --- /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 000000000000..3bea3dd5e2f6 --- /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 000000000000..32bc2ddde6b7 --- /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 000000000000..58918af864f8 --- /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 8bbeb8306c48..4864c60134ff 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 e8d1f1f1fb26..f86acf172d1d 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 000000000000..053fd6539f32 --- /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 000000000000..3becc83fba6f --- /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 286c9ed4aed2..000000000000 --- 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 4b30e0cfbdb8..000000000000 --- 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 000000000000..bc4be64a8e67 --- /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 000000000000..9a7292ddcef6 --- /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 2fc4fd925ea3..20c4a1b457f2 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 4758e3620d3e..6b3faa329449 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.