From 1c78d4af8534b43f4633a21b1a2f3e2be7cfbf29 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Fri, 15 May 2015 17:18:12 -0400 Subject: [PATCH] Don't swallow AssertionErrors Most validation errors are in fact the user's problem, but in the case of an AssertionError that's a real problem with Heat. We should return 500 status codes and log the tracebacks, not wrap the in validation exceptions. Change-Id: I71d91a5413d7f026b332014487583b7f2762b322 --- heat/engine/resources/stack_resource.py | 2 ++ heat/engine/service.py | 2 ++ heat/engine/stack.py | 10 ++++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/heat/engine/resources/stack_resource.py b/heat/engine/resources/stack_resource.py index f4e4b1131d..576af5e489 100644 --- a/heat/engine/resources/stack_resource.py +++ b/heat/engine/resources/stack_resource.py @@ -66,6 +66,8 @@ class StackResource(resource.Resource): self.child_params()) nested_stack.strict_validate = False nested_stack.validate() + except AssertionError: + raise except Exception as ex: raise exception.StackValidationFailed( error=_("Failed to validate"), diff --git a/heat/engine/service.py b/heat/engine/service.py index cb78aa17ca..a3ac0dce28 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -556,6 +556,8 @@ class EngineService(service.Service): def _validate_new_stack(self, cnxt, stack_name, parsed_template): try: parsed_template.validate() + except AssertionError: + raise except Exception as ex: raise exception.StackValidationFailed(message=six.text_type(ex)) diff --git a/heat/engine/stack.py b/heat/engine/stack.py index b566bca04b..085b600c18 100755 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -642,8 +642,10 @@ class Stack(collections.Mapping): try: result = res.validate() except exception.HeatException as ex: - LOG.info(ex) + LOG.debug('%s', ex) raise ex + except AssertionError: + raise except Exception as ex: LOG.exception(_LE("Exception: %s"), ex) raise exception.StackValidationFailed( @@ -669,7 +671,9 @@ class Stack(collections.Mapping): path=[self.t.OUTPUTS], message=message) except exception.StackValidationFailed as ex: - raise ex + raise + except AssertionError: + raise except Exception as ex: raise exception.StackValidationFailed( error='Output validation error', @@ -1555,6 +1559,8 @@ class Stack(collections.Mapping): def resolve_static_data(self, snippet): try: return self.t.parse(self, snippet) + except AssertionError: + raise except Exception as ex: raise exception.StackValidationFailed( message=encodeutils.safe_decode(six.text_type(ex)))