Fix availability zones tests

Whenever creating a resource in an availability zone,
the positive test cases must ensure that the AZ supports
the characteristics needed by the resource.

Add a new helper method to filter AZs by share types
to facilitate such a check.

Change-Id: Ia721c434ceae5f02fc51bef5ec48b356da0de98d
Closes-Bug: #1811739
This commit is contained in:
Goutham Pacha Ravi 2019-01-14 23:16:23 -08:00
parent 89262f6721
commit 839c98b2c1
8 changed files with 87 additions and 40 deletions

View File

@ -41,14 +41,16 @@ class ReplicationAdminTest(base.BaseSharesMixedTest):
raise share_exceptions.ShareReplicationTypeException(
replication_type=cls.replication_type
)
cls.zones = cls.get_availability_zones(client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
extra_specs = {"replication_type": cls.replication_type}
cls.share_type = cls._create_share_type(extra_specs)
cls.share_type_id = cls.share_type['id']
cls.zones = cls.get_availability_zones_matching_share_type(
cls.share_type, client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
# Create share with above share_type
cls.share = cls.create_share(share_type_id=cls.share_type_id,
availability_zone=cls.share_zone,
@ -71,7 +73,8 @@ class ReplicationAdminTest(base.BaseSharesMixedTest):
raise self.skipException(
msg % ','.join(constants.REPLICATION_PROMOTION_CHOICES))
share = self.create_share(
share_type_id=self.share_type_id, client=self.admin_client)
share_type_id=self.share_type_id, client=self.admin_client,
availability_zone=self.share_zone)
original_replica = self.admin_client.list_share_replicas(
share_id=share['id'])[0]

View File

@ -42,14 +42,17 @@ class ReplicationAdminTest(base.BaseSharesMixedTest):
raise share_exceptions.ShareReplicationTypeException(
replication_type=cls.replication_type
)
cls.zones = cls.get_availability_zones(client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
# create share type
extra_specs = {"replication_type": cls.replication_type}
cls.share_type = cls._create_share_type(extra_specs)
cls.share_type_id = cls.share_type['id']
cls.zones = cls.get_availability_zones_matching_share_type(
cls.share_type, client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
# create share
cls.share = cls.create_share(size=CONF.share.share_size + 1,
share_type_id=cls.share_type_id,

View File

@ -687,18 +687,56 @@ class BaseSharesTest(test.BaseTestCase):
return sg_snapshot
@classmethod
def get_availability_zones(cls, client=None):
def get_availability_zones(cls, client=None, backends=None):
"""List the availability zones for "manila-share" services
that are currently in "up" state.
"""
client = client or cls.shares_v2_client
client = client or cls.admin_shares_v2_client
backends = (
'|'.join(['^%s$' % backend for backend in backends])
if backends else '.*'
)
cls.services = client.list_services()
zones = [service['zone'] for service in cls.services if
service['binary'] == "manila-share" and
service['state'] == 'up']
service['binary'] == 'manila-share' and
service['state'] == 'up' and
re.search(backends, service['host'])]
return zones
@classmethod
def get_pools_matching_share_type(cls, share_type, client=None):
client = client or cls.admin_shares_v2_client
if utils.is_microversion_supported('2.23'):
return client.list_pools(
search_opts={'share_type': share_type['id']})['pools']
pools = client.list_pools(detail=True)['pools']
share_type = client.get_share_type(share_type['id'])['share_type']
extra_specs = {}
for k, v in share_type['extra_specs'].items():
extra_specs[k] = (
True if six.text_type(v).lower() == 'true'
else False if six.text_type(v).lower() == 'false' else v
)
return [
pool for pool in pools if all(y in pool['capabilities'].items()
for y in extra_specs.items())
]
@classmethod
def get_availability_zones_matching_share_type(cls, share_type,
client=None):
client = client or cls.admin_shares_v2_client
pools_matching_share_type = cls.get_pools_matching_share_type(
share_type, client=client)
backends_matching_share_type = set(
[pool['name'].split("#")[0] for pool in pools_matching_share_type]
)
azs = cls.get_availability_zones(backends=backends_matching_share_type)
return azs
def get_pools_for_replication_domain(self):
# Get the list of pools for the replication domain
pools = self.admin_client.list_pools(detail=True)['pools']

View File

@ -46,10 +46,6 @@ class ReplicationTest(base.BaseSharesMixedTest):
raise share_exceptions.ShareReplicationTypeException(
replication_type=cls.replication_type
)
cls.zones = cls.get_availability_zones(client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
cls.extra_specs = cls.add_extra_specs_to_dict(
{"replication_type": cls.replication_type})
share_type = cls.create_share_type(
@ -57,6 +53,12 @@ class ReplicationTest(base.BaseSharesMixedTest):
extra_specs=cls.extra_specs,
client=cls.admin_client)
cls.share_type = share_type["share_type"]
cls.zones = cls.get_availability_zones_matching_share_type(
cls.share_type, client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
# Create share with above share_type
cls.creation_data = {'kwargs': {
'share_type_id': cls.share_type['id'],
@ -309,10 +311,6 @@ class ReplicationActionsTest(base.BaseSharesMixedTest):
raise share_exceptions.ShareReplicationTypeException(
replication_type=cls.replication_type
)
cls.zones = cls.get_availability_zones(client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
cls.extra_specs = cls.add_extra_specs_to_dict(
{"replication_type": cls.replication_type})
share_type = cls.create_share_type(
@ -320,6 +318,12 @@ class ReplicationActionsTest(base.BaseSharesMixedTest):
extra_specs=cls.extra_specs,
client=cls.admin_client)
cls.share_type = share_type["share_type"]
cls.zones = cls.get_availability_zones_matching_share_type(
cls.share_type, client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
# Create share with above share_type
cls.creation_data = {'kwargs': {
'share_type_id': cls.share_type['id'],

View File

@ -42,15 +42,17 @@ class ReplicationNegativeTest(base.BaseSharesMixedTest):
raise share_exceptions.ShareReplicationTypeException(
replication_type=cls.replication_type
)
cls.zones = cls.get_availability_zones(client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
# create share type
extra_specs = {"replication_type": cls.replication_type}
cls.share_type = cls._create_share_type(extra_specs)
cls.share_type_id = cls.share_type['id']
cls.zones = cls.get_availability_zones_matching_share_type(
cls.share_type, client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
# create share with above share_type
cls.share1, cls.instance_id1 = cls._create_share_get_instance()

View File

@ -42,19 +42,16 @@ class ReplicationSnapshotTest(base.BaseSharesMixedTest):
raise share_exceptions.ShareReplicationTypeException(
replication_type=cls.replication_type
)
cls.zones = cls.get_availability_zones(client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
# create share type
extra_specs = {"replication_type": cls.replication_type}
cls.share_type = cls._create_share_type(extra_specs)
cls.share_type_id = cls.share_type['id']
# Create share with above share_type
cls.creation_data = {'kwargs': {
'share_type_id': cls.share_type_id,
'availability_zone': cls.share_zone,
}}
cls.zones = cls.get_availability_zones_matching_share_type(
cls.share_type, client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
@tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
def test_snapshot_after_share_replica(self):

View File

@ -78,10 +78,6 @@ class RevertToSnapshotTest(base.BaseSharesMixedTest):
raise share_exceptions.ShareReplicationTypeException(
replication_type=cls.replication_type
)
cls.zones = cls.get_availability_zones(client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
extra_specs = cls.add_extra_specs_to_dict({
"replication_type": cls.replication_type,
constants.REVERT_TO_SNAPSHOT_SUPPORT: True,
@ -91,6 +87,10 @@ class RevertToSnapshotTest(base.BaseSharesMixedTest):
extra_specs=extra_specs,
client=cls.admin_client)
cls.replicated_share_type = share_type["share_type"]
cls.zones = cls.get_availability_zones_matching_share_type(
cls.replicated_share_type, client=cls.admin_client)
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
@tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
@ddt.data(

View File

@ -195,7 +195,8 @@ class ShareGroupsTest(base.BaseSharesMixedTest):
def test_create_sg_and_share_specifying_az(self, where_specify_az):
# Get list of existing availability zones, at least one always
# should exist
azs = self.shares_v2_client.list_availability_zones()
azs = self.get_availability_zones_matching_share_type(
self.share_type)
sg_kwargs = {
'share_group_type_id': self.share_group_type_id,
@ -204,7 +205,7 @@ class ShareGroupsTest(base.BaseSharesMixedTest):
'cleanup_in_class': False,
}
if where_specify_az in ('sg', 'sg_and_share'):
sg_kwargs['availability_zone'] = azs[0]['name']
sg_kwargs['availability_zone'] = azs[0]
# Create share group
share_group = self.create_share_group(**sg_kwargs)
@ -215,10 +216,9 @@ class ShareGroupsTest(base.BaseSharesMixedTest):
self.assertIn('availability_zone', share_group)
if where_specify_az in ('sg', 'sg_and_share'):
self.assertEqual(azs[0]['name'], share_group['availability_zone'])
self.assertEqual(azs[0], share_group['availability_zone'])
else:
self.assertIn(
share_group['availability_zone'], [az['name'] for az in azs])
self.assertIn(share_group['availability_zone'], azs)
# Test 'consistent_snapshot_support' as part of 2.33 API change
self.assertIn('consistent_snapshot_support', share_group)
@ -233,7 +233,7 @@ class ShareGroupsTest(base.BaseSharesMixedTest):
'experimental': True,
}
if where_specify_az == 'sg_and_share':
s_kwargs['availability_zone'] = azs[0]['name']
s_kwargs['availability_zone'] = azs[0]
# Create share in share group
share = self.create_share(**s_kwargs)