Updated sync for alt_region tests, improved status loops

Updated synchronization after gaining better
insights into how to utilize oslo_concurrency
module. Updated region resource updates to be
in resource_setup of base.py for ranger tempest
test suite. Improved region status and removal
loops to overall improve functionality.

Change-Id: I17310dcc46697d4a4541d3ee8355f0669c268e8a
This commit is contained in:
jh629g 2020-07-10 13:20:34 -05:00 committed by Jeremy Houser
parent 3ad54cf082
commit 0616e8e574
8 changed files with 78 additions and 53 deletions

View File

@ -1,5 +1,5 @@
[flake8] [flake8]
ignore = E125,E123,E129,H903,H306 ignore = E125,E123,E129,H903,H306,W503
show-source = False show-source = False
exclude = exclude =
.git, .git,

View File

@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from oslo_concurrency import lockutils
from oslo_log import log as logging from oslo_log import log as logging
from ranger_tempest_plugin import clients from ranger_tempest_plugin import clients
from tempest import config from tempest import config
@ -21,6 +22,9 @@ from tempest import test
CONF = config.CONF CONF = config.CONF
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
PREFIX = 'alt_region'
SYNC = lockutils.synchronized_with_prefix(PREFIX)
class BaseOrmTest(test.BaseTestCase): class BaseOrmTest(test.BaseTestCase):
@ -41,21 +45,23 @@ class BaseOrmTest(test.BaseTestCase):
cls.project_client = cls.os_admin.projects_client cls.project_client = cls.os_admin.projects_client
cls.region_client = cls.os_admin.rms_client cls.region_client = cls.os_admin.rms_client
super(BaseOrmTest, cls).setup_clients()
@classmethod
def resource_setup(cls):
super(BaseOrmTest, cls).resource_setup()
# Get regions in ranger deployment # Get regions in ranger deployment
_, regions_list = cls.region_client.list_regions() _, regions_list = cls.region_client.list_regions()
regions = [x for x in regions_list['regions']] for region in regions_list['regions']:
for region in regions:
if region['id'] == CONF.identity.region or \ if region['id'] == CONF.identity.region or \
(region['id'] == CONF.ranger.alt_region and (region['id'] == CONF.ranger.alt_region
CONF.ranger.alt_region_available is True): and CONF.ranger.alt_region_available is True):
cls.addClassResourceCleanup(cls.region_client.update_region,
region['id'],
**region)
region['domainName'] = CONF.auth.admin_domain_name region['domainName'] = CONF.auth.admin_domain_name
cls.region_client.update_region(region['id'], cls.region_client.update_region(region['id'],
**region) **region)
cls.addClassResourceCleanup(cls.region_client.update_region,
super(BaseOrmTest, cls).setup_clients() region['id'],
**region)
@classmethod @classmethod
def skip_checks(cls): def skip_checks(cls):

View File

