]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
parallelize instance delete
authorVijendar Komalla <vijendar.komalla@RACKSPACE.COM>
Thu, 29 Aug 2013 17:44:33 +0000 (12:44 -0500)
committerVijendar Komalla <vijendar.komalla@RACKSPACE.COM>
Wed, 4 Sep 2013 20:02:26 +0000 (15:02 -0500)
This is third patch in the series to implement parallel delete.
In this patch, parallelizing instance deletion

Blueprint parallel-delete

Change-Id: I86d2e25901b330dcf4b0e512eec66fb71199727b

heat/engine/resources/instance.py

index d8509c9b682cf22b379bd9b577a7d424a6bd1203..fcb82d7e9b8043e6f10f8f3c8ebb35fbab248232 100644 (file)
@@ -383,6 +383,24 @@ class Instance(resource.Resource):
         # make sure the image exists.
         nova_utils.get_image_id(self.nova(), self.properties['ImageId'])
 
+    @scheduler.wrappertask
+    def _delete_server(self, server):
+        '''
+        Return a co-routine that deletes the server and waits for it to
+        disappear from Nova.
+        '''
+        yield self._detach_volumes_task()()
+        server.delete()
+
+        while True:
+            yield
+
+            try:
+                server.get()
+            except clients.novaclient.exceptions.NotFound:
+                self.resource_id = None
+                break
+
     def _detach_volumes_task(self):
         '''
         Detach volumes from the instance
@@ -400,18 +418,23 @@ class Instance(resource.Resource):
         if self.resource_id is None:
             return
 
-        scheduler.TaskRunner(self._detach_volumes_task())()
-
         try:
             server = self.nova().servers.get(self.resource_id)
         except clients.novaclient.exceptions.NotFound:
-            pass
-        else:
-            delete = scheduler.TaskRunner(
-                nova_utils.delete_server, server)
-            delete(wait_time=0.2)
+            self.resource_id = None
+            return
+
+        server_delete_task = scheduler.TaskRunner(self._delete_server,
+                                                  server=server)
+        server_delete_task.start()
+        return server_delete_task
 
-        self.resource_id = None
+    def check_delete_complete(self, server_delete_task):
+        # if the resource was already deleted, server_delete_task will be None
+        if server_delete_task is None:
+            return True
+        else:
+            return server_delete_task.step()
 
     def handle_suspend(self):
         '''