diff --git a/neutron/quota.py b/neutron/quota.py index ae718cb..3cf8e11 100644 --- a/neutron/quota.py +++ b/neutron/quota.py @@ -156,9 +156,12 @@ class BaseResource(object): @property def default(self): """Return the default value of the quota.""" - return getattr(cfg.CONF.QUOTAS, - self.flag, - cfg.CONF.QUOTAS.default_quota) + # Any negative value will be interpreted as an infinite quota, + # and stored as -1 for compatibility with current behaviour + value = getattr(cfg.CONF.QUOTAS, + self.flag, + cfg.CONF.QUOTAS.default_quota) + return max(value, -1) class CountableResource(BaseResource): diff --git a/neutron/tests/unit/test_quota_ext.py b/neutron/tests/unit/test_quota_ext.py index 608d9fb..3195ecf 100644 --- a/neutron/tests/unit/test_quota_ext.py +++ b/neutron/tests/unit/test_quota_ext.py @@ -79,6 +79,16 @@ class QuotaExtensionTestCase(testlib_api.WebTestCase): attributes.RESOURCE_ATTRIBUTE_MAP = self.saved_attr_map super(QuotaExtensionTestCase, self).tearDown() + def _test_quota_default_values(self, expected_values): + tenant_id = 'tenant_id1' + env = {'neutron.context': context.Context('', tenant_id)} + res = self.api.get(_get_path('quotas', id=tenant_id, fmt=self.fmt), + extra_environ=env) + quota = self.deserialize(res) + for resource in expected_values: + self.assertEqual(expected_values[resource], + quota['quota'][resource]) + class QuotaExtensionDbTestCase(QuotaExtensionTestCase): fmt = 'json' @@ -97,15 +107,20 @@ class QuotaExtensionDbTestCase(QuotaExtensionTestCase): self.assertEqual(200, res.status_int) def test_quotas_default_values(self): - tenant_id = 'tenant_id1' - env = {'neutron.context': context.Context('', tenant_id)} - res = self.api.get(_get_path('quotas', id=tenant_id, fmt=self.fmt), - extra_environ=env) - quota = self.deserialize(res) - self.assertEqual(10, quota['quota']['network']) - self.assertEqual(10, quota['quota']['subnet']) - self.assertEqual(50, quota['quota']['port']) - self.assertEqual(-1, quota['quota']['extra1']) + self._test_quota_default_values( + {'network': 10, + 'subnet': 10, + 'port': 50, + 'extra1': -1}) + + def test_quotas_negative_default_value(self): + cfg.CONF.set_override( + 'quota_port', -666, group='QUOTAS') + self._test_quota_default_values( + {'network': 10, + 'subnet': 10, + 'port': -1, + 'extra1': -1}) def test_show_quotas_with_admin(self): tenant_id = 'tenant_id1' @@ -337,15 +352,20 @@ class QuotaExtensionCfgTestCase(QuotaExtensionTestCase): super(QuotaExtensionCfgTestCase, self).setUp() def test_quotas_default_values(self): - tenant_id = 'tenant_id1' - env = {'neutron.context': context.Context('', tenant_id)} - res = self.api.get(_get_path('quotas', id=tenant_id, fmt=self.fmt), - extra_environ=env) - quota = self.deserialize(res) - self.assertEqual(10, quota['quota']['network']) - self.assertEqual(10, quota['quota']['subnet']) - self.assertEqual(50, quota['quota']['port']) - self.assertEqual(-1, quota['quota']['extra1']) + self._test_quota_default_values( + {'network': 10, + 'subnet': 10, + 'port': 50, + 'extra1': -1}) + + def test_quotas_negative_default_value(self): + cfg.CONF.set_override( + 'quota_port', -666, group='QUOTAS') + self._test_quota_default_values( + {'network': 10, + 'subnet': 10, + 'port': -1, + 'extra1': -1}) def test_show_quotas_with_admin(self): tenant_id = 'tenant_id1'