summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Prince <dprince@redhat.com>2012-08-17 15:34:28 -0400
committerDan Prince <dprince@redhat.com>2012-08-17 23:11:55 -0400
commit1a605cccb1fe29ae6554ad5afa3110abef11d9c2 (patch)
treed45519d5abc4d5cb2f99b50bbabc51ca595abc95
parenta10be151ad9f62bb916498c8dae42e4b54dfc779 (diff)
downloadnova-1a605cccb1fe29ae6554ad5afa3110abef11d9c2.tar.gz
nova-1a605cccb1fe29ae6554ad5afa3110abef11d9c2.tar.xz
nova-1a605cccb1fe29ae6554ad5afa3110abef11d9c2.zip
Return HTTP 422 on bad server update PUT request.
This patch updates the /servers API and the disk config extension so that they properly handle incorrectly formatted server update/PUT requests. Includes a new test cause that verifies (with extensions enabled) that a poorly formatted PUT request to /servers returns HTTP 422 instead of a 500. Also updated the previous test_create_missing_server test to use test.TestException instead of Exception. Fixes LP Bug #1038227. Change-Id: I6b11602790778465348647bb5825b7326d50065a
-rw-r--r--nova/api/openstack/compute/contrib/disk_config.py3
-rw-r--r--nova/api/openstack/compute/servers.py3
-rw-r--r--nova/tests/api/openstack/compute/test_servers.py19
3 files changed, 23 insertions, 2 deletions
diff --git a/nova/api/openstack/compute/contrib/disk_config.py b/nova/api/openstack/compute/contrib/disk_config.py
index 293be7415..903f930fc 100644
--- a/nova/api/openstack/compute/contrib/disk_config.py
+++ b/nova/api/openstack/compute/contrib/disk_config.py
@@ -148,7 +148,8 @@ class ServerDiskConfigController(wsgi.Controller):
def update(self, req, id, body):
context = req.environ['nova.context']
if authorize(context):
- self._set_disk_config(body['server'])
+ if 'server' in body:
+ self._set_disk_config(body['server'])
resp_obj = (yield)
self._show(req, resp_obj)
diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py
index 0c5a2e530..67a950ada 100644
--- a/nova/api/openstack/compute/servers.py
+++ b/nova/api/openstack/compute/servers.py
@@ -813,6 +813,9 @@ class Controller(wsgi.Controller):
if not body:
raise exc.HTTPUnprocessableEntity()
+ if not 'server' in body:
+ raise exc.HTTPUnprocessableEntity()
+
ctxt = req.environ['nova.context']
update_dict = {}
diff --git a/nova/tests/api/openstack/compute/test_servers.py b/nova/tests/api/openstack/compute/test_servers.py
index 662a272f8..fd3597b68 100644
--- a/nova/tests/api/openstack/compute/test_servers.py
+++ b/nova/tests/api/openstack/compute/test_servers.py
@@ -4765,7 +4765,7 @@ class ServersAllExtensionsTestCase(test.TestCase):
"""Test create with malformed body"""
def fake_create(*args, **kwargs):
- raise Exception("Request should not reach the compute API.")
+ raise test.TestingException("Should not reach the compute API.")
self.stubs.Set(nova.compute.api.API, 'create', fake_create)
@@ -4777,3 +4777,20 @@ class ServersAllExtensionsTestCase(test.TestCase):
req.body = jsonutils.dumps(body)
res = req.get_response(self.app)
self.assertEqual(422, res.status_int)
+
+ def test_update_missing_server(self):
+ """Test create with malformed body"""
+
+ def fake_update(*args, **kwargs):
+ raise test.TestingException("Should not reach the compute API.")
+
+ self.stubs.Set(nova.compute.api.API, 'create', fake_update)
+
+ req = fakes.HTTPRequest.blank('/fake/servers/1')
+ req.method = 'PUT'
+ req.content_type = 'application/json'
+ body = {'foo': {'a': 'b'}}
+
+ req.body = jsonutils.dumps(body)
+ res = req.get_response(self.app)
+ self.assertEqual(422, res.status_int)