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 <gmann@ghanshyammann.com>

Change-Id: I8fc37415c968eb64380b8bd66b713aa6b733578f
This commit is contained in:
zhufl 2020-06-05 16:04:49 +08:00 committed by Ghanshyam Mann
parent 6bc98ccfaa
commit ed6d10235c
6 changed files with 113 additions and 9 deletions

View File

@ -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

View File

@ -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,

View File

@ -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'])

View File

@ -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)

View File

@ -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.