Fix for volume quota class test

When 'VolumeQuotaClassesTest.test_update_default_quota' is tested in race
with other tests which involve creating/deleting volume types or updating
default quotas of volume type, it may cause the assertions in
'test_update_default_quota' failed. This patch is to solve this problem.

Change-Id: I6566519ad0b19f62a3ac7365de33ed3fc62517d7
Closes-Bug: 1687488
This commit is contained in:
jeremy.zhang 2017-05-26 12:58:14 +08:00
parent 7203f58c97
commit dc407d683d

View File

@ -13,6 +13,8 @@
# License for the specific language governing permissions and limitations
# under the License.
import random
from oslo_log import log as logging
from testtools import matchers
@ -53,31 +55,41 @@ class VolumeQuotaClassesTest(base.BaseVolumeAdminTest):
LOG.debug("Get the current default quota class values")
body = self.admin_quota_classes_client.show_quota_class_set(
'default')['quota_class_set']
body.pop('id')
# Restore the defaults when the test is done
self.addCleanup(self._restore_default_quotas, body.copy())
# Note(jeremyZ) Only include specified quota keys to avoid the conflict
# that other tests may create/delete volume types or update volume
# type's default quotas in concurrency running.
update_kwargs = {key: body[key] for key in body if key in QUOTA_KEYS}
# Increment some of the values for updating the default quota class.
# For safety, only items with value >= 0 will be updated, and items
# with value < 0 (-1 means unlimited) will be ignored.
for quota, default in body.items():
# Restore the defaults when the test is done.
self.addCleanup(self._restore_default_quotas, update_kwargs.copy())
# Note(jeremyZ) Increment some of the values for updating the default
# quota class. For safety, only items with value >= 0 will be updated,
# and items with value < 0 (-1 means unlimited) will be ignored.
for quota, default in update_kwargs.items():
if default >= 0:
body[quota] = default + 1
update_kwargs[quota] = default + 1
# Create a volume type for updating default quotas class.
volume_type_name = self.create_volume_type()['name']
for key in ['volumes', 'snapshots', 'gigabytes']:
update_kwargs['%s_%s' % (key, volume_type_name)] = \
random.randint(1, 10)
LOG.debug("Update limits for the default quota class set")
update_body = self.admin_quota_classes_client.update_quota_class_set(
'default', **body)['quota_class_set']
'default', **update_kwargs)['quota_class_set']
self.assertThat(update_body.items(),
matchers.ContainsAll(body.items()))
matchers.ContainsAll(update_kwargs.items()))
# Verify current project's default quotas
# Verify current project's default quotas.
default_quotas = self.admin_quotas_client.show_default_quota_set(
self.os_admin.credentials.tenant_id)['quota_set']
self.assertThat(default_quotas.items(),
matchers.ContainsAll(body.items()))
matchers.ContainsAll(update_kwargs.items()))
# Verify a new project's default quotas
# Verify a new project's default quotas.
project_name = data_utils.rand_name('quota_class_tenant')
description = data_utils.rand_name('desc_')
project_id = self.identity_utils.create_project(
@ -86,4 +98,4 @@ class VolumeQuotaClassesTest(base.BaseVolumeAdminTest):
default_quotas = self.admin_quotas_client.show_default_quota_set(
project_id)['quota_set']
self.assertThat(default_quotas.items(),
matchers.ContainsAll(body.items()))
matchers.ContainsAll(update_kwargs.items()))