Exemplo n.º 1
0
    def test_transfer_accept_over_quota(self, mock_notify, mock_quota_voltype,
                                        mock_quota_reserve):
        svc = self.start_service('volume', host='test_host')
        self.addCleanup(svc.stop)
        tx_api = transfer_api.API()
        volume = utils.create_volume(self.ctxt,
                                     volume_type_id=fake.VOLUME_TYPE_ID,
                                     updated_at=self.updated_at)
        transfer = tx_api.create(self.ctxt, volume.id, 'Description')
        fake_overs = ['volumes_lvmdriver-3']
        fake_quotas = {'gigabytes_lvmdriver-3': 1, 'volumes_lvmdriver-3': 10}
        fake_usages = {
            'gigabytes_lvmdriver-3': {
                'reserved': 0,
                'in_use': 1
            },
            'volumes_lvmdriver-3': {
                'reserved': 0,
                'in_use': 1
            }
        }

        mock_quota_reserve.side_effect = exception.OverQuota(
            overs=fake_overs, quotas=fake_quotas, usages=fake_usages)

        self.ctxt.user_id = fake.USER2_ID
        self.ctxt.project_id = fake.PROJECT2_ID
        self.assertRaises(exception.VolumeLimitExceeded, tx_api.accept,
                          self.ctxt, transfer['id'], transfer['auth_key'])
        # notification of transfer.accept is sent only after quota check
        # passes
        self.assertEqual(2, mock_notify.call_count)
Exemplo n.º 2
0
    def test_create_group_failed_update_quota(self, mock_volume_types_get,
                                              mock_group_type_get, mock_group,
                                              mock_group_quota_reserve):
        mock_volume_types_get.return_value = [{'id': fake.VOLUME_TYPE_ID}]
        mock_group_type_get.return_value = {'id': fake.GROUP_TYPE_ID}
        fake_overs = ['groups']
        fake_quotas = {'groups': 1}
        fake_usages = {'groups': {'reserved': 0, 'in_use': 1}}
        mock_group_quota_reserve.side_effect = exception.OverQuota(
            overs=fake_overs, quotas=fake_quotas, usages=fake_usages)
        name = "test_group"
        description = "this is a test group"
        grp = utils.create_group(self.ctxt,
                                 group_type_id=fake.GROUP_TYPE_ID,
                                 volume_type_ids=[fake.VOLUME_TYPE_ID],
                                 availability_zone='nova',
                                 host=None,
                                 name=name,
                                 description=description,
                                 status=fields.GroupStatus.CREATING)
        mock_group.return_value = grp

        self.assertRaises(exception.GroupLimitExceeded,
                          self.group_api.create,
                          self.ctxt,
                          name,
                          description,
                          "fake-grouptype-name", [fake.VOLUME_TYPE_ID],
                          availability_zone='nova')
Exemplo n.º 3
0
    def test_transfer_accept_over_quota_check_limit(self, mock_quota_limit):
        svc = self.start_service('volume', host='test_host')
        self.addCleanup(svc.stop)
        tx_api = transfer_api.API()
        volume = utils.create_volume(self.ctxt,
                                     volume_type_id=fake.VOLUME_TYPE_ID,
                                     updated_at=self.updated_at)
        transfer = tx_api.create(self.ctxt, volume.id, 'Description')
        fake_overs = ['per_volume_gigabytes']
        fake_quotas = {'per_volume_gigabytes': 1}
        fake_usages = {}

        mock_quota_limit.side_effect = exception.OverQuota(overs=fake_overs,
                                                           quotas=fake_quotas,
                                                           usages=fake_usages)

        self.ctxt.user_id = fake.USER2_ID
        self.ctxt.project_id = fake.PROJECT2_ID
        with mock.patch('cinder.volume.volume_utils.notify_about_volume_usage'
                        ) as mock_notify:
            self.assertRaises(exception.VolumeSizeExceedsLimit, tx_api.accept,
                              self.ctxt, transfer['id'], transfer['auth_key'])
            # notification of transfer.accept is sent only after quota check
            # passes
            self.assertEqual(0, mock_notify.call_count)
    def test_transfer_accept_over_quota(self, mock_notify, mock_quota_voltype,
                                        mock_quota_reserve):
        svc = self.start_service('volume', host='test_host')
        self.addCleanup(svc.stop)
        tx_api = transfer_api.API()
        volume = utils.create_volume(self.ctxt,
                                     volume_type_id='12345',
                                     updated_at=self.updated_at)
        transfer = tx_api.create(self.ctxt, volume.id, 'Description')
        fake_overs = ['volumes_lvmdriver-3']
        fake_quotas = {'gigabytes_lvmdriver-3': 1, 'volumes_lvmdriver-3': 10}
        fake_usages = {
            'gigabytes_lvmdriver-3': {
                'reserved': 0,
                'in_use': 1
            },
            'volumes_lvmdriver-3': {
                'reserved': 0,
                'in_use': 1
            }
        }

        mock_quota_reserve.side_effect = exception.OverQuota(
            overs=fake_overs, quotas=fake_quotas, usages=fake_usages)

        self.ctxt.user_id = 'new_user_id'
        self.ctxt.project_id = 'new_project_id'
        self.assertRaises(exception.VolumeLimitExceeded, tx_api.accept,
                          self.ctxt, transfer['id'], transfer['auth_key'])
