From: Jeff Peeler Date: Wed, 8 May 2013 22:40:17 +0000 (-0400) Subject: Add new exception for invalid template ref X-Git-Tag: 2014.1~617^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=54225d05d50aa9234eb44abc4d295047da393d87;p=openstack-build%2Fheat-build.git Add new exception for invalid template ref Hopefully is clearer than a KeyError. Change-Id: Ib387825396ab0286df00aaff3b1b539cd7fc9a77 Fixes: bug #1178011 --- diff --git a/heat/api/aws/exception.py b/heat/api/aws/exception.py index b4ece2b3..44ed0ef2 100644 --- a/heat/api/aws/exception.py +++ b/heat/api/aws/exception.py @@ -1,4 +1,4 @@ -# vim: tabstop = 4 shiftwidth=4 softtabstop=4 +# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. @@ -254,6 +254,7 @@ def map_remote_error(ex): 'WatchRuleNotFound', 'StackExists', 'StackValidationFailed', + 'InvalidTemplateReference', ) denied_errors = ('Forbidden', 'NotAuthorized') diff --git a/heat/api/openstack/v1/util.py b/heat/api/openstack/v1/util.py index f3aebc1f..4c9a96cf 100644 --- a/heat/api/openstack/v1/util.py +++ b/heat/api/openstack/v1/util.py @@ -97,6 +97,7 @@ def remote_error(ex): 'InvalidTenant': exc.HTTPForbidden, 'StackExists': exc.HTTPConflict, 'StackValidationFailed': exc.HTTPBadRequest, + 'InvalidTemplateReference': exc.HTTPBadRequest, } Exc = error_map.get(ex.exc_type, exc.HTTPInternalServerError) diff --git a/heat/common/exception.py b/heat/common/exception.py index 5fd56a19..97b8ea0c 100644 --- a/heat/common/exception.py +++ b/heat/common/exception.py @@ -196,6 +196,11 @@ class InvalidTemplateAttribute(OpenstackException): " is incorrect.") +class InvalidTemplateReference(OpenstackException): + message = _("The specified reference (%(resource)s %(key)s)" + " is incorrect.") + + class UserKeyPairMissing(OpenstackException): message = _("The Key (%(key_name)s) could not be found.") diff --git a/heat/engine/resource.py b/heat/engine/resource.py index 92263211..ac216d65 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -262,21 +262,26 @@ class Resource(object): def __str__(self): return '%s "%s"' % (self.__class__.__name__, self.name) - def _add_dependencies(self, deps, fragment): + def _add_dependencies(self, deps, head, fragment): if isinstance(fragment, dict): for key, value in fragment.items(): if key in ('DependsOn', 'Ref'): - target = self.stack.resources[value] + try: + target = self.stack.resources[value] + except KeyError: + raise exception.InvalidTemplateReference( + resource=value, + key=head) if key == 'DependsOn' or target.strict_dependency: deps += (self, target) elif key != 'Fn::GetAtt': - self._add_dependencies(deps, value) + self._add_dependencies(deps, key, value) elif isinstance(fragment, list): for item in fragment: - self._add_dependencies(deps, item) + self._add_dependencies(deps, head, item) def add_dependencies(self, deps): - self._add_dependencies(deps, self.t) + self._add_dependencies(deps, None, self.t) deps += (self, None) def keystone(self): diff --git a/heat/tests/test_vpc.py b/heat/tests/test_vpc.py index 022039aa..bc15edcc 100644 --- a/heat/tests/test_vpc.py +++ b/heat/tests/test_vpc.py @@ -390,10 +390,15 @@ Resources: self.m.VerifyAll() def test_network_interface_error(self): - self.assertRaises( - KeyError, + real_exception = self.assertRaises( + exception.InvalidTemplateReference, self.create_stack, self.test_template_error) + expected_exception = exception.InvalidTemplateReference( + resource='INVALID-REF-IN-TEMPLATE', + key='GroupSet') + + self.assertEquals(str(expected_exception), str(real_exception)) class InternetGatewayTest(VPCTestBase):