diff --git a/nova/conf/quota.py b/nova/conf/quota.py index 4766a8b286..d8dc1eb9d7 100644 --- a/nova/conf/quota.py +++ b/nova/conf/quota.py @@ -287,24 +287,21 @@ to help keep quota usage up-to-date and reduce the impact of out of sync usage issues. Note that quotas are not updated on a periodic task, they will update on a new reservation if max_age has passed since the last reservation. """), -# TODO(pumaranikar): Add a new config to select between the db_driver and -# the no_op driver using stevedore. cfg.StrOpt('driver', - default='nova.quota.DbQuotaDriver', - deprecated_for_removal=True, - deprecated_since='14.0.0', - deprecated_group='DEFAULT', - deprecated_name='quota_driver', - help=""" -The quota enforcer driver. - + default='nova.quota.DbQuotaDriver', + choices=('nova.quota.DbQuotaDriver', + 'nova.quota.NoopQuotaDriver'), + help=""" Provides abstraction for quota checks. Users can configure a specific driver to use for quota checks. Possible values: -* nova.quota.DbQuotaDriver (default) or any string representing fully - qualified class name. +* nova.quota.DbQuotaDriver: Stores quota limit information + in the database and relies on the quota_* configuration options for default + quota limit values. Counts quota usage on-demand. +* nova.quota.NoopQuotaDriver: Ignores quota and treats all resources as + unlimited. """), cfg.BoolOpt('recheck_quota', default=True, diff --git a/nova/quota.py b/nova/quota.py index dde040e5c8..c8e4ad3168 100644 --- a/nova/quota.py +++ b/nova/quota.py @@ -20,7 +20,6 @@ import copy from oslo_log import log as logging from oslo_utils import importutils -import six import nova.conf from nova import context as nova_context @@ -995,21 +994,18 @@ class CountableResource(AbsoluteResource): class QuotaEngine(object): """Represent the set of recognized quotas.""" - def __init__(self, quota_driver_class=None): + def __init__(self, quota_driver=None): """Initialize a Quota object.""" self._resources = {} - self._driver_cls = quota_driver_class - self.__driver = None + # NOTE(mriedem): quota_driver is ever only supplied in tests with a + # fake driver. + self.__driver = quota_driver @property def _driver(self): if self.__driver: return self.__driver - if not self._driver_cls: - self._driver_cls = CONF.quota.driver - if isinstance(self._driver_cls, six.string_types): - self._driver_cls = importutils.import_object(self._driver_cls) - self.__driver = self._driver_cls + self.__driver = importutils.import_object(CONF.quota.driver) return self.__driver def register_resource(self, resource): diff --git a/nova/tests/unit/compute/test_compute_cells.py b/nova/tests/unit/compute/test_compute_cells.py index 68b93754f9..deb54a58ec 100644 --- a/nova/tests/unit/compute/test_compute_cells.py +++ b/nova/tests/unit/compute/test_compute_cells.py @@ -66,7 +66,7 @@ def stub_call_to_cells(context, instance, method, *args, **kwargs): # Use NoopQuotaDriver in child cells. saved_quotas = quota.QUOTAS quota.QUOTAS = quota.QuotaEngine( - quota_driver_class=quota.NoopQuotaDriver()) + quota_driver=quota.NoopQuotaDriver()) compute_api.QUOTAS = quota.QUOTAS try: return fn(context, instance, *args, **kwargs) @@ -88,7 +88,7 @@ def stub_cast_to_cells(context, instance, method, *args, **kwargs): # Use NoopQuotaDriver in child cells. saved_quotas = quota.QUOTAS quota.QUOTAS = quota.QuotaEngine( - quota_driver_class=quota.NoopQuotaDriver()) + quota_driver=quota.NoopQuotaDriver()) compute_api.QUOTAS = quota.QUOTAS try: fn(context, instance, *args, **kwargs) diff --git a/nova/tests/unit/test_quota.py b/nova/tests/unit/test_quota.py index e3c0264441..bcb4b7cdbe 100644 --- a/nova/tests/unit/test_quota.py +++ b/nova/tests/unit/test_quota.py @@ -489,15 +489,8 @@ class QuotaEngineTestCase(test.TestCase): self.assertEqual(quota_obj._resources, {}) self.assertIsInstance(quota_obj._driver, quota.DbQuotaDriver) - def test_init_override_string(self): - quota_obj = quota.QuotaEngine( - quota_driver_class='nova.tests.unit.test_quota.FakeDriver') - - self.assertEqual(quota_obj._resources, {}) - self.assertIsInstance(quota_obj._driver, FakeDriver) - def test_init_override_obj(self): - quota_obj = quota.QuotaEngine(quota_driver_class=FakeDriver) + quota_obj = quota.QuotaEngine(quota_driver=FakeDriver) self.assertEqual(quota_obj._resources, {}) self.assertEqual(quota_obj._driver, FakeDriver) @@ -528,7 +521,7 @@ class QuotaEngineTestCase(test.TestCase): context = FakeContext('test_project', 'test_class') driver = FakeDriver(by_user=dict( fake_user=dict(test_resource=42))) - quota_obj = quota.QuotaEngine(quota_driver_class=driver) + quota_obj = quota.QuotaEngine(quota_driver=driver) result = quota_obj.get_by_project_and_user(context, 'test_project', 'fake_user', 'test_resource') @@ -542,7 +535,7 @@ class QuotaEngineTestCase(test.TestCase): context = FakeContext('test_project', 'test_class') driver = FakeDriver(by_project=dict( test_project=dict(test_resource=42))) - quota_obj = quota.QuotaEngine(quota_driver_class=driver) + quota_obj = quota.QuotaEngine(quota_driver=driver) result = quota_obj.get_by_project(context, 'test_project', 'test_resource') @@ -555,7 +548,7 @@ class QuotaEngineTestCase(test.TestCase): context = FakeContext('test_project', 'test_class') driver = FakeDriver(by_class=dict( test_class=dict(test_resource=42))) - quota_obj = quota.QuotaEngine(quota_driver_class=driver) + quota_obj = quota.QuotaEngine(quota_driver=driver) result = quota_obj.get_by_class(context, 'test_class', 'test_resource') self.assertEqual(driver.called, [ @@ -564,7 +557,7 @@ class QuotaEngineTestCase(test.TestCase): self.assertEqual(result, 42) def _make_quota_obj(self, driver): - quota_obj = quota.QuotaEngine(quota_driver_class=driver) + quota_obj = quota.QuotaEngine(quota_driver=driver) resources = [ quota.AbsoluteResource('test_resource4'), quota.AbsoluteResource('test_resource3'), diff --git a/releasenotes/notes/rocky-quota-driver-config-6459e19ef2b43aa2.yaml b/releasenotes/notes/rocky-quota-driver-config-6459e19ef2b43aa2.yaml new file mode 100644 index 0000000000..5c630e3bba --- /dev/null +++ b/releasenotes/notes/rocky-quota-driver-config-6459e19ef2b43aa2.yaml @@ -0,0 +1,11 @@ +--- +upgrade: + - | + The ``[quota]/driver`` configuration option is no longer deprecated + but now only allows one of two possible values: + + * ``nova.quota.DbQuotaDriver`` + * ``nova.quota.NoopQuotaDriver`` + + This means it is no longer possible to class-load custom out-of-tree + quota drivers. \ No newline at end of file