Просмотр исходного кода

Made waiting for Nova server deletion helper function timeout.

Nashwan Azhari 9 лет назад
Родитель
Сommit
39a49e443d
1 измененных файлов с 21 добавлено и 6 удалено
  1. 21 6
      coriolis/providers/openstack/common.py

+ 21 - 6
coriolis/providers/openstack/common.py

@@ -21,6 +21,10 @@ CINDER_API_VERSION = 2
 
 LOG = logging.getLogger(__name__)
 
+SERVER_STATUS_ERROR = 'ERROR'
+SERVER_STATUS_ACTIVE = 'ACTIVE'
+SERVER_STATUS_SHUTOFF = 'SHUTOFF'
+
 
 GlanceImage = collections.namedtuple(
     "GlanceImage", "id format size path os_type")
@@ -106,17 +110,28 @@ def wait_for_instance(nova, instance_id, expected_status='ACTIVE'):
 
 
 @utils.retry_on_error()
-def wait_for_instance_deletion(nova, instance_id):
+def wait_for_instance_deletion(nova, instance_id, timeout=300, period=2):
     instances = nova.servers.findall(id=instance_id)
-    while instances and instances[0].status != 'ERROR':
+    endtime = time.time() + timeout
+    while time.time() < endtime and instances:
+        instance = utils.index_singleton_list(instances)
+        if instance.status == SERVER_STATUS_ERROR:
+            break
+
         LOG.debug('Instance %(id)s status: %(status)s. '
-                  'Waiting for its deletion.',
-                  {'id': instance_id, 'status': instances[0].status})
-        time.sleep(2)
+                  'Waiting %(period)s seconds for its deletion.',
+                  {'id': instance_id, 'status': instance.status,
+                   'period': period})
+        time.sleep(period)
         instances = nova.servers.findall(id=instance_id)
+
     if instances:
+        instance = utils.index_singleton_list(instances)
         raise exception.CoriolisException(
-            "VM is in status: %s" % instances[0].status)
+            "Timeout of %(timeout)s seconds reached while waiting for VM "
+            "\"%(instance_id)s\" deletion. Last known status: \"%(status)s\"" %
+            {'timeout': timeout, 'status': instance.status,
+             'instance_id': instance_id})
 
 
 @utils.retry_on_error()