@ -33,6 +33,7 @@ class CmsBaseOrmTest(base.BaseOrmTest):
@classmethod @classmethod
def resource_setup(cls): def resource_setup(cls):
super(CmsBaseOrmTest, cls).resource_setup()
cls.setup_customer = cls._get_customer_params() cls.setup_customer = cls._get_customer_params()
cls.setup_customer_id = \ cls.setup_customer_id = \
cls._create_cust_validate_creation_on_dcp_and_lcp( cls._create_cust_validate_creation_on_dcp_and_lcp(
@ -51,8 +52,6 @@ class CmsBaseOrmTest(base.BaseOrmTest):
cls._del_cust_validate_deletion_on_dcp_and_lcp, cls._del_cust_validate_deletion_on_dcp_and_lcp,
cls.bare_customer_id) cls.bare_customer_id)
super(CmsBaseOrmTest, cls).resource_setup()
@classmethod @classmethod
def setup_clients(cls): def setup_clients(cls):
super(CmsBaseOrmTest, cls).setup_clients() super(CmsBaseOrmTest, cls).setup_clients()
@ -65,7 +64,7 @@ class CmsBaseOrmTest(base.BaseOrmTest):
compute["instances"] = "10" compute["instances"] = "10"
compute["key-pairs"] = "10" compute["key-pairs"] = "10"
compute["ram"] = "10" compute["ram"] = "10"
compute["vcpus"] = "51" compute["vcpus"] = "36"
compute["metadata-items"] = "34" compute["metadata-items"] = "34"
storage["gigabytes"] = "10" storage["gigabytes"] = "10"
storage["snapshots"] = "10" storage["snapshots"] = "10"
@ -114,7 +113,7 @@ class CmsBaseOrmTest(base.BaseOrmTest):
metadata['my_server_name'] = cust_name metadata['my_server_name'] = cust_name
metadata['ocx_cust'] = str(random.randint(0, 999999999)) metadata['ocx_cust'] = str(random.randint(0, 999999999))
customer["description"] = cust_name customer["description"] = cust_name
customer["enabled"] = True if enabled else False customer["enabled"] = bool(enabled)
customer["name"] = cust_name customer["name"] = cust_name
customer['metadata'] = metadata customer['metadata'] = metadata
customer["regions"] = regions customer["regions"] = regions
@ -213,8 +212,8 @@ class CmsBaseOrmTest(base.BaseOrmTest):
body = cls.nova_quotas_client.show_quota_set(cust_id) body = cls.nova_quotas_client.show_quota_set(cust_id)
for param in quota["compute"][0]: for param in quota["compute"][0]:
if param in body["quota_set"]: if param in body["quota_set"]:
if (quota["compute"][0][param] == if (quota["compute"][0][param]
str(body["quota_set"][param])): == str(body["quota_set"][param])):
actual_quota_count += 1 actual_quota_count += 1
body = cls.volume_quotas_client.show_quota_set(cust_id) body = cls.volume_quotas_client.show_quota_set(cust_id)
for param in quota["storage"][0]: for param in quota["storage"][0]:
@ -224,8 +223,8 @@ class CmsBaseOrmTest(base.BaseOrmTest):
body = cls.networks_quotas_client.show_quotas(cust_id) body = cls.networks_quotas_client.show_quotas(cust_id)
for param in quota["network"][0]: for param in quota["network"][0]:
if param in body["quota_set"]: if param in body["quota_set"]:
if (quota["compute"][0][param] == if (quota["compute"][0][param]
str(body["quota_set"][param])): == str(body["quota_set"][param])):
actual_quota_count += 1 actual_quota_count += 1
return bool(expected_quota_count == actual_quota_count) return bool(expected_quota_count == actual_quota_count)
@ -279,6 +278,15 @@ class CmsBaseOrmTest(base.BaseOrmTest):
time.sleep(cls.build_interval) time.sleep(cls.build_interval)
_, body = cls.client.get_customer(customer_id) _, body = cls.client.get_customer(customer_id)
loopcount = 0
while loopcount < 10:
for regions_on_customer in body['regions']:
if regions_on_customer['name'] == rname:
time.sleep(cls.build_interval)
_, body = cls.client.get_customer(customer_id)
break
loopcount += 1
for regions_on_customer in body['regions']: for regions_on_customer in body['regions']:
if regions_on_customer['name'] == rname: if regions_on_customer['name'] == rname:

View File

