From: Zane Bitter Date: Mon, 10 Sep 2012 16:04:34 +0000 (+0200) Subject: Handle verification errors in create/update in cfn API X-Git-Tag: 2014.1~1445 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=2e0dfbab47470e91fdbdbcfc81387692a5523fa3;p=openstack-build%2Fheat-build.git Handle verification errors in create/update in cfn API If a StackCreate or StackUpdate call fails verification in the engine, we get an error message returned rather than a stack identifier. Fixes #224 Change-Id: I5f47f5d0e25e8bc05633d29605adcc8827edd379 Signed-off-by: Zane Bitter --- diff --git a/heat/api/v1/stacks.py b/heat/api/v1/stacks.py index e259df7e..8ca455e8 100644 --- a/heat/api/v1/stacks.py +++ b/heat/api/v1/stacks.py @@ -312,12 +312,18 @@ class StackController(object): else: args['stack_identity'] = self._get_identity(con, stack_name) - res = engine_action[action](con, **args) + result = engine_action[action](con, **args) except rpc_common.RemoteError as ex: return exception.map_remote_error(ex) - identity = identifier.HeatIdentifier(**res) - return api_utils.format_response(action, {'StackId': identity.arn()}) + try: + identity = identifier.HeatIdentifier(**result) + except (ValueError, TypeError): + response = result + else: + response = {'StackId': identity.arn()} + + return api_utils.format_response(action, response) def get_template(self, req): """ diff --git a/heat/tests/test_api_cfn_v1.py b/heat/tests/test_api_cfn_v1.py index aae253df..122679ea 100644 --- a/heat/tests/test_api_cfn_v1.py +++ b/heat/tests/test_api_cfn_v1.py @@ -472,6 +472,41 @@ class StackControllerTest(unittest.TestCase): self.assertEqual(type(result), exception.HeatInvalidParameterValueError) + def test_create_err_engine(self): + # Format a dummy request + stack_name = "wordpress" + template = {u'Foo': u'bar'} + json_template = json.dumps(template) + params = {'Action': 'CreateStack', 'StackName': stack_name, + 'TemplateBody': '%s' % json_template, + 'TimeoutInMinutes': 30, + 'Parameters.member.1.ParameterKey': 'InstanceType', + 'Parameters.member.1.ParameterValue': 'm1.xlarge'} + engine_parms = {u'InstanceType': u'm1.xlarge'} + engine_args = {'timeout_mins': u'30'} + dummy_req = self._dummy_GET_request(params) + + # Stub out the RPC call to the engine with a pre-canned response + self.m.StubOutWithMock(rpc, 'call') + engine_err = {'Description': 'Something went wrong'} + + rpc.call(dummy_req.context, self.topic, {'method': 'create_stack', + 'args': + {'stack_name': stack_name, + 'template': template, + 'params': engine_parms, + 'args': engine_args}, + 'version': self.api_version}, None + ).AndReturn(engine_err) + + self.m.ReplayAll() + + result = self.controller.create(dummy_req) + + expected = {'CreateStackResponse': {'CreateStackResult': engine_err}} + + self.assertEqual(result, expected) + def test_update(self): # Format a dummy request stack_name = "wordpress"