]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Detach Volumes from an Instance in parallel
authorZane Bitter <zbitter@redhat.com>
Fri, 24 May 2013 08:31:27 +0000 (10:31 +0200)
committerZane Bitter <zbitter@redhat.com>
Fri, 24 May 2013 08:31:27 +0000 (10:31 +0200)
Use a PollingTaskGroup to ensure that if there are multiple Volumes
attached to an Instance they are detached in parallel rather than serially.

Change-Id: Ice399ae495af75558f2f8b1b1dc330d0b556a269

heat/engine/resources/instance.py

index 2dfc4c9b2589e57982df8f8e3ff8ce985c31fe66..607fb58b5db288f0a14d5669210543189ee57964 100644 (file)
@@ -385,13 +385,6 @@ class Instance(resource.Resource):
 
         return ((vol['VolumeId'], vol['Device']) for vol in volumes)
 
-    def detach_volumes(self):
-        for volume_id, device in self.volumes():
-            detach_task = volume.VolumeDetachTask(self.stack,
-                                                  self.resource_id,
-                                                  volume_id)
-            scheduler.TaskRunner(detach_task)()
-
     def handle_update(self, json_snippet, tmpl_diff, prop_diff):
         if 'Metadata' in tmpl_diff:
             self.metadata = tmpl_diff.get('Metadata', {})
@@ -433,7 +426,11 @@ class Instance(resource.Resource):
         if self.resource_id is None:
             return
 
-        self.detach_volumes()
+        detach_tasks = (volume.VolumeDetachTask(self.stack,
+                                                self.resource_id,
+                                                volume_id)
+                        for volume_id, device in self.volumes())
+        scheduler.TaskRunner(scheduler.PollingTaskGroup(detach_tasks))()
 
         try:
             server = self.nova().servers.get(self.resource_id)