@ -104,9 +104,8 @@ class FmsBaseOrmTest(base.BaseOrmTest):
cls._wait_for_flavor_status_on_dcp(flavor_id, flavor_status) cls._wait_for_flavor_status_on_dcp(flavor_id, flavor_status)
cls._validate_flavor_creation_on_lcp(flavor_id) cls._validate_flavor_creation_on_lcp(flavor_id)
return flavor return flavor
else: message = "flavor %s not created successfully" % flavor_id
message = "flavor %s not created successfully" % flavor_id raise exceptions.TempestException(message)
raise exceptions.TempestException(message)
@classmethod @classmethod
def _wait_for_flavor_status_on_dcp(cls, flavor_id, status): def _wait_for_flavor_status_on_dcp(cls, flavor_id, status):
@ -159,8 +158,8 @@ class FmsBaseOrmTest(base.BaseOrmTest):
if expected_specs[spec] == actual_specs[spec]: if expected_specs[spec] == actual_specs[spec]:
actual_specs_count += 1 actual_specs_count += 1
return bool(expected_specs_count == actual_specs_count) return bool(expected_specs_count == actual_specs_count)
return bool(_validate_extra_specs(flavor_orm) and return bool(_validate_extra_specs(flavor_orm)
_validate_extra_specs(flavor_lcp)) and _validate_extra_specs(flavor_lcp))
@classmethod @classmethod
def _del_flv_and_validate_deletion_on_dcp_and_lcp(cls, flavor_id): def _del_flv_and_validate_deletion_on_dcp_and_lcp(cls, flavor_id):
@ -179,21 +178,26 @@ class FmsBaseOrmTest(base.BaseOrmTest):
cls, flavor_id, rname): cls, flavor_id, rname):
cls.client.delete_region_from_flavor(flavor_id, rname) cls.client.delete_region_from_flavor(flavor_id, rname)
delete_loop_counter = 0 time.sleep(cls.build_interval)
_, body = cls.client.get_flavor(flavor_id) _, body = cls.client.get_flavor(flavor_id)
loopcount = 0
while delete_loop_counter <= 5: while loopcount < 10:
delete_loop_counter += 1
for regions_on_flavor in body['flavor']['regions']: for regions_on_flavor in body['flavor']['regions']:
if regions_on_flavor['name'] == rname: if regions_on_flavor['name'] == rname:
time.sleep(cls.build_interval) time.sleep(cls.build_interval)
_, body = cls.client.get_flavor(flavor_id) _, body = cls.client.get_flavor(flavor_id)
continue
loopcount += 1
if delete_loop_counter >= 5: _, body = cls.client.get_flavor(flavor_id)
message = \
'Region {} failed to get deleted from flavor {}' \ for regions_on_flavor in body['flavor']['regions']:
.format(rname, flavor_id) if regions_on_flavor['name'] == rname:
raise exceptions.TempestException(message) message = \
'Region {} failed to get deleted from flavor {}' \
.format(rname, flavor_id)
raise exceptions.TempestException(message)
@classmethod @classmethod
def _wait_for_flavor_deletion_on_dcp(cls, flavor_id): def _wait_for_flavor_deletion_on_dcp(cls, flavor_id):
@ -254,8 +258,8 @@ class FmsBaseOrmTest(base.BaseOrmTest):
@classmethod @classmethod
def _validate_flv_geometry_on_lcp(cls, flavor_id, post_body): def _validate_flv_geometry_on_lcp(cls, flavor_id, post_body):
flv = cls.flavors_client.show_flavor(flavor_id)["flavor"] flv = cls.flavors_client.show_flavor(flavor_id)["flavor"]
return bool(flv["vcpus"] == int(post_body["vcpus"]) and return bool(flv["vcpus"] == int(post_body["vcpus"])
flv["ram"] == post_body["ram"] and and flv["ram"] == post_body["ram"]
flv["swap"] == int(post_body["swap"]) and and flv["swap"] == int(post_body["swap"])
flv["disk"] == int(post_body["disk"]) and and flv["disk"] == int(post_body["disk"])
flv["ephemeral"] == post_body["ephemeral"]) and flv["ephemeral"] == post_body["ephemeral"])

View File

@ -17,7 +17,6 @@ import copy
import random import random
import uuid import uuid
from oslo_concurrency import lockutils
from ranger_tempest_plugin import data_utils as orm_data_utils from ranger_tempest_plugin import data_utils as orm_data_utils
from ranger_tempest_plugin.tests.api import cms_base from ranger_tempest_plugin.tests.api import cms_base
from tempest import config from tempest import config
@ -27,8 +26,6 @@ from tempest.lib import exceptions
import testtools import testtools
CONF = config.CONF CONF = config.CONF
PREFIX = 'ranger'
SYNC = lockutils.synchronized_with_prefix(PREFIX)
class TestTempestCms(cms_base.CmsBaseOrmTest): class TestTempestCms(cms_base.CmsBaseOrmTest):
@ -322,6 +319,7 @@ class TestTempestCms(cms_base.CmsBaseOrmTest):
_, body = self.client.get_customer(test_cust_name) _, body = self.client.get_customer(test_cust_name)
self.assertIn(test_customer_id, body['uuid']) self.assertIn(test_customer_id, body['uuid'])
@cms_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('c2f4e842-c0c3-4747-9b10-e86c25fe8283') @decorators.idempotent_id('c2f4e842-c0c3-4747-9b10-e86c25fe8283')
@ -344,6 +342,7 @@ class TestTempestCms(cms_base.CmsBaseOrmTest):
self.assertEqual(body['status'], 'Success') self.assertEqual(body['status'], 'Success')
self.assertEqual(len(body['regions']), 2) self.assertEqual(len(body['regions']), 2)
@cms_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('5e6f1b6b-bff1-4d30-ba97-4ff66ad47ba9') @decorators.idempotent_id('5e6f1b6b-bff1-4d30-ba97-4ff66ad47ba9')
@ -364,7 +363,7 @@ class TestTempestCms(cms_base.CmsBaseOrmTest):
self.assertEqual(body['status'], 'Success') self.assertEqual(body['status'], 'Success')
self.assertEqual(len(body['regions']), 2) self.assertEqual(len(body['regions']), 2)
@SYNC('customer') @cms_base.base.SYNC('customer')
@decorators.idempotent_id('43785f87-27d5-408d-997f-de602caeb698') @decorators.idempotent_id('43785f87-27d5-408d-997f-de602caeb698')
def test_replace_customer(self): def test_replace_customer(self):
customer = self._get_bare_customer_params() customer = self._get_bare_customer_params()
@ -399,14 +398,17 @@ class TestTempestCms(cms_base.CmsBaseOrmTest):
self.assertRaises(exceptions.NotFound, self.client.get_customer, self.assertRaises(exceptions.NotFound, self.client.get_customer,
test_customer_id) test_customer_id)
@cms_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test')
@decorators.idempotent_id('b8493b3f-e64d-448e-a965-b0eeff415981') @decorators.idempotent_id('b8493b3f-e64d-448e-a965-b0eeff415981')
def test_customer_while_region_down(self): def test_customer_while_region_down(self):
# create region with status down # create region with status down
self._update_region(CONF.identity.region, status={'status': 'down'}) self._update_region(CONF.ranger.alt_region, status={'status': 'down'})
# create customer within that newly created region # create customer within that newly created region
cust_body = self._get_customer_params() cust_body = self._get_customer_params()
cust_body['regions'][0]['name'] = CONF.identity.region cust_body['regions'][0]['name'] = CONF.ranger.alt_region
self.assertRaises(exceptions.BadRequest, self.assertRaises(exceptions.BadRequest,
self.client.create_customer, **cust_body) self.client.create_customer, **cust_body)
@ -515,6 +517,7 @@ class TestTempestCms(cms_base.CmsBaseOrmTest):
self.assertDictEqual(self.setup_customer['defaultQuotas'][0], self.assertDictEqual(self.setup_customer['defaultQuotas'][0],
body['defaultQuotas'][0]) body['defaultQuotas'][0])
@cms_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('4bd683c6-1e1c-4f5d-9f42-6af8ac0b2183') @decorators.idempotent_id('4bd683c6-1e1c-4f5d-9f42-6af8ac0b2183')

