Merge "Fix server group schema for compute microversion 2.64"
diff --git a/doc/source/microversion_testing.rst b/doc/source/microversion_testing.rst
index ecf2930..ff6237e 100644
--- a/doc/source/microversion_testing.rst
+++ b/doc/source/microversion_testing.rst
@@ -418,6 +418,10 @@
.. _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 a110eb4..e16afaf 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -306,10 +306,18 @@
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 4c0d021..4811a7b 100644
--- a/tempest/api/compute/servers/test_server_group.py
+++ b/tempest/api/compute/servers/test_server_group.py
@@ -44,9 +44,21 @@
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 @@
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 @@
@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 @@
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 @@
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 0000000..e69de29
--- /dev/null
+++ b/tempest/lib/api_schema/response/compute/v2_64/__init__.py
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 0000000..1402de5
--- /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 89ad2d9..9895653 100644
--- a/tempest/lib/services/compute/server_groups_client.py
+++ b/tempest/lib/services/compute/server_groups_client.py
@@ -20,6 +20,8 @@
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 @@
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.