From: Liang Chen Date: Mon, 17 Jun 2013 10:19:15 +0000 (+0800) Subject: make stack creation return json response X-Git-Tag: 2014.1~446^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=8dca1f53170bceecb6f14b1b12a4911439dfce6b;p=openstack-build%2Fheat-build.git make stack creation return json response added a serializer to handle create response serialization fixes bug #1187883 Change-Id: Ibdeb8b810d759901979becb8b29bdc337f2f5bec --- diff --git a/heat/api/openstack/v1/stacks.py b/heat/api/openstack/v1/stacks.py index fd244e9f..450be990 100644 --- a/heat/api/openstack/v1/stacks.py +++ b/heat/api/openstack/v1/stacks.py @@ -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) diff --git a/heat/tests/test_api_openstack_v1.py b/heat/tests/test_api_openstack_v1.py index 3e3b111c..e8c53c22 100644 --- a/heat/tests/test_api_openstack_v1.py +++ b/heat/tests/test_api_openstack_v1.py @@ -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,