View File

@ -27,7 +27,7 @@ import testtools
CONF = config.CONF CONF = config.CONF
PREFIX = 'ranger' PREFIX = 'flavor'
SYNC = lockutils.synchronized_with_prefix(PREFIX) SYNC = lockutils.synchronized_with_prefix(PREFIX)
@ -327,7 +327,7 @@ class TestTempestFms(fms_base.FmsBaseOrmTest):
# ensure there is at least a tag # ensure there is at least a tag
_, tag_body = self.client.get_tags(self.flavor['id']) _, tag_body = self.client.get_tags(self.flavor['id'])
restore_tags = tag_body restore_tags = tag_body
self.assertTrue(True if tag_body.get("tags") else False) self.assertTrue(bool(tag_body.get("tags")))
# test delete_all_tags command - run get_tag again and confirm # test delete_all_tags command - run get_tag again and confirm
# that the tag dict is now empty # that the tag dict is now empty
@ -339,7 +339,7 @@ class TestTempestFms(fms_base.FmsBaseOrmTest):
# restore deleted tags # restore deleted tags
self._exec_tags_function(self.flavor['id'], restore_tags, 'add', None) self._exec_tags_function(self.flavor['id'], restore_tags, 'add', None)
@SYNC('alt_region') @fms_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('ec74d68f-b42a-41a8-9685-ff5eca25ea0c') @decorators.idempotent_id('ec74d68f-b42a-41a8-9685-ff5eca25ea0c')
@ -539,7 +539,7 @@ class TestTempestFms(fms_base.FmsBaseOrmTest):
self.assertEqual(flavor_details["status"], "Success") self.assertEqual(flavor_details["status"], "Success")
self.assertEqual(flavor_details["disk"], disk) self.assertEqual(flavor_details["disk"], disk)
@SYNC('alt_region') @fms_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('997ca03c-4176-4632-a0c9-7e943b03306c') @decorators.idempotent_id('997ca03c-4176-4632-a0c9-7e943b03306c')
@ -559,7 +559,7 @@ class TestTempestFms(fms_base.FmsBaseOrmTest):
assert self.region or self.alt_region in \ assert self.region or self.alt_region in \
flavor['regions'][1]['name'] flavor['regions'][1]['name']
@SYNC('alt_region') @fms_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('ea2a618e-bd53-460b-bde5-01ea20b417c9') @decorators.idempotent_id('ea2a618e-bd53-460b-bde5-01ea20b417c9')
@ -574,7 +574,7 @@ class TestTempestFms(fms_base.FmsBaseOrmTest):
self.assertEqual(flavor_details['status'], 'Success') self.assertEqual(flavor_details['status'], 'Success')
self.assertEqual(len(flavor['regions']), 2) self.assertEqual(len(flavor['regions']), 2)
@SYNC('alt_region') @fms_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('06c81b29-85b6-4edf-ab89-3877c49e23bc') @decorators.idempotent_id('06c81b29-85b6-4edf-ab89-3877c49e23bc')
@ -601,7 +601,9 @@ class TestTempestFms(fms_base.FmsBaseOrmTest):
self.assertEqual(flavor_details['status'], 'Success') self.assertEqual(flavor_details['status'], 'Success')
self.assertEqual(flavor['id'], post_body['id']) self.assertEqual(flavor['id'], post_body['id'])
@SYNC('alt_region') @fms_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test')
@decorators.idempotent_id('37f1909f-3ba2-403c-ba0c-0a11b869d6a1') @decorators.idempotent_id('37f1909f-3ba2-403c-ba0c-0a11b869d6a1')
def test_flavor_while_region_down(self): def test_flavor_while_region_down(self):
# update region to status down # update region to status down

