Merge "Fix update quota of subprojects"

This commit is contained in:
Jenkins 2015-10-07 19:28:18 +00:00 committed by Gerrit Code Review
commit 71355fdbad
4 changed files with 28 additions and 8 deletions

View File

@ -80,7 +80,7 @@ class QuotaSetsController(wsgi.Controller):
free_quota = (parent_project_quotas[key]['limit'] -
parent_project_quotas[key]['in_use'] -
parent_project_quotas[key]['reserved'] -
parent_project_quotas[key]['allocated'])
parent_project_quotas[key].get('allocated', 0))
current = 0
if project_quotas.get(key):
@ -295,7 +295,7 @@ class QuotaSetsController(wsgi.Controller):
target_project.id,
parent_id)
parent_project_quotas = QUOTAS.get_project_quotas(
context, parent_id, parent_project_id=parent_id)
context, parent_id)
# NOTE(ankit): Pass #2 - In this loop for body['quota_set'].keys(),
# we validate the quota limits to ensure that we can bail out if
@ -318,7 +318,7 @@ class QuotaSetsController(wsgi.Controller):
quota_values,
parent_project_quotas)
allocated_quotas[key] = (
parent_project_quotas[key]['allocated'] + value)
parent_project_quotas[key].get('allocated', 0) + value)
else:
value = self._validate_quota_limit(body['quota_set'], key)
valid_quotas[key] = value
@ -339,8 +339,13 @@ class QuotaSetsController(wsgi.Controller):
# atomic operation.
if parent_id:
if key in allocated_quotas.keys():
db.quota_allocated_update(context, parent_id, key,
allocated_quotas[key])
try:
db.quota_allocated_update(context, parent_id, key,
allocated_quotas[key])
except exception.ProjectQuotaNotFound:
parent_limit = parent_project_quotas[key]['limit']
db.quota_create(context, parent_id, key, parent_limit,
allocated=allocated_quotas[key])
return {'quota_set': self._get_quotas(context, target_project_id,
parent_project_id=parent_id)}

View File

@ -722,9 +722,10 @@ def volume_glance_metadata_copy_from_volume_to_volume(context,
###################
def quota_create(context, project_id, resource, limit):
def quota_create(context, project_id, resource, limit, allocated=0):
"""Create a quota for the given project and resource."""
return IMPL.quota_create(context, project_id, resource, limit)
return IMPL.quota_create(context, project_id, resource, limit,
allocated=allocated)
def quota_get(context, project_id, resource):

View File

@ -564,11 +564,13 @@ def quota_allocated_get_all_by_project(context, project_id):
@require_admin_context
def quota_create(context, project_id, resource, limit):
def quota_create(context, project_id, resource, limit, allocated):
quota_ref = models.Quota()
quota_ref.project_id = project_id
quota_ref.resource = resource
quota_ref.hard_limit = limit
if allocated:
quota_ref.allocated = allocated
session = get_session()
with session.begin():

View File

@ -300,6 +300,18 @@ class QuotaSetsControllerTest(test.TestCase):
self.assertRaises(webob.exc.HTTPForbidden, self.controller.update,
self.req, self.B.id, body)
def test_update_subproject_quota_when_parent_has_default_quotas(self):
self.controller._get_project = mock.Mock()
self.controller._get_project.side_effect = self._get_project
# Since the quotas of the project A were not updated, it will have
# default quotas.
self.req.environ['cinder.context'].project_id = self.A.id
# Update the project B quota.
expected = make_body(gigabytes=1000, snapshots=10,
volumes=5, backups=5, tenant_id=None)
result = self.controller.update(self.req, self.B.id, expected)
self.assertDictMatch(expected, result)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_string_length')
@mock.patch(