From 7b9c2312cd323c0cfc80f86c0385ff2c9f8e5daf Mon Sep 17 00:00:00 2001 From: Liang Chen Date: Wed, 12 Jun 2013 21:47:05 +0800 Subject: [PATCH] fix an CFN API and AWS error mapping StackExists should return AlreadyExists, not InvalidParameterValue Fixes bug #1188473 Change-Id: Ia969cddc1b61caa13f4f70bcc29f3160595a779b --- heat/api/aws/exception.py | 13 ++++++++++++- heat/tests/test_api_cfn_v1.py | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/heat/api/aws/exception.py b/heat/api/aws/exception.py index 462163c5e3..a75463e273 100644 --- a/heat/api/aws/exception.py +++ b/heat/api/aws/exception.py @@ -204,6 +204,15 @@ class HeatThrottlingError(HeatAPIException): explanation = "Request was denied due to request throttling" +class AlreadyExistsError(HeatAPIException): + ''' + Resource with the name requested already exists + ''' + code = 400 + title = 'AlreadyExists' + explanation = "Resource with the name requested already exists" + + # Not documented in the AWS docs, authentication failure errors class HeatAccessDeniedError(HeatAPIException): ''' @@ -252,17 +261,19 @@ def map_remote_error(ex): 'ResourceNotAvailable', 'PhysicalResourceNotFound', 'WatchRuleNotFound', - 'StackExists', 'StackValidationFailed', 'InvalidTemplateReference', 'UnknownUserParameter', ) denied_errors = ('Forbidden', 'NotAuthorized') + already_exists_errors = ('StackExists') if ex.exc_type in inval_param_errors: return HeatInvalidParameterValueError(detail=ex.value) elif ex.exc_type in denied_errors: return HeatAccessDeniedError(detail=ex.value) + elif ex.exc_type in already_exists_errors: + return AlreadyExistsError(detail=ex.value) else: # Map everything else to internal server error for now return HeatInternalFailureError(detail=ex.value) diff --git a/heat/tests/test_api_cfn_v1.py b/heat/tests/test_api_cfn_v1.py index 130d2682aa..eafff5ff65 100644 --- a/heat/tests/test_api_cfn_v1.py +++ b/heat/tests/test_api_cfn_v1.py @@ -597,7 +597,7 @@ class CfnStackControllerTest(HeatTestCase): result = self.controller.create(dummy_req) self.assertEqual(type(result), - exception.HeatInvalidParameterValueError) + exception.AlreadyExistsError) self.m.VerifyAll() def test_create_err_engine(self):