From 3aee34ac5f4e26d07c09c6ad2cab98287cd14994 Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Tue, 23 Jun 2020 09:06:30 -0700 Subject: [PATCH] Add more test coverage for Ranger services Change-Id: Id517254464e50e36d95a26d49ddd1288819e5032 --- ranger_tempest_plugin/services/rms_client.py | 49 +------ ranger_tempest_plugin/tests/api/ims_base.py | 25 +++- ranger_tempest_plugin/tests/api/rms_base.py | 127 +++++++++++++++++- .../tests/api/test_images.py | 120 +++++++++++++---- .../tests/api/test_region_groups.py | 50 +++---- .../tests/api/test_regions.py | 114 +++++++++++++--- 6 files changed, 356 insertions(+), 129 deletions(-) diff --git a/ranger_tempest_plugin/services/rms_client.py b/ranger_tempest_plugin/services/rms_client.py index 2a8c9bc..1a5c8e9 100755 --- a/ranger_tempest_plugin/services/rms_client.py +++ b/ranger_tempest_plugin/services/rms_client.py @@ -28,56 +28,11 @@ CONF = config.CONF class RmsClient(base_client.RangerClientBase): rms_url = CONF.ranger.ranger_rms_base_url - identity_url = CONF.identity.uri_v3 or "" - identity_url = identity_url.strip('/v3') version = "v2" - def create_region(self, region_id, **kwargs): + def create_region(self, **kwargs): uri = '%s/%s/orm/regions' % (self.rms_url, self.version) - post_body = { - 'status': 'functional', - 'name': region_id, - 'id': region_id, - 'description': region_id, - 'designType': 'compact', - 'locationType': 'testlocation', - 'vlcpName': 'testvlcp', - 'address': { - 'country': 'usa', - 'state': 'tx', - 'city': 'austin', - 'street': '12 main', - 'zip': '12345' - }, - 'metadata': { - 'key': ["value"] - }, - 'endpoints': [ - { - 'publicURL': - 'https://dashboard-ranger.%s.com' % region_id, - 'type': 'dashboard' - }, - { - 'publicURL': self.identity_url, - 'type': 'identity' - }, - { - 'publicURL': - 'https://ranger-agent.%s.com:9010' % region_id, - 'type': 'ord' - }, - - ], - 'rangerAgentVersion': '3.6', - 'OSVersion': 'kilo', - 'CLLI': 'testclli' - } - if kwargs is not None: - for key in kwargs: - post_body[key] = kwargs[key] - - post_body = json.dumps(post_body) + post_body = json.dumps(kwargs) return self.post_request(uri, post_body, schema.create_region) def update_region(self, region_id, **kwargs): diff --git a/ranger_tempest_plugin/tests/api/ims_base.py b/ranger_tempest_plugin/tests/api/ims_base.py index 95aef3d..92643f0 100755 --- a/ranger_tempest_plugin/tests/api/ims_base.py +++ b/ranger_tempest_plugin/tests/api/ims_base.py @@ -162,11 +162,11 @@ class ImsBaseOrmTest(base.BaseOrmTest): _, body = cls.client.get_image(image_id) image = body["image"] - regions_on_image = [region for region in image["regions"]] - if regions_on_image: - region_id = regions_on_image[0]["name"] + regions_on_image = [region["name"] for region in image["regions"]] + for region in regions_on_image: cls._delete_region_from_image_and_validate_deletion( - image_id, region_id) + image_id, region) + cls._wait_for_image_status_on_dcp(image_id, "no regions") cls.client.delete_image(image_id) cls._validate_image_deletion_on_lcp(image_id) @@ -175,7 +175,22 @@ class ImsBaseOrmTest(base.BaseOrmTest): def _delete_region_from_image_and_validate_deletion(cls, image_id, region_id): cls.client.delete_region_from_image(image_id, region_id) - cls._wait_for_image_status_on_dcp(image_id, "no regions") + start = int(time.time()) + while True: + time.sleep(cls.build_interval) + if int(time.time()) - start >= cls.build_timeout: + message = ('Image %s failed to be deleted' + ' within the required time (%s s)' + % (image_id, cls.build_timeout)) + raise exceptions.TimeoutException(message) + + not_found = True + _, body = cls.client.get_image(image_id) + for regions_on_image in body['image']['regions']: + if regions_on_image['name'] == region_id: + not_found = False + if not_found: + break @classmethod def _wait_for_image_deletion_on_dcp(cls, image_id): diff --git a/ranger_tempest_plugin/tests/api/rms_base.py b/ranger_tempest_plugin/tests/api/rms_base.py index 950d781..be62827 100755 --- a/ranger_tempest_plugin/tests/api/rms_base.py +++ b/ranger_tempest_plugin/tests/api/rms_base.py @@ -16,7 +16,12 @@ from oslo_log import log as logging from ranger_tempest_plugin.data_utils import data_utils from ranger_tempest_plugin.tests.api import base +from tempest import config +from tempest.lib import exceptions +import time + +CONF = config.CONF LOG = logging.getLogger(__name__) @@ -26,20 +31,134 @@ class RmsBaseOrmTest(base.BaseOrmTest): def resource_setup(cls): cls.setup_ids = [] # create standard region - _, cls.region_1 = cls.client.create_region(data_utils.rand_name()) + _, cls.region_1 = cls.client.create_region(**cls._get_region_params()) cls.setup_ids.append(cls.region_1['id']) + # create region sharing region_1 properties - _, cls.region_2 = cls.client.create_region(data_utils.rand_name(), - **{'metadata': - {'key': ["value"]}}) + another_region = cls._get_region_params() + another_region['metadata'] = {'key2': ['value2']} + _, cls.region_2 = cls.client.create_region(**another_region) cls.setup_ids.append(cls.region_2['id']) for region_id in cls.setup_ids: cls.addClassResourceCleanup(cls.client.delete_region, region_id) + # create customer + customer_parms = cls._get_customer_params() + cls.setup_customer = \ + cls._create_customer_validate_creation(**customer_parms) + super(RmsBaseOrmTest, cls).resource_setup() @classmethod def setup_clients(cls): cls.client = cls.os_primary.rms_client + cls.cms_client = cls.os_primary.cms_client super(RmsBaseOrmTest, cls).setup_clients() + + @classmethod + def _get_region_params(cls): + identity_url = CONF.identity.uri_v3 or "" + identity_url = identity_url.strip('/v3') + region_id = data_utils.rand_name() + + region = {} + region = { + 'status': 'functional', + 'name': region_id, + 'id': region_id, + 'description': region_id, + 'designType': 'Cruiser', + 'locationType': 'testlocation', + 'vlcpName': region_id, + 'address': { + 'country': 'usa', + 'state': 'tx', + 'city': 'austin', + 'street': '12 main', + 'zip': '12345' + }, + 'metadata': { + 'key': ['value'], + 'key2': ['value2'] + }, + 'endpoints': [ + { + 'publicURL': + 'https://dashboard-nc.%s.cci.att.com' % region_id, + 'type': 'dashboard' + }, + { + 'publicURL': identity_url, + 'type': 'identity' + }, + { + 'publicURL': + 'https://ranger-agent-nc.%s.cci.att.com' % region_id, + 'type': 'ord' + }, + + ], + 'rangerAgentVersion': '2.0', + 'OSVersion': 'Stein', + 'CLLI': 'testclli' + } + + return region + + @classmethod + def _get_customer_params(cls): + customer = {} + customer['description'] = data_utils.rand_name('ormTempestCms') + customer['enabled'] = True + customer['name'] = data_utils.rand_name('ormTempestCms') + customer['regions'] = [{'name': CONF.identity.region}] + customer['defaultQuotas'] = [] + customer['users'] = [] + return customer + + @classmethod + def _wait_for_status(cls, customer_id, status): + customer_status = cls.cms_client.get_customer(customer_id)[1]['status'] + start = int(time.time()) + while customer_status != status: + time.sleep(cls.build_interval) + customer_status = cls.cms_client.get_customer( + customer_id)[1]['status'] + if customer_status == 'Error': + message = ('customer %s failed to reach %s status' + ' and is in ERROR status on orm' % + (customer_id, status)) + raise exceptions.TempestException(message) + if int(time.time()) - start >= cls.build_timeout: + message = ('customer %s failed to reach %s' + 'status within the required time (%s s)' + 'on orm and is in %s status.' + % (customer_id, status, + cls.build_timeout, + customer_status)) + raise exceptions.TimeoutException(message) + + @classmethod + def _create_customer_validate_creation(cls, **kwargs): + _, body = cls.cms_client.create_customer(**kwargs) + customer_id = body['customer']['id'] + + cls.addClassResourceCleanup( + cls._delete_customer_validate_deletion, customer_id) + + cls._wait_for_status(customer_id, 'Success') + _, customer = cls.cms_client.get_customer(customer_id) + return customer + + @classmethod + def _delete_customer_validate_deletion(cls, customer_id): + _, customer = cls.cms_client.get_customer(customer_id) + regions_on_customer = \ + [region['name'] for region in customer['regions']] + + for region in regions_on_customer: + cls.cms_client.delete_region_from_customer(customer_id, region) + + cls._wait_for_status(customer_id, 'no regions') + cls.cms_client.delete_customer(customer_id) diff --git a/ranger_tempest_plugin/tests/api/test_images.py b/ranger_tempest_plugin/tests/api/test_images.py index 747d5f0..c0d0d3e 100644 --- a/ranger_tempest_plugin/tests/api/test_images.py +++ b/ranger_tempest_plugin/tests/api/test_images.py @@ -14,12 +14,14 @@ # under the License. from oslo_concurrency import lockutils +from ranger_tempest_plugin import data_utils as orm_data_utils from ranger_tempest_plugin.tests.api import ims_base from tempest import config from tempest.lib import decorators from tempest.lib import exceptions +import testtools CONF = config.CONF @@ -90,6 +92,16 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): self._del_img_validate_deletion_on_dcp_and_lcp(id_) self.assertRaises(exceptions.NotFound, self.client.get_image, id_) + def _create_region_group(self): + _, body = self.rms_client.create_region_group( + **orm_data_utils.rand_region_group([CONF.identity.region, + CONF.ranger.alt_region])) + + group_id = body['group']['id'] + self.addCleanup(self.rms_client.delete_region_group, group_id) + + return group_id + @decorators.idempotent_id('2b1bb28b-4151-4e75-ae1b-d21089c3418c') def test_get_image(self): """Execute 'get_image' using the following options: @@ -376,34 +388,36 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): image_ids = [img['id'] for img in body['images']] self.assertIn(image['id'], image_ids) - # TODO(JH629g): following test skipped until protect image bug resolved - # @decorators.idempotent_id('59887b26-8e73-4781-87a4-3b505ece0021') - # def test_create_image_protected_true(self): - # post_body = self._get_image_params() - # set Protected True - # post_body['protected'] = True + @decorators.idempotent_id('59887b26-8e73-4781-87a4-3b505ece0021') + def test_create_update_delete_image_protected_true(self): + post_body = self._get_image_params() + # set protected True + post_body['protected'] = True - # add image to temepst cleanup - # self.addCleanup( - # self._del_img_validate_deletion_on_dcp_and_lcp, - # post_body['id']) - - # call client create_IMAGE and wait till status equals 'Success' - # _, body = self.client.create_image(**post_body) - # image = body["image"] - # self._wait_for_image_status_on_dcp(image['id'], 'Success') + # call client create_image and wait till status equals 'Success' + _, body = self.client.create_image(**post_body) + image = body["image"] + self._wait_for_image_status_on_dcp(image['id'], 'Success') # verify image record created successfully - # _, body = self.client.get_image(image['id']) - # image = body["image"] - # self.assertEqual(image["regions"][0]["name"], CONF.identity.region) + _, body = self.client.get_image(image['id']) + image = body["image"] + self.assertEqual(image["regions"][0]["name"], CONF.identity.region) + self.assertEqual(image["protected"], True) - # unset protect for cleanup - # post_body['protected'] = False - # _, body = self.client.update_image(post_body['id'], - # para=None, - # **post_body) - # self._wait_for_image_status_on_dcp(image['id'], 'Success') + # unset protected to False for delete + post_body['protected'] = False + _, body = self.client.update_image(post_body['id'], + para=None, + **post_body) + self._wait_for_image_status_on_dcp(image['id'], 'Success') + + _, body = self.client.get_image(image['id']) + image = body["image"] + self.assertEqual(image["protected"], False) + + # delete image + self._del_img_validate_deletion_on_dcp_and_lcp(post_body['id']) @decorators.idempotent_id('56cd1de0-3908-41d5-af98-45ad95463817') def test_create_image_with_tags_properties(self): @@ -433,6 +447,7 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): self.assertListEqual(image["tags"], tags) self.assertDictEqual(image["properties"], properties) + @SYNC('region') @decorators.idempotent_id('67aa7014-4dbb-4d66-bc7b-1a95a57494f8') def test_create_image_with_uuid(self): post_body = self._get_image_params() @@ -452,3 +467,60 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): _, body = self.client.get_image(image['id']) image = body["image"] self.assertEqual(image['id'], post_body['id']) + + @SYNC('region') + @testtools.skipUnless(CONF.ranger.alt_region_available, + 'Alt region not provided, skipping this test') + @decorators.idempotent_id('7ae78584-55af-45cb-a4a2-b28cc679699e') + def test_create_image_with_region_group(self): + # create region group + group_id = self._create_region_group() + post_body = self._get_image_params() + post_body['regions'] = [ + { + 'name': group_id, + 'type': 'group' + } + ] + + # call client create_image and wait till status equals 'Success' + _, body = self.client.create_image(**post_body) + image = body["image"] + + self.addCleanup( + self._del_img_validate_deletion_on_dcp_and_lcp, image['id']) + self._wait_for_image_status_on_dcp(image['id'], 'Success') + + # verify image record created successfully + _, body = self.client.get_image(image['id']) + image = body["image"] + + self.assertEqual(image['status'], 'Success') + self.assertEqual(len(image['regions']), 2) + + @SYNC('region') + @testtools.skipUnless(CONF.ranger.alt_region_available, + 'Alt region not provided, skipping this test') + @decorators.idempotent_id('73c97918-2081-4f42-9c1e-6fd7a9fb8735') + def test_create_image_with_two_regions(self): + post_body = self._get_image_params() + + region1 = {'name': CONF.identity.region, + 'type': 'single'} + region2 = {'name': CONF.ranger.alt_region, + 'type': 'single'} + post_body['regions'] = [region1, region2] + + # call client create_image and wait till status equals 'Success' + _, body = self.client.create_image(**post_body) + image = body["image"] + self.addCleanup( + self._del_img_validate_deletion_on_dcp_and_lcp, image['id']) + self._wait_for_image_status_on_dcp(image['id'], 'Success') + + # verify image record created successfully + _, body = self.client.get_image(image['id']) + image = body["image"] + + self.assertEqual(image['status'], 'Success') + self.assertEqual(len(image['regions']), 2) diff --git a/ranger_tempest_plugin/tests/api/test_region_groups.py b/ranger_tempest_plugin/tests/api/test_region_groups.py index f37f651..bc270d5 100755 --- a/ranger_tempest_plugin/tests/api/test_region_groups.py +++ b/ranger_tempest_plugin/tests/api/test_region_groups.py @@ -14,55 +14,41 @@ # under the License. from ranger_tempest_plugin import data_utils as orm_data_utils -from ranger_tempest_plugin.tests.api import base +from ranger_tempest_plugin.tests.api import rms_base from tempest.lib import decorators from tempest.lib import exceptions -from tempest.lib.common.utils import data_utils - -class TestTempestRegionGroup(base.BaseOrmTest): +class TestTempestRegionGroup(rms_base.RmsBaseOrmTest): @classmethod def resource_setup(cls): - cls.setup_ids = [] - cls.group_ids = [] - cls.rms_client = cls.os_admin.rms_client - # create standard region - _, cls.region_1 = cls.rms_client.create_region(data_utils.rand_name()) - cls.setup_ids.append(cls.region_1['id']) - # create region sharing region_1 properties - _, cls.region_2 = cls.rms_client.create_region(data_utils.rand_name()) - cls.setup_ids.append(cls.region_2['id']) + super(TestTempestRegionGroup, cls).resource_setup() - _, cls.group_1 = cls.rms_client.create_region_group( + cls.group_ids = [] + _, cls.group_1 = cls.client.create_region_group( **orm_data_utils.rand_region_group(cls.setup_ids)) cls.group_ids.append(cls.group_1['group']['id']) - _, cls.group_2 = cls.rms_client.create_region_group( + _, cls.group_2 = cls.client.create_region_group( **orm_data_utils.rand_region_group(cls.setup_ids)) cls.group_ids.append(cls.group_2['group']['id']) - for region_id in cls.setup_ids: - cls.addClassResourceCleanup(cls.rms_client.delete_region, - region_id) for group_id in cls.group_ids: - cls.addClassResourceCleanup(cls.rms_client.delete_region_group, + cls.addClassResourceCleanup(cls.client.delete_region_group, group_id) - super(TestTempestRegionGroup, cls).resource_setup() - @decorators.idempotent_id('0d377eb2-754d-49c1-9a4f-c7019dfe80ca') def test_update_group(self): _id = self.group_ids[-1] group = orm_data_utils.rand_region_group(self.setup_ids, _id) - _, body = self.rms_client.update_region_group(_id, **group) + _, body = self.client.update_region_group(_id, **group) self.assert_expected(group, body['group'], ['regions']) @decorators.idempotent_id('b946c6c4-d601-42b9-befd-ba40992a3c53') def test_list_groups(self): - _, body = self.rms_client.list_region_groups() + _, body = self.client.list_region_groups() groups = [x['id'] for x in body['groups']] self.assertIn(self.group_1['group']['id'], groups) self.assertIn(self.group_2['group']['id'], groups) @@ -70,15 +56,15 @@ class TestTempestRegionGroup(base.BaseOrmTest): @decorators.idempotent_id('9a37d966-4416-4ff3-8f3b-6847810662d7') def test_get_group(self): _id = self.group_1['group']['id'] - _, body = self.rms_client.get_region_group(_id) + _, body = self.client.get_region_group(_id) self.assert_expected(self.group_1['group'], body, ['links']) @decorators.idempotent_id('504cc5cb-bc19-48ea-9456-16f5b24c9529') def test_create_region_group(self): - _, region_group = self.rms_client.create_region_group( + _, region_group = self.client.create_region_group( **orm_data_utils.rand_region_group(self.setup_ids) ) - _, region_group_details = self.rms_client.get_region_group( + _, region_group_details = self.client.get_region_group( region_group['group']['id'] ) self.assertIn( @@ -91,15 +77,15 @@ class TestTempestRegionGroup(base.BaseOrmTest): ) self.addCleanup( - self.rms_client.delete_region_group, + self.client.delete_region_group, region_group['group']['id']) @decorators.idempotent_id('504cc5cb-bc19-48ea-9456-16f5b24c9530') def test_delete_region_group(self): - _, region_group = self.rms_client.create_region_group( + _, region_group = self.client.create_region_group( **orm_data_utils.rand_region_group(self.setup_ids) ) - _, region_group_details = self.rms_client.get_region_group( + _, region_group_details = self.client.get_region_group( region_group['group']['id'] ) @@ -112,9 +98,9 @@ class TestTempestRegionGroup(base.BaseOrmTest): region_group_details['regions'] ) - self.rms_client.delete_region_group(region_group['group']['id']) + self.client.delete_region_group(region_group['group']['id']) self.assertRaises( - exceptions.NotFound, self.rms_client.get_region_group, + exceptions.NotFound, self.client.get_region_group, region_group['group']['id'] ) @@ -125,6 +111,6 @@ class TestTempestRegionGroup(base.BaseOrmTest): ids = ['some_non_existenant_region'] self.assertRaises( - exceptions.BadRequest, self.rms_client.create_region_group, + exceptions.BadRequest, self.client.create_region_group, **orm_data_utils.rand_region_group(ids) ) diff --git a/ranger_tempest_plugin/tests/api/test_regions.py b/ranger_tempest_plugin/tests/api/test_regions.py index 0094847..7aa2bf8 100755 --- a/ranger_tempest_plugin/tests/api/test_regions.py +++ b/ranger_tempest_plugin/tests/api/test_regions.py @@ -22,11 +22,17 @@ from tempest.lib import exceptions class TestTempestRegion(rms_base.RmsBaseOrmTest): + def _list_regions_with_filter(self, filter, key): + _, body = self.client.list_regions(filter) + regions = [x for x in body['regions']] + self.assertTrue( + all([region[key] == self.region_1[key] for region in regions])) + @decorators.idempotent_id('829c7da0-2332-4f80-ad35-24306b67ed0e') def test_create_and_delete_region(self): # create new region for API test region = orm_data_utils.rand_region() - _, region_body = self.client.create_region(region['id'], **region) + _, region_body = self.client.create_region(**region) test_region_name = region_body['name'] test_region_id = region_body['id'] @@ -77,19 +83,79 @@ class TestTempestRegion(rms_base.RmsBaseOrmTest): @decorators.idempotent_id('f2b2361d-ce71-43a8-9f01-acb529835880') def test_list_region_with_metadata(self): - filter = {'metadata': list(self.region_1['metadata'].keys())[0]} - self._list_regions_with_filter(filter, 'metadata') + filter = {'metadata': list(self.region_2['metadata'].keys())[0]} + _, body = self.client.list_regions(filter) + regions = [x for x in body['regions']] + for r in regions: + self.assertIn(filter['metadata'], r['metadata'].keys()) @decorators.idempotent_id('4533b31a-115d-466d-bf75-8ac24338c1a5') def test_list_region_with_address(self): filter = { 'country': self.region_1['address']['country'], + 'state': self.region_1['address']['state'], 'city': self.region_1['address']['city'], 'street': self.region_1['address']['street'], 'zip': self.region_1['address']['zip'] } self._list_regions_with_filter(filter, 'address') + @decorators.idempotent_id('4235a73b-2437-4466-8af8-5d29da2cd236') + def test_list_region_by_address_parameters(self): + random_region = orm_data_utils.rand_region() + random_region['address']['country'] = 'ABC' + random_region['address']['state'] = 'XX' + random_region['address']['city'] = 'YYY' + random_region['address']['street'] = '123 Test Street' + random_region['address']['zip'] = '11211' + _, region_body = self.client.create_region(**random_region) + self.addCleanup(self.client.delete_region, region_body['id']) + + # Filter by country + filter = {'country': region_body['address']['country']} + _, body = self.client.list_regions(filter) + regions = [x for x in body['regions']] + self.assertTrue(all( + [region['address']['country'] == region_body['address']['country'] + for region in regions])) + + # Filter by state + filter = {'state': region_body['address']['state']} + _, body = self.client.list_regions(filter) + regions = [x for x in body['regions']] + self.assertTrue(all( + [region['address']['state'] == region_body['address']['state'] + for region in regions])) + + # Filter by city + filter = {'city': region_body['address']['city']} + _, body = self.client.list_regions(filter) + regions = [x for x in body['regions']] + self.assertTrue(all( + [region['address']['city'] == region_body['address']['city'] + for region in regions])) + + # Filter by street + filter = {'street': region_body['address']['street']} + _, body = self.client.list_regions(filter) + regions = [x for x in body['regions']] + self.assertTrue(all( + [region['address']['street'] == region_body['address']['street'] + for region in regions])) + + # Filter by zip + filter = {'zip': region_body['address']['zip']} + _, body = self.client.list_regions(filter) + regions = [x for x in body['regions']] + self.assertTrue(all( + [region['address']['zip'] == region_body['address']['zip'] + for region in regions])) + + @decorators.idempotent_id('b40fa67c-94ab-4b33-8441-70f50b50a17e') + def test_list_region_with_location_type(self): + filter = {'location_type': self.region_1['locationType']} + self._list_regions_with_filter(filter, 'locationType') + @decorators.idempotent_id('726b8215-af10-4385-83c7-32b51502dff1') def test_list_region_with_type(self): filter = {'type': self.region_1['designType']} @@ -108,7 +174,7 @@ class TestTempestRegion(rms_base.RmsBaseOrmTest): @decorators.idempotent_id('cefb952f-7777-4878-87d2-d78ac345f0d2') def test_get_region_metadata(self): _, body = self.client.get_region_metadata(self.region_2['id']) - self.assert_expected({'metadata': {'key': ['value']}}, body, []) + self.assert_expected({'metadata': {'key2': ['value2']}}, body, []) @decorators.idempotent_id('b2c3baf5-22af-4bf9-bcad-b6a1a74e82d9') def test_update_region(self): @@ -135,12 +201,6 @@ class TestTempestRegion(rms_base.RmsBaseOrmTest): metadata) self.assert_expected(metadata, body, []) - def _list_regions_with_filter(self, filter, key): - _, body = self.client.list_regions(filter) - regions = [x for x in body['regions']] - self.assertTrue( - all([region[key] == self.region_1[key] for region in regions])) - @decorators.idempotent_id('77257e0c-e2f8-4b98-886c-359508a4a73d') def test_list_multiple_filter(self): filter = { @@ -150,10 +210,30 @@ class TestTempestRegion(rms_base.RmsBaseOrmTest): } self._list_regions_with_filter(filter, 'name') - @decorators.idempotent_id('ce9bcbba-a97b-4da2-937e-69afbc5f93f8') - def test_delete_region_metadata(self): - _, body = self.client.delete_region_metadata( - self.region_1['id'], 'key' - ) - _, region = self.client.get_region(self.region_1['id']) - self.assertEqual(region['metadata'], {}) + @decorators.idempotent_id('4a8975f0-c9fd-477c-a01d-5679552083f3') + def test_add_delete_region_metadata(self): + # get original metadata before addition + _, region = self.client.get_region(self.region_2['id']) + orig_metadata = region['metadata'] + + # add metadata + metadata = {'metadata': {'m1': ['km1']}} + self.client.add_region_metadata(self.region_2['id'], **metadata) + _, body = self.client.get_region(self.region_2['id']) + + new_metadata = dict( + list(orig_metadata.items()) + list(metadata['metadata'].items())) + + self.assertDictEqual(body['metadata'], new_metadata) + + # remove metadata + self.client.delete_region_metadata(self.region_2['id'], 'm1') + _, body = self.client.get_region(self.region_2['id']) + self.assertDictEqual(body['metadata'], orig_metadata) + + @decorators.idempotent_id('75c2e596-4ea9-454f-94a2-e5d084af2059') + def test_delete_region_with_resource(self): + # delete region when a customer is assigned a region + self.assertRaises(exceptions.BadRequest, + self.client.delete_region, + self.setup_customer['regions'][0]['name'])