]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Implement parallel delete
authorVijendar Komalla <vijendar.komalla@RACKSPACE.COM>
Thu, 29 Aug 2013 13:59:46 +0000 (08:59 -0500)
committerVijendar Komalla <vijendar.komalla@RACKSPACE.COM>
Wed, 4 Sep 2013 20:02:02 +0000 (15:02 -0500)
This is first patch in the series to implement parallel delete
and it includes following changes:

1. changing Stack.delete to use stack_task
2. In Resource.delete polling for check_delete_complete
3. Updating unit tests to use TaskRunner for resource.delete and
   resource.destroy

Blueprint parallel-delete

Change-Id: I8a96b1a956388372c29f9f45445f397467667110

18 files changed:
heat/engine/parser.py
heat/engine/resource.py
heat/tests/test_cw_alarm.py
heat/tests/test_eip.py
heat/tests/test_instance.py
heat/tests/test_metadata_refresh.py
heat/tests/test_neutron.py
heat/tests/test_rackspace_cloud_server.py
heat/tests/test_resource.py
heat/tests/test_s3.py
heat/tests/test_security_group.py
heat/tests/test_server.py
heat/tests/test_sqlalchemy_api.py
heat/tests/test_swift.py
heat/tests/test_user.py
heat/tests/test_volume.py
heat/tests/test_vpc.py
heat/tests/test_waitcondition.py

index 67bfef20403f09d843e250907025efbf507ec59a..f715a6c0c5f93de9e54ddab149c61c8cc481f807 100644 (file)
@@ -481,30 +481,34 @@ class Stack(object):
                            "Invalid action %s" % action)
             return
 
+        stack_status = self.COMPLETE
+        reason = 'Stack %s completed successfully' % action.lower()
         self.state_set(action, self.IN_PROGRESS, 'Stack %s started' % action)
 
-        failures = []
-
         backup_stack = self._backup_stack(False)
         if backup_stack is not None:
             backup_stack.delete()
             if backup_stack.status != backup_stack.COMPLETE:
                 errs = backup_stack.status_reason
-                failures.append('Error deleting backup resources: %s' % errs)
+                failure = 'Error deleting backup resources: %s' % errs
+                self.state_set(action, self.FAILED,
+                               'Failed to %s : %s' % (action, failure))
+                return
 
-        for res in reversed(self):
-            try:
-                res.destroy()
-            except exception.ResourceFailure as ex:
-                logger.error('Failed to delete %s error: %s' % (str(res),
-                                                                str(ex)))
-                failures.append(str(res))
+        action_task = scheduler.DependencyTaskGroup(self.dependencies,
+                                                    resource.Resource.destroy,
+                                                    reverse=True)
+        try:
+            scheduler.TaskRunner(action_task)(timeout=self.timeout_secs())
+        except exception.ResourceFailure as ex:
+            stack_status = self.FAILED
+            reason = 'Resource %s failed: %s' % (action.lower(), str(ex))
+        except scheduler.Timeout:
+            stack_status = self.FAILED
+            reason = '%s timed out' % action.title()
 
-        if failures:
-            self.state_set(action, self.FAILED,
-                           'Failed to %s : %s' % (action, ', '.join(failures)))
-        else:
-            self.state_set(action, self.COMPLETE, '%s completed' % action)
+        self.state_set(action, stack_status, reason)
+        if stack_status != self.FAILED:
             db_api.stack_delete(self.context, self.id)
             self.id = None
 
@@ -553,7 +557,7 @@ class Stack(object):
 
         for res in reversed(deps):
             try:
-                res.destroy()
+                scheduler.TaskRunner(res.destroy)()
             except exception.ResourceFailure as ex:
                 failed = True
                 logger.error('delete: %s' % str(ex))
index c3e7b36f0b60c3bfbef57ca1e026c830d51a5100..39d5562cf93dd78fb16dad71bf55be46c579b5f5 100644 (file)
@@ -22,6 +22,7 @@ from heat.openstack.common import excutils
 from heat.db import api as db_api
 from heat.common import identifier
 from heat.common import short_id
