From acb32e773b9899b142ff54241a7e7f297d0fcb45 Mon Sep 17 00:00:00 2001 From: Ghanshyam Date: Wed, 20 Aug 2014 14:44:48 +0900 Subject: [PATCH] Handle non dict metadata in server metadata V2 API While creating or updating the server metadata, requested metadata should be in form of dictionary. Currently if it is not in that form then, 500 error is being return which should be 400. This patch adds such request check for V2 API and adds its UT Change-Id: Ifcd4f9d352de7b2676beff319b641547b8952566 --- nova/api/openstack/compute/server_metadata.py | 11 ++++++ .../openstack/compute/test_server_metadata.py | 36 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/nova/api/openstack/compute/server_metadata.py b/nova/api/openstack/compute/server_metadata.py index 68cc188e0d9c..b530ed49248a 100644 --- a/nova/api/openstack/compute/server_metadata.py +++ b/nova/api/openstack/compute/server_metadata.py @@ -56,6 +56,9 @@ class Controller(object): except (KeyError, TypeError): msg = _("Malformed request body") raise exc.HTTPBadRequest(explanation=msg) + if not isinstance(metadata, dict): + msg = _("Malformed request body. metadata must be object") + raise exc.HTTPBadRequest(explanation=msg) context = req.environ['nova.context'] @@ -75,6 +78,10 @@ class Controller(object): expl = _('Malformed request body') raise exc.HTTPBadRequest(explanation=expl) + if not isinstance(meta_item, dict): + msg = _("Malformed request body. meta item must be object") + raise exc.HTTPBadRequest(explanation=msg) + if id not in meta_item: expl = _('Request body and URI mismatch') raise exc.HTTPBadRequest(explanation=expl) @@ -100,6 +107,10 @@ class Controller(object): expl = _('Malformed request body') raise exc.HTTPBadRequest(explanation=expl) + if not isinstance(metadata, dict): + msg = _("Malformed request body. metadata must be object") + raise exc.HTTPBadRequest(explanation=msg) + context = req.environ['nova.context'] new_metadata = self._update_instance_metadata(context, server_id, diff --git a/nova/tests/api/openstack/compute/test_server_metadata.py b/nova/tests/api/openstack/compute/test_server_metadata.py index 71974a95bfa6..327ae101c536 100644 --- a/nova/tests/api/openstack/compute/test_server_metadata.py +++ b/nova/tests/api/openstack/compute/test_server_metadata.py @@ -245,6 +245,18 @@ class ServerMetaDataTest(BaseTest): self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create, req, self.uuid, body) + def test_create_item_non_dict(self): + self.stubs.Set(nova.db, 'instance_metadata_update', + return_create_instance_metadata) + req = fakes.HTTPRequest.blank(self.url + '/key1') + req.method = 'PUT' + body = {"metadata": None} + req.body = jsonutils.dumps(body) + req.headers["content-type"] = "application/json" + + self.assertRaises(webob.exc.HTTPBadRequest, + self.controller.create, req, self.uuid, body) + def test_create_item_key_too_long(self): self.stubs.Set(nova.db, 'instance_metadata_update', return_create_instance_metadata) @@ -347,6 +359,18 @@ class ServerMetaDataTest(BaseTest): self.assertRaises(webob.exc.HTTPNotFound, self.controller.update_all, req, '100', body) + def test_update_all_non_dict(self): + self.stubs.Set(nova.db, 'instance_metadata_update', + return_create_instance_metadata) + req = fakes.HTTPRequest.blank(self.url) + req.method = 'PUT' + body = {"metadata": None} + req.body = jsonutils.dumps(body) + req.headers["content-type"] = "application/json" + + self.assertRaises(webob.exc.HTTPBadRequest, + self.controller.update_all, req, self.uuid, body) + def test_update_item(self): self.stubs.Set(objects.Instance, 'save', fake_instance_save) req = fakes.HTTPRequest.blank(self.url + '/key1') @@ -442,6 +466,18 @@ class ServerMetaDataTest(BaseTest): self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, req, self.uuid, 'bad', body) + def test_update_item_non_dict(self): + self.stubs.Set(nova.db, 'instance_metadata_update', + return_create_instance_metadata) + req = fakes.HTTPRequest.blank(self.url + '/bad') + req.method = 'PUT' + body = {"meta": None} + req.body = jsonutils.dumps(body) + req.headers["content-type"] = "application/json" + + self.assertRaises(webob.exc.HTTPBadRequest, + self.controller.update, req, self.uuid, 'bad', body) + def test_too_many_metadata_items_on_create(self): self.stubs.Set(nova.db, 'instance_metadata_update', return_create_instance_metadata)