Source code for volume.admin.test_volume_quota_classes

# Copyright 2017 FiberHome Telecommunication Technologies CO.,LTD
# All Rights Reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    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

from tempest.api.volume import base
from tempest.common import identity
from tempest.common import tempest_fixtures as fixtures
from tempest import config
from tempest.lib.common.utils import data_utils
from tempest.lib import decorators

CONF = config.CONF
LOG = logging.getLogger(__name__)
QUOTA_KEYS = ['gigabytes', 'snapshots', 'volumes', 'backups',
              'backup_gigabytes', 'per_volume_gigabytes']


[docs] class VolumeQuotaClassesTest(base.BaseVolumeAdminTest): """Test volume quota classes""" def setUp(self): # Note(jeremy.zhang): All test cases in this class need to externally # lock on doing anything with default quota values. self.useFixture(fixtures.LockFixture('volume_quotas')) super(VolumeQuotaClassesTest, self).setUp() def _restore_default_quotas(self, original_defaults): LOG.debug("Restoring volume quota class defaults") self.admin_quota_classes_client.update_quota_class_set( 'default', **original_defaults)
[docs] @decorators.idempotent_id('abb9198e-67d0-4b09-859f-4f4a1418f176') def test_show_default_quota(self): """Test showing default volume quota class set""" # response body is validated by schema default_quotas = self.admin_quota_classes_client.show_quota_class_set( 'default')['quota_class_set'] self.assertEqual('default', default_quotas.pop('id'))
[docs] @decorators.idempotent_id('a7644c63-2669-467a-b00e-452dd5c5397b') def test_update_default_quota(self): """Test updating default volume quota class set Check current project and new project's default quota are updated to the provided one. """ LOG.debug("Get the current default quota class values") body = self.admin_quota_classes_client.show_quota_class_set( 'default')['quota_class_set'] # 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} # 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: 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', **update_kwargs)['quota_class_set'] self.assertThat(update_body.items(), matchers.ContainsAll(update_kwargs.items())) # 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(update_kwargs.items())) # Verify a new project's default quotas. project_name = data_utils.rand_name( prefix=CONF.resource_name_prefix, name='quota_class_tenant') description = data_utils.rand_name( prefix=CONF.resource_name_prefix, name='desc_') project_id = identity.identity_utils(self.os_admin).create_project( name=project_name, description=description)['id'] self.addCleanup(identity.identity_utils(self.os_admin).delete_project, project_id) default_quotas = self.admin_quotas_client.show_default_quota_set( project_id)['quota_set'] self.assertThat(default_quotas.items(), matchers.ContainsAll(update_kwargs.items()))