]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Store instance resource-id earlier
authorZane Bitter <zbitter@redhat.com>
Tue, 29 Jan 2013 18:48:22 +0000 (19:48 +0100)
committerZane Bitter <zbitter@redhat.com>
Tue, 29 Jan 2013 18:48:22 +0000 (19:48 +0100)
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 <zbitter@redhat.com>
heat/engine/resources/instance.py

index 0c590516fe28ffadea7c6dc64d28946efb1f63f4..b2477080892ec204976b34a1ad143934e43520ce 100644 (file)
@@ -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))