Add entity body validation helper
Add a _valid_body() helper for the servers API to avoid repeating the same tests in multiple methods. Include a check that the 'server' value is actually a dict. Also remove the superfluous checking of req.body which is a leftover from when the body wasn't a method parameter. Change-Id: If8114cc76d68567005c85c803f29e30e034db89a
This commit is contained in:
@@ -613,10 +613,7 @@ class Controller(wsgi.Controller):
|
|||||||
@wsgi.deserializers(xml=CreateDeserializer)
|
@wsgi.deserializers(xml=CreateDeserializer)
|
||||||
def create(self, req, body):
|
def create(self, req, body):
|
||||||
"""Creates a new server for a given user."""
|
"""Creates a new server for a given user."""
|
||||||
if not body:
|
if not self.is_valid_body(body, 'server'):
|
||||||
raise exc.HTTPUnprocessableEntity()
|
|
||||||
|
|
||||||
if not 'server' in body:
|
|
||||||
raise exc.HTTPUnprocessableEntity()
|
raise exc.HTTPUnprocessableEntity()
|
||||||
|
|
||||||
body['server']['key_name'] = self._get_key_name(req, body)
|
body['server']['key_name'] = self._get_key_name(req, body)
|
||||||
@@ -815,13 +812,7 @@ class Controller(wsgi.Controller):
|
|||||||
@wsgi.serializers(xml=ServerTemplate)
|
@wsgi.serializers(xml=ServerTemplate)
|
||||||
def update(self, req, id, body):
|
def update(self, req, id, body):
|
||||||
"""Update server then pass on to version-specific controller."""
|
"""Update server then pass on to version-specific controller."""
|
||||||
if len(req.body) == 0:
|
if not self.is_valid_body(body, 'server'):
|
||||||
raise exc.HTTPUnprocessableEntity()
|
|
||||||
|
|
||||||
if not body:
|
|
||||||
raise exc.HTTPUnprocessableEntity()
|
|
||||||
|
|
||||||
if not 'server' in body:
|
|
||||||
raise exc.HTTPUnprocessableEntity()
|
raise exc.HTTPUnprocessableEntity()
|
||||||
|
|
||||||
ctxt = req.environ['nova.context']
|
ctxt = req.environ['nova.context']
|
||||||
|
|||||||
@@ -1102,6 +1102,23 @@ class Controller(object):
|
|||||||
else:
|
else:
|
||||||
self._view_builder = None
|
self._view_builder = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_valid_body(body, entity_name):
|
||||||
|
if not (body and entity_name in body):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def is_dict(d):
|
||||||
|
try:
|
||||||
|
d.get(None)
|
||||||
|
return True
|
||||||
|
except AttributeError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not is_dict(body[entity_name]):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class Fault(webob.exc.HTTPException):
|
class Fault(webob.exc.HTTPException):
|
||||||
"""Wrap webob.exc.HTTPException to provide API friendly response."""
|
"""Wrap webob.exc.HTTPException to provide API friendly response."""
|
||||||
|
|||||||
@@ -2765,16 +2765,6 @@ class ServersControllerCreateTest(test.TestCase):
|
|||||||
# The fact that the action doesn't raise is enough validation
|
# The fact that the action doesn't raise is enough validation
|
||||||
self.controller.create(req, body)
|
self.controller.create(req, body)
|
||||||
|
|
||||||
def test_create_instance_malformed_entity(self):
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/fake/servers')
|
|
||||||
req.method = 'POST'
|
|
||||||
body = {'server': 'string'}
|
|
||||||
req.body = jsonutils.dumps(body)
|
|
||||||
req.headers['content-type'] = "application/json"
|
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
|
||||||
self.controller.create, req, body)
|
|
||||||
|
|
||||||
def test_create_location(self):
|
def test_create_location(self):
|
||||||
selfhref = 'http://localhost/v2/fake/servers/%s' % FAKE_UUID
|
selfhref = 'http://localhost/v2/fake/servers/%s' % FAKE_UUID
|
||||||
bookhref = 'http://localhost/fake/servers/%s' % FAKE_UUID
|
bookhref = 'http://localhost/fake/servers/%s' % FAKE_UUID
|
||||||
@@ -4866,6 +4856,10 @@ class ServersUnprocessableEntityTestCase(test.TestCase):
|
|||||||
body = {'foo': {'a': 'b'}}
|
body = {'foo': {'a': 'b'}}
|
||||||
self._unprocessable_server_create(body=body)
|
self._unprocessable_server_create(body=body)
|
||||||
|
|
||||||
|
def test_create_server_malformed_entity(self):
|
||||||
|
body = {'server': 'string'}
|
||||||
|
self._unprocessable_server_create(body=body)
|
||||||
|
|
||||||
def _unprocessable_server_update(self, body):
|
def _unprocessable_server_update(self, body):
|
||||||
req = fakes.HTTPRequest.blank('/v2/fake/servers/%s' % FAKE_UUID)
|
req = fakes.HTTPRequest.blank('/v2/fake/servers/%s' % FAKE_UUID)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
@@ -4879,3 +4873,7 @@ class ServersUnprocessableEntityTestCase(test.TestCase):
|
|||||||
def test_update_server_missing_server(self):
|
def test_update_server_missing_server(self):
|
||||||
body = {'foo': {'a': 'b'}}
|
body = {'foo': {'a': 'b'}}
|
||||||
self._unprocessable_server_update(body=body)
|
self._unprocessable_server_update(body=body)
|
||||||
|
|
||||||
|
def test_create_update_malformed_entity(self):
|
||||||
|
body = {'server': 'string'}
|
||||||
|
self._unprocessable_server_update(body=body)
|
||||||
|
|||||||
@@ -861,3 +861,32 @@ class ResponseObjectTest(test.TestCase):
|
|||||||
self.assertEqual(response.headers['X-header2'], 'header2')
|
self.assertEqual(response.headers['X-header2'], 'header2')
|
||||||
self.assertEqual(response.status_int, 202)
|
self.assertEqual(response.status_int, 202)
|
||||||
self.assertEqual(response.body, mtype)
|
self.assertEqual(response.body, mtype)
|
||||||
|
|
||||||
|
|
||||||
|
class ValidBodyTest(test.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(ValidBodyTest, self).setUp()
|
||||||
|
self.controller = wsgi.Controller()
|
||||||
|
|
||||||
|
def test_is_valid_body(self):
|
||||||
|
body = {'foo': {}}
|
||||||
|
self.assertTrue(self.controller.is_valid_body(body, 'foo'))
|
||||||
|
|
||||||
|
def test_is_valid_body_none(self):
|
||||||
|
resource = wsgi.Resource(controller=None)
|
||||||
|
self.assertFalse(self.controller.is_valid_body(None, 'foo'))
|
||||||
|
|
||||||
|
def test_is_valid_body_empty(self):
|
||||||
|
resource = wsgi.Resource(controller=None)
|
||||||
|
self.assertFalse(self.controller.is_valid_body({}, 'foo'))
|
||||||
|
|
||||||
|
def test_is_valid_body_no_entity(self):
|
||||||
|
resource = wsgi.Resource(controller=None)
|
||||||
|
body = {'bar': {}}
|
||||||
|
self.assertFalse(self.controller.is_valid_body(body, 'foo'))
|
||||||
|
|
||||||
|
def test_is_valid_body_malformed_entity(self):
|
||||||
|
resource = wsgi.Resource(controller=None)
|
||||||
|
body = {'foo': 'bar'}
|
||||||
|
self.assertFalse(self.controller.is_valid_body(body, 'foo'))
|
||||||
|
|||||||
Reference in New Issue
Block a user