summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Harris <rick.harris@rackspace.com>2010-12-17 14:21:03 -0600
committerRick Harris <rick.harris@rackspace.com>2010-12-17 14:21:03 -0600
commitae54d5bdf3e0615c5be9ebe4f03f7256f22484ee (patch)
tree39a8017b27cf73714b792885ff41e173819431a4
parente601ab4a1068029b2f0b79789ed506fda1332404 (diff)
Add wait_for_vhd_coalesce
-rw-r--r--nova/virt/xenapi/vm_utils.py52
-rw-r--r--nova/virt/xenapi/vmops.py3
2 files changed, 37 insertions, 18 deletions
diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py
index c3e8b30b7..1b18b0a01 100644
--- a/nova/virt/xenapi/vm_utils.py
+++ b/nova/virt/xenapi/vm_utils.py
@@ -175,26 +175,12 @@ class VMHelper():
logging.debug('Created snapshot %s from VM %s.', template_vm_ref,
vm_ref)
- #NOTE(sirp): wait for any coalescing
- #NOTE(sirp): for some reason re-scan wasn't occuring automatically on
- # XS5.6
- #TODO(sirp): clean this up, perhaps use LoopingCall
sr_ref = vdi_rec["SR"]
- scan_sr(session, sr_ref)
- parent_uuid = get_vhd_parent_uuid(session, vdi_ref)
- time.sleep(5)
- while original_parent_uuid and (parent_uuid != original_parent_uuid):
- scan_sr(session, sr_ref)
- logging.debug(
- "Parent %s doesn't match original parent %s, "
- "waiting for coalesce...", parent_uuid, original_parent_uuid)
- #TODO(sirp): make this non-blocking
- time.sleep(5)
- parent_uuid = get_vhd_parent_uuid(session, vdi_ref)
-
- vdi_uuids = [vdi_uuid, parent_uuid]
- return template_vm_ref, vdi_uuids
+ parent_uuid = wait_for_vhd_coalesce(
+ session, sr_ref, vdi_ref, original_parent_uuid)
+ #TODO(sirp): we need to assert only one parent, not parents two deep
+ return template_vm_ref, [vdi_uuid, parent_uuid]
@classmethod
def upload_image(cls, session, vdi_uuids, glance_label):
@@ -336,6 +322,7 @@ def get_vhd_parent(session, vdi_rec):
else:
return None
+
def get_vhd_parent_uuid(session, vdi_ref):
vdi_rec = session.get_xenapi().VDI.get_record(vdi_ref)
ret = get_vhd_parent(session, vdi_rec)
@@ -345,7 +332,36 @@ def get_vhd_parent_uuid(session, vdi_ref):
else:
return None
+
def scan_sr(session, sr_ref):
logging.debug("Re-scanning SR %s", sr_ref)
task = session.call_xenapi('Async.SR.scan', sr_ref)
session.wait_for_task(task)
+
+
+def wait_for_vhd_coalesce(session, sr_ref, vdi_ref, original_parent_uuid):
+ """ TODO Explain why coalescing has to occur here """
+ #TODO(sirp): we need to timeout this req after a while
+ #NOTE(sirp): for some reason re-scan wasn't occuring automatically on
+ # XS5.6
+ #TODO(sirp): clean this up, perhaps use LoopingCall
+ def _get_vhd_parent_uuid_with_refresh(first_time):
+ if not first_time:
+ #TODO(sirp): should this interval be a gflag?
+ #TODO(sirp): make this non-blocking
+ time.sleep(5)
+ scan_sr(session, sr_ref)
+ return get_vhd_parent_uuid(session, vdi_ref)
+
+ parent_uuid = _get_vhd_parent_uuid_with_refresh(first_time=True)
+ logging.debug(
+ "Parent %s doesn't match original parent %s, "
+ "waiting for coalesce...", parent_uuid, original_parent_uuid)
+ while original_parent_uuid and (parent_uuid != original_parent_uuid):
+ logging.debug(
+ "Parent %s doesn't match original parent %s, "
+ "waiting for coalesce...", parent_uuid, original_parent_uuid)
+ parent_uuid = _get_vhd_parent_uuid_with_refresh(first_time=False)
+
+ return parent_uuid
+
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index 50b5ec3d6..988c54d6d 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -81,6 +81,7 @@ class VMOps(object):
def snapshot(self, instance):
""" Create snapshot from a running VM instance """
+ logging.debug("Starting snapshot for VM %s", instance)
#TODO(sirp): Add quiesce and VSS locking support when Windows support
# is added
vm_ref = VMHelper.lookup(self._session, instance.name)
@@ -104,6 +105,8 @@ class VMOps(object):
finally:
self._destroy(template_vm_ref, shutdown=False)
+ logging.debug("Finished snapshot and upload for VM %s", instance)
+
def reboot(self, instance):
""" Reboot VM instance """
instance_name = instance.name