+from heat.engine import scheduler
 from heat.engine import resources
 from heat.engine import timestamp
 # import class to avoid name collisions and ugly aliasing
@@ -515,12 +516,21 @@ class Resource(object):
             self.state_set(action, self.IN_PROGRESS)
 
             deletion_policy = self.t.get('DeletionPolicy', 'Delete')
+            handle_data = None
             if deletion_policy == 'Delete':
                 if callable(getattr(self, 'handle_delete', None)):
-                    self.handle_delete()
+                    handle_data = self.handle_delete()
+                    yield
             elif deletion_policy == 'Snapshot':
                 if callable(getattr(self, 'handle_snapshot_delete', None)):
-                    self.handle_snapshot_delete(initial_state)
+                    handle_data = self.handle_snapshot_delete(initial_state)
+                    yield
+
+            if (deletion_policy != 'Retain' and
+                    callable(getattr(self, 'check_delete_complete', None))):
+                while not self.check_delete_complete(handle_data):
+                    yield
+
         except Exception as ex:
             logger.exception('Delete %s', str(self))
             failure = exception.ResourceFailure(ex, self, self.action)
@@ -536,11 +546,12 @@ class Resource(object):
         else:
             self.state_set(action, self.COMPLETE)
 
+    @scheduler.wrappertask
     def destroy(self):
         '''
         Delete the resource and remove it from the database.
         '''
-        self.delete()
+        yield self.delete()
 
         if self.id is None:
             return
index c89ebdb0831627ebce36fe8b28444e27344f8ca5..8729ef669e1185dec707aa4970424eb27c550a83 100644 (file)
@@ -92,7 +92,7 @@ class CloudWatchAlarmTest(HeatTestCase):
 
         scheduler.TaskRunner(rsrc.update, snippet)()
 
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_mem_alarm_high_update_replace(self):
@@ -119,7 +119,7 @@ class CloudWatchAlarmTest(HeatTestCase):
         updater = scheduler.TaskRunner(rsrc.update, snippet)
         self.assertRaises(resource.UpdateReplace, updater)
 
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_suspend_resume(self):
@@ -146,5 +146,5 @@ class CloudWatchAlarmTest(HeatTestCase):
 
         self.assertEqual(wr.state, watchrule.WatchRule.NODATA)
 
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
index 728af8872d6eaa4faa821aa3bcd0f0e929f168e0..8ded59ccd3e8ec5853353cdf98983094d6654f2a 100644 (file)
@@ -181,7 +181,7 @@ class EIPTest(HeatTestCase):
                               rsrc.FnGetAtt, 'Foo')
 
         finally:
-            rsrc.destroy()
+            scheduler.TaskRunner(rsrc.destroy)()
 
         self.m.VerifyAll()
 
@@ -200,8 +200,8 @@ class EIPTest(HeatTestCase):
         # TODO(sbaker), figure out why this is an empty string
         #self.assertEqual('', association.FnGetRefId())
 
-        association.delete()
-        rsrc.delete()
+        scheduler.TaskRunner(association.delete)()
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
 
@@ -420,7 +420,7 @@ class AllocTest(HeatTestCase):
                               rsrc.FnGetAtt, 'Foo')
 
         finally:
-            rsrc.destroy()
+            scheduler.TaskRunner(rsrc.destroy)()
 
         self.m.VerifyAll()
 
@@ -448,7 +448,7 @@ class AllocTest(HeatTestCase):
         rsrc = self.create_eip(t, stack, 'the_eip')
         association = self.create_association(t, stack, 'IPAssoc')
 
-        association.delete()
-        rsrc.delete()
+        scheduler.TaskRunner(association.delete)()
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
index 5377ac449d4d93f10c21ce782c794b5c24321634..e2b9523d373de7e8ce94e77eb51eb891a0f9b031 100644 (file)
@@ -295,7 +295,7 @@ class InstancesTest(HeatTestCase):
         get().AndRaise(instances.clients.novaclient.exceptions.NotFound(404))
         mox.Replay(get)
 
