From ed41b6804a8eafb710f8faec425e22ebe0b85ca9 Mon Sep 17 00:00:00 2001 From: ling-yun Date: Mon, 11 Nov 2013 22:00:03 +0800 Subject: [PATCH] Update quota-set throw 500 error The server doesn't check whether the parameter "quota_set" or "quota_class_set" is in request body.So the 500 error has been thrown. We should catch the KeyError and transfer the KeyError to 400(HTTPBadRequest) instead of 500. Closes-Bug: #1249971 (cherry picked from commit 2ed2f3aff8eee70e02eb995780af292057cfcad4) Change-Id: I01260c77efa50324f3d203888689cdb1e94d2c21 --- cinder/api/contrib/quota_classes.py | 7 ++++++- cinder/api/contrib/quotas.py | 6 +++++- cinder/tests/api/contrib/test_quotas.py | 10 ++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/cinder/api/contrib/quota_classes.py b/cinder/api/contrib/quota_classes.py index d229825de40..f309ee6e0b5 100644 --- a/cinder/api/contrib/quota_classes.py +++ b/cinder/api/contrib/quota_classes.py @@ -42,7 +42,7 @@ class QuotaClassTemplate(xmlutil.TemplateBuilder): return xmlutil.MasterTemplate(root, 1) -class QuotaClassSetsController(object): +class QuotaClassSetsController(wsgi.Controller): def _format_quota_set(self, quota_class, quota_set): """Convert the quota object to a result dict""" @@ -68,6 +68,11 @@ class QuotaClassSetsController(object): context = req.environ['cinder.context'] authorize(context) quota_class = id + if not self.is_valid_body(body, 'quota_class_set'): + msg = _("Missing required element quota_class_set" + " in request body.") + raise webob.exc.HTTPBadRequest(explanation=msg) + for key in body['quota_class_set'].keys(): if key in QUOTAS: value = int(body['quota_class_set'][key]) diff --git a/cinder/api/contrib/quotas.py b/cinder/api/contrib/quotas.py index a21f991067d..dd9afb4aeb9 100644 --- a/cinder/api/contrib/quotas.py +++ b/cinder/api/contrib/quotas.py @@ -46,7 +46,7 @@ class QuotaTemplate(xmlutil.TemplateBuilder): return xmlutil.MasterTemplate(root, 1) -class QuotaSetsController(object): +class QuotaSetsController(wsgi.Controller): def _format_quota_set(self, project_id, quota_set): """Convert the quota object to a result dict""" @@ -96,6 +96,10 @@ class QuotaSetsController(object): context = req.environ['cinder.context'] authorize_update(context) project_id = id + if not self.is_valid_body(body, 'quota_set'): + msg = _("Missing required element quota_set in request body.") + raise webob.exc.HTTPBadRequest(explanation=msg) + for key in body['quota_set'].keys(): if key in QUOTAS: self._validate_quota_limit(body['quota_set'][key]) diff --git a/cinder/tests/api/contrib/test_quotas.py b/cinder/tests/api/contrib/test_quotas.py index c145870e116..0877ca1b655 100644 --- a/cinder/tests/api/contrib/test_quotas.py +++ b/cinder/tests/api/contrib/test_quotas.py @@ -101,6 +101,16 @@ class QuotaSetsControllerTest(test.TestCase): self.assertRaises(webob.exc.HTTPForbidden, self.controller.update, self.req, 'foo', make_body(tenant_id=None)) + def test_update_without_quota_set_field(self): + body = {'fake_quota_set': {'gigabytes': 100}} + self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, + self.req, 'foo', body) + + def test_update_empty_body(self): + body = {} + self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, + self.req, 'foo', body) + class QuotaSerializerTest(test.TestCase):