diff --git a/ranger_tempest_plugin/schemas/regions_schema.py b/ranger_tempest_plugin/schemas/regions_schema.py index 3bcf5e4..0838e63 100644 --- a/ranger_tempest_plugin/schemas/regions_schema.py +++ b/ranger_tempest_plugin/schemas/regions_schema.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License +# pylint: disable=C0103 + _metadata = { 'type': 'object', 'items': { @@ -205,3 +207,7 @@ list_region_groups = { delete_region_group = { 'status_code': [204] } + +delete_region_metadata = { + 'status_code': [204] +} diff --git a/ranger_tempest_plugin/services/rms_client.py b/ranger_tempest_plugin/services/rms_client.py index ac2a384..a5abb98 100755 --- a/ranger_tempest_plugin/services/rms_client.py +++ b/ranger_tempest_plugin/services/rms_client.py @@ -113,7 +113,7 @@ class RmsClient(base_client.RangerClientBase): def list_regions(self, filter=None): uri = '%s/%s/orm/regions' % (self.rms_url, self.version) if filter is not None: - uri += '?' + urllib.parse.urlencode(filter) + uri += '?' + urllib.urlencode(filter) return self.get_request(uri, schema.list_region) def delete_region(self, region_id): @@ -125,15 +125,11 @@ class RmsClient(base_client.RangerClientBase): % (self.rms_url, self.version, region_id) post_body = json.dumps(kwargs) return self.post_request(uri, post_body, schema.update_metadata) -# -# def delete_region_metadata(self, region_id, key): -# uri = '%s/%s/orm/regions/%s/metadata/%s' % ( -# self.rms_url, self.version, region_id, key) -# ex_headers = self.get_headers() -# resp, body = self.delete(uri, extra_headers=ex_headers) -# self.expected_success(200, resp.status) -# body = json.loads(body) -# return rest_client.ResponseBody(resp, body) + + def delete_region_metadata(self, region_id, key): + uri = '%s/%s/orm/regions/%s/metadata/%s' % ( + self.rms_url, self.version, region_id, key) + return self.delete_request(uri, schema.delete_region_metadata) def create_region_group(self, **kwargs): uri = '%s/%s/orm/groups' % (self.rms_url, self.version) diff --git a/ranger_tempest_plugin/tests/api/test_region_groups.py b/ranger_tempest_plugin/tests/api/test_region_groups.py index e952829..efa32a2 100755 --- a/ranger_tempest_plugin/tests/api/test_region_groups.py +++ b/ranger_tempest_plugin/tests/api/test_region_groups.py @@ -1,87 +1,133 @@ -# Copyright 2016 AT&T Corp -# 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. - -from ranger_tempest_plugin import data_utils as orm_data_utils -from ranger_tempest_plugin.tests.api import base - -from tempest import config - -from tempest.lib import decorators - -from tempest.lib.common.utils import data_utils - -CONF = config.CONF - - -class TestTempestRegionGroup(base.BaseOrmTest): - - @classmethod - def setup_credentials(cls): - super(TestTempestRegionGroup, cls).setup_credentials() - - @classmethod - def setup_clients(cls): - super(TestTempestRegionGroup, cls).setup_clients() - cls.client = cls.os_primary.rms_client - - @classmethod - def resource_setup(cls): - cls.setup_ids = [] - cls.group_ids = [] - # create standard region - _, cls.region_1 = cls.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.client.create_region(data_utils.rand_name()) - cls.setup_ids.append(cls.region_2['id']) - - _, cls.group_1 = cls.client.create_region_group( - **orm_data_utils.rand_region_group([cls.setup_ids[0]]) - ) - cls.group_ids.append(cls.group_1['group']['id']) - _, 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']) - - super(TestTempestRegionGroup, cls).resource_setup() - - @classmethod - def resource_cleanup(cls): - for region_id in cls.setup_ids: - cls.client.delete_region(region_id) - for group_id in cls.group_ids: - cls.client.delete_region_group(group_id) - super(TestTempestRegionGroup, cls).resource_cleanup() - - @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.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.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) - - @decorators.idempotent_id('9a37d966-4416-4ff3-8f3b-6847810662d7') - def test_get_group(self): - _id = self.group_1['group']['id'] - _, body = self.client.get_region_group(_id) - self.assert_expected(self.group_1['group'], body, ['links']) +# Copyright 2016 AT&T Corp +# 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. + +from ranger_tempest_plugin import data_utils as orm_data_utils +from ranger_tempest_plugin.tests.api import base + +from tempest import config + +from tempest.lib import decorators +from tempest.lib import exceptions + +from tempest.lib.common.utils import data_utils + +CONF = config.CONF + + +class TestTempestRegionGroup(base.BaseOrmTest): + + @classmethod + def setup_credentials(cls): + super(TestTempestRegionGroup, cls).setup_credentials() + + @classmethod + def setup_clients(cls): + super(TestTempestRegionGroup, cls).setup_clients() + cls.client = cls.os_primary.rms_client + + @classmethod + def resource_setup(cls): + cls.setup_ids = [] + cls.group_ids = [] + # create standard region + _, cls.region_1 = cls.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.client.create_region(data_utils.rand_name()) + cls.setup_ids.append(cls.region_2['id']) + + _, cls.group_1 = cls.client.create_region_group( + **orm_data_utils.rand_region_group([cls.setup_ids[0]]) + ) + cls.group_ids.append(cls.group_1['group']['id']) + _, 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']) + + super(TestTempestRegionGroup, cls).resource_setup() + + @classmethod + def resource_cleanup(cls): + for region_id in cls.setup_ids: + cls.client.delete_region(region_id) + for group_id in cls.group_ids: + cls.client.delete_region_group(group_id) + super(TestTempestRegionGroup, cls).resource_cleanup() + + @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.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.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) + + @decorators.idempotent_id('9a37d966-4416-4ff3-8f3b-6847810662d7') + def test_get_group(self): + _id = self.group_1['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.client.create_region_group( + **orm_data_utils.rand_region_group(self.setup_ids) + ) + _, region_group_details = self.client.get_region_group( + region_group['group']['id'] + ) + self.assertEqual( + region_group_details['regions'], + [self.region_1['id'], self.region_2['id']] + ) + # add to cleanup + self.group_ids.append(region_group['group']['id']) + + @decorators.idempotent_id('504cc5cb-bc19-48ea-9456-16f5b24c9530') + def test_delete_region_group(self): + _, region_group = self.client.create_region_group( + **orm_data_utils.rand_region_group(self.setup_ids) + ) + _, region_group_details = self.client.get_region_group( + region_group['group']['id'] + ) + self.assertEqual( + region_group_details['regions'], + [self.region_1['id'], self.region_2['id']] + ) + + self.client.delete_region_group(region_group['group']['id']) + self.assertRaises( + exceptions.NotFound, self.client.get_region_group, + region_group['group']['id'] + ) + + @decorators.idempotent_id('504cc5cb-bc19-48ea-9456-16f5b24c9531') + def test_validate_region_group(self): + # Validate the Regions added to group are present in Ranger + # try to add NON-EXISTENANT Region in the payload to create Group + ids = ['some_non_existenant_region'] + + self.assertRaises( + 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 a4dfb65..a657f74 100755 --- a/ranger_tempest_plugin/tests/api/test_regions.py +++ b/ranger_tempest_plugin/tests/api/test_regions.py @@ -1,177 +1,194 @@ -# Copyright 2016 AT&T Corp -# 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. - -from ranger_tempest_plugin import data_utils as orm_data_utils -from ranger_tempest_plugin.tests.api import rms_base - -from tempest import config - -from tempest.lib import decorators -from tempest.lib import exceptions - -from tempest.lib.common.utils import data_utils - -CONF = config.CONF - - -class TestTempestRegion(rms_base.RmsBaseOrmTest): - - @classmethod - def resource_setup(cls): - cls.setup_ids = [] - # create standard region - _, cls.region_1 = cls.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.client.create_region(data_utils.rand_name()) - cls.setup_ids.append(cls.region_2['id']) - # create region with differing properties - _, cls.region_3 = cls.client.create_region( - data_utils.rand_name(), - **{'status': 'down', - 'rangerAgentVersion': '3.0', - 'OSVersion': 'mitaka', - 'CLLI': '123450', - 'address': {'country': 'Mexico', 'state': 'Sonora', - 'city': 'Nogales', 'street': '12 main', - 'zip': '84000'}, - 'metadata': {'meta1': ['val1']}, - 'designType': 'large'}) - cls.setup_ids.append(cls.region_3['id']) - - super(TestTempestRegion, cls).resource_setup() - - @classmethod - def resource_cleanup(cls): - for region_id in cls.setup_ids: - cls.client.delete_region(region_id) - super(TestTempestRegion, cls).resource_cleanup() - - @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) - - test_region_name = region_body['name'] - test_region_id = region_body['id'] - _, body = self.client.get_region(test_region_name) - self.assertEqual(test_region_id, body['id']) - - # now delete the region - self.client.delete_region(test_region_id) - self.assertRaises(exceptions.NotFound, self.client.get_region, - test_region_id) - - @decorators.idempotent_id('eecedcb0-9c96-453d-bd72-71dba26fa1c5') - def test_list_region(self): - _, body = self.client.list_regions() - regions = [x['id'] for x in body['regions']] - self.assertIn(self.region_1['id'], regions) - - @decorators.idempotent_id('0164e040-7775-4837-9ac2-aaa0f71cdfca') - def test_list_region_v1(self): - _, body = self.client.list_regions_v1() - regions = [x['id'] for x in body] - self.assertIn(self.region_1['id'], regions) - - @decorators.idempotent_id('e6c6fdfe-5fa2-45f5-8bd8-fb9cf79e99fc') - def test_list_region_with_name(self): - filter = {'regionname': self.region_1['name']} - self._list_regions_with_filter(filter, 'name') - - @decorators.idempotent_id('b3310e32-0c31-4d37-9789-cc3c4639dabe') - def test_list_region_with_osversion(self): - filter = {'osversion': self.region_1['OSVersion']} - self._list_regions_with_filter(filter, 'OSVersion') - - @decorators.idempotent_id('0b2d3e79-c14a-4527-94b0-04eeae053a80') - def test_list_region_with_status(self): - filter = {'status': self.region_1['status']} - self._list_regions_with_filter(filter, 'status') - - @decorators.idempotent_id('871be582-ecaa-4a46-a403-4d6b5e59d7de') - def test_list_region_with_ranger_version(self): - filter = {'ranger_agent_version': self.region_1['rangerAgentVersion']} - self._list_regions_with_filter(filter, 'rangerAgentVersion') - - @decorators.idempotent_id('ac18be48-c787-4a65-913f-a0b0a80fbd1d') - def test_list_region_with_clli(self): - filter = {'clli': self.region_1['CLLI']} - self._list_regions_with_filter(filter, 'CLLI') - - @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') - - @decorators.idempotent_id('4533b31a-115d-466d-bf75-8ac24338c1a5') - def test_list_region_with_address(self): - filter = { - 'country': self.region_1['address']['country'], - '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('726b8215-af10-4385-83c7-32b51502dff1') - def test_list_region_with_type(self): - filter = {'type': self.region_1['designType']} - self._list_regions_with_filter(filter, 'designType') - - @decorators.idempotent_id('4875ea70-a5a1-4b46-b752-246221670d26') - def test_list_region_with_vlcp(self): - filter = {'vlcp_name': self.region_1['vlcpName']} - self._list_regions_with_filter(filter, 'vlcpName') - - @decorators.idempotent_id('358f3cbc-4ae5-4b43-be36-6df55eae8fd9') - def test_get_region(self): - _, body = self.client.get_region(self.region_1['id']) - self.assert_expected(self.region_1, body, []) - - @decorators.idempotent_id('cefb952f-7777-4878-87d2-d78ac345f0d2') - def test_get_region_metadata(self): - _, body = self.client.get_region_metadata(self.region_1['id']) - self.assert_expected(self.region_1['metadata'], body['metadata'], []) - - @decorators.idempotent_id('b2c3baf5-22af-4bf9-bcad-b6a1a74e82d9') - def test_update_region(self): - _id = self.setup_ids[-1] - region = orm_data_utils.rand_region(_id) - _, body = self.client.update_region(_id, **region) - self.assert_expected(region, body, []) - - @decorators.idempotent_id('0d5644d8-92bc-497c-8fc5-b57417d86e6d') - def test_update_region_status(self): - status = {} - status['status'] = orm_data_utils.rand_region_status( - [self.region_1['status']]) - _, body = self.client.update_region_status(self.region_1['id'], status) - self.assert_expected(status, body, ['links']) - - @decorators.idempotent_id('5c1a2624-6abe-49e7-82c8-30e8df1377d0') - def test_update_region_metadata(self): - metadata = {} - metadata['metadata'] = orm_data_utils.rand_region_metadata() - _, body = self.client.update_region_metadata(self.region_1['id'], - 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])) +# Copyright 2016 AT&T Corp +# 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. + +from ranger_tempest_plugin import data_utils as orm_data_utils +from ranger_tempest_plugin.tests.api import rms_base + +from tempest import config + +from tempest.lib import decorators +from tempest.lib import exceptions + +from tempest.lib.common.utils import data_utils + +CONF = config.CONF + + +class TestTempestRegion(rms_base.RmsBaseOrmTest): + + @classmethod + def resource_setup(cls): + cls.setup_ids = [] + # create standard region + _, cls.region_1 = cls.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.client.create_region(data_utils.rand_name()) + cls.setup_ids.append(cls.region_2['id']) + # create region with differing properties + _, cls.region_3 = cls.client.create_region( + data_utils.rand_name(), + **{'status': 'down', + 'rangerAgentVersion': '3.0', + 'OSVersion': 'mitaka', + 'CLLI': '123450', + 'address': {'country': 'Mexico', 'state': 'Sonora', + 'city': 'Nogales', 'street': '12 main', + 'zip': '84000'}, + 'metadata': {'meta1': ['val1']}, + 'designType': 'large'}) + cls.setup_ids.append(cls.region_3['id']) + + super(TestTempestRegion, cls).resource_setup() + + @classmethod + def resource_cleanup(cls): + for region_id in cls.setup_ids: + cls.client.delete_region(region_id) + super(TestTempestRegion, cls).resource_cleanup() + + @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) + + test_region_name = region_body['name'] + test_region_id = region_body['id'] + _, body = self.client.get_region(test_region_name) + self.assertEqual(test_region_id, body['id']) + + # now delete the region + self.client.delete_region(test_region_id) + self.assertRaises(exceptions.NotFound, self.client.get_region, + test_region_id) + + @decorators.idempotent_id('eecedcb0-9c96-453d-bd72-71dba26fa1c5') + def test_list_region(self): + _, body = self.client.list_regions() + regions = [x['id'] for x in body['regions']] + self.assertIn(self.region_1['id'], regions) + + @decorators.idempotent_id('0164e040-7775-4837-9ac2-aaa0f71cdfca') + def test_list_region_v1(self): + _, body = self.client.list_regions_v1() + regions = [x['id'] for x in body] + self.assertIn(self.region_1['id'], regions) + + @decorators.idempotent_id('e6c6fdfe-5fa2-45f5-8bd8-fb9cf79e99fc') + def test_list_region_with_name(self): + filter = {'regionname': self.region_1['name']} + self._list_regions_with_filter(filter, 'name') + + @decorators.idempotent_id('b3310e32-0c31-4d37-9789-cc3c4639dabe') + def test_list_region_with_osversion(self): + filter = {'osversion': self.region_1['OSVersion']} + self._list_regions_with_filter(filter, 'OSVersion') + + @decorators.idempotent_id('0b2d3e79-c14a-4527-94b0-04eeae053a80') + def test_list_region_with_status(self): + filter = {'status': self.region_1['status']} + self._list_regions_with_filter(filter, 'status') + + @decorators.idempotent_id('871be582-ecaa-4a46-a403-4d6b5e59d7de') + def test_list_region_with_ranger_version(self): + filter = {'ranger_agent_version': self.region_1['rangerAgentVersion']} + self._list_regions_with_filter(filter, 'rangerAgentVersion') + + @decorators.idempotent_id('ac18be48-c787-4a65-913f-a0b0a80fbd1d') + def test_list_region_with_clli(self): + filter = {'clli': self.region_1['CLLI']} + self._list_regions_with_filter(filter, 'CLLI') + + @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') + + @decorators.idempotent_id('4533b31a-115d-466d-bf75-8ac24338c1a5') + def test_list_region_with_address(self): + filter = { + 'country': self.region_1['address']['country'], + '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('726b8215-af10-4385-83c7-32b51502dff1') + def test_list_region_with_type(self): + filter = {'type': self.region_1['designType']} + self._list_regions_with_filter(filter, 'designType') + + @decorators.idempotent_id('4875ea70-a5a1-4b46-b752-246221670d26') + def test_list_region_with_vlcp(self): + filter = {'vlcp_name': self.region_1['vlcpName']} + self._list_regions_with_filter(filter, 'vlcpName') + + @decorators.idempotent_id('358f3cbc-4ae5-4b43-be36-6df55eae8fd9') + def test_get_region(self): + _, body = self.client.get_region(self.region_1['id']) + self.assert_expected(self.region_1, body, []) + + @decorators.idempotent_id('cefb952f-7777-4878-87d2-d78ac345f0d2') + def test_get_region_metadata(self): + _, body = self.client.get_region_metadata(self.region_1['id']) + self.assert_expected(self.region_1['metadata'], body['metadata'], []) + + @decorators.idempotent_id('b2c3baf5-22af-4bf9-bcad-b6a1a74e82d9') + def test_update_region(self): + _id = self.setup_ids[-1] + region = orm_data_utils.rand_region(_id) + _, body = self.client.update_region(_id, **region) + self.assert_expected(region, body, []) + + @decorators.idempotent_id('0d5644d8-92bc-497c-8fc5-b57417d86e6d') + def test_update_region_status(self): + status = {} + status['status'] = orm_data_utils.rand_region_status( + [self.region_1['status']]) + _, body = self.client.update_region_status(self.region_1['id'], status) + self.assert_expected(status, body, ['links']) + + @decorators.idempotent_id('5c1a2624-6abe-49e7-82c8-30e8df1377d0') + def test_update_region_metadata(self): + metadata = {} + metadata['metadata'] = orm_data_utils.rand_region_metadata() + _, body = self.client.update_region_metadata(self.region_1['id'], + 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 = { + 'vlcp_name': self.region_1['vlcpName'], + 'status': self.region_1['status'], + 'regionname': self.region_1['name'] + } + 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'], {})