-        instance.delete()
+        scheduler.TaskRunner(instance.delete)()
         self.assertTrue(instance.resource_id is None)
         self.assertEqual(instance.state, (instance.DELETE, instance.COMPLETE))
         self.m.VerifyAll()
index 01ace312b1bcc579530a4aaec24a91861541ec0e..f6c2aa706a966b90071bb1a626ef30db468ee2f5 100644 (file)
@@ -259,7 +259,8 @@ class WaitCondMetadataUpdateTest(HeatTestCase):
 
         scheduler.TaskRunner._sleep(mox.IsA(int)).WithSideEffects(check_empty)
         scheduler.TaskRunner._sleep(mox.IsA(int)).WithSideEffects(post_success)
-        scheduler.TaskRunner._sleep(mox.IsA(int)).AndReturn(None)
+        scheduler.TaskRunner._sleep(mox.IsA(int)).MultipleTimes().AndReturn(
+            None)
 
         self.m.ReplayAll()
         self.stack.create()
index dff9d5baf80cf01664c4e9ad321d78f2bcb2bd55..c90d3e2689e390cea4422793473525a89bde4393 100644 (file)
@@ -519,7 +519,7 @@ class NeutronSubnetTest(HeatTestCase):
         ref_id = rsrc.FnGetRefId()
         self.assertEqual('91e47a57-7508-46fe-afc9-fc454e8580e1', ref_id)
         self.assertEqual(False, rsrc.FnGetAtt('enable_dhcp'))
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
 
@@ -698,9 +698,9 @@ class NeutronRouterTest(HeatTestCase):
                 'subnet_id': '91e47a57-7508-46fe-afc9-fc454e8580e1'
             })
 
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
         rsrc.state_set(rsrc.CREATE, rsrc.COMPLETE, 'to delete again')
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_gateway_router(self):
@@ -731,9 +731,9 @@ class NeutronRouterTest(HeatTestCase):
                 'network_id': 'fc68ea2c-b60b-4b4f-bd82-94ec81110766'
             })
 
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
         rsrc.state_set(rsrc.CREATE, rsrc.COMPLETE, 'to delete again')
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
 
@@ -808,9 +808,9 @@ class NeutronFloatingIPTest(HeatTestCase):
                          fip.FnGetAtt('id'))
         self.assertRaises(resource.UpdateReplace,
                           fip.handle_update, {}, {}, {})
-        self.assertEqual(fip.delete(), None)
+        scheduler.TaskRunner(fip.delete)()
         fip.state_set(fip.CREATE, fip.COMPLETE, 'to delete again')
-        self.assertEqual(fip.delete(), None)
+        scheduler.TaskRunner(fip.delete)()
 
         self.m.VerifyAll()
 
@@ -976,16 +976,16 @@ class NeutronFloatingIPTest(HeatTestCase):
         self.assertRaises(resource.UpdateReplace,
                           fipa.handle_update, {}, {}, {})
 
-        self.assertEqual(fipa.delete(), None)
-        self.assertEqual(scheduler.TaskRunner(p.delete)(), None)
-        self.assertEqual(fip.delete(), None)
+        scheduler.TaskRunner(fipa.delete)()
+        scheduler.TaskRunner(p.delete)()
+        scheduler.TaskRunner(fip.delete)()
 
         fipa.state_set(fipa.CREATE, fipa.COMPLETE, 'to delete again')
         fip.state_set(fip.CREATE, fip.COMPLETE, 'to delete again')
         p.state_set(p.CREATE, p.COMPLETE, 'to delete again')
 
-        self.assertEqual(fipa.delete(), None)
+        scheduler.TaskRunner(fipa.delete)()
         self.assertEqual(scheduler.TaskRunner(p.delete)(), None)
-        self.assertEqual(fip.delete(), None)
+        scheduler.TaskRunner(fip.delete)()
 
         self.m.VerifyAll()
