From 75fe47994b3557cd6091355aaee4c75cc5d3b2ba Mon Sep 17 00:00:00 2001
From: Salvatore Orlando <salvatore.orlando@eu.citrix.com>
Date: Mon, 1 Aug 2011 15:40:29 +0100
Subject: [PATCH] Fixing API behaviour for throwing 400 error on invalid body.
 Adding unit test for creating a port without request body.

---
 quantum/api/api_common.py |  8 +++++++-
 tests/unit/test_api.py    | 21 +++++++++++++++++++++
 tests/unit/testlib_api.py |  5 +++--
 3 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/quantum/api/api_common.py b/quantum/api/api_common.py
index c588a83567..140a7c5b9b 100644
--- a/quantum/api/api_common.py
+++ b/quantum/api/api_common.py
@@ -43,7 +43,13 @@ class QuantumController(wsgi.Controller):
                 des_body = self._deserialize(req.body,
                                              req.best_match_content_type())
                 data = des_body and des_body.get(self._resource_name, None)
-                param_value = data and data.get(param_name, None)
+                if not data:
+                    msg = ("Failed to parse request. Resource: " +
+                           self._resource_name + " not found in request body")
+                    for line in msg.split('\n'):
+                        LOG.error(line)
+                    raise exc.HTTPBadRequest(msg)
+                param_value = data.get(param_name, None)
             if not param_value:
                 # 2- parse request headers
                 # prepend param name with a 'x-' prefix
diff --git a/tests/unit/test_api.py b/tests/unit/test_api.py
index d17e6ed87f..9cad7ed41f 100644
--- a/tests/unit/test_api.py
+++ b/tests/unit/test_api.py
@@ -285,6 +285,21 @@ class APITest(unittest.TestCase):
         self.assertEqual(show_port_res.status_int, 430)
         LOG.debug("_test_show_port_portnotfound - format:%s - END", format)
 
+    def _test_create_port_noreqbody(self, format):
+        LOG.debug("_test_create_port_noreqbody - format:%s - START", format)
+        content_type = "application/%s" % format
+        network_id = self._create_network(format)
+        port_id = self._create_port(network_id, None, format,
+                                    custom_req_body='')
+        show_port_req = testlib.show_port_request(self.tenant_id,
+                                                  network_id, port_id, format)
+        show_port_res = show_port_req.get_response(self.api)
+        self.assertEqual(show_port_res.status_int, 200)
+        port_data = self._port_serializer.deserialize(
+                        show_port_res.body, content_type)
+        self.assertEqual(port_id, port_data['port']['id'])
+        LOG.debug("_test_create_port_noreqbody - format:%s - END", format)
+
     def _test_create_port(self, format):
         LOG.debug("_test_create_port - format:%s - START", format)
         content_type = "application/%s" % format
@@ -741,6 +756,12 @@ class APITest(unittest.TestCase):
     def test_create_port_xml(self):
         self._test_create_port('xml')
 
+    def test_create_port_noreqbody_json(self):
+        self._test_create_port_noreqbody('json')
+
+    def test_create_port_noreqbody_xml(self):
+        self._test_create_port_noreqbody('xml')
+
     def test_create_port_networknotfound_json(self):
         self._test_create_port_networknotfound('json')
 
diff --git a/tests/unit/testlib_api.py b/tests/unit/testlib_api.py
index 1a731be154..0a50d616e0 100644
--- a/tests/unit/testlib_api.py
+++ b/tests/unit/testlib_api.py
@@ -77,9 +77,10 @@ def new_port_request(tenant_id, network_id, port_state,
     method = 'POST'
     path = "/tenants/%(tenant_id)s/networks/" \
            "%(network_id)s/ports.%(format)s" % locals()
-    data = custom_req_body or {'port': {'port-state': '%s' % port_state}}
+    data = custom_req_body or port_state and \
+           {'port': {'port-state': '%s' % port_state}}
     content_type = "application/%s" % format
-    body = Serializer().serialize(data, content_type)
+    body = data and Serializer().serialize(data, content_type)
     return create_request(path, body, content_type, method)