Add more test coverage for Ranger services

Change-Id: Id517254464e50e36d95a26d49ddd1288819e5032
This commit is contained in:
Chi Lo 2020-06-23 09:06:30 -07:00
parent c9dd2c3adb
commit 3aee34ac5f
6 changed files with 356 additions and 129 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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