index 0b46b8a00d3b193c4eb8daef2d70ab00791b5293..7d53359f56f057b105ab38da7f30c07693e924a5 100644 (file)
@@ -300,7 +300,7 @@ class RackspaceCloudServerTest(HeatTestCase):
         get().AndRaise(novaclient.exceptions.NotFound(404))
         mox.Replay(get)
 
-        cs.delete()
+        scheduler.TaskRunner(cs.delete)()
         self.assertTrue(cs.resource_id is None)
         self.assertEqual(cs.state, (cs.DELETE, cs.COMPLETE))
         self.m.VerifyAll()
index 144889dc761e249eee688a383a1514d8aed3b3b3..0394aa3e9471816b2b79e6dd3f4092cc5185864c 100644 (file)
@@ -319,7 +319,7 @@ class ResourceTest(HeatTestCase):
         res.id = 'test_res_id'
         (res.action, res.status) = (res.INIT, res.DELETE)
         self.assertRaises(exception.ResourceFailure, res.create)
-        res.destroy()
+        scheduler.TaskRunner(res.destroy)()
         res.state_reset()
         scheduler.TaskRunner(res.create)()
         self.assertEqual((res.CREATE, res.COMPLETE), res.state)
index fb249dff8a3402f642657952bbbfab16d8dd15c7..4bef5e925a52e334ce600b72cdca14664f1a7a93 100644 (file)
@@ -116,7 +116,7 @@ class s3Test(HeatTestCase):
         self.assertRaises(resource.UpdateReplace,
                           rsrc.handle_update, {}, {}, {})
 
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_public_read(self):
@@ -136,7 +136,7 @@ class s3Test(HeatTestCase):
         properties['AccessControl'] = 'PublicRead'
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'S3Bucket')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_public_read_write(self):
@@ -156,7 +156,7 @@ class s3Test(HeatTestCase):
         properties['AccessControl'] = 'PublicReadWrite'
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'S3Bucket')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_authenticated_read(self):
@@ -175,7 +175,7 @@ class s3Test(HeatTestCase):
         properties['AccessControl'] = 'AuthenticatedRead'
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'S3Bucket')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_website(self):
@@ -194,7 +194,7 @@ class s3Test(HeatTestCase):
         t = template_format.parse(swift_template)
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'S3BucketWebsite')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_delete_exception(self):
@@ -212,7 +212,7 @@ class s3Test(HeatTestCase):
         t = template_format.parse(swift_template)
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'S3Bucket')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
 
@@ -233,7 +233,7 @@ class s3Test(HeatTestCase):
         bucket['DeletionPolicy'] = 'Retain'
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'S3Bucket')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
 
         self.m.VerifyAll()
index 99c2ddc163b6285abae8379c120f06cd7a1513ce..5ef5845c7fa964793b9f3f9a6b51e5f34478c6b4 100644 (file)
@@ -19,6 +19,7 @@ from heat.common import exception
 from heat.common import template_format
 from heat.engine import parser
 from heat.engine import resource
+from heat.engine import scheduler
 from heat.tests.common import HeatTestCase
 from heat.tests.fakes import FakeKeystoneClient
 from heat.tests.v1_1 import fakes
@@ -359,7 +360,7 @@ Resources:
 
         self.assertResourceState(sg, utils.PhysName('test_stack', 'the_sg'))
 
-        self.assertEqual(None, sg.delete())
+        scheduler.TaskRunner(sg.delete)()
 
         sg.state_set(sg.CREATE, sg.COMPLETE, 'to delete again')
         sg.resource_id = 2
@@ -797,7 +798,7 @@ Resources:
 
         self.assertResourceState(sg, 'aaaa')
 
-        self.assertEqual(None, sg.delete())
+        scheduler.TaskRunner(sg.delete)()
 
         sg.state_set(sg.CREATE, sg.COMPLETE, 'to delete again')
         sg.resource_id = 'aaaa'
index 342eb1a1d2d0030a039eda73a80452cf562c55e6..458498568670ea12e9c000b8f9a0783e088597ca 100644 (file)
@@ -334,13 +334,13 @@ class ServersTest(HeatTestCase):
         get().AndRaise(servers.clients.novaclient.exceptions.NotFound(404))
         mox.Replay(get)
 
