From 2ed2f3aff8eee70e02eb995780af292057cfcad4 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. Change-Id: I01260c77efa50324f3d203888689cdb1e94d2c21 Closes-Bug: #1249971 --- 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 d229825de..72bffcb2e 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 08b233152..388571de6 100644 --- a/cinder/api/contrib/quotas.py +++ b/cinder/api/contrib/quotas.py @@ -48,7 +48,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""" @@ -98,6 +98,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) + bad_keys = [] for key, value in body['quota_set'].items(): diff --git a/cinder/tests/api/contrib/test_quotas.py b/cinder/tests/api/contrib/test_quotas.py index 4a70f68c0..312682d43 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): -- 2.45.2