]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Handle verification errors in create/update in cfn API
authorZane Bitter <zbitter@redhat.com>
Mon, 10 Sep 2012 16:04:34 +0000 (18:04 +0200)
committerZane Bitter <zbitter@redhat.com>
Mon, 10 Sep 2012 16:04:34 +0000 (18:04 +0200)
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 <zbitter@redhat.com>
heat/api/v1/stacks.py
heat/tests/test_api_cfn_v1.py

index e259df7eb7099222f52e2d277517d247b780e760..8ca455e8084d5db822d6d4f7df721a6c484ed225 100644 (file)
@@ -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):
         """
index aae253dffc7896f1c7aa56b936f2abb38794199f..122679eaa7a7d3bdc56421fd39317520f5cbddb0 100644 (file)
@@ -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"