Exemplo n.º 5
0
 def test_retype_over_quota(self):
     # Should fail if going over quota for new type
     exc = exception.OverQuota(overs=['gigabytes'],
                               quotas={'gigabytes': 20},
                               usages={'gigabytes': {'reserved': 5,
                                                     'in_use': 15}})
     self.retype_mocks['reserve'].side_effect = exc
     self._retype_volume_exec(413)
Exemplo n.º 6
0
    def limit_check(self, context, resources, values, project_id=None):
        """Check simple quota limits.

        For limits--those quotas for which there is no usage
        synchronization function--this method checks that a set of
        proposed values are permitted by the limit restriction.

        This method will raise a QuotaResourceUnknown exception if a
        given resource is unknown or if it is not a simple limit
        resource.

        If any of the proposed values is over the defined quota, an
        OverQuota exception will be raised with the sorted list of the
        resources which are too high.  Otherwise, the method returns
        nothing.

        :param context: The request context, for access checks.
        :param resources: A dictionary of the registered resources.
        :param values: A dictionary of the values to check against the
                       quota.
        :param project_id: Specify the project_id if current context
                           is admin and admin wants to impact on
                           common user's tenant.
        """

        # Ensure no value is less than zero
        unders = [key for key, val in values.items() if val < 0]
        if unders:
            raise exception.InvalidQuotaValue(unders=sorted(unders))

        # If project_id is None, then we use the project_id in context
        if project_id is None:
            project_id = context.project_id

        # Get the applicable quotas
        quotas = self._get_quotas(context,
                                  resources,
                                  values.keys(),
                                  has_sync=False,
                                  project_id=project_id)
        # Check the quotas and construct a list of the resources that
        # would be put over limit by the desired values
        overs = [
            key for key, val in values.items()
            if quotas[key] >= 0 and quotas[key] < val
        ]
        if overs:
            raise exception.OverQuota(overs=sorted(overs),
                                      quotas=quotas,
                                      usages={})
Exemplo n.º 7
0
    def _process_reserve_over_quota(self, overs, usages, quotas,
                                    expected_ex,
                                    resource='volumes'):
        ctxt = context.get_admin_context()
        ctxt.project_id = 'fake'
        size = 1
        kwargs = {'overs': overs,
                  'usages': usages,
                  'quotas': quotas}
        exc = exception.OverQuota(**kwargs)

        self.assertRaises(expected_ex,
                          quota_utils.process_reserve_over_quota,
                          ctxt, exc,
                          resource=resource,
                          size=size)
Exemplo n.º 8
0
from cinder.tests.unit.api.v2 import fakes as v2_fakes
from cinder.tests.unit.brick import fake_lvm
from cinder.tests.unit import fake_constants as fake
from cinder.tests.unit import utils as tests_utils
from cinder.tests.unit import volume as base
import cinder.volume

QUOTAS = quota.QUOTAS

CONF = cfg.CONF

OVER_SNAPSHOT_QUOTA_EXCEPTION = exception.OverQuota(
    overs=['snapshots'],
    usages={'snapshots': {
        'reserved': 1,
        'in_use': 9
    }},
    quotas={
        'gigabytes': 10,
        'snapshots': 10
    })


def create_snapshot(volume_id, size=1, metadata=None, ctxt=None, **kwargs):
    """Create a snapshot object."""
    metadata = metadata or {}
    snap = objects.Snapshot(ctxt or context.get_admin_context())
    snap.volume_size = size
    snap.user_id = fake.USER_ID
    snap.project_id = fake.PROJECT_ID
    snap.volume_id = volume_id
    snap.status = fields.SnapshotStatus.CREATING