summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavanum Srinivas <davanum@gmail.com>2012-10-23 22:37:04 -0400
committerDavanum Srinivas <davanum@gmail.com>2012-10-24 08:27:41 -0400
commitdb7798a973bb05af5d4668a9f9b20ce62e8a47af (patch)
tree563aaef1b651d41a825994e3896bf3dad11583d3
parentdf1fb2978c854beb58646406796c2bef2bfb047f (diff)
downloadnova-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.py3
-rw-r--r--nova/api/openstack/compute/servers.py4
-rw-r--r--nova/compute/api.py4
-rw-r--r--nova/exception.py4
-rw-r--r--nova/tests/api/openstack/compute/test_server_metadata.py12
-rw-r--r--nova/tests/api/openstack/compute/test_servers.py8
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):