]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Add new exception for invalid template ref
authorJeff Peeler <jpeeler@redhat.com>
Wed, 8 May 2013 22:40:17 +0000 (18:40 -0400)
committerJeff Peeler <jpeeler@redhat.com>
Fri, 10 May 2013 15:41:24 +0000 (11:41 -0400)
Hopefully is clearer than a KeyError.

Change-Id: Ib387825396ab0286df00aaff3b1b539cd7fc9a77
Fixes: bug #1178011
heat/api/aws/exception.py
heat/api/openstack/v1/util.py
heat/common/exception.py
heat/engine/resource.py
heat/tests/test_vpc.py

index b4ece2b34545514fe8abcb7bec388fba431c0418..44ed0ef2c74208ac7759fc6d3fe81a13ab120fb6 100644 (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')
 
index f3aebc1f59beb0812a2fbe4d5a299359b3e1b1e0..4c9a96cf4c80306118cef3cd70c3c7e3cd645f82 100644 (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)
index 5fd56a192b13f45a6ebaf5cd0fc5738146e4eb63..97b8ea0ca454fe05df117b00125b937ddea6f498 100644 (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.")
 
index 92263211c99b74fa246ea0d8316078807e80bff6..ac216d65e183ca411d3fceecd1841ebeed8f3522 100644 (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):
index 022039aa3a3667a7ce43248625fe5408333fdde6..bc15edcc0e1bc19fdfd75add7c0c9b3521449499 100644 (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):