]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
make stack creation return json response
authorLiang Chen <cbjchen@cn.ibm.com>
Mon, 17 Jun 2013 10:19:15 +0000 (18:19 +0800)
committerLiang Chen <cbjchen@cn.ibm.com>
Fri, 21 Jun 2013 07:01:13 +0000 (15:01 +0800)
added a serializer to handle create response serialization

fixes bug #1187883

Change-Id: Ibdeb8b810d759901979becb8b29bdc337f2f5bec

heat/api/openstack/v1/stacks.py
heat/tests/test_api_openstack_v1.py

index fd244e9f25ad6335ae736a989d4e9d7365f99f39..450be99097ad5e85350283864f44890448ef5415 100644 (file)
@@ -223,7 +223,7 @@ class StackController(object):
         except rpc_common.RemoteError as ex:
             return util.remote_error(ex)
 
-        raise exc.HTTPCreated(location=util.make_url(req, result))
+        return {'stack': format_stack(req, {engine_api.STACK_ID: result})}
 
     @util.tenant_local
     def lookup(self, req, stack_name, path='', body=None):
@@ -354,11 +354,28 @@ class StackController(object):
         return {'resource_types': types}
 
 
+class StackSerializer(wsgi.JSONResponseSerializer):
+    """Handles serialization of specific controller method responses."""
+
+    def _populate_response_header(self, response, location, status):
+        response.status = status
+        response.headers['Location'] = location.encode('utf-8')
+        response.headers['Content-Type'] = 'application/json'
+        return response
+
+    def create(self, response, result):
+        self._populate_response_header(response,
+                                       result['stack']['links'][0]['href'],
+                                       201)
+        response.body = self.to_json(result)
+        return response
+
+
 def create_resource(options):
     """
     Stacks resource factory method.
     """
     # TODO(zaneb) handle XML based on Content-type/Accepts
     deserializer = wsgi.JSONRequestDeserializer()
-    serializer = wsgi.JSONResponseSerializer()
+    serializer = StackSerializer()
     return wsgi.Resource(StackController(options), deserializer, serializer)
index 3e3b111c69afa7952aad6c71cc319d16b8dbd4ae..e8c53c22ae79916dbfe96aa03754d67b4a04958a 100644 (file)
@@ -365,14 +365,15 @@ class StackControllerTest(ControllerTest, HeatTestCase):
                  None).AndReturn(dict(identity))
         self.m.ReplayAll()
 
-        try:
-            response = self.controller.create(req,
-                                              tenant_id=identity.tenant,
-                                              body=body)
-        except webob.exc.HTTPCreated as created:
-            self.assertEqual(created.location, self._url(identity))
-        else:
-            self.fail('HTTPCreated not raised')
+        response = self.controller.create(req,
+                                          tenant_id=identity.tenant,
+                                          body=body)
+
+        expected = {'stack':
+                    {'id': '1',
+                     'links': [{'href': self._url(identity), 'rel': 'self'}]}}
+        self.assertEqual(response, expected)
+
         self.m.VerifyAll()
 
     def test_create_with_files(self):
@@ -401,14 +402,14 @@ class StackControllerTest(ControllerTest, HeatTestCase):
                  None).AndReturn(dict(identity))
         self.m.ReplayAll()
 
-        try:
-            response = self.controller.create(req,
-                                              tenant_id=identity.tenant,
-                                              body=body)
-        except webob.exc.HTTPCreated as created:
-            self.assertEqual(created.location, self._url(identity))
-        else:
-            self.fail('HTTPCreated not raised')
+        result = self.controller.create(req,
+                                        tenant_id=identity.tenant,
+                                        body=body)
+        expected = {'stack':
+                    {'id': '1',
+                     'links': [{'href': self._url(identity), 'rel': 'self'}]}}
+        self.assertEqual(result, expected)
+
         self.m.VerifyAll()
 
     def test_create_err_rpcerr(self):
@@ -997,6 +998,23 @@ class StackControllerTest(ControllerTest, HeatTestCase):
         self.m.VerifyAll()
 
 
+class StackSerializerTest(HeatTestCase):
+
+    def setUp(self):
+        super(StackSerializerTest, self).setUp()
+        self.serializer = stacks.StackSerializer()
+
+    def test_serialize_create(self):
+        result = {'stack':
+                  {'id': '1',
+                   'links': [{'href': 'location', "rel": "self"}]}}
+        response = webob.Response()
+        response = self.serializer.create(response, result)
+        self.assertEqual(response.status_int, 201)
+        self.assertEqual(response.headers['Location'], 'location')
+        self.assertEqual(response.headers['Content-Type'], 'application/json')
+
+
 class ResourceControllerTest(ControllerTest, HeatTestCase):
     '''
     Tests the API class which acts as the WSGI controller,