From ed6d10235cdd41880a8f39d2e9126d9ba3b840be Mon Sep 17 00:00:00 2001 From: zhufl Date: Fri, 5 Jun 2020 16:04:49 +0800 Subject: [PATCH] Fix server group schema for compute microversion 2.64 For Compute microversion 2.64: 1. change policies to policy in: * GET /os-server-groups * POST /os-server-groups * GET /os-server-groups/{server_group_id} 2. add rules in: * GET /os-server-groups * POST /os-server-groups * GET /os-server-groups/{server_group_id} 3. remove metadata from: * GET /os-server-groups * POST /os-server-groups * GET /os-server-groups/{server_group_id} The testcases of create_server_group should also be modified. Co-authored-by: Ghanshyam Mann Change-Id: I8fc37415c968eb64380b8bd66b713aa6b733578f --- doc/source/microversion_testing.rst | 4 ++ tempest/api/compute/base.py | 14 ++++- .../api/compute/servers/test_server_group.py | 43 ++++++++++++-- .../response/compute/v2_64/__init__.py | 0 .../response/compute/v2_64/server_groups.py | 56 +++++++++++++++++++ .../services/compute/server_groups_client.py | 5 +- 6 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 tempest/lib/api_schema/response/compute/v2_64/__init__.py create mode 100644 tempest/lib/api_schema/response/compute/v2_64/server_groups.py diff --git a/doc/source/microversion_testing.rst b/doc/source/microversion_testing.rst index 2529c9e276..1480b1f310 100644 --- a/doc/source/microversion_testing.rst +++ b/doc/source/microversion_testing.rst @@ -418,6 +418,10 @@ Microversion tests implemented in Tempest .. _2.63: https://docs.openstack.org/nova/latest/reference/api-microversion-history.html#id58 + * `2.64`_ + + .. _2.64: https://docs.openstack.org/nova/latest/reference/api-microversion-history.html#id59 + * `2.70`_ .. _2.70: https://docs.openstack.org/nova/latest/reference/api-microversion-history.html#id64 diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py index ed5028276c..505d3d6761 100644 --- a/tempest/api/compute/base.py +++ b/tempest/api/compute/base.py @@ -306,10 +306,18 @@ class BaseV2ComputeTest(api_version_utils.BaseMicroversionTest, def create_test_server_group(cls, name="", policy=None): if not name: name = data_utils.rand_name(cls.__name__ + "-Server-Group") - if policy is None: - policy = ['affinity'] + if cls.is_requested_microversion_compatible('2.63'): + policy = policy or ['affinity'] + if not isinstance(policy, list): + policy = [policy] + kwargs = {'policies': policy} + else: + policy = policy or 'affinity' + if isinstance(policy, list): + policy = policy[0] + kwargs = {'policy': policy} body = cls.server_groups_client.create_server_group( - name=name, policies=policy)['server_group'] + name=name, **kwargs)['server_group'] cls.addClassResourceCleanup( test_utils.call_and_ignore_notfound_exc, cls.server_groups_client.delete_server_group, diff --git a/tempest/api/compute/servers/test_server_group.py b/tempest/api/compute/servers/test_server_group.py index 4c0d02193c..4811a7bf01 100644 --- a/tempest/api/compute/servers/test_server_group.py +++ b/tempest/api/compute/servers/test_server_group.py @@ -43,10 +43,22 @@ class ServerGroupTestJSON(base.BaseV2ComputeTest): super(ServerGroupTestJSON, cls).setup_clients() cls.client = cls.server_groups_client + @classmethod + def _set_policy(cls, policy): + if not cls.is_requested_microversion_compatible('2.63'): + return policy[0] + else: + return policy + @classmethod def resource_setup(cls): super(ServerGroupTestJSON, cls).resource_setup() - cls.policy = ['affinity'] + if cls.is_requested_microversion_compatible('2.63'): + cls.policy_field = 'policies' + cls.policy = ['affinity'] + else: + cls.policy_field = 'policy' + cls.policy = 'affinity' def setUp(self): super(ServerGroupTestJSON, self).setUp() @@ -61,9 +73,9 @@ class ServerGroupTestJSON(base.BaseV2ComputeTest): def _create_server_group(self, name, policy): # create the test server-group with given policy - server_group = {'name': name, 'policies': policy} + server_group = {'name': name, self.policy_field: policy} body = self.create_test_server_group(name, policy) - for key in ['name', 'policies']: + for key in ['name', self.policy_field]: self.assertEqual(server_group[key], body[key]) return body @@ -88,7 +100,7 @@ class ServerGroupTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('3645a102-372f-4140-afad-13698d850d23') def test_create_delete_server_group_with_anti_affinity_policy(self): """Test Create/Delete the server-group with anti-affinity policy""" - policy = ['anti-affinity'] + policy = self._set_policy(['anti-affinity']) self._create_delete_server_group(policy) @decorators.idempotent_id('154dc5a4-a2fe-44b5-b99e-f15806a4a113') @@ -99,7 +111,7 @@ class ServerGroupTestJSON(base.BaseV2ComputeTest): for _ in range(0, 2): server_groups.append(self._create_server_group(server_group_name, self.policy)) - for key in ['name', 'policies']: + for key in ['name', self.policy_field]: self.assertEqual(server_groups[0][key], server_groups[1][key]) self.assertNotEqual(server_groups[0]['id'], server_groups[1]['id']) @@ -134,3 +146,24 @@ class ServerGroupTestJSON(base.BaseV2ComputeTest): server_group = (self.server_groups_client.show_server_group( self.created_server_group['id'])['server_group']) self.assertIn(server['id'], server_group['members']) + + +class ServerGroup264TestJSON(base.BaseV2ComputeTest): + """These tests check for the server-group APIs 2.64 microversion. + + This tests is only to verify the POST, GET server-groups APIs response + schema with 2.64 microversion + """ + create_default_network = True + min_microversion = '2.64' + + @decorators.idempotent_id('b52f09dd-2133-4037-9a5d-bdb260096a88') + def test_create_get_server_group(self): + # create, get the test server-group with given policy + server_group = self.create_test_server_group( + name='server-group', policy='affinity') + self.addCleanup( + self.server_groups_client.delete_server_group, + server_group['id']) + self.server_groups_client.list_server_groups() + self.server_groups_client.show_server_group(server_group['id']) diff --git a/tempest/lib/api_schema/response/compute/v2_64/__init__.py b/tempest/lib/api_schema/response/compute/v2_64/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tempest/lib/api_schema/response/compute/v2_64/server_groups.py b/tempest/lib/api_schema/response/compute/v2_64/server_groups.py new file mode 100644 index 0000000000..1402de5e96 --- /dev/null +++ b/tempest/lib/api_schema/response/compute/v2_64/server_groups.py @@ -0,0 +1,56 @@ +# Copyright 2020 ZTE Corporation. All rights reserved. +# +# 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_13 import server_groups as \ + server_groupsv213 + +# Compute microversion 2.64: +# 1. change policies to policy in: +# * GET /os-server-groups +# * POST /os-server-groups +# * GET /os-server-groups/{server_group_id} +# 2. add rules in: +# * GET /os-server-groups +# * POST /os-server-groups +# * GET /os-server-groups/{server_group_id} +# 3. remove metadata from: +# * GET /os-server-groups +# * POST /os-server-groups +# * GET /os-server-groups/{server_group_id} + +common_server_group = copy.deepcopy(server_groupsv213.common_server_group) +common_server_group['properties']['policy'] = {'type': 'string'} +common_server_group['properties']['rules'] = {'type': 'object'} +common_server_group['properties'].pop('policies') +common_server_group['properties'].pop('metadata') +common_server_group['required'].append('policy') +common_server_group['required'].append('rules') +common_server_group['required'].remove('policies') +common_server_group['required'].remove('metadata') + +create_show_server_group = copy.deepcopy( + server_groupsv213.create_show_server_group) +create_show_server_group['response_body']['properties'][ + 'server_group'] = common_server_group + +list_server_groups = copy.deepcopy(server_groupsv213.list_server_groups) +list_server_groups['response_body']['properties']['server_groups'][ + 'items'] = common_server_group + +# 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. +delete_server_group = copy.deepcopy(server_groupsv213.delete_server_group) diff --git a/tempest/lib/services/compute/server_groups_client.py b/tempest/lib/services/compute/server_groups_client.py index 89ad2d9f70..98956538e3 100644 --- a/tempest/lib/services/compute/server_groups_client.py +++ b/tempest/lib/services/compute/server_groups_client.py @@ -20,6 +20,8 @@ from tempest.lib.api_schema.response.compute.v2_1 import server_groups \ as schema from tempest.lib.api_schema.response.compute.v2_13 import server_groups \ as schemav213 +from tempest.lib.api_schema.response.compute.v2_64 import server_groups \ + as schemav264 from tempest.lib.common import rest_client from tempest.lib.services.compute import base_compute_client @@ -28,7 +30,8 @@ class ServerGroupsClient(base_compute_client.BaseComputeClient): schema_versions_info = [ {'min': None, 'max': '2.12', 'schema': schema}, - {'min': '2.13', 'max': None, 'schema': schemav213}] + {'min': '2.13', 'max': '2.63', 'schema': schemav213}, + {'min': '2.64', 'max': None, 'schema': schemav264}] def create_server_group(self, **kwargs): """Create the server group.