summaryrefslogtreecommitdiff
path: root/tests/unit/test_quota.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/test_quota.py')
-rw-r--r--tests/unit/test_quota.py456
1 files changed, 0 insertions, 456 deletions
diff --git a/tests/unit/test_quota.py b/tests/unit/test_quota.py
deleted file mode 100644
index 29e5378b..00000000
--- a/tests/unit/test_quota.py
+++ /dev/null
@@ -1,456 +0,0 @@
-#
-# 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 datetime
-
-import mock
-from oslo_config import fixture as config
-from oslotest import base as test_base
-from oslotest import moxstubout
-
-from openstack.common import quota
-
-
-class FakeContext(object):
- project_id = 'p1'
- user_id = 'u1'
- quota_class = 'QuotaClass_'
-
- def elevated(self):
- return self
-
-
-class ExceptionTestCase(test_base.BaseTestCase):
-
- def _get_raised_exception(self, exception, *args, **kwargs):
- try:
- raise exception(*args, **kwargs)
- except Exception as e:
- return e
-
- def test_quota_exception_format(self):
-
- class TestException(quota.QuotaException):
- msg_fmt = "Test format %(string)s"
-
- e = self._get_raised_exception(TestException)
- self.assertEqual(str(e), e.msg_fmt)
-
- e = self._get_raised_exception(TestException, number=42)
- self.assertEqual(str(e), e.msg_fmt)
-
- e = self._get_raised_exception(TestException, string="test")
- self.assertEqual(str(e), e.msg_fmt % {"string": "test"})
-
-
-class DbQuotaDriverTestCase(test_base.BaseTestCase):
-
- def setUp(self):
- self.stubs = self.useFixture(moxstubout.MoxStubout()).stubs
- self.CONF = self.useFixture(config.Config()).conf
- self.sample_resources = {'r1': quota.BaseResource('r1'),
- 'r2': quota.BaseResource('r2')}
-
- dbapi = mock.Mock()
- dbapi.quota_usage_get_all_by_project_and_user = mock.Mock(
- return_value={'project_id': 'p1', 'user_id': 'u1',
- 'r1': {'reserved': 1, 'in_use': 2},
- 'r2': {'reserved': 2, 'in_use': 3}})
- dbapi.quota_get_all_by_project_and_user = mock.Mock(
- return_value={'project_id': 'p1', 'user_id': 'u1',
- 'r1': 5, 'r2': 6})
- dbapi.quota_get = mock.Mock(return_value='quota_get')
- dbapi.quota_reserve = mock.Mock(return_value='quota_reserve')
- dbapi.quota_class_get = mock.Mock(return_value='quota_class_get')
- dbapi.quota_class_reserve = mock.Mock(
- return_value='quota_class_reserve')
- dbapi.quota_class_get_default = mock.Mock(
- return_value={'r1': 1, 'r2': 2})
- dbapi.quota_class_get_all_by_name = mock.Mock(return_value={'r1': 9})
- dbapi.quota_get_all_by_project = mock.Mock(
- return_value=dict([('r%d' % i, i) for i in range(3)]))
- dbapi.quota_get_all = mock.Mock(
- return_value=[{'resource': 'r1', 'hard_limit': 3},
- {'resource': 'r2', 'hard_limit': 4}])
- dbapi.quota_usage_get_all_by_project = mock.Mock(
- return_value=dict([('r%d' % i, {'in_use': i, 'reserved': i + 1})
- for i in range(3)]))
- self.dbapi = dbapi
- self.driver = quota.DbQuotaDriver(dbapi)
- self.ctxt = FakeContext()
- return super(DbQuotaDriverTestCase, self).setUp()
-
- def test_get_by_project(self):
- args = ['p1', 'resource']
- self.assertEqual('quota_get',
- self.driver.get_by_project(self.ctxt, *args))
- self.driver.db.quota_get.assert_called_once_with(self.ctxt, *args)
-
- def test_get_by_project_and_user(self):
- args = ['p1', 'u1', 'resource']
- self.assertEqual('quota_get',
- self.driver.get_by_project_and_user(self.ctxt, *args))
- self.driver.db.quota_get.assert_called_once_with(self.ctxt, *args)
-
- def test_get_by_class(self):
- args = ['class', 'resource']
- self.assertEqual('quota_class_get',
- self.driver.get_by_class(self.ctxt, *args))
- self.driver.db.quota_class_get.assert_called_once_with(self.ctxt,
- *args)
-
- def test_get_defaults(self):
- defaults = self.driver.get_defaults(self.ctxt, self.sample_resources)
- self.assertEqual(defaults, {'r1': 1, 'r2': 2})
- self.sample_resources.pop('r1')
- defaults = self.driver.get_defaults(self.ctxt, self.sample_resources)
- self.assertEqual(defaults, {'r2': 2})
-
- def test_get_class_quotas(self):
- quotas = self.driver.get_class_quotas(self.ctxt,
- self.sample_resources,
- 'ClassName')
- self.assertEqual(quotas, {'r1': 9, 'r2': 2})
-
- def test_get_user_quotas(self):
- actual = self.driver.get_user_quotas(
- self.ctxt, self.sample_resources.copy(), 'p1', 'u1')
- expected = {'r1': {'in_use': 2, 'limit': 5, 'reserved': 1},
- 'r2': {'in_use': 3, 'limit': 6, 'reserved': 2}}
- self.assertEqual(actual, expected)
-
- def test_get_default_user_quotas(self):
- self.dbapi.quota_get_all_by_project_and_user = mock.Mock(
- return_value={'project_id': 'p1', 'user_id': 'u1'})
- self.dbapi.quota_get_all_by_project = mock.Mock(
- return_value={'r1': 5, 'r2': 6})
- driver = quota.DbQuotaDriver(self.dbapi)
- actual = driver.get_user_quotas(
- self.ctxt, self.sample_resources.copy(), 'p1', 'u1')
- expected = {'r1': {'in_use': 2, 'limit': 5, 'reserved': 1},
- 'r2': {'in_use': 3, 'limit': 6, 'reserved': 2}}
- self.assertEqual(actual, expected)
-
- def test_get_settable_quotas(self):
- actual = self.driver.get_settable_quotas(self.ctxt,
- self.sample_resources, 'p1')
- expected = {'r1': {'maximum': -1, 'minimum': 3},
- 'r2': {'maximum': -1, 'minimum': 5}}
- self.assertEqual(actual, expected)
-
- def test_get_settable_quotas_with_user_id(self):
- actual = self.driver.get_settable_quotas(
- self.ctxt, self.sample_resources, 'p1', user_id='u1')
- expected = {'r1': {'maximum': 3, 'minimum': 3},
- 'r2': {'maximum': 4, 'minimum': 5}}
- self.assertEqual(actual, expected)
-
- def test_get_project_quotas(self):
- self.ctxt.quota_class = 'ClassName'
- expected = {'r1': {'limit': 1, 'in_use': 1, 'reserved': 2},
- 'r2': {'limit': 2, 'in_use': 2, 'reserved': 3}}
- quotas = self.driver.get_project_quotas(self.ctxt,
- self.sample_resources, 'p1')
- self.assertEqual(quotas, expected)
-
- def test_get_project_quotas_project_id_differs(self):
- self.ctxt.project_id = 'p2'
- expected = {'r1': {'limit': 1, 'in_use': 1, 'reserved': 2},
- 'r2': {'limit': 2, 'in_use': 2, 'reserved': 3}}
- quotas = self.driver.get_project_quotas(self.ctxt,
- self.sample_resources, 'p1')
- self.assertEqual(quotas, expected)
-
- def test_get_project_quotas_omit_default_quota_class(self):
- self.sample_resources['r3'] = quota.BaseResource('r3')
- quotas = self.driver.get_project_quotas(
- self.ctxt, self.sample_resources, 'p1', defaults=False)
- expected = {'r1': {'limit': 1, 'in_use': 1, 'reserved': 2},
- 'r2': {'limit': 2, 'in_use': 2, 'reserved': 3}}
- self.assertEqual(quotas, expected)
-
- def test_limit_check_invalid_quota_value(self):
- self.assertRaises(quota.InvalidQuotaValue,
- self.driver.limit_check, self.ctxt, [], {'r1': -1})
-
- def test_limit_check_quota_resource_unknown(self):
- self.assertRaises(quota.QuotaResourceUnknown,
- self.driver.limit_check,
- self.ctxt,
- {'r1': quota.ReservableResource('r1', 'r1')},
- {'r1': 42})
-
- def test_limit_check_over_quota(self):
- self.assertRaises(quota.OverQuota,
- self.driver.limit_check,
- self.ctxt,
- {'r1': quota.BaseResource('r1')},
- {'r1': 2})
-
- def test_limit_check(self):
- self.assertIsNone(self.driver.limit_check(
- self.ctxt, {'r1': quota.BaseResource('r1')}, {'r1': 1}))
-
- def test_quota_reserve(self):
- now = datetime.datetime.utcnow()
-
- class FakeTimeutils(object):
- @staticmethod
- def utcnow():
- return now
-
- self.stubs.Set(quota, "timeutils", FakeTimeutils)
-
- expected = [self.ctxt, self.sample_resources, {}, {}, {}, None,
- self.CONF.until_refresh, self.CONF.max_age]
-
- # expire as None
- self.assertEqual('quota_reserve', self.driver.reserve(
- self.ctxt, self.sample_resources, {}, None, 'p1'))
- expected[5] = now + datetime.timedelta(
- seconds=self.CONF.reservation_expire)
- self.driver.db.quota_reserve.assert_called_once_with(*expected,
- project_id='p1',
- user_id='u1')
- self.driver.db.reset_mock()
- # expire as seconds
- self.assertEqual('quota_reserve', self.driver.reserve(
- self.ctxt, self.sample_resources, {}, 42, 'p1'))
- expected[5] = now + datetime.timedelta(seconds=42)
- self.driver.db.quota_reserve.assert_called_once_with(*expected,
- project_id='p1',
- user_id='u1')
- self.driver.db.reset_mock()
- # expire as absolute
- expected[5] = now + datetime.timedelta(hours=1)
- self.assertEqual('quota_reserve', self.driver.reserve(
- self.ctxt, self.sample_resources, {},
- now + datetime.timedelta(hours=1), 'p1'))
- self.driver.db.quota_reserve.assert_called_once_with(*expected,
- project_id='p1',
- user_id='u1')
- self.driver.db.reset_mock()
- # InvalidReservationExpiration
- self.assertRaises(quota.InvalidReservationExpiration,
- self.driver.reserve, self.ctxt,
- self.sample_resources, {}, (), 'p1')
- self.driver.db.reset_mock()
- # project_id is None
- self.assertEqual('quota_reserve', self.driver.reserve(
- self.ctxt, self.sample_resources, {},
- now + datetime.timedelta(hours=1)))
- self.driver.db.quota_reserve.assert_called_once_with(*expected,
- project_id='p1',
- user_id='u1')
-
- def test_commit(self):
- self.assertIsNone(self.driver.commit(self.ctxt, 'reservations',
- project_id='p1'))
- self.driver.db.reservation_commit.assert_called_once_with(
- self.ctxt, 'reservations', project_id='p1', user_id='u1')
-
- def test_commit_project_id_none(self):
- self.assertIsNone(self.driver.commit(self.ctxt, 'reservations'))
- self.driver.db.reservation_commit.assert_called_once_with(
- self.ctxt, 'reservations', project_id='p1', user_id='u1')
-
- def test_rollback(self):
- self.assertIsNone(self.driver.rollback(self.ctxt, 'reservations',
- project_id='p1'))
- self.driver.db.reservation_rollback.assert_called_once_with(
- self.ctxt, 'reservations', project_id='p1', user_id='u1')
-
- def test_rollback_project_id_none(self):
- self.assertIsNone(self.driver.rollback(self.ctxt, 'reservations'))
- self.driver.db.reservation_rollback.assert_called_once_with(
- self.ctxt, 'reservations', project_id='p1', user_id='u1')
-
- def test_usage_reset(self):
- resource = self.sample_resources['r1']
- self.assertIsNone(self.driver.usage_reset(self.ctxt, [resource]))
- self.driver.db.quota_usage_update.assert_called_once_with(
- self.ctxt, 'p1', 'u1', resource, in_use=-1)
-
- def test_usage_reset_quota_usage_not_found(self):
- resource = self.sample_resources['r1']
- self.driver.db.quota_usage_update = mock.Mock(
- side_effect=quota.QuotaUsageNotFound)
- self.assertIsNone(self.driver.usage_reset(self.ctxt, [resource]))
- self.driver.db.quota_usage_update.assert_called_once_with(
- self.ctxt, 'p1', 'u1', resource, in_use=-1)
-
- def test_destroy_all_by_project_and_user(self):
- self.assertIsNone(self.driver.destroy_all_by_project_and_user(
- self.ctxt, 'p1', 'u1'))
- method = self.driver.db.quota_destroy_all_by_project_and_user
- method.assert_called_once_with(self.ctxt, 'p1', 'u1')
-
- def test_destroy_all_by_project(self):
- self.assertIsNone(self.driver.destroy_all_by_project(self.ctxt, 'p1'))
- self.driver.db.quota_destroy_all_by_project.assert_called_once_with(
- self.ctxt, 'p1')
-
- def test_expire(self):
- self.assertIsNone(self.driver.expire(self.ctxt))
- self.driver.db.reservation_expire.assert_called_once_with(self.ctxt)
-
-
-class BaseResourceTestCase(test_base.BaseTestCase):
-
- def setUp(self):
- self.ctxt = FakeContext()
- self.dbapi = mock.Mock()
- self.dbapi.quota_get = mock.Mock(return_value='quota_get')
- self.dbapi.quota_class_get = mock.Mock(
- return_value='quota_class_get')
- self.dbapi.quota_class_get_default = mock.Mock(
- return_value={'r1': 1})
- self.driver = quota.DbQuotaDriver(self.dbapi)
- super(BaseResourceTestCase, self).setUp()
-
- def test_quota(self):
- resource = quota.BaseResource('r1')
- self.assertEqual('quota_get', resource.quota(self.driver, self.ctxt))
-
- def test_quota_no_project_id(self):
- self.ctxt.project_id = None
- resource = quota.BaseResource('r1')
- self.assertEqual('quota_class_get',
- resource.quota(self.driver, self.ctxt))
-
- def test_quota_project_quota_not_found(self):
- self.dbapi.quota_get = mock.Mock(
- side_effect=quota.ProjectQuotaNotFound())
- resource = quota.BaseResource('r1')
- self.assertEqual('quota_class_get',
- resource.quota(self.driver, self.ctxt))
-
- def test_quota_quota_class_not_found(self):
- self.dbapi.quota_get = mock.Mock(
- side_effect=quota.ProjectQuotaNotFound(project_id='p1'))
- self.dbapi.quota_class_get = mock.Mock(
- side_effect=quota.QuotaClassNotFound(class_name='ClassName'))
- resource = quota.BaseResource('r1')
- self.assertEqual(1, resource.quota(self.driver, self.ctxt))
-
-
-class CountableResourceTestCase(test_base.BaseTestCase):
-
- def test_init(self):
- resource = quota.CountableResource('r1', 42)
- self.assertEqual('r1', resource.name)
- self.assertEqual(42, resource.count)
-
-
-class QuotaEngineTestCase(test_base.BaseTestCase):
-
- def setUp(self):
- self.ctxt = FakeContext()
- self.dbapi = mock.Mock()
- self.quota_driver = mock.Mock()
- self.engine = quota.QuotaEngine(self.dbapi, self.quota_driver)
- self.r1 = quota.BaseResource('r1')
- self.r2 = quota.BaseResource('r2')
- self.engine.register_resources([self.r1, self.r2])
- super(QuotaEngineTestCase, self).setUp()
-
- def assertProxyMethod(self, method, *args, **kwargs):
- if 'retval' in kwargs:
- retval = kwargs.pop('retval')
- else:
- retval = method
- setattr(self.quota_driver, method, mock.Mock(return_value=method))
- actual = getattr(self.engine, method)(self.ctxt, *args, **kwargs)
- getattr(self.quota_driver, method).assert_called_once_with(self.ctxt,
- *args,
- **kwargs)
- self.assertEqual(actual, retval)
-
- def assertMethod(self, method, args, kwargs, called_args,
- called_kwargs, retval):
- setattr(self.quota_driver, method, mock.Mock(return_value=method))
- actual = getattr(self.engine, method)(self.ctxt, *args, **kwargs)
- getattr(self.quota_driver, method).assert_called_once_with(
- self.ctxt, *called_args, **called_kwargs)
- self.assertEqual(actual, retval)
-
- def test_proxy_methods(self):
- self.assertProxyMethod('get_by_project', 'p1', 'resname')
- self.assertProxyMethod('get_by_project_and_user', 'p1', 'u1', 'res')
- self.assertProxyMethod('get_by_class', 'quota_class', 'resname')
- self.assertProxyMethod('get_default', 'resource')
- self.assertProxyMethod('expire', retval=None)
- self.assertProxyMethod('usage_reset', 'resources', retval=None)
- self.assertProxyMethod('destroy_all_by_project', 'p1', retval=None)
- self.assertProxyMethod('destroy_all_by_project_and_user', 'p1',
- 'u1', retval=None)
- self.assertProxyMethod('commit', 'reservations', project_id='p1',
- user_id='u1', retval=None)
- self.assertProxyMethod('rollback', 'reservations', project_id='p1',
- user_id=None, retval=None)
-
- self.assertMethod('get_settable_quotas', ['p1'], {'user_id': 'u1'},
- [self.engine.resources, 'p1'], {'user_id': 'u1'},
- 'get_settable_quotas')
- self.assertMethod('get_defaults', [], {},
- [self.engine.resources], {}, 'get_defaults')
- self.assertMethod('get_project_quotas', ['p1', 'quotaclass'],
- {'defaults': 'defaults', 'usages': 'usages'},
- [self.engine.resources, 'p1'],
- {'quota_class': 'quotaclass', 'defaults': 'defaults',
- 'usages': 'usages', 'remains': False},
- 'get_project_quotas')
- self.assertMethod('reserve', [],
- {'expire': 'expire', 'project_id': 'p1',
- 'user_id': 'u1', 'deltas': 'd1'},
- [self.engine.resources, {'deltas': 'd1'}],
- {'expire': 'expire',
- 'project_id': 'p1', 'user_id': 'u1'}, 'reserve')
- self.assertMethod('get_class_quotas',
- ['quota_class'], {'defaults': 'defaults'},
- [self.engine.resources, 'quota_class'],
- {'defaults': 'defaults'}, 'get_class_quotas')
- self.assertMethod('get_user_quotas', ['project_id', 'user_id'],
- {'quota_class': 'qc', 'defaults': 'de',
- 'usages': 'us'},
- [self.engine.resources, 'project_id', 'user_id'],
- {'quota_class': 'qc', 'defaults': 'de',
- 'usages': 'us'},
- 'get_user_quotas')
- self.assertMethod('limit_check',
- [], {'project_id': 'p1', 'user_id': 'u1',
- 'val1': 'val1'},
- [self.engine.resources, {'val1': 'val1'}],
- {'project_id': 'p1', 'user_id': 'u1'}, 'limit_check')
-
- def test_resource_names(self):
- self.assertEqual(['r1', 'r2'], self.engine.resource_names)
-
- def test_contains(self):
- self.assertTrue(self.r1.name in self.engine)
- self.assertTrue(self.r2.name in self.engine)
- self.assertFalse('r3' in self.engine)
-
- def test_count(self):
- count = mock.Mock(return_value=42)
- r = quota.CountableResource('r1', count)
- self.engine.register_resource(r)
- actual = self.engine.count(self.ctxt, 'r1')
- self.assertEqual(42, actual)
- count.assert_called_once_with(self.ctxt)
- self.assertRaises(quota.QuotaResourceUnknown,
- self.engine.count, self.ctxt, 'r2')
-
- def test_init(self):
- engine = quota.QuotaEngine(self.dbapi)
- self.assertIsInstance(engine._driver, quota.DbQuotaDriver)