Skip to content

Commit

Permalink
Fix Incorrect Exception when metadata is over 255 characters
Browse files Browse the repository at this point in the history
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
(cherry picked from commit db7798a)
  • Loading branch information
dims authored and vishvananda committed Nov 21, 2012
1 parent 197398f commit 78de622
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 12 deletions.
3 changes: 3 additions & 0 deletions nova/api/openstack/compute/server_metadata.py
Expand Up @@ -129,6 +129,9 @@ def _update_instance_metadata(self, context, server_id, metadata,
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})
Expand Down
4 changes: 4 additions & 0 deletions nova/api/openstack/compute/servers.py
Expand Up @@ -860,6 +860,8 @@ def create(self, req, body):
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)
Expand Down Expand Up @@ -1203,6 +1205,8 @@ def _action_rebuild(self, req, id, body):
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)
Expand Down
4 changes: 2 additions & 2 deletions nova/compute/api.py
Expand Up @@ -270,11 +270,11 @@ def _check_metadata_properties_quota(self, context, metadata=None):
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
Expand Down
4 changes: 4 additions & 0 deletions nova/exception.py
Expand Up @@ -259,6 +259,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")

Expand Down
12 changes: 6 additions & 6 deletions nova/tests/api/openstack/compute/test_server_metadata.py
Expand Up @@ -371,7 +371,7 @@ def test_update_item_key_too_long(self):
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)

Expand All @@ -384,7 +384,7 @@ def test_update_item_value_too_long(self):
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)

Expand Down Expand Up @@ -436,13 +436,13 @@ def test_invalid_metadata_items_on_create(self):
#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.
Expand Down Expand Up @@ -479,13 +479,13 @@ def test_invalid_metadata_items_on_update_item(self):
#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.
Expand Down
8 changes: 4 additions & 4 deletions nova/tests/api/openstack/compute/test_servers.py
Expand Up @@ -1234,7 +1234,7 @@ def test_rebuild_instance_with_metadata_key_too_long(self):
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):
Expand Down Expand Up @@ -1268,7 +1268,7 @@ def test_rebuild_instance_with_metadata_value_too_long(self):
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):
Expand Down Expand Up @@ -2463,7 +2463,7 @@ def test_create_instance_metadata_key_too_long(self):
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):
Expand All @@ -2487,7 +2487,7 @@ def test_create_instance_metadata_value_too_long(self):
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):
Expand Down

0 comments on commit 78de622

Please sign in to comment.