From 2e0dfbab47470e91fdbdbcfc81387692a5523fa3 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Mon, 10 Sep 2012 18:04:34 +0200 Subject: [PATCH] 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 --- heat/api/v1/stacks.py | 12 +++++++++--- heat/tests/test_api_cfn_v1.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) 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" -- 2.45.2