Update share quota functional tests
- Updates the existent functional tests to accomplish with the two new quotas for share replicas. - Add new functional tests for share replicas Depends-On: I8ba7bc6f167c28d6c169b2187d0e1bda7cad3f69 Change-Id: I9c5df364bca666bbc32fb10b100a38f78888088a
This commit is contained in:
parent
9d229583b0
commit
ca4dd9f101
|
@ -30,7 +30,7 @@ ShareGroup = [
|
||||||
help="The minimum api microversion is configured to be the "
|
help="The minimum api microversion is configured to be the "
|
||||||
"value of the minimum microversion supported by Manila."),
|
"value of the minimum microversion supported by Manila."),
|
||||||
cfg.StrOpt("max_api_microversion",
|
cfg.StrOpt("max_api_microversion",
|
||||||
default="2.52",
|
default="2.53",
|
||||||
help="The maximum api microversion is configured to be the "
|
help="The maximum api microversion is configured to be the "
|
||||||
"value of the latest microversion supported by Manila."),
|
"value of the latest microversion supported by Manila."),
|
||||||
cfg.StrOpt("region",
|
cfg.StrOpt("region",
|
||||||
|
|
|
@ -1032,8 +1032,9 @@ class SharesV2Client(shares_client.SharesClient):
|
||||||
snapshots=None, gigabytes=None, snapshot_gigabytes=None,
|
snapshots=None, gigabytes=None, snapshot_gigabytes=None,
|
||||||
share_networks=None,
|
share_networks=None,
|
||||||
share_groups=None, share_group_snapshots=None,
|
share_groups=None, share_group_snapshots=None,
|
||||||
force=True, share_type=None,
|
force=True, share_type=None, share_replicas=None,
|
||||||
url=None, version=LATEST_MICROVERSION):
|
replica_gigabytes=None, url=None,
|
||||||
|
version=LATEST_MICROVERSION):
|
||||||
if url is None:
|
if url is None:
|
||||||
url = self._get_quotas_url(version)
|
url = self._get_quotas_url(version)
|
||||||
url += '/%s' % tenant_id
|
url += '/%s' % tenant_id
|
||||||
|
@ -1056,6 +1057,10 @@ class SharesV2Client(shares_client.SharesClient):
|
||||||
put_body["share_groups"] = share_groups
|
put_body["share_groups"] = share_groups
|
||||||
if share_group_snapshots is not None:
|
if share_group_snapshots is not None:
|
||||||
put_body["share_group_snapshots"] = share_group_snapshots
|
put_body["share_group_snapshots"] = share_group_snapshots
|
||||||
|
if share_replicas is not None:
|
||||||
|
put_body["share_replicas"] = share_replicas
|
||||||
|
if replica_gigabytes is not None:
|
||||||
|
put_body["replica_gigabytes"] = replica_gigabytes
|
||||||
put_body = json.dumps({"quota_set": put_body})
|
put_body = json.dumps({"quota_set": put_body})
|
||||||
|
|
||||||
resp, body = self.put(url, put_body, version=version)
|
resp, body = self.put(url, put_body, version=version)
|
||||||
|
|
|
@ -26,6 +26,8 @@ from manila_tempest_tests import utils
|
||||||
CONF = config.CONF
|
CONF = config.CONF
|
||||||
PRE_SHARE_GROUPS_MICROVERSION = "2.39"
|
PRE_SHARE_GROUPS_MICROVERSION = "2.39"
|
||||||
SHARE_GROUPS_MICROVERSION = "2.40"
|
SHARE_GROUPS_MICROVERSION = "2.40"
|
||||||
|
PRE_SHARE_REPLICA_QUOTAS_MICROVERSION = "2.52"
|
||||||
|
SHARE_REPLICA_QUOTAS_MICROVERSION = "2.53"
|
||||||
|
|
||||||
|
|
||||||
@ddt.ddt
|
@ddt.ddt
|
||||||
|
@ -54,6 +56,9 @@ class SharesAdminQuotasTest(base.BaseSharesAdminTest):
|
||||||
if utils.is_microversion_supported(SHARE_GROUPS_MICROVERSION):
|
if utils.is_microversion_supported(SHARE_GROUPS_MICROVERSION):
|
||||||
self.assertGreater(int(quotas["share_groups"]), -2)
|
self.assertGreater(int(quotas["share_groups"]), -2)
|
||||||
self.assertGreater(int(quotas["share_group_snapshots"]), -2)
|
self.assertGreater(int(quotas["share_group_snapshots"]), -2)
|
||||||
|
if utils.share_replica_quotas_are_supported():
|
||||||
|
self.assertGreater(int(quotas["share_replicas"]), -2)
|
||||||
|
self.assertGreater(int(quotas["replica_gigabytes"]), -2)
|
||||||
|
|
||||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
def test_show_quotas(self):
|
def test_show_quotas(self):
|
||||||
|
@ -66,6 +71,9 @@ class SharesAdminQuotasTest(base.BaseSharesAdminTest):
|
||||||
if utils.is_microversion_supported(SHARE_GROUPS_MICROVERSION):
|
if utils.is_microversion_supported(SHARE_GROUPS_MICROVERSION):
|
||||||
self.assertGreater(int(quotas["share_groups"]), -2)
|
self.assertGreater(int(quotas["share_groups"]), -2)
|
||||||
self.assertGreater(int(quotas["share_group_snapshots"]), -2)
|
self.assertGreater(int(quotas["share_group_snapshots"]), -2)
|
||||||
|
if utils.share_replica_quotas_are_supported():
|
||||||
|
self.assertGreater(int(quotas["share_replicas"]), -2)
|
||||||
|
self.assertGreater(int(quotas["replica_gigabytes"]), -2)
|
||||||
|
|
||||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
def test_show_quotas_for_user(self):
|
def test_show_quotas_for_user(self):
|
||||||
|
@ -79,6 +87,9 @@ class SharesAdminQuotasTest(base.BaseSharesAdminTest):
|
||||||
if utils.is_microversion_supported(SHARE_GROUPS_MICROVERSION):
|
if utils.is_microversion_supported(SHARE_GROUPS_MICROVERSION):
|
||||||
self.assertGreater(int(quotas["share_groups"]), -2)
|
self.assertGreater(int(quotas["share_groups"]), -2)
|
||||||
self.assertGreater(int(quotas["share_group_snapshots"]), -2)
|
self.assertGreater(int(quotas["share_group_snapshots"]), -2)
|
||||||
|
if utils.share_replica_quotas_are_supported():
|
||||||
|
self.assertGreater(int(quotas["share_replicas"]), -2)
|
||||||
|
self.assertGreater(int(quotas["replica_gigabytes"]), -2)
|
||||||
|
|
||||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
@base.skip_if_microversion_not_supported(PRE_SHARE_GROUPS_MICROVERSION)
|
@base.skip_if_microversion_not_supported(PRE_SHARE_GROUPS_MICROVERSION)
|
||||||
|
@ -99,6 +110,17 @@ class SharesAdminQuotasTest(base.BaseSharesAdminTest):
|
||||||
for key in ('share_groups', 'share_group_snapshots'):
|
for key in ('share_groups', 'share_group_snapshots'):
|
||||||
self.assertNotIn(key, quotas)
|
self.assertNotIn(key, quotas)
|
||||||
|
|
||||||
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
|
@base.skip_if_microversion_not_supported(
|
||||||
|
PRE_SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
def test_show_replica_quotas_for_user_using_too_old_microversion(self):
|
||||||
|
quotas = self.shares_v2_client.show_quotas(
|
||||||
|
self.tenant_id, self.user_id,
|
||||||
|
version=PRE_SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
|
||||||
|
for key in('share_replicas', 'replica_gigabytes'):
|
||||||
|
self.assertNotIn(key, quotas)
|
||||||
|
|
||||||
@ddt.data(
|
@ddt.data(
|
||||||
('id', True),
|
('id', True),
|
||||||
('name', False),
|
('name', False),
|
||||||
|
@ -107,6 +129,10 @@ class SharesAdminQuotasTest(base.BaseSharesAdminTest):
|
||||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
@base.skip_if_microversion_lt("2.39")
|
@base.skip_if_microversion_lt("2.39")
|
||||||
def test_show_share_type_quotas(self, share_type_key, is_st_public):
|
def test_show_share_type_quotas(self, share_type_key, is_st_public):
|
||||||
|
# Check if the used microversion supports 'share_replica' and
|
||||||
|
# 'replica_gigabytes' quotas
|
||||||
|
replica_quotas_supported = utils.share_replica_quotas_are_supported()
|
||||||
|
|
||||||
# Create share type
|
# Create share type
|
||||||
share_type = self.create_share_type(
|
share_type = self.create_share_type(
|
||||||
data_utils.rand_name("tempest-manila"),
|
data_utils.rand_name("tempest-manila"),
|
||||||
|
@ -117,6 +143,12 @@ class SharesAdminQuotasTest(base.BaseSharesAdminTest):
|
||||||
if 'share_type' in share_type:
|
if 'share_type' in share_type:
|
||||||
share_type = share_type['share_type']
|
share_type = share_type['share_type']
|
||||||
|
|
||||||
|
keys = ['shares', 'gigabytes', 'snapshots', 'snapshot_gigabytes']
|
||||||
|
|
||||||
|
if replica_quotas_supported:
|
||||||
|
keys.append('share_replicas')
|
||||||
|
keys.append('replica_gigabytes')
|
||||||
|
|
||||||
# Get current project quotas
|
# Get current project quotas
|
||||||
p_quotas = self.shares_v2_client.show_quotas(self.tenant_id)
|
p_quotas = self.shares_v2_client.show_quotas(self.tenant_id)
|
||||||
|
|
||||||
|
@ -125,7 +157,7 @@ class SharesAdminQuotasTest(base.BaseSharesAdminTest):
|
||||||
self.tenant_id, share_type=share_type[share_type_key])
|
self.tenant_id, share_type=share_type[share_type_key])
|
||||||
|
|
||||||
# Share type quotas have values equal to project's
|
# Share type quotas have values equal to project's
|
||||||
for key in ('shares', 'gigabytes', 'snapshots', 'snapshot_gigabytes'):
|
for key in keys:
|
||||||
self.assertEqual(st_quotas[key], p_quotas[key])
|
self.assertEqual(st_quotas[key], p_quotas[key])
|
||||||
|
|
||||||
# Verify that we do not have share groups related quotas
|
# Verify that we do not have share groups related quotas
|
||||||
|
@ -215,6 +247,31 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
self.tenant_id, self.user_id, **{quota_key: new_quota})
|
self.tenant_id, self.user_id, **{quota_key: new_quota})
|
||||||
self.assertEqual(new_quota, int(updated[quota_key]))
|
self.assertEqual(new_quota, int(updated[quota_key]))
|
||||||
|
|
||||||
|
@ddt.data(("share_replicas", False),
|
||||||
|
("share_replicas", True),
|
||||||
|
("replica_gigabytes", False),
|
||||||
|
("replica_gigabytes", True),
|
||||||
|
)
|
||||||
|
@ddt.unpack
|
||||||
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
|
@base.skip_if_microversion_not_supported(SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
def test_update_user_quota_replica_related(self, quota_key, use_user_id):
|
||||||
|
kwargs = {}
|
||||||
|
|
||||||
|
# Update the kwargs with user_id in case the user_id need to be
|
||||||
|
# specified in the request
|
||||||
|
kwargs.update({'user_id': self.user_id}) if use_user_id else None
|
||||||
|
quotas = self.client.show_quotas(self.tenant_id, **kwargs)
|
||||||
|
new_quota = int(quotas[quota_key]) - 1
|
||||||
|
|
||||||
|
# Add the updated quota into the kwargs
|
||||||
|
kwargs.update({quota_key: new_quota})
|
||||||
|
|
||||||
|
# Set the new quota based on tenant or tenant and user_id
|
||||||
|
updated = self.client.update_quotas(
|
||||||
|
self.tenant_id, **kwargs)
|
||||||
|
self.assertEqual(new_quota, int(updated[quota_key]))
|
||||||
|
|
||||||
@ddt.data(
|
@ddt.data(
|
||||||
('id', True),
|
('id', True),
|
||||||
('name', False),
|
('name', False),
|
||||||
|
@ -223,14 +280,22 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
@base.skip_if_microversion_lt("2.39")
|
@base.skip_if_microversion_lt("2.39")
|
||||||
def test_update_share_type_quota(self, share_type_key, is_st_public):
|
def test_update_share_type_quota(self, share_type_key, is_st_public):
|
||||||
|
# Check if the used microversion supports 'share_replica' and
|
||||||
|
# 'replica_gigabytes' quotas
|
||||||
|
replica_quotas_supported = utils.share_replica_quotas_are_supported()
|
||||||
share_type = self._create_share_type()
|
share_type = self._create_share_type()
|
||||||
|
|
||||||
# Get current quotas
|
# Get current quotas
|
||||||
quotas = self.client.show_quotas(
|
quotas = self.client.show_quotas(
|
||||||
self.tenant_id, share_type=share_type[share_type_key])
|
self.tenant_id, share_type=share_type[share_type_key])
|
||||||
|
quota_keys = ['shares', 'gigabytes', 'snapshots', 'snapshot_gigabytes']
|
||||||
|
|
||||||
|
if replica_quotas_supported:
|
||||||
|
quota_keys.append('share_replicas')
|
||||||
|
quota_keys.append('replica_gigabytes')
|
||||||
|
|
||||||
# Update quotas
|
# Update quotas
|
||||||
for q in ('shares', 'gigabytes', 'snapshots', 'snapshot_gigabytes'):
|
for q in quota_keys:
|
||||||
new_quota = int(quotas[q]) - 1
|
new_quota = int(quotas[q]) - 1
|
||||||
|
|
||||||
# Set new quota
|
# Set new quota
|
||||||
|
@ -242,7 +307,7 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
current_quotas = self.client.show_quotas(
|
current_quotas = self.client.show_quotas(
|
||||||
self.tenant_id, share_type=share_type[share_type_key])
|
self.tenant_id, share_type=share_type[share_type_key])
|
||||||
|
|
||||||
for q in ('shares', 'gigabytes', 'snapshots', 'snapshot_gigabytes'):
|
for q in quota_keys:
|
||||||
self.assertEqual(int(quotas[q]) - 1, current_quotas[q])
|
self.assertEqual(int(quotas[q]) - 1, current_quotas[q])
|
||||||
|
|
||||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
|
@ -368,6 +433,9 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
data["share_groups"] = int(custom["share_groups"]) + 2
|
data["share_groups"] = int(custom["share_groups"]) + 2
|
||||||
data["share_group_snapshots"] = (
|
data["share_group_snapshots"] = (
|
||||||
int(custom["share_group_snapshots"]) + 2)
|
int(custom["share_group_snapshots"]) + 2)
|
||||||
|
if utils.share_replica_quotas_are_supported():
|
||||||
|
data["share_replicas"] = int(custom["share_replicas"]) + 2
|
||||||
|
data["replica_gigabytes"] = int(custom["replica_gigabytes"]) + 2
|
||||||
|
|
||||||
# set new quota
|
# set new quota
|
||||||
updated = self.client.update_quotas(self.tenant_id, **data)
|
updated = self.client.update_quotas(self.tenant_id, **data)
|
||||||
|
@ -385,6 +453,11 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
data["share_group_snapshots"],
|
data["share_group_snapshots"],
|
||||||
int(updated["share_group_snapshots"]))
|
int(updated["share_group_snapshots"]))
|
||||||
|
if utils.share_replica_quotas_are_supported():
|
||||||
|
self.assertEqual(
|
||||||
|
data["share_replicas"], int(updated["share_replicas"]))
|
||||||
|
self.assertEqual(
|
||||||
|
data["replica_gigabytes"], int(updated["replica_gigabytes"]))
|
||||||
|
|
||||||
# Reset customized quotas
|
# Reset customized quotas
|
||||||
self.client.reset_quotas(self.tenant_id)
|
self.client.reset_quotas(self.tenant_id)
|
||||||
|
@ -406,6 +479,21 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
int(default["share_group_snapshots"]),
|
int(default["share_group_snapshots"]),
|
||||||
int(reseted["share_group_snapshots"]))
|
int(reseted["share_group_snapshots"]))
|
||||||
|
if utils.share_replica_quotas_are_supported():
|
||||||
|
self.assertEqual(
|
||||||
|
int(default["share_replicas"]), int(reseted["share_replicas"]))
|
||||||
|
self.assertEqual(
|
||||||
|
int(default["replica_gigabytes"]),
|
||||||
|
int(reseted["replica_gigabytes"]))
|
||||||
|
|
||||||
|
def _get_new_replica_quota_values(self, default_quotas, value_to_set):
|
||||||
|
new_values = {
|
||||||
|
'share_replicas': int(
|
||||||
|
default_quotas['share_replicas']) + value_to_set,
|
||||||
|
'replica_gigabytes': int(
|
||||||
|
default_quotas['replica_gigabytes']) + value_to_set
|
||||||
|
}
|
||||||
|
return new_values
|
||||||
|
|
||||||
@ddt.data(
|
@ddt.data(
|
||||||
('id', True),
|
('id', True),
|
||||||
|
@ -416,17 +504,34 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
@base.skip_if_microversion_lt("2.39")
|
@base.skip_if_microversion_lt("2.39")
|
||||||
def test_reset_share_type_quotas(self, share_type_key, is_st_public):
|
def test_reset_share_type_quotas(self, share_type_key, is_st_public):
|
||||||
share_type = self._create_share_type()
|
share_type = self._create_share_type()
|
||||||
|
quota_keys = ['shares', 'snapshots', 'gigabytes', 'snapshot_gigabytes']
|
||||||
|
|
||||||
# get default_quotas
|
# get default_quotas
|
||||||
default_quotas = self.client.default_quotas(self.tenant_id)
|
default_quotas = self.client.default_quotas(self.tenant_id)
|
||||||
|
|
||||||
|
kwargs = {}
|
||||||
|
|
||||||
|
# check if the replica_gigabytes and share_replicas quotas are
|
||||||
|
# supported
|
||||||
|
if utils.share_replica_quotas_are_supported():
|
||||||
|
kwargs.update(self._get_new_replica_quota_values(
|
||||||
|
default_quotas, 5))
|
||||||
|
quota_keys.append('share_replicas')
|
||||||
|
quota_keys.append('replica_gigabytes')
|
||||||
|
|
||||||
# set new quota for project
|
# set new quota for project
|
||||||
updated_p_quota = self.client.update_quotas(
|
updated_p_quota = self.client.update_quotas(
|
||||||
self.tenant_id,
|
self.tenant_id,
|
||||||
shares=int(default_quotas['shares']) + 5,
|
shares=int(default_quotas['shares']) + 5,
|
||||||
snapshots=int(default_quotas['snapshots']) + 5,
|
snapshots=int(default_quotas['snapshots']) + 5,
|
||||||
gigabytes=int(default_quotas['gigabytes']) + 5,
|
gigabytes=int(default_quotas['gigabytes']) + 5,
|
||||||
snapshot_gigabytes=int(default_quotas['snapshot_gigabytes']) + 5)
|
snapshot_gigabytes=int(default_quotas['snapshot_gigabytes']) + 5,
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
if utils.share_replica_quotas_are_supported():
|
||||||
|
kwargs.update(self._get_new_replica_quota_values(
|
||||||
|
default_quotas, 3))
|
||||||
|
|
||||||
# set new quota for project
|
# set new quota for project
|
||||||
self.client.update_quotas(
|
self.client.update_quotas(
|
||||||
|
@ -435,7 +540,9 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
shares=int(default_quotas['shares']) + 3,
|
shares=int(default_quotas['shares']) + 3,
|
||||||
snapshots=int(default_quotas['snapshots']) + 3,
|
snapshots=int(default_quotas['snapshots']) + 3,
|
||||||
gigabytes=int(default_quotas['gigabytes']) + 3,
|
gigabytes=int(default_quotas['gigabytes']) + 3,
|
||||||
snapshot_gigabytes=int(default_quotas['snapshot_gigabytes']) + 3)
|
snapshot_gigabytes=int(default_quotas['snapshot_gigabytes']) + 3,
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
|
||||||
# reset share type quotas
|
# reset share type quotas
|
||||||
self.client.reset_quotas(
|
self.client.reset_quotas(
|
||||||
|
@ -445,7 +552,7 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
current_p_quota = self.client.show_quotas(self.tenant_id)
|
current_p_quota = self.client.show_quotas(self.tenant_id)
|
||||||
current_st_quota = self.client.show_quotas(
|
current_st_quota = self.client.show_quotas(
|
||||||
self.tenant_id, share_type=share_type[share_type_key])
|
self.tenant_id, share_type=share_type[share_type_key])
|
||||||
for key in ('shares', 'snapshots', 'gigabytes', 'snapshot_gigabytes'):
|
for key in quota_keys:
|
||||||
self.assertEqual(updated_p_quota[key], current_p_quota[key])
|
self.assertEqual(updated_p_quota[key], current_p_quota[key])
|
||||||
|
|
||||||
# Default share type quotas are current project quotas
|
# Default share type quotas are current project quotas
|
||||||
|
@ -561,6 +668,30 @@ class SharesAdminQuotasUpdateTest(base.BaseSharesAdminTest):
|
||||||
|
|
||||||
self.assertEqual(-1, quotas.get('share_group_snapshots'))
|
self.assertEqual(-1, quotas.get('share_group_snapshots'))
|
||||||
|
|
||||||
|
@ddt.data("share_replicas", "replica_gigabytes")
|
||||||
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
|
@utils.skip_if_microversion_not_supported(
|
||||||
|
SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
def test_unlimited_quota_for_replica_quotas(self, quota_key):
|
||||||
|
kwargs = {quota_key: -1}
|
||||||
|
self.client.update_quotas(self.tenant_id, **kwargs)
|
||||||
|
|
||||||
|
quotas = self.client.show_quotas(self.tenant_id)
|
||||||
|
|
||||||
|
self.assertEqual(-1, quotas.get(quota_key))
|
||||||
|
|
||||||
|
@ddt.data("share_replicas", "replica_gigabytes")
|
||||||
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
|
@utils.skip_if_microversion_not_supported(
|
||||||
|
SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
def test_unlimited_user_quota_for_replica_quotas(self, quota_key):
|
||||||
|
kwargs = {quota_key: -1}
|
||||||
|
self.client.update_quotas(self.tenant_id, self.user_id, **kwargs)
|
||||||
|
|
||||||
|
quotas = self.client.show_quotas(self.tenant_id, self.user_id)
|
||||||
|
|
||||||
|
self.assertEqual(-1, quotas.get(quota_key))
|
||||||
|
|
||||||
@ddt.data(11, -1)
|
@ddt.data(11, -1)
|
||||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
def test_update_user_quotas_bigger_than_project_quota(self, user_quota):
|
def test_update_user_quotas_bigger_than_project_quota(self, user_quota):
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import ddt
|
import ddt
|
||||||
|
import manila_tempest_tests.tests.api.test_replication_negative as rep_neg_test
|
||||||
from tempest import config
|
from tempest import config
|
||||||
from tempest.lib import exceptions as lib_exc
|
from tempest.lib import exceptions as lib_exc
|
||||||
import testtools
|
import testtools
|
||||||
|
@ -25,6 +26,8 @@ from manila_tempest_tests import utils
|
||||||
CONF = config.CONF
|
CONF = config.CONF
|
||||||
PRE_SHARE_GROUPS_MICROVERSION = "2.39"
|
PRE_SHARE_GROUPS_MICROVERSION = "2.39"
|
||||||
SHARE_GROUPS_MICROVERSION = "2.40"
|
SHARE_GROUPS_MICROVERSION = "2.40"
|
||||||
|
PRE_SHARE_REPLICA_QUOTAS_MICROVERSION = "2.52"
|
||||||
|
SHARE_REPLICA_QUOTAS_MICROVERSION = "2.53"
|
||||||
|
|
||||||
|
|
||||||
@ddt.ddt
|
@ddt.ddt
|
||||||
|
@ -88,6 +91,21 @@ class SharesAdminQuotasNegativeTest(base.BaseSharesAdminTest):
|
||||||
lib_exc.BadRequest,
|
lib_exc.BadRequest,
|
||||||
client.update_quotas, client.tenant_id, **kwargs)
|
client.update_quotas, client.tenant_id, **kwargs)
|
||||||
|
|
||||||
|
@ddt.data(
|
||||||
|
{"share_replicas": -2},
|
||||||
|
{"replica_gigabytes": -2},
|
||||||
|
)
|
||||||
|
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
|
||||||
|
@utils.skip_if_microversion_not_supported(
|
||||||
|
SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
def test_update_replica_quotas_wrong_data(self, kwargs):
|
||||||
|
# -1 is acceptable value as unlimited
|
||||||
|
|
||||||
|
client = self.get_client_with_isolated_creds(client_version='2')
|
||||||
|
self.assertRaises(
|
||||||
|
lib_exc.BadRequest,
|
||||||
|
client.update_quotas, client.tenant_id, **kwargs)
|
||||||
|
|
||||||
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
|
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
|
||||||
def test_create_share_with_size_bigger_than_quota(self):
|
def test_create_share_with_size_bigger_than_quota(self):
|
||||||
quotas = self.shares_client.show_quotas(
|
quotas = self.shares_client.show_quotas(
|
||||||
|
@ -196,6 +214,26 @@ class SharesAdminQuotasNegativeTest(base.BaseSharesAdminTest):
|
||||||
force=False,
|
force=False,
|
||||||
share_networks=bigger_value)
|
share_networks=bigger_value)
|
||||||
|
|
||||||
|
@ddt.data("share_replicas", "replica_gigabytes")
|
||||||
|
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
|
||||||
|
@utils.skip_if_microversion_not_supported(
|
||||||
|
SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
def test_try_set_user_quota_replicas_bigger_than_tenant_quota(self, key):
|
||||||
|
client = self.get_client_with_isolated_creds(client_version='2')
|
||||||
|
|
||||||
|
# get current quotas for tenant
|
||||||
|
tenant_quotas = client.show_quotas(client.tenant_id)
|
||||||
|
|
||||||
|
# try set user quota for snapshots bigger than tenant quota
|
||||||
|
bigger_value = int(tenant_quotas[key]) + 2
|
||||||
|
kwargs = {key: bigger_value}
|
||||||
|
self.assertRaises(lib_exc.BadRequest,
|
||||||
|
client.update_quotas,
|
||||||
|
client.tenant_id,
|
||||||
|
client.user_id,
|
||||||
|
force=False,
|
||||||
|
**kwargs)
|
||||||
|
|
||||||
@ddt.data(
|
@ddt.data(
|
||||||
('quota-sets', '2.0', 'show_quotas'),
|
('quota-sets', '2.0', 'show_quotas'),
|
||||||
('quota-sets', '2.0', 'default_quotas'),
|
('quota-sets', '2.0', 'default_quotas'),
|
||||||
|
@ -302,6 +340,24 @@ class SharesAdminQuotasNegativeTest(base.BaseSharesAdminTest):
|
||||||
client.tenant_id,
|
client.tenant_id,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
|
|
||||||
|
@ddt.data("share_replicas", "replica_gigabytes")
|
||||||
|
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
|
||||||
|
@base.skip_if_microversion_not_supported(SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
def test_share_replica_quotas_using_too_old_microversion(self, quota_key):
|
||||||
|
client = self.get_client_with_isolated_creds(client_version='2')
|
||||||
|
tenant_quotas = client.show_quotas(
|
||||||
|
client.tenant_id, version=SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
kwargs = {
|
||||||
|
"version": PRE_SHARE_REPLICA_QUOTAS_MICROVERSION,
|
||||||
|
quota_key: tenant_quotas[quota_key],
|
||||||
|
}
|
||||||
|
|
||||||
|
self.assertRaises(
|
||||||
|
lib_exc.BadRequest,
|
||||||
|
client.update_quotas,
|
||||||
|
client.tenant_id,
|
||||||
|
**kwargs)
|
||||||
|
|
||||||
@ddt.data('show', 'reset', 'update')
|
@ddt.data('show', 'reset', 'update')
|
||||||
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
|
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
|
||||||
@base.skip_if_microversion_lt("2.38")
|
@base.skip_if_microversion_lt("2.38")
|
||||||
|
@ -366,3 +422,77 @@ class SharesAdminQuotasNegativeTest(base.BaseSharesAdminTest):
|
||||||
self.assertRaises(lib_exc.OverLimit,
|
self.assertRaises(lib_exc.OverLimit,
|
||||||
self.create_share,
|
self.create_share,
|
||||||
share_type_id=self.share_type_id)
|
share_type_id=self.share_type_id)
|
||||||
|
|
||||||
|
|
||||||
|
@ddt.ddt
|
||||||
|
class ReplicaQuotasNegativeTest(rep_neg_test.ReplicationNegativeBase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def skip_checks(cls):
|
||||||
|
super(ReplicaQuotasNegativeTest, cls).skip_checks()
|
||||||
|
if not CONF.share.run_quota_tests:
|
||||||
|
msg = "Quota tests are disabled."
|
||||||
|
raise cls.skipException(msg)
|
||||||
|
|
||||||
|
utils.check_skip_if_microversion_lt(SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
|
||||||
|
def _modify_quotas_for_test(self, quota_key, new_limit):
|
||||||
|
kwargs = {quota_key: new_limit}
|
||||||
|
|
||||||
|
# Get the original quota values
|
||||||
|
original_quota = self.admin_client.show_quotas(self.tenant_id)
|
||||||
|
|
||||||
|
# Update the current quotas
|
||||||
|
self.admin_client.update_quotas(self.tenant_id, **kwargs)
|
||||||
|
|
||||||
|
# Save the previous value
|
||||||
|
old_quota_values = {quota_key: original_quota[quota_key]}
|
||||||
|
|
||||||
|
# Get the updated quotas and add a cleanup
|
||||||
|
updated_quota = self.admin_client.show_quotas(self.tenant_id)
|
||||||
|
self.addCleanup(self.admin_client.update_quotas,
|
||||||
|
self.tenant_id,
|
||||||
|
**old_quota_values)
|
||||||
|
|
||||||
|
# Make sure that the new value was properly set
|
||||||
|
self.assertEqual(new_limit, updated_quota[quota_key])
|
||||||
|
|
||||||
|
@tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
|
||||||
|
@ddt.data(('share_replicas', 2), ('replica_gigabytes', None))
|
||||||
|
@ddt.unpack
|
||||||
|
def test_create_replica_over_replica_limit(self, quota_key, new_limit):
|
||||||
|
# Define the quota values to be updated
|
||||||
|
new_limit = (int(self.share1['size'] * 2)
|
||||||
|
if quota_key == 'replica_gigabytes' else new_limit)
|
||||||
|
|
||||||
|
# Create an inactive share replica
|
||||||
|
self.create_share_replica(
|
||||||
|
self.share1["id"], self.replica_zone, cleanup_in_class=False)
|
||||||
|
|
||||||
|
# Modify the quota limit for this test
|
||||||
|
self._modify_quotas_for_test(quota_key, new_limit)
|
||||||
|
|
||||||
|
# Make sure that the request to create a third one will fail
|
||||||
|
self.assertRaises(lib_exc.OverLimit,
|
||||||
|
self.create_share_replica,
|
||||||
|
self.share1['id'],
|
||||||
|
availability_zone=self.replica_zone)
|
||||||
|
|
||||||
|
@testtools.skipUnless(
|
||||||
|
CONF.share.run_extend_tests,
|
||||||
|
"Share extend tests are disabled.")
|
||||||
|
@tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
|
||||||
|
def test_extend_replica_over_limit(self):
|
||||||
|
# Define the quota values to be updated
|
||||||
|
quota_key = 'replica_gigabytes'
|
||||||
|
|
||||||
|
# Modify the quota limit for this test
|
||||||
|
self._modify_quotas_for_test(quota_key, new_limit=self.share1['size'])
|
||||||
|
|
||||||
|
new_size = self.share1['size'] + 1
|
||||||
|
|
||||||
|
# Make sure that the request to create a third one will fail
|
||||||
|
self.assertRaises(lib_exc.OverLimit,
|
||||||
|
self.shares_v2_client.extend_share,
|
||||||
|
self.share1['id'],
|
||||||
|
new_size)
|
||||||
|
|
|
@ -15,12 +15,15 @@
|
||||||
|
|
||||||
import ddt
|
import ddt
|
||||||
import itertools
|
import itertools
|
||||||
|
from manila_tempest_tests import utils
|
||||||
from tempest import config
|
from tempest import config
|
||||||
from testtools import testcase as tc
|
from testtools import testcase as tc
|
||||||
|
|
||||||
from manila_tempest_tests.tests.api import base
|
from manila_tempest_tests.tests.api import base
|
||||||
|
|
||||||
CONF = config.CONF
|
CONF = config.CONF
|
||||||
|
PRE_SHARE_REPLICAS_MICROVERSION = "2.52"
|
||||||
|
SHARE_REPLICAS_MICROVERSION = "2.53"
|
||||||
|
|
||||||
|
|
||||||
@ddt.ddt
|
@ddt.ddt
|
||||||
|
@ -39,35 +42,49 @@ class SharesQuotasTest(base.BaseSharesTest):
|
||||||
@ddt.data('shares_client', 'shares_v2_client')
|
@ddt.data('shares_client', 'shares_v2_client')
|
||||||
def test_default_quotas(self, client_name):
|
def test_default_quotas(self, client_name):
|
||||||
quotas = getattr(self, client_name).default_quotas(self.tenant_id)
|
quotas = getattr(self, client_name).default_quotas(self.tenant_id)
|
||||||
|
uses_v2_client = client_name == 'shares_v2_client'
|
||||||
self.assertGreater(int(quotas["gigabytes"]), -2)
|
self.assertGreater(int(quotas["gigabytes"]), -2)
|
||||||
self.assertGreater(int(quotas["snapshot_gigabytes"]), -2)
|
self.assertGreater(int(quotas["snapshot_gigabytes"]), -2)
|
||||||
self.assertGreater(int(quotas["shares"]), -2)
|
self.assertGreater(int(quotas["shares"]), -2)
|
||||||
self.assertGreater(int(quotas["snapshots"]), -2)
|
self.assertGreater(int(quotas["snapshots"]), -2)
|
||||||
self.assertGreater(int(quotas["share_networks"]), -2)
|
self.assertGreater(int(quotas["share_networks"]), -2)
|
||||||
|
if utils.share_replica_quotas_are_supported() and uses_v2_client:
|
||||||
|
self.assertGreater(int(quotas["share_replicas"]), -2)
|
||||||
|
self.assertGreater(int(quotas["replica_gigabytes"]), -2)
|
||||||
|
|
||||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
@ddt.data('shares_client', 'shares_v2_client')
|
@ddt.data('shares_client', 'shares_v2_client')
|
||||||
def test_show_quotas(self, client_name):
|
def test_show_quotas(self, client_name):
|
||||||
quotas = getattr(self, client_name).show_quotas(self.tenant_id)
|
quotas = getattr(self, client_name).show_quotas(self.tenant_id)
|
||||||
|
uses_v2_client = client_name == 'shares_v2_client'
|
||||||
self.assertGreater(int(quotas["gigabytes"]), -2)
|
self.assertGreater(int(quotas["gigabytes"]), -2)
|
||||||
self.assertGreater(int(quotas["snapshot_gigabytes"]), -2)
|
self.assertGreater(int(quotas["snapshot_gigabytes"]), -2)
|
||||||
self.assertGreater(int(quotas["shares"]), -2)
|
self.assertGreater(int(quotas["shares"]), -2)
|
||||||
self.assertGreater(int(quotas["snapshots"]), -2)
|
self.assertGreater(int(quotas["snapshots"]), -2)
|
||||||
self.assertGreater(int(quotas["share_networks"]), -2)
|
self.assertGreater(int(quotas["share_networks"]), -2)
|
||||||
|
if utils.share_replica_quotas_are_supported() and uses_v2_client:
|
||||||
|
self.assertGreater(int(quotas["share_replicas"]), -2)
|
||||||
|
self.assertGreater(int(quotas["replica_gigabytes"]), -2)
|
||||||
|
|
||||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
@ddt.data('shares_client', 'shares_v2_client')
|
@ddt.data('shares_client', 'shares_v2_client')
|
||||||
def test_show_quotas_for_user(self, client_name):
|
def test_show_quotas_for_user(self, client_name):
|
||||||
quotas = getattr(self, client_name).show_quotas(
|
quotas = getattr(self, client_name).show_quotas(
|
||||||
self.tenant_id, self.user_id)
|
self.tenant_id, self.user_id)
|
||||||
|
uses_v2_client = client_name == 'shares_v2_client'
|
||||||
self.assertGreater(int(quotas["gigabytes"]), -2)
|
self.assertGreater(int(quotas["gigabytes"]), -2)
|
||||||
self.assertGreater(int(quotas["snapshot_gigabytes"]), -2)
|
self.assertGreater(int(quotas["snapshot_gigabytes"]), -2)
|
||||||
self.assertGreater(int(quotas["shares"]), -2)
|
self.assertGreater(int(quotas["shares"]), -2)
|
||||||
self.assertGreater(int(quotas["snapshots"]), -2)
|
self.assertGreater(int(quotas["snapshots"]), -2)
|
||||||
self.assertGreater(int(quotas["share_networks"]), -2)
|
self.assertGreater(int(quotas["share_networks"]), -2)
|
||||||
|
if utils.share_replica_quotas_are_supported() and uses_v2_client:
|
||||||
|
self.assertGreater(int(quotas["share_replicas"]), -2)
|
||||||
|
self.assertGreater(int(quotas["replica_gigabytes"]), -2)
|
||||||
|
|
||||||
@ddt.data(
|
@ddt.data(
|
||||||
*itertools.product(set(("2.25", CONF.share.max_api_microversion)),
|
*itertools.product(set(("2.25", CONF.share.max_api_microversion)),
|
||||||
|
(True, False)),
|
||||||
|
*itertools.product(set(("2.53", CONF.share.max_api_microversion)),
|
||||||
(True, False))
|
(True, False))
|
||||||
)
|
)
|
||||||
@ddt.unpack
|
@ddt.unpack
|
||||||
|
@ -75,14 +92,27 @@ class SharesQuotasTest(base.BaseSharesTest):
|
||||||
@base.skip_if_microversion_not_supported("2.25")
|
@base.skip_if_microversion_not_supported("2.25")
|
||||||
def test_show_quotas_detail(self, microversion, with_user):
|
def test_show_quotas_detail(self, microversion, with_user):
|
||||||
quota_args = {"tenant_id": self.tenant_id, "version": microversion, }
|
quota_args = {"tenant_id": self.tenant_id, "version": microversion, }
|
||||||
|
keys = ['gigabytes', 'snapshot_gigabytes', 'shares',
|
||||||
|
'snapshots', 'share_networks']
|
||||||
|
if utils.is_microversion_ge(microversion, SHARE_REPLICAS_MICROVERSION):
|
||||||
|
keys.append('share_replicas')
|
||||||
|
keys.append('replica_gigabytes')
|
||||||
if with_user:
|
if with_user:
|
||||||
quota_args.update({"user_id": self.user_id})
|
quota_args.update({"user_id": self.user_id})
|
||||||
quotas = self.shares_v2_client.detail_quotas(**quota_args)
|
quotas = self.shares_v2_client.detail_quotas(**quota_args)
|
||||||
quota_keys = list(quotas.keys())
|
quota_keys = list(quotas.keys())
|
||||||
for outer in ('gigabytes', 'snapshot_gigabytes', 'shares',
|
for outer in keys:
|
||||||
'snapshots', 'share_networks'):
|
|
||||||
self.assertIn(outer, quota_keys)
|
self.assertIn(outer, quota_keys)
|
||||||
outer_keys = list(quotas[outer].keys())
|
outer_keys = list(quotas[outer].keys())
|
||||||
for inner in ('in_use', 'limit', 'reserved'):
|
for inner in ('in_use', 'limit', 'reserved'):
|
||||||
self.assertIn(inner, outer_keys)
|
self.assertIn(inner, outer_keys)
|
||||||
self.assertGreater(int(quotas[outer][inner]), -2)
|
self.assertGreater(int(quotas[outer][inner]), -2)
|
||||||
|
|
||||||
|
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||||
|
@base.skip_if_microversion_not_supported(PRE_SHARE_REPLICAS_MICROVERSION)
|
||||||
|
def test_quota_detail_2_52_no_share_replica_quotas(self):
|
||||||
|
quota_args = {"tenant_id": self.tenant_id,
|
||||||
|
"version": PRE_SHARE_REPLICAS_MICROVERSION}
|
||||||
|
quotas = self.shares_v2_client.detail_quotas(**quota_args)
|
||||||
|
self.assertNotIn('share_replicas', quotas.keys())
|
||||||
|
self.assertNotIn('replica_gigabytes', quotas.keys())
|
||||||
|
|
|
@ -28,11 +28,10 @@ CONF = config.CONF
|
||||||
_MIN_SUPPORTED_MICROVERSION = '2.11'
|
_MIN_SUPPORTED_MICROVERSION = '2.11'
|
||||||
|
|
||||||
|
|
||||||
class ReplicationNegativeTest(base.BaseSharesMixedTest):
|
class ReplicationNegativeBase(base.BaseSharesMixedTest):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def skip_checks(cls):
|
def skip_checks(cls):
|
||||||
super(ReplicationNegativeTest, cls).skip_checks()
|
super(ReplicationNegativeBase, cls).skip_checks()
|
||||||
if not CONF.share.run_replication_tests:
|
if not CONF.share.run_replication_tests:
|
||||||
raise cls.skipException('Replication tests are disabled.')
|
raise cls.skipException('Replication tests are disabled.')
|
||||||
|
|
||||||
|
@ -40,7 +39,7 @@ class ReplicationNegativeTest(base.BaseSharesMixedTest):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def resource_setup(cls):
|
def resource_setup(cls):
|
||||||
super(ReplicationNegativeTest, cls).resource_setup()
|
super(ReplicationNegativeBase, cls).resource_setup()
|
||||||
cls.admin_client = cls.admin_shares_v2_client
|
cls.admin_client = cls.admin_shares_v2_client
|
||||||
cls.replication_type = CONF.share.backend_replication_type
|
cls.replication_type = CONF.share.backend_replication_type
|
||||||
cls.multitenancy_enabled = (
|
cls.multitenancy_enabled = (
|
||||||
|
@ -80,6 +79,9 @@ class ReplicationNegativeTest(base.BaseSharesMixedTest):
|
||||||
instance_id = share_instances[0]["id"]
|
instance_id = share_instances[0]["id"]
|
||||||
return share, instance_id
|
return share, instance_id
|
||||||
|
|
||||||
|
|
||||||
|
class ReplicationNegativeTest(ReplicationNegativeBase):
|
||||||
|
|
||||||
def _is_replication_type_promotable(self):
|
def _is_replication_type_promotable(self):
|
||||||
if (self.replication_type
|
if (self.replication_type
|
||||||
not in constants.REPLICATION_PROMOTION_CHOICES):
|
not in constants.REPLICATION_PROMOTION_CHOICES):
|
||||||
|
|
|
@ -23,6 +23,7 @@ import testtools
|
||||||
|
|
||||||
CONF = config.CONF
|
CONF = config.CONF
|
||||||
SHARE_NETWORK_SUBNETS_MICROVERSION = '2.51'
|
SHARE_NETWORK_SUBNETS_MICROVERSION = '2.51'
|
||||||
|
SHARE_REPLICA_QUOTAS_MICROVERSION = "2.53"
|
||||||
|
|
||||||
|
|
||||||
def get_microversion_as_tuple(microversion_str):
|
def get_microversion_as_tuple(microversion_str):
|
||||||
|
@ -202,6 +203,10 @@ def share_network_subnets_are_supported():
|
||||||
return is_microversion_supported(SHARE_NETWORK_SUBNETS_MICROVERSION)
|
return is_microversion_supported(SHARE_NETWORK_SUBNETS_MICROVERSION)
|
||||||
|
|
||||||
|
|
||||||
|
def share_replica_quotas_are_supported():
|
||||||
|
return is_microversion_supported(SHARE_REPLICA_QUOTAS_MICROVERSION)
|
||||||
|
|
||||||
|
|
||||||
def share_network_get_default_subnet(share_network):
|
def share_network_get_default_subnet(share_network):
|
||||||
return next((
|
return next((
|
||||||
subnet for subnet in share_network.get('share_network_subnets', [])
|
subnet for subnet in share_network.get('share_network_subnets', [])
|
||||||
|
|
Loading…
Reference in New Issue