]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Not to eat Metadata parsing error
authorLiang Chen <cbjchen@cn.ibm.com>
Mon, 12 Aug 2013 15:21:18 +0000 (23:21 +0800)
committerLiang Chen <cbjchen@cn.ibm.com>
Mon, 12 Aug 2013 15:24:37 +0000 (23:24 +0800)
Exception raised while resolving metadata is treated as database
exception and eaten.

A few testing errors are revealed after metadata parsing error is
propagated to callers.

Fixes bug #1207193

Change-Id: I3b5cc5fed3896b7fe59533c7d09f0226e5cf5ad9

heat/engine/resource.py
heat/tests/test_autoscaling.py
heat/tests/test_resource.py

index 656a71cb095bda4526275c3f2672a25f91272120..bb071ee64c9e0af9f1c0950f7f39ce25b35da093 100644 (file)
@@ -575,6 +575,7 @@ class Resource(object):
 
     def _store(self):
         '''Create the resource in the database.'''
+        metadata = self.metadata
         try:
             rs = {'action': self.action,
                   'status': self.status,
@@ -582,7 +583,7 @@ class Resource(object):
                   'stack_id': self.stack.id,
                   'nova_instance': self.resource_id,
                   'name': self.name,
-                  'rsrc_metadata': self.metadata,
+                  'rsrc_metadata': metadata,
                   'stack_name': self.stack.name}
 
             new_rs = db_api.resource_create(self.context, rs)
index aaeb023708fdb395b3c41b181a5cfe4e81edf1f7..71fe5fd01458aea33ef063771b4101ecb8835774 100644 (file)
@@ -875,6 +875,10 @@ class AutoScalingTest(HeatTestCase):
         Metadata.__get__(mox.IgnoreArg(), rsrc, mox.IgnoreArg()
                          ).AndReturn(previous_meta)
 
+        #stub for the metadata accesses while creating the two instances
+        Metadata.__get__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
+        Metadata.__get__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
+
         # raise by 200%, should work
         self._stub_lb_reload(3, unset=False)
         self._stub_create(2)
@@ -924,7 +928,11 @@ class AutoScalingTest(HeatTestCase):
         Metadata.__get__(mox.IgnoreArg(), rsrc, mox.IgnoreArg()
                          ).AndReturn(previous_meta)
 
+        #stub for the metadata accesses while creating the two instances
+        Metadata.__get__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
+        Metadata.__get__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
         # raise by 200%, should work
+
         self._stub_lb_reload(3, unset=False)
         self._stub_meta_expected(now, 'PercentChangeInCapacity : 200')
         self._stub_create(2)
@@ -1106,6 +1114,9 @@ class AutoScalingTest(HeatTestCase):
         Metadata.__get__(mox.IgnoreArg(), rsrc, mox.IgnoreArg()
                          ).AndReturn(previous_meta)
 
+        #stub for the metadata accesses while creating the additional instance
+        Metadata.__get__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
+
         now = now + datetime.timedelta(seconds=61)
         self._stub_lb_reload(3, unset=False)
         self._stub_meta_expected(now, 'ChangeInCapacity : 1', 2)
@@ -1163,6 +1174,9 @@ class AutoScalingTest(HeatTestCase):
         Metadata.__get__(mox.IgnoreArg(), rsrc, mox.IgnoreArg()
                          ).AndReturn(previous_meta)
 
+        #stub for the metadata accesses while creating the additional instance
+        Metadata.__get__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
+
         self._stub_lb_reload(3, unset=False)
         self._stub_meta_expected(now, 'ChangeInCapacity : 1', 2)
         self._stub_create(1)
@@ -1221,6 +1235,9 @@ class AutoScalingTest(HeatTestCase):
         Metadata.__get__(mox.IgnoreArg(), rsrc, mox.IgnoreArg()
                          ).AndReturn(previous_meta)
 
+        #stub for the metadata accesses while creating the addtional instance
+        Metadata.__get__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
+
         self._stub_lb_reload(3, unset=False)
         self._stub_meta_expected(now, 'ChangeInCapacity : 1', 2)
         self._stub_create(1)
@@ -1282,11 +1299,16 @@ class AutoScalingTest(HeatTestCase):
         self.m.UnsetStubs()
 
         self.m.StubOutWithMock(Metadata, '__get__')
+
         Metadata.__get__(mox.IgnoreArg(), up_policy, mox.IgnoreArg()
                          ).AndReturn(previous_meta)
         Metadata.__get__(mox.IgnoreArg(), rsrc, mox.IgnoreArg()
                          ).AndReturn(previous_meta)
 
+        #stub for the metadata accesses while creating the two instances
+        Metadata.__get__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
+        Metadata.__get__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
+
         now = now + datetime.timedelta(seconds=61)
 
         self._stub_lb_reload(4, unset=False)
index 5bc09cda94fdef77e635dc077855a42e9b87d6fc..8dcba55254d5d905cfe471c1e5b71670a2665f4f 100644 (file)
@@ -279,6 +279,16 @@ class ResourceTest(HeatTestCase):
         self.assertRaises(exception.ResourceFailure, create)
         self.assertEqual((res.CREATE, res.FAILED), res.state)
 
+    def test_create_fail_metadata_parse_error(self):
+        tmpl = {'Type': 'GenericResourceType', 'Properties': {},
+                'Metadata': {"Fn::GetAtt": ["ResourceA", "abc"]}}
+        rname = 'test_resource'
+        res = generic_rsrc.ResourceWithProps(rname, tmpl, self.stack)
+
+        create = scheduler.TaskRunner(res.create)
+        self.assertRaises(exception.ResourceFailure, create)
+        self.assertEqual((res.CREATE, res.FAILED), res.state)
+
     def test_create_resource_after_destroy(self):
         tmpl = {'Type': 'GenericResourceType'}
         rname = 'test_res_id_none'