From: Zane Bitter Date: Mon, 21 May 2012 12:53:42 +0000 (+0200) Subject: Handle failures when deleting stacks X-Git-Tag: 2014.1~1810 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=a72267cb0cab2e61e49b6f53e40aadbca3e8ec91;p=openstack-build%2Fheat-build.git Handle failures when deleting stacks Signed-off-by: Zane Bitter --- diff --git a/heat/engine/instance.py b/heat/engine/instance.py index 7c5b2105..cc85b468 100644 --- a/heat/engine/instance.py +++ b/heat/engine/instance.py @@ -222,7 +222,11 @@ class Instance(Resource): return self.state_set(self.DELETE_IN_PROGRESS) Resource.delete(self) - server = self.nova().servers.get(self.instance_id) - server.delete() + try: + server = self.nova().servers.get(self.instance_id) + except NotFound: + pass + else: + server.delete() self.instance_id = None self.state_set(self.DELETE_COMPLETE) diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 5e0723db..afd05673 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -199,14 +199,14 @@ class Stack(object): self.status_set(self.IN_PROGRESS) for r in order: - failed_str = self.resources[r].CREATE_FAILED + res = self.resources[r] if not failed: try: - self.resources[r].create() + res.create() except Exception as ex: logger.exception('create') failed = True - self.resources[r].state_set(failed_str, str(ex)) + res.state_set(res.CREATE_FAILED, str(ex)) try: self.update_parsed_template() @@ -214,11 +214,9 @@ class Stack(object): logger.exception('update_parsed_template') else: - self.resources[r].state_set(failed_str) - if failed: - self.status_set(self.CREATE_FAILED) - else: - self.status_set(self.CREATE_COMPLETE) + res.state_set(res.CREATE_FAILED) + + self.status_set(failed and self.CREATE_FAILED or self.CREATE_COMPLETE) def create(self): @@ -230,19 +228,23 @@ class Stack(object): delete all the resources in the reverse order specified by get_create_order(). ''' + order = self.get_create_order() + failed = False self.status_set(self.DELETE_IN_PROGRESS) - order = self.get_create_order() - order.reverse() - for r in order: + for r in reversed(order): + res = self.resources[r] try: - self.resources[r].delete() + res.delete() db_api.resource_get(None, self.resources[r].id).delete() except Exception as ex: + failed = True + res.state_set(res.DELETE_FAILED) logger.error('delete: %s' % str(ex)) - db_api.stack_delete(None, self.name) - self.status_set(self.DELETE_COMPLETE) + self.status_set(failed and self.DELETE_FAILED or self.DELETE_COMPLETE) + if not failed: + db_api.stack_delete(None, self.name) def delete(self): pool = eventlet.GreenPool() diff --git a/heat/engine/volume.py b/heat/engine/volume.py index af3610ea..f3651d37 100644 --- a/heat/engine/volume.py +++ b/heat/engine/volume.py @@ -62,7 +62,7 @@ class Volume(Resource): vol = self.nova('volume').volumes.get(self.instance_id) if vol.status == 'in-use': logger.warn('cant delete volume when in-use') - return + raise exception.Error("Volume in use") self.state_set(self.DELETE_IN_PROGRESS) Resource.delete(self)