Merge "Fix update quota of subprojects"
This commit is contained in:
commit
71355fdbad
@ -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)}
|
||||
|
@ -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):
|
||||
|
@ -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():
|
||||
|
@ -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(
|
||||
|
Loading…
x
Reference in New Issue
Block a user