From 2bbc908b003d969821b2a0c491dbb2a81c718aa2 Mon Sep 17 00:00:00 2001 From: Randall Burt Date: Wed, 25 Jun 2014 15:39:20 -0500 Subject: [PATCH] Refactor AWS::EC2::Instance delete handling Refactor instance to use the nova_utils delete function. Closes-Bug: #1329453 Change-Id: Ie84fb3c5c9f6381e4eea3a5e99d62266a8abd023 --- heat/engine/resources/instance.py | 51 +++++++++---------------------- 1 file changed, 15 insertions(+), 36 deletions(-) diff --git a/heat/engine/resources/instance.py b/heat/engine/resources/instance.py index fbc27f452f..79dabecb96 100644 --- a/heat/engine/resources/instance.py +++ b/heat/engine/resources/instance.py @@ -677,26 +677,6 @@ class Instance(resource.Resource): '/'.join([self.SECURITY_GROUPS, self.SECURITY_GROUP_IDS]), self.NETWORK_INTERFACES) - @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: - nova_utils.refresh_server(server) - if server.status == "DELETED": - break - except nova_exceptions.NotFound: - break - self.resource_id_set(None) - def _detach_volumes_task(self): ''' Detach volumes from the instance @@ -708,29 +688,28 @@ class Instance(resource.Resource): return scheduler.PollingTaskGroup(detach_tasks) def handle_delete(self): - ''' - Delete an instance, blocking until it is disposed by OpenStack - ''' if self.resource_id is None: return - try: server = self.nova().servers.get(self.resource_id) except nova_exceptions.NotFound: - self.resource_id_set(None) return + deleters = ( + scheduler.TaskRunner(self._detach_volumes_task()), + scheduler.TaskRunner(nova_utils.delete_server, server)) + deleters[0].start() + return deleters - server_delete_task = scheduler.TaskRunner(self._delete_server, - server=server) - server_delete_task.start() - return server_delete_task - - 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 check_delete_complete(self, deleters): + # if the resource was already deleted, deleters will be None + if deleters: + for deleter in deleters: + if not deleter.started(): + deleter.start() + if not deleter.step(): + return False + self.resource_id_set(None) + return True def handle_suspend(self): '''