-        server.delete()
+        scheduler.TaskRunner(server.delete)()
         self.assertTrue(server.resource_id is None)
         self.assertEqual(server.state, (server.DELETE, server.COMPLETE))
         self.m.VerifyAll()
 
         server.state_set(server.CREATE, server.COMPLETE, 'to delete again')
-        server.delete()
+        scheduler.TaskRunner(server.delete)()
         self.assertEqual(server.state, (server.DELETE, server.COMPLETE))
         self.m.VerifyAll()
 
index 00099a35e0dd28110399a93c414afdd967764e1e..6a0845f641db3781089cc66633b7a53acf4851cb 100644 (file)
@@ -20,6 +20,7 @@ from heat.common import exception
 from heat.common import template_format
 from heat.engine.resources import instance as instances
 from heat.engine import parser
+from heat.engine import scheduler
 from heat.openstack.common import uuidutils
 from heat.tests.common import HeatTestCase
 from heat.tests import utils
@@ -136,7 +137,7 @@ class SqlAlchemyTest(HeatTestCase):
         self.assertNotEqual(encrypted_key, "fake secret")
         decrypted_key = cs.my_secret
         self.assertEqual(decrypted_key, "fake secret")
-        cs.destroy()
+        scheduler.TaskRunner(cs.destroy)()
 
     def test_resource_data_delete(self):
         stack = self._setup_test_stack('stack', UUID1)[1]
index 3adc19d2d50b8d0d749191509c74d30df1318f46..1473bd5f6fe731efffefa0174b1e9ffc2cbf0d65 100644 (file)
@@ -160,7 +160,7 @@ class swiftTest(HeatTestCase):
         self.assertRaises(resource.UpdateReplace,
                           rsrc.handle_update, {}, {}, {})
 
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_public_read(self):
@@ -179,7 +179,7 @@ class swiftTest(HeatTestCase):
         properties['X-Container-Read'] = '.r:*'
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'SwiftContainer')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_public_read_write(self):
@@ -199,7 +199,7 @@ class swiftTest(HeatTestCase):
         properties['X-Container-Write'] = '.r:*'
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'SwiftContainer')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_website(self):
@@ -218,7 +218,7 @@ class swiftTest(HeatTestCase):
         t = template_format.parse(swift_template)
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'SwiftContainerWebsite')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_delete_exception(self):
@@ -236,7 +236,7 @@ class swiftTest(HeatTestCase):
         t = template_format.parse(swift_template)
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'SwiftContainer')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
 
@@ -257,7 +257,7 @@ class swiftTest(HeatTestCase):
         container['DeletionPolicy'] = 'Retain'
         stack = utils.parse_stack(t)
         rsrc = self.create_resource(t, stack, 'SwiftContainer')
-        rsrc.delete()
+        scheduler.TaskRunner(rsrc.delete)()
         self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
 
         self.m.VerifyAll()
index fab51dcfe0d16c6930d7de390665c0c29dae06d0..19116d6bbb0bbc71bf312a0dae364269a1f0fea4 100644 (file)
@@ -129,20 +129,20 @@ class UserTest(UserPolicyTestCase):
         self.assertEqual(None, rsrc.handle_resume())
 
         rsrc.resource_id = None
-        self.assertEqual(None, rsrc.delete())
+        scheduler.TaskRunner(rsrc.delete)()
         self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
 
         rsrc.resource_id = self.fc.access
         rsrc.state_set(rsrc.CREATE, rsrc.COMPLETE)
         self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
 
-        self.assertEqual(None, rsrc.delete())
+        scheduler.TaskRunner(rsrc.delete)()
         self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
 
         rsrc.state_set(rsrc.CREATE, rsrc.COMPLETE)
         self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
 
-        self.assertEqual(None, rsrc.delete())
+        scheduler.TaskRunner(rsrc.delete)()
         self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
         self.m.VerifyAll()
 
