diff options
author | Davanum Srinivas <davanum@gmail.com> | 2012-10-23 22:37:04 -0400 |
---|---|---|
committer | Davanum Srinivas <davanum@gmail.com> | 2012-10-24 08:27:41 -0400 |
commit | db7798a973bb05af5d4668a9f9b20ce62e8a47af (patch) | |
tree | 563aaef1b651d41a825994e3896bf3dad11583d3 | |
parent | df1fb2978c854beb58646406796c2bef2bfb047f (diff) | |
download | nova-db7798a973bb05af5d4668a9f9b20ce62e8a47af.tar.gz nova-db7798a973bb05af5d4668a9f9b20ce62e8a47af.tar.xz nova-db7798a973bb05af5d4668a9f9b20ce62e8a47af.zip |
Fix Incorrect Exception when metadata is over 255 characters
Need to be in sync with Essex. Throw a new exception in api.py when key or value
is over 255 chars. Catch this exception end return back HTTP error 413.
add extra lines in exception.py to make pep8 happy
Fixes bug 1004007
Change-Id: I67694e3a9600b7dd0b80c519327327568751c2a4
-rw-r--r-- | nova/api/openstack/compute/server_metadata.py | 3 | ||||
-rw-r--r-- | nova/api/openstack/compute/servers.py | 4 | ||||
-rw-r--r-- | nova/compute/api.py | 4 | ||||
-rw-r--r-- | nova/exception.py | 4 | ||||
-rw-r--r-- | nova/tests/api/openstack/compute/test_server_metadata.py | 12 | ||||
-rw-r--r-- | nova/tests/api/openstack/compute/test_servers.py | 8 |
6 files changed, 23 insertions, 12 deletions
diff --git a/nova/api/openstack/compute/server_metadata.py b/nova/api/openstack/compute/server_metadata.py index dfb4b55a8..4e5a3ee02 100644 --- a/nova/api/openstack/compute/server_metadata.py +++ b/nova/api/openstack/compute/server_metadata.py @@ -129,6 +129,9 @@ class Controller(object): except exception.InvalidMetadata as error: raise exc.HTTPBadRequest(explanation=unicode(error)) + except exception.InvalidMetadataSize as error: + raise exc.HTTPRequestEntityTooLarge(explanation=unicode(error)) + except exception.QuotaError as error: raise exc.HTTPRequestEntityTooLarge(explanation=unicode(error), headers={'Retry-After': 0}) diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py index c5e829d52..1ceb5d34e 100644 --- a/nova/api/openstack/compute/servers.py +++ b/nova/api/openstack/compute/servers.py @@ -873,6 +873,8 @@ class Controller(wsgi.Controller): raise exc.HTTPBadRequest(explanation=unicode(error)) except exception.InvalidMetadata as error: raise exc.HTTPBadRequest(explanation=unicode(error)) + except exception.InvalidMetadataSize as error: + raise exc.HTTPRequestEntityTooLarge(explanation=unicode(error)) except exception.ImageNotFound as error: msg = _("Can not find requested image") raise exc.HTTPBadRequest(explanation=msg) @@ -1224,6 +1226,8 @@ class Controller(wsgi.Controller): raise exc.HTTPNotFound(explanation=msg) except exception.InvalidMetadata as error: raise exc.HTTPBadRequest(explanation=unicode(error)) + except exception.InvalidMetadataSize as error: + raise exc.HTTPRequestEntityTooLarge(explanation=unicode(error)) except exception.ImageNotFound: msg = _("Cannot find image for rebuild") raise exc.HTTPBadRequest(explanation=msg) diff --git a/nova/compute/api.py b/nova/compute/api.py index 7773d9f32..066538761 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -269,11 +269,11 @@ class API(base.Base): if len(k) > 255: msg = _("Metadata property key greater than 255 characters") LOG.warn(msg) - raise exception.InvalidMetadata(reason=msg) + raise exception.InvalidMetadataSize(reason=msg) if len(v) > 255: msg = _("Metadata property value greater than 255 characters") LOG.warn(msg) - raise exception.InvalidMetadata(reason=msg) + raise exception.InvalidMetadataSize(reason=msg) def _check_requested_networks(self, context, requested_networks): """ Check if the networks requested belongs to the project diff --git a/nova/exception.py b/nova/exception.py index 8983103dd..ab9265f5d 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -263,6 +263,10 @@ class InvalidMetadata(Invalid): message = _("Invalid metadata") + ": %(reason)s" +class InvalidMetadataSize(Invalid): + message = _("Invalid metadata size") + ": %(reason)s" + + class InvalidPortRange(Invalid): message = _("Invalid port range %(from_port)s:%(to_port)s. %(msg)s") diff --git a/nova/tests/api/openstack/compute/test_server_metadata.py b/nova/tests/api/openstack/compute/test_server_metadata.py index c8814e705..bcce624d7 100644 --- a/nova/tests/api/openstack/compute/test_server_metadata.py +++ b/nova/tests/api/openstack/compute/test_server_metadata.py @@ -371,7 +371,7 @@ class ServerMetaDataTest(test.TestCase): req.body = jsonutils.dumps(body) req.headers["content-type"] = "application/json" - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller.update, req, self.uuid, ("a" * 260), body) @@ -384,7 +384,7 @@ class ServerMetaDataTest(test.TestCase): req.body = jsonutils.dumps(body) req.headers["content-type"] = "application/json" - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller.update, req, self.uuid, "key1", body) @@ -436,13 +436,13 @@ class ServerMetaDataTest(test.TestCase): #test for long key data = {"metadata": {"a" * 260: "value1"}} req.body = jsonutils.dumps(data) - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller.create, req, self.uuid, data) #test for long value data = {"metadata": {"key": "v" * 260}} req.body = jsonutils.dumps(data) - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller.create, req, self.uuid, data) #test for empty key. @@ -479,13 +479,13 @@ class ServerMetaDataTest(test.TestCase): #test for long key data = {"metadata": {"a" * 260: "value1"}} req.body = jsonutils.dumps(data) - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller.update_all, req, self.uuid, data) #test for long value data = {"metadata": {"key": "v" * 260}} req.body = jsonutils.dumps(data) - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller.update_all, req, self.uuid, data) #test for empty key. diff --git a/nova/tests/api/openstack/compute/test_servers.py b/nova/tests/api/openstack/compute/test_servers.py index 117ff26a4..92c9b37c8 100644 --- a/nova/tests/api/openstack/compute/test_servers.py +++ b/nova/tests/api/openstack/compute/test_servers.py @@ -1313,7 +1313,7 @@ class ServersControllerTest(test.TestCase): req.method = 'POST' req.body = jsonutils.dumps(body) req.headers["content-type"] = "application/json" - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller._action_rebuild, req, FAKE_UUID, body) def test_rebuild_instance_with_metadata_value_too_long(self): @@ -1347,7 +1347,7 @@ class ServersControllerTest(test.TestCase): req.method = 'POST' req.body = jsonutils.dumps(body) req.headers["content-type"] = "application/json" - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller._action_rebuild, req, FAKE_UUID, body) def test_rebuild_instance_fails_when_min_ram_too_small(self): @@ -2541,7 +2541,7 @@ class ServersControllerCreateTest(test.TestCase): req.body = jsonutils.dumps(body) req.headers["content-type"] = "application/json" - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller.create, req, body) def test_create_instance_metadata_value_too_long(self): @@ -2565,7 +2565,7 @@ class ServersControllerCreateTest(test.TestCase): req.body = jsonutils.dumps(body) req.headers["content-type"] = "application/json" - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(webob.exc.HTTPRequestEntityTooLarge, self.controller.create, req, body) def test_create_instance_metadata_key_blank(self): |