Fixes per tenant quota doesn't work

Fixes bug 1101331

Change-Id: I9c4e88b437506ed5818ee56ff6fd70588cb0f965
This commit is contained in:
He Jie Xu 2013-01-24 15:26:55 +08:00
parent 77f2f276d3
commit 54233724f1
4 changed files with 51 additions and 16 deletions

View File

@ -40,8 +40,6 @@ FAULT_MAP = {exceptions.NotFound: webob.exc.HTTPNotFound,
ValueError: webob.exc.HTTPBadRequest, ValueError: webob.exc.HTTPBadRequest,
} }
QUOTAS = quota.QUOTAS
def _fields(request): def _fields(request):
""" """
@ -284,9 +282,9 @@ class Controller(object):
plugin=self._plugin) plugin=self._plugin)
try: try:
tenant_id = item[self._resource]['tenant_id'] tenant_id = item[self._resource]['tenant_id']
count = QUOTAS.count(request.context, self._resource, count = quota.QUOTAS.count(request.context, self._resource,
self._plugin, self._collection, self._plugin, self._collection,
tenant_id) tenant_id)
if bulk: if bulk:
delta = deltas.get(tenant_id, 0) + 1 delta = deltas.get(tenant_id, 0) + 1
deltas[tenant_id] = delta deltas[tenant_id] = delta
@ -297,9 +295,9 @@ class Controller(object):
# We don't want to quota this resource # We don't want to quota this resource
LOG.debug(e) LOG.debug(e)
else: else:
QUOTAS.limit_check(request.context, quota.QUOTAS.limit_check(request.context,
item[self._resource]['tenant_id'], item[self._resource]['tenant_id'],
**kwargs) **kwargs)
def notify(create_result): def notify(create_result):
notifier_api.notify(request.context, notifier_api.notify(request.context,

View File

@ -145,7 +145,7 @@ class DbQuotaDriver(object):
quotas = DbQuotaDriver.get_tenant_quotas( quotas = DbQuotaDriver.get_tenant_quotas(
context, sub_resources, context.tenant_id) context, sub_resources, context.tenant_id)
return dict((k, v['limit']) for k, v in quotas.items()) return dict((k, v) for k, v in quotas.items())
def limit_check(self, context, tenant_id, resources, values): def limit_check(self, context, tenant_id, resources, values):
"""Check simple quota limits. """Check simple quota limits.

View File

@ -282,9 +282,12 @@ def _count_resource(context, plugin, resources, tenant_id):
return len(obj_list) if obj_list else 0 return len(obj_list) if obj_list else 0
resources = [] def register_resources_from_config():
for resource_item in cfg.CONF.QUOTAS.quota_items: resources = []
resources.append(CountableResource(resource_item, _count_resource, for resource_item in cfg.CONF.QUOTAS.quota_items:
'quota_' + resource_item)) resources.append(CountableResource(resource_item, _count_resource,
'quota_' + resource_item))
QUOTAS.register_resources(resources)
QUOTAS.register_resources(resources)
register_resources_from_config()

View File

@ -1,4 +1,4 @@
import unittest import unittest2 as unittest
import webtest import webtest
import mock import mock
@ -6,6 +6,7 @@ import mock
from quantum.api import extensions from quantum.api import extensions
from quantum.api.v2 import attributes from quantum.api.v2 import attributes
from quantum.common import config from quantum.common import config
from quantum.common import exceptions
from quantum import context from quantum import context
from quantum.db import api as db from quantum.db import api as db
from quantum import manager from quantum import manager
@ -53,7 +54,8 @@ class QuotaExtensionTestCase(unittest.TestCase):
'quota_items', 'quota_items',
['network', 'subnet', 'port', 'extra1'], ['network', 'subnet', 'port', 'extra1'],
group='QUOTAS') group='QUOTAS')
quota.QUOTAS = quota.QuotaEngine()
quota.register_resources_from_config()
self._plugin_patcher = mock.patch(TARGET_PLUGIN, autospec=True) self._plugin_patcher = mock.patch(TARGET_PLUGIN, autospec=True)
self.plugin = self._plugin_patcher.start() self.plugin = self._plugin_patcher.start()
self.plugin.return_value.supported_extension_aliases = ['quotas'] self.plugin.return_value.supported_extension_aliases = ['quotas']
@ -153,3 +155,35 @@ class QuotaExtensionTestCase(unittest.TestCase):
self.assertEqual(404, res.status_int) self.assertEqual(404, res.status_int)
except Exception: except Exception:
pass pass
def test_quotas_limit_check(self):
tenant_id = 'tenant_id1'
env = {'quantum.context': context.Context('', tenant_id,
is_admin=True)}
quotas = {'quota': {'network': 5}}
res = self.api.put_json(_get_path('quotas', id=tenant_id, fmt='json'),
quotas, extra_environ=env)
self.assertEqual(200, res.status_int)
quota.QUOTAS.limit_check(context.Context('', tenant_id),
tenant_id,
network=4)
def test_quotas_limit_check_with_over_quota(self):
tenant_id = 'tenant_id1'
env = {'quantum.context': context.Context('', tenant_id,
is_admin=True)}
quotas = {'quota': {'network': 5}}
res = self.api.put_json(_get_path('quotas', id=tenant_id, fmt='json'),
quotas, extra_environ=env)
self.assertEqual(200, res.status_int)
with self.assertRaises(exceptions.OverQuota):
quota.QUOTAS.limit_check(context.Context('', tenant_id),
tenant_id,
network=6)
def test_quotas_limit_check_with_invalid_quota_value(self):
tenant_id = 'tenant_id1'
with self.assertRaises(exceptions.InvalidQuotaValue):
quota.QUOTAS.limit_check(context.Context('', tenant_id),
tenant_id,
network=-1)