@@ -303,7 +303,7 @@ class AccessKeyTest(UserPolicyTestCase):
 
         self.assertRaises(exception.InvalidTemplateAttribute,
                           rsrc.FnGetAtt, 'Foo')
-        self.assertEqual(None, rsrc.delete())
+        scheduler.TaskRunner(rsrc.delete)()
         self.m.VerifyAll()
 
     def test_access_key_deleted(self):
@@ -326,7 +326,7 @@ class AccessKeyTest(UserPolicyTestCase):
         self.fc.delete_ec2_keypair(self.fc.user_id,
                                    rsrc.resource_id).AndRaise(NotFound('Gone'))
         self.m.ReplayAll()
-        self.assertEqual(None, rsrc.delete())
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
 
@@ -346,7 +346,7 @@ class AccessKeyTest(UserPolicyTestCase):
         self.assertRaises(exception.ResourceFailure, create)
         self.assertEqual((rsrc.CREATE, rsrc.FAILED), rsrc.state)
 
-        self.assertEqual(None, rsrc.delete())
+        scheduler.TaskRunner(rsrc.delete)()
         self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
 
         self.m.VerifyAll()
index 64bd0a2d4a6b61a7488778ec8bac89d9c40bde79..c6f2f046a073dc877a074c6f55fba689c369b4d1 100644 (file)
@@ -146,13 +146,14 @@ class VolumeTest(HeatTestCase):
                           rsrc.handle_update, {}, {}, {})
 
         fv.status = 'in-use'
-        self.assertRaises(exception.ResourceFailure, rsrc.destroy)
+        self.assertRaises(exception.ResourceFailure,
+                          scheduler.TaskRunner(rsrc.destroy))
         fv.status = 'available'
-        self.assertEqual(rsrc.destroy(), None)
+        scheduler.TaskRunner(rsrc.destroy)()
 
         # Test when volume already deleted
         rsrc.state_set(rsrc.CREATE, rsrc.COMPLETE)
-        self.assertEqual(rsrc.destroy(), None)
+        scheduler.TaskRunner(rsrc.destroy)()
 
         self.m.VerifyAll()
 
@@ -194,7 +195,7 @@ class VolumeTest(HeatTestCase):
         scheduler.TaskRunner(stack.create)()
         self.assertEqual(rsrc.state, (rsrc.CREATE, rsrc.COMPLETE))
 
-        self.assertEqual(stack.delete(), None)
+        scheduler.TaskRunner(stack.delete)()
 
         self.m.VerifyAll()
 
@@ -271,7 +272,7 @@ class VolumeTest(HeatTestCase):
         self.assertRaises(resource.UpdateReplace,
                           rsrc.handle_update, {}, {}, {})
 
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
 
@@ -317,7 +318,7 @@ class VolumeTest(HeatTestCase):
         self.assertRaises(resource.UpdateReplace,
                           rsrc.handle_update, {}, {}, {})
 
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
 
@@ -343,7 +344,7 @@ class VolumeTest(HeatTestCase):
         scheduler.TaskRunner(stack['DataVolume'].create)()
         rsrc = self.create_attachment(t, stack, 'MountPoint')
 
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
 
@@ -373,7 +374,7 @@ class VolumeTest(HeatTestCase):
         self.assertEqual(fv.status, 'available')
         rsrc = self.create_attachment(t, stack, 'MountPoint')
 
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
 
@@ -428,7 +429,7 @@ class VolumeTest(HeatTestCase):
 
         rsrc = self.create_volume(t, stack, 'DataVolume')
 
-        self.assertEqual(rsrc.destroy(), None)
+        scheduler.TaskRunner(rsrc.destroy)()
 
         self.m.VerifyAll()
 
@@ -452,7 +453,8 @@ class VolumeTest(HeatTestCase):
 
         rsrc = self.create_volume(t, stack, 'DataVolume')
 
-        self.assertRaises(exception.ResourceFailure, rsrc.destroy)
+        self.assertRaises(exception.ResourceFailure,
+                          scheduler.TaskRunner(rsrc.destroy))
 
         self.m.VerifyAll()
 
