summaryrefslogtreecommitdiffstats
path: root/nova/virt
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2011-09-30 15:40:04 +0000
committerGerrit Code Review <review@openstack.org>2011-09-30 15:40:04 +0000
commit96b99e4d1f5f264e7f263ddbf50981abf5a3b04e (patch)
treea20a6d10fce59da6232e30eedb8f5555aeb28383 /nova/virt
parentcb6250fa77d7724ba7e5dd15e8a3c9973756c1f5 (diff)
parentb9aac1181581b9036c98f5aa493731fdc74be7e1 (diff)
Merge "Fixed bug lp850602. Adding backing file copy operation on kvm block migration."
Diffstat (limited to 'nova/virt')
-rw-r--r--nova/virt/libvirt/connection.py33
1 files changed, 30 insertions, 3 deletions
diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py
index 6afd41c1b..03b1a4ba4 100644
--- a/nova/virt/libvirt/connection.py
+++ b/nova/virt/libvirt/connection.py
@@ -1728,9 +1728,31 @@ class LibvirtConnection(driver.ComputeDriver):
for info in disk_info:
base = os.path.basename(info['path'])
- # Get image type and create empty disk image.
+ # Get image type and create empty disk image, and
+ # create backing file in case of qcow2.
instance_disk = os.path.join(instance_dir, base)
- utils.execute('qemu-img', 'create', '-f', info['type'],
+ if not info['backing_file']:
+ utils.execute('qemu-img', 'create', '-f', info['type'],
+ instance_disk, info['local_gb'])
+
+ else:
+ # Creating backing file follows same way as spawning instances.
+ backing_file = os.path.join(FLAGS.instances_path,
+ '_base', info['backing_file'])
+
+ if not os.path.exists(backing_file):
+ self._cache_image(fn=self._fetch_image,
+ context=ctxt,
+ target=info['path'],
+ fname=info['backing_file'],
+ cow=FLAGS.use_cow_images,
+ image_id=instance_ref['image_ref'],
+ user_id=instance_ref['user_id'],
+ project_id=instance_ref['project_id'],
+ size=instance_ref['local_gb'])
+
+ utils.execute('qemu-img', 'create', '-f', info['type'],
+ '-o', 'backing_file=%s' % backing_file,
instance_disk, info['local_gb'])
# if image has kernel and ramdisk, just download
@@ -1821,12 +1843,17 @@ class LibvirtConnection(driver.ComputeDriver):
driver_nodes[cnt].get_properties().get_next().getContent()
if disk_type == 'raw':
size = int(os.path.getsize(path))
+ backing_file = ""
else:
out, err = utils.execute('qemu-img', 'info', path)
size = [i.split('(')[1].split()[0] for i in out.split('\n')
if i.strip().find('virtual size') >= 0]
size = int(size[0])
+ backing_file = [i.split('actual path:')[1].strip()[:-1]
+ for i in out.split('\n') if 0 <= i.find('backing file')]
+ backing_file = os.path.basename(backing_file[0])
+
# block migration needs same/larger size of empty image on the
# destination host. since qemu-img creates bit smaller size image
# depending on original image size, fixed value is necessary.
@@ -1842,7 +1869,7 @@ class LibvirtConnection(driver.ComputeDriver):
break
disk_info.append({'type': disk_type, 'path': path,
- 'local_gb': size})
+ 'local_gb': size, 'backing_file': backing_file})
return utils.dumps(disk_info)