From 43cc313b0beabaddf3c7210f22fea9532b134f4a Mon Sep 17 00:00:00 2001 From: Amit Uniyal Date: Fri, 17 May 2024 02:04:34 -0400 Subject: [PATCH] Adds validation schema for compute - Adds user_id and project_id in list migrations for v2.80 - Adds attachment_id and bdm_uuid in volume attachment for v2.89 - Removes id from volume attachment list and show - Update a microversion condition to call evacuate API. Change-Id: I3a2fbcfad992799f7c7aec97bb18edf647cefa1c --- .../response/compute/v2_80/__init__.py | 0 .../response/compute/v2_80/migrations.py | 40 +++++++++ .../response/compute/v2_89/__init__.py | 0 .../response/compute/v2_89/servers.py | 84 +++++++++++++++++++ .../lib/services/compute/migrations_client.py | 5 +- .../lib/services/compute/servers_client.py | 10 ++- 6 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 tempest/lib/api_schema/response/compute/v2_80/__init__.py create mode 100644 tempest/lib/api_schema/response/compute/v2_80/migrations.py create mode 100644 tempest/lib/api_schema/response/compute/v2_89/__init__.py create mode 100644 tempest/lib/api_schema/response/compute/v2_89/servers.py diff --git a/tempest/lib/api_schema/response/compute/v2_80/__init__.py b/tempest/lib/api_schema/response/compute/v2_80/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tempest/lib/api_schema/response/compute/v2_80/migrations.py b/tempest/lib/api_schema/response/compute/v2_80/migrations.py new file mode 100644 index 0000000000..f2fa008051 --- /dev/null +++ b/tempest/lib/api_schema/response/compute/v2_80/migrations.py @@ -0,0 +1,40 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import copy + +from tempest.lib.api_schema.response.compute.v2_59 import migrations + +########################################################################### +# +# 2.80: +# +# The user_id and project_id value is now returned in the response body in +# addition to the migration id for the following API responses: +# +# - GET /os-migrations +# +########################################################################### + +user_id = {'type': 'string'} +project_id = {'type': 'string'} + +list_migrations = copy.deepcopy(migrations.list_migrations) + +list_migrations['response_body']['properties']['migrations']['items'][ + 'properties'].update({ + 'user_id': user_id, + 'project_id': project_id + }) + +list_migrations['response_body']['properties']['migrations']['items'][ + 'required'].extend(['user_id', 'project_id']) diff --git a/tempest/lib/api_schema/response/compute/v2_89/__init__.py b/tempest/lib/api_schema/response/compute/v2_89/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tempest/lib/api_schema/response/compute/v2_89/servers.py b/tempest/lib/api_schema/response/compute/v2_89/servers.py new file mode 100644 index 0000000000..debf0dcc57 --- /dev/null +++ b/tempest/lib/api_schema/response/compute/v2_89/servers.py @@ -0,0 +1,84 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import copy + +from tempest.lib.api_schema.response.compute.v2_79 import servers as servers279 + + +########################################################################### +# +# 2.89: +# +# The attachment_id and bdm_uuid parameter is now returned in the response body +# of the following calls: +# +# - GET /servers/{server_id}/os-volume_attachments +# - GET /servers/{server_id}/os-volume_attachments/{volume_id} +# - POST /servers/{server_id}/os-volume_attachments +########################################################################### + +attach_volume = copy.deepcopy(servers279.attach_volume) + +show_volume_attachment = copy.deepcopy(servers279.show_volume_attachment) + +list_volume_attachments = copy.deepcopy(servers279.list_volume_attachments) + +# Remove properties +# 'id' is available unti v2.88 +show_volume_attachment['response_body']['properties'][ + 'volumeAttachment']['properties'].pop('id') +show_volume_attachment['response_body']['properties'][ + 'volumeAttachment']['required'].remove('id') +list_volume_attachments['response_body']['properties'][ + 'volumeAttachments']['items']['properties'].pop('id') +list_volume_attachments['response_body']['properties'][ + 'volumeAttachments']['items']['required'].remove('id') + + +# Add new properties +new_properties = { + 'attachment_id': {'type': 'string', 'format': 'uuid'}, + 'bdm_uuid': {'type': 'string', 'format': 'uuid'} +} + +show_volume_attachment['response_body']['properties'][ + 'volumeAttachment']['properties'].update(new_properties) +show_volume_attachment['response_body']['properties'][ + 'volumeAttachment']['required'].extend(new_properties.keys()) +list_volume_attachments['response_body']['properties'][ + 'volumeAttachments']['items']['properties'].update(new_properties) +list_volume_attachments['response_body']['properties'][ + 'volumeAttachments']['items']['required'].extend(new_properties.keys()) + + +# NOTE(zhufl): Below are the unchanged schema in this microversion. We +# need to keep this schema in this file to have the generic way to select the +# right schema based on self.schema_versions_info mapping in service client. +# ****** Schemas unchanged since microversion 2.75 *** +rebuild_server = copy.deepcopy(servers279.rebuild_server) +rebuild_server_with_admin_pass = copy.deepcopy( + servers279.rebuild_server_with_admin_pass) +update_server = copy.deepcopy(servers279.update_server) +get_server = copy.deepcopy(servers279.get_server) +list_servers_detail = copy.deepcopy(servers279.list_servers_detail) +list_servers = copy.deepcopy(servers279.list_servers) +show_server_diagnostics = copy.deepcopy(servers279.show_server_diagnostics) +get_remote_consoles = copy.deepcopy(servers279.get_remote_consoles) +list_tags = copy.deepcopy(servers279.list_tags) +update_all_tags = copy.deepcopy(servers279.update_all_tags) +delete_all_tags = copy.deepcopy(servers279.delete_all_tags) +check_tag_existence = copy.deepcopy(servers279.check_tag_existence) +update_tag = copy.deepcopy(servers279.update_tag) +delete_tag = copy.deepcopy(servers279.delete_tag) +show_instance_action = copy.deepcopy(servers279.show_instance_action) +create_backup = copy.deepcopy(servers279.create_backup) diff --git a/tempest/lib/services/compute/migrations_client.py b/tempest/lib/services/compute/migrations_client.py index 8a6e62a131..d43fe838c9 100644 --- a/tempest/lib/services/compute/migrations_client.py +++ b/tempest/lib/services/compute/migrations_client.py @@ -21,6 +21,8 @@ from tempest.lib.api_schema.response.compute.v2_23 import migrations \ as schemav223 from tempest.lib.api_schema.response.compute.v2_59 import migrations \ as schemav259 +from tempest.lib.api_schema.response.compute.v2_80 import migrations \ + as schemav280 from tempest.lib.common import rest_client from tempest.lib.services.compute import base_compute_client @@ -29,7 +31,8 @@ class MigrationsClient(base_compute_client.BaseComputeClient): schema_versions_info = [ {'min': None, 'max': '2.22', 'schema': schema}, {'min': '2.23', 'max': '2.58', 'schema': schemav223}, - {'min': '2.59', 'max': None, 'schema': schemav259}] + {'min': '2.59', 'max': '2.79', 'schema': schemav259}, + {'min': '2.80', 'max': None, 'schema': schemav280}] def list_migrations(self, **params): """List all migrations. diff --git a/tempest/lib/services/compute/servers_client.py b/tempest/lib/services/compute/servers_client.py index 7e3b99faf3..1b93f91abf 100644 --- a/tempest/lib/services/compute/servers_client.py +++ b/tempest/lib/services/compute/servers_client.py @@ -43,6 +43,7 @@ from tempest.lib.api_schema.response.compute.v2_73 import servers as schemav273 from tempest.lib.api_schema.response.compute.v2_75 import servers as schemav275 from tempest.lib.api_schema.response.compute.v2_79 import servers as schemav279 from tempest.lib.api_schema.response.compute.v2_8 import servers as schemav28 +from tempest.lib.api_schema.response.compute.v2_89 import servers as schemav289 from tempest.lib.api_schema.response.compute.v2_9 import servers as schemav29 from tempest.lib.common import rest_client from tempest.lib.services.compute import base_compute_client @@ -73,7 +74,8 @@ class ServersClient(base_compute_client.BaseComputeClient): {'min': '2.71', 'max': '2.72', 'schema': schemav271}, {'min': '2.73', 'max': '2.74', 'schema': schemav273}, {'min': '2.75', 'max': '2.78', 'schema': schemav275}, - {'min': '2.79', 'max': None, 'schema': schemav279}] + {'min': '2.79', 'max': '2.88', 'schema': schemav279}, + {'min': '2.89', 'max': None, 'schema': schemav289}] def __init__(self, auth_provider, service, region, enable_instance_password=True, **kwargs): @@ -896,7 +898,11 @@ class ServersClient(base_compute_client.BaseComputeClient): API reference: https://docs.openstack.org/api-ref/compute/#evacuate-server-evacuate-action """ - if self.enable_instance_password: + api_version = self.get_headers().get(self.api_microversion_header_name) + + if not api_version and self.enable_instance_password: + evacuate_schema = schema.evacuate_server_with_admin_pass + elif api_version < '2.14': evacuate_schema = schema.evacuate_server_with_admin_pass else: evacuate_schema = schema.evacuate_server