From 957a45c32eeaf5a9136215df06da2658d815534e Mon Sep 17 00:00:00 2001 From: Angus Salkeld Date: Fri, 13 Apr 2012 20:15:23 +1000 Subject: [PATCH] Fix the stack.delete() by populating the resource id/state from the db. Signed-off-by: Angus Salkeld --- heat/engine/resources.py | 48 +++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/heat/engine/resources.py b/heat/engine/resources.py index fb36061d..83e47d22 100644 --- a/heat/engine/resources.py +++ b/heat/engine/resources.py @@ -42,15 +42,17 @@ class Resource(object): self.t = json_snippet self.depends_on = [] self.references = [] - self.state = None self.stack = stack self.name = name - self.id = None - self.instance_id = None resource = db_api.resource_get_by_name_and_stack(None, name, stack.id) if resource: self.instance_id = resource.nova_instance - self.stack_id = stack.id + self.state = resource.state + self.id = resource.id + else: + self.instance_id = None + self.state = None + self.id = None self._nova = {} if not self.t.has_key('Properties'): @@ -86,21 +88,24 @@ class Resource(object): self.stack.resolve_joins(self.t) self.stack.resolve_base64(self.t) - rs = {} - rs['state'] = self.CREATE_IN_PROGRESS - rs['nova_instance'] = None - rs['stack_id'] = self.stack.id - rs['name'] = self.name - rs['stack_name'] = self.stack.name - new_rs = db_api.resource_create(None, rs) - self.id = new_rs.id - def instance_id_set(self, inst): - rsc = db_api.resource_get(None, self.id) - rsc.nova_instance = inst self.instance_id = inst def state_set(self, new_state, reason="state changed"): + if new_state is self.CREATE_COMPLETE: + try: + rs = {} + rs['state'] = new_state + rs['stack_id'] = self.stack.id + rs['nova_instance'] = self.instance_id + rs['name'] = self.name + rs['stack_name'] = self.stack.name + new_rs = db_api.resource_create(None, rs) + self.id = new_rs.id + + except Exception as ex: + print 'db error %s' % str(ex) + if new_state != self.state: ev = {} ev['logical_resource_id'] = self.name @@ -112,11 +117,15 @@ class Resource(object): ev['resource_status_reason'] = reason ev['resource_type'] = self.t['Type'] ev['resource_properties'] = self.t['Properties'] - db_api.event_create(None, ev) + try: + db_api.event_create(None, ev) + except Exception as ex: + print 'db error %s' % str(ex) self.state = new_state def delete(self): - print 'deleting %s name:%s id:%s' % (self.t['Type'], self.name, self.instance_id) + print 'deleting %s name:%s inst:%s db_id:%s' % (self.t['Type'], self.name, + self.instance_id, str(self.id)) def reload(self): pass @@ -236,7 +245,6 @@ class ElasticIp(Resource): Resource.delete(self) if self.instance_id != None: - print 'ElasticIp delete %s:%s' % (self.ipaddress, self.instance_id) self.nova().floating_ips.delete(self.instance_id) self.state_set(self.DELETE_COMPLETE) @@ -514,10 +522,14 @@ class Instance(Resource): self.state_set(self.CREATE_FAILED) def delete(self): + if self.state == self.DELETE_IN_PROGRESS or self.state == self.DELETE_COMPLETE: + return + self.state_set(self.DELETE_IN_PROGRESS) Resource.delete(self) server = self.nova().servers.get(self.instance_id) server.delete() self.instance_id = None + self.state_set(self.DELETE_COMPLETE) def insert_package_and_services(self, r, new_script): -- 2.45.2