From aed986cd469b2cc2f044ca9c8374c1f6bb159e5d Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Tue, 29 Jan 2013 19:48:22 +0100 Subject: [PATCH] Store instance resource-id earlier If creation is interrupted during startup, we will need the ID of the instance stored in order to delete it later. bug 1072932 Change-Id: I56b8d285bba43d6e2466705956f85c06f119d65c Signed-off-by: Zane Bitter --- heat/engine/resources/instance.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/heat/engine/resources/instance.py b/heat/engine/resources/instance.py index 0c590516..b2477080 100644 --- a/heat/engine/resources/instance.py +++ b/heat/engine/resources/instance.py @@ -255,22 +255,29 @@ class Instance(resource.Resource): scheduler_hints = None server_userdata = self._build_userdata(userdata) - server = self.nova().servers.create(name=self.physical_resource_name(), - image=image_id, - flavor=flavor_id, - key_name=key_name, - security_groups=security_groups, - userdata=server_userdata, - meta=tags, - scheduler_hints=scheduler_hints) + server = None + try: + server = self.nova().servers.create( + name=self.physical_resource_name(), + image=image_id, + flavor=flavor_id, + key_name=key_name, + security_groups=security_groups, + userdata=server_userdata, + meta=tags, + scheduler_hints=scheduler_hints) + finally: + # Avoid a race condition where the thread could be cancelled + # before the ID is stored + if server is not None: + self.resource_id_set(server.id) + while server.status == 'BUILD': server.get() eventlet.sleep(1) if server.status == 'ACTIVE': - self.resource_id_set(server.id) self._set_ipaddress(server.networks) else: - self.resource_id_set(server.id) raise exception.Error('%s instance[%s] status[%s]' % ('nova reported unexpected', self.name, server.status)) -- 2.45.2