]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
RPC API: Add a StackExists exception
authorZane Bitter <zbitter@redhat.com>
Thu, 17 Jan 2013 10:10:15 +0000 (11:10 +0100)
committerZane Bitter <zbitter@redhat.com>
Thu, 17 Jan 2013 10:47:47 +0000 (11:47 +0100)
Change-Id: Ia8cb5af80abc7570b938c381d51e41eb7aa0629d
Signed-off-by: Zane Bitter <zbitter@redhat.com>
heat/api/aws/exception.py
heat/api/openstack/v1/util.py
heat/common/exception.py
heat/engine/service.py
heat/tests/test_api_cfn_v1.py
heat/tests/test_api_openstack_v1.py
heat/tests/test_engine_service.py

index 4ab0937c32e3b5a3644bc614a86b4c6c53ede9f7..1cfc1c89a5770734b44699380ee6cd84018805ce 100644 (file)
@@ -248,6 +248,7 @@ def map_remote_error(ex):
             'ValueError',
             'InvalidTenant',
             'StackNotFound',
+            'StackExists',
         )
 
         if ex.exc_type in inval_param_errors:
index db5323f30e0ccb6d650e312a1107354feaa92d46..c231b1940bb2ddeb3c5f431ff64618f49adaa838 100644 (file)
@@ -93,6 +93,7 @@ def remote_error(ex, force_exists=False):
         'ValueError': client_error,
         'StackNotFound': exc.HTTPNotFound,
         'InvalidTenant': exc.HTTPForbidden,
+        'StackExists': exc.HTTPConflict,
     }
 
     Exc = error_map.get(ex.exc_type, exc.HTTPInternalServerError)
index d58b040b9947b690a1f16455f1cffa9869fcb90a..8a170399feeeba702d060a49acb7cb1694facc9f 100644 (file)
@@ -211,3 +211,7 @@ class InvalidTenant(OpenstackException):
 
 class StackNotFound(OpenstackException):
     message = _("The Stack (%(stack_name)s) could not be found.")
+
+
+class StackExists(OpenstackException):
+    message = _("The Stack (%(stack_name)s) already exists.")
index 81b463c0c057fdc196f640d16c1e4c94de364c90..2ed405bb2c302acd06e0a48525b0096faaa128ea 100644 (file)
@@ -197,7 +197,7 @@ class EngineService(service.Service):
         logger.info('template is %s' % template)
 
         if db_api.stack_get_by_name(context, stack_name):
-            raise AttributeError('Stack already exists with that name')
+            raise exception.StackExists(stack_name=stack_name)
 
         tmpl = parser.Template(template)
 
index 95b6278bc467f18e21ea97927621cf1dbbf68806..44b85f43b6870a2e1af5debff130f7de2a3483d0 100644 (file)
@@ -490,6 +490,40 @@ class StackControllerTest(unittest.TestCase):
         self.assertEqual(type(result),
                          exception.HeatInvalidParameterValueError)
 
+    def test_create_err_exists(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)
+
+        # Insert an engine RPC error and ensure we map correctly to the
+        # heat exception type
+        self.m.StubOutWithMock(rpc, 'call')
+
+        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
+                 ).AndRaise(rpc_common.RemoteError("StackExists"))
+
+        self.m.ReplayAll()
+
+        result = self.controller.create(dummy_req)
+
+        self.assertEqual(type(result),
+                         exception.HeatInvalidParameterValueError)
+
     def test_create_err_engine(self):
         # Format a dummy request
         stack_name = "wordpress"
index 8e733ebdf9a603b248d2c8fbfab37ab307a062e4..e9b19fd8dce2303d774f50aa77660438fe1306ce 100644 (file)
@@ -379,6 +379,34 @@ class StackControllerTest(ControllerTest, unittest.TestCase):
                           req, tenant_id=self.tenant, body=body)
         self.m.VerifyAll()
 
+    def test_create_err_existing(self):
+        stack_name = "wordpress"
+        template = {u'Foo': u'bar'}
+        parameters = {u'InstanceType': u'm1.xlarge'}
+        json_template = json.dumps(template)
+        body = {'template': template,
+                'stack_name': stack_name,
+                'parameters': parameters,
+                'timeout_mins': 30}
+
+        req = self._post('/stacks', json.dumps(body))
+
+        self.m.StubOutWithMock(rpc, 'call')
+        rpc.call(req.context, self.topic,
+                 {'method': 'create_stack',
+                  'args': {'stack_name': stack_name,
+                           'template': template,
+                           'params': parameters,
+                           'args': {'timeout_mins': 30}},
+                  'version': self.api_version},
+                 None).AndRaise(rpc_common.RemoteError("StackExists"))
+        self.m.ReplayAll()
+
+        self.assertRaises(webob.exc.HTTPConflict,
+                          self.controller.create,
+                          req, tenant_id=self.tenant, body=body)
+        self.m.VerifyAll()
+
     def test_create_err_engine(self):
         stack_name = "wordpress"
         template = {u'Foo': u'bar'}
index 60c81cda39e71724912eecb3024cb8d572156f76..d4cd759a7815d887e53c8b96ee0023983dec18a6 100644 (file)
@@ -412,7 +412,7 @@ class stackServiceTest(unittest.TestCase):
                           self.ctx, 'wibble')
 
     def test_stack_create_existing(self):
-        self.assertRaises(AttributeError, self.man.create_stack,
+        self.assertRaises(exception.StackExists, self.man.create_stack,
                           self.ctx, self.stack_name, self.stack.t, {}, {})
 
     def test_stack_by_name_tenants(self):