Add new exception for invalid template ref

Hopefully is clearer than a KeyError.

Change-Id: Ib387825396ab0286df00aaff3b1b539cd7fc9a77
Fixes: bug #1178011
This commit is contained in:
Jeff Peeler 2013-05-08 18:40:17 -04:00
parent 61090f485e
commit 54225d05d5
5 changed files with 25 additions and 8 deletions

View File

@ -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')

View File

@ -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)

View File

@ -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.")

View File

@ -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):

View File

@ -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):