From 78265babaf0f98b861f8d6707da3ae6fbbe376fe Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Tue, 29 Apr 2014 16:39:07 -0400 Subject: [PATCH] Raise InvalidTemplateReference for missing resources Previously this code raised InvalidTemplateAttribute when a resource doesn't exist. But our existing code (in the dependency check, which executes first) raises InvalidTemplateReference in this case and reserves InvalidTemplateAttribute for when the resource exists but the attribute is invalid. This patch makes the functions consistent with that behaviour. It also raises InvalidTemplateReference, instead of KeyError, in the same case in get_resource. I assumed that this could never fail, but that is only true for Ref, not get_resource. Change-Id: Ib7dcd3333bc2fc7778d3a013abae10c5795086dd --- heat/engine/cfn/functions.py | 20 ++++++++++++-------- heat/engine/parameters.py | 2 +- heat/tests/test_hot.py | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/heat/engine/cfn/functions.py b/heat/engine/cfn/functions.py index 558b172529..2bf6389be9 100644 --- a/heat/engine/cfn/functions.py +++ b/heat/engine/cfn/functions.py @@ -85,8 +85,9 @@ class ParamRef(function.Function): try: return self.parameters[param_name] - except (KeyError, ValueError): - raise exception.UserParameterMissing(key=param_name) + except KeyError: + raise exception.InvalidTemplateReference(resource=param_name, + key='unknown') class ResourceRef(function.Function): @@ -98,10 +99,14 @@ class ResourceRef(function.Function): { "Ref" : "" } ''' - def _resource(self): + def _resource(self, path='unknown'): resource_name = function.resolve(self.args) - return self.stack[resource_name] + try: + return self.stack[resource_name] + except KeyError: + raise exception.InvalidTemplateReference(resource=resource_name, + key=path) def result(self): return self._resource().FnGetRefId() @@ -150,15 +155,14 @@ class GetAtt(function.Function): return resource_name, attribute - def _resource(self): + def _resource(self, path='unknown'): resource_name = function.resolve(self._resource_name) try: return self.stack[resource_name] except KeyError: - raise exception.InvalidTemplateAttribute( - resource=resource_name, - key=function.resolve(self._attribute)) + raise exception.InvalidTemplateReference(resource=resource_name, + key=path) def result(self): attribute = function.resolve(self._attribute) diff --git a/heat/engine/parameters.py b/heat/engine/parameters.py index 910bacc29a..cc623c2af7 100644 --- a/heat/engine/parameters.py +++ b/heat/engine/parameters.py @@ -220,7 +220,7 @@ class Parameter(object): if self.has_default(): return self.default() - raise KeyError(_('Missing parameter %s') % self.name) + raise exception.UserParameterMissing(key=self.name) def hidden(self): ''' diff --git a/heat/tests/test_hot.py b/heat/tests/test_hot.py index 2d2d84820b..cc380097fb 100644 --- a/heat/tests/test_hot.py +++ b/heat/tests/test_hot.py @@ -649,7 +649,7 @@ class StackTest(test_parser.StackTest): self.stack.state) snippet = {'Value': {'get_attr': ['resource2', 'who_cares']}} - self.assertRaises(exception.InvalidTemplateAttribute, + self.assertRaises(exception.InvalidTemplateReference, self.resolve, snippet) @utils.stack_delete_after