@@ -479,7 +481,7 @@ class VolumeTest(HeatTestCase):
         create = scheduler.TaskRunner(rsrc.create)
         self.assertRaises(exception.ResourceFailure, create)
 
-        self.assertEqual(rsrc.destroy(), None)
+        scheduler.TaskRunner(rsrc.destroy)()
 
         self.m.VerifyAll()
 
@@ -713,7 +715,7 @@ class VolumeTest(HeatTestCase):
         self.assertRaises(resource.UpdateReplace, rsrc.handle_update,
                           {}, {}, {})
 
-        self.assertEqual(rsrc.delete(), None)
+        scheduler.TaskRunner(rsrc.delete)()
 
         self.m.VerifyAll()
 
index fff4731cf70d0772db82270e6c5770790c63ed01..f7197935143da02d66dde37b61f0a9f87ade1caf 100644 (file)
@@ -19,6 +19,7 @@ from heat.common import template_format
 from heat.engine import parser
 from heat.engine import clients
 from heat.engine import resource
+from heat.engine import scheduler
 from heat.tests.common import HeatTestCase
 from heat.tests import fakes
 from heat.tests import utils
@@ -363,7 +364,7 @@ Resources:
         self.assertRaises(resource.UpdateReplace,
                           vpc.handle_update, {}, {}, {})
 
-        self.assertEqual(None, vpc.delete())
+        scheduler.TaskRunner(vpc.delete)()
         self.m.VerifyAll()
 
 
@@ -414,10 +415,10 @@ Resources:
 
         self.assertEqual('moon', subnet.FnGetAtt('AvailabilityZone'))
 
-        self.assertEqual(None, subnet.delete())
+        scheduler.TaskRunner(subnet.delete)()
         subnet.state_set(subnet.CREATE, subnet.COMPLETE, 'to delete again')
-        self.assertEqual(None, subnet.delete())
-        self.assertEqual(None, stack['the_vpc'].delete())
+        scheduler.TaskRunner(subnet.delete)()
+        scheduler.TaskRunner(stack['the_vpc'].delete)()
         self.m.VerifyAll()
 
 
@@ -584,7 +585,7 @@ Resources:
                               rsrc.handle_update, {}, {}, {})
 
         finally:
-            stack.delete()
+            scheduler.TaskRunner(stack.delete)()
 
         self.m.VerifyAll()
 
@@ -679,6 +680,7 @@ Resources:
         self.mock_show_subnet()
         self.mock_show_security_group(group='INVALID-NO-REF')
         self.mock_delete_subnet()
+        neutronclient.Client.delete_port(None).AndReturn(None)
         self.mock_delete_network()
 
         self.m.ReplayAll()
@@ -691,7 +693,7 @@ Resources:
             reason = rsrc.status_reason
             self.assertTrue(reason.startswith('InvalidTemplateAttribute:'))
         finally:
-            stack.delete()
+            scheduler.TaskRunner(stack.delete)()
 
         self.m.VerifyAll()
 
@@ -837,8 +839,8 @@ Resources:
             resource.UpdateReplace,
             association.handle_update, {}, {}, {})
 
-        association.delete()
-        route_table.delete()
+        scheduler.TaskRunner(association.delete)()
+        scheduler.TaskRunner(route_table.delete)()
 
         stack.delete()
         self.m.VerifyAll()
index db1a3ce63748d54286124a3243b171fc5edde9da..d514db5565bdfacd9f3fb061accd319ce7bea389 100644 (file)
@@ -216,7 +216,7 @@ class WaitConditionTest(HeatTestCase):
 
         # Avoid the stack create exercising the timeout code at the same time
         self.m.StubOutWithMock(self.stack, 'timeout_secs')
-        self.stack.timeout_secs().AndReturn(None)
+        self.stack.timeout_secs().MultipleTimes().AndReturn(None)
 
         self.m.StubOutWithMock(scheduler, 'wallclock')