View File

@ -25,7 +25,7 @@ import testtools
CONF = config.CONF CONF = config.CONF
PREFIX = 'ranger' PREFIX = 'alt_region'
SYNC = lockutils.synchronized_with_prefix(PREFIX) SYNC = lockutils.synchronized_with_prefix(PREFIX)
@ -296,7 +296,7 @@ class TestTempestIms(ims_base.ImsBaseOrmTest):
self.assertRaises(exceptions.NotFound, self.client.get_image, self.assertRaises(exceptions.NotFound, self.client.get_image,
image['id']) image['id'])
@SYNC('alt_region') @ims_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('e642fa39-1b69-4d17-8bd1-aee90ea042a3') @decorators.idempotent_id('e642fa39-1b69-4d17-8bd1-aee90ea042a3')
@ -472,7 +472,7 @@ class TestTempestIms(ims_base.ImsBaseOrmTest):
image = body["image"] image = body["image"]
self.assertEqual(image['id'], post_body['id']) self.assertEqual(image['id'], post_body['id'])
@SYNC('alt_region') @ims_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('7ae78584-55af-45cb-a4a2-b28cc679699e') @decorators.idempotent_id('7ae78584-55af-45cb-a4a2-b28cc679699e')
@ -502,7 +502,7 @@ class TestTempestIms(ims_base.ImsBaseOrmTest):
self.assertEqual(image['status'], 'Success') self.assertEqual(image['status'], 'Success')
self.assertEqual(len(image['regions']), 2) self.assertEqual(len(image['regions']), 2)
@SYNC('alt_region') @ims_base.base.SYNC('alt_region', external=True)
@testtools.skipUnless(CONF.ranger.alt_region_available, @testtools.skipUnless(CONF.ranger.alt_region_available,
'Alt region not provided, skipping this test') 'Alt region not provided, skipping this test')
@decorators.idempotent_id('73c97918-2081-4f42-9c1e-6fd7a9fb8735') @decorators.idempotent_id('73c97918-2081-4f42-9c1e-6fd7a9fb8735')

View File

@ -2,6 +2,7 @@
# of appearance. Changing the order has an impact on the overall integration # of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later. # process, which may cause wedges in the gate later.
flake8>=3.8
hacking>=0.12.0,<0.13 # Apache-2.0 hacking>=0.12.0,<0.13 # Apache-2.0
coverage>=4.0,!=4.4 # Apache-2.0 coverage>=4.0,!=4.4 # Apache-2.0
oslo.config>=5.2.0 # Apache-2.0 oslo.config>=5.2.0 # Apache-2.0
@ -10,6 +11,7 @@ oslo.log>=3.36.0 # Apache-2.0
oslosphinx>=4.7.0 # Apache-2.0 oslosphinx>=4.7.0 # Apache-2.0
oslotest>=1.10.0 # Apache-2.0 oslotest>=1.10.0 # Apache-2.0
oslo.utils>=3.33.0 # Apache-2.0 oslo.utils>=3.33.0 # Apache-2.0
pylint >= 2.5.3
python-subunit>=0.0.18 # Apache-2.0/BSD python-subunit>=0.0.18 # Apache-2.0/BSD
reno>=1.8.0 # Apache-2.0 reno>=1.8.0 # Apache-2.0
requests>=2.10.0 requests>=2.10.0