From 1b93fdbf13c67bd5b0a5efc1306b95f30c64cc34 Mon Sep 17 00:00:00 2001 From: Thuleau Édouard Date: Fri, 2 Sep 2011 17:28:11 +0200 Subject: Add flag 'snapshot_image_format' to select the disk format of the snapshot image generated with the libvirt driver. --- nova/virt/libvirt/connection.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 363a20ed0..8e32ac2c4 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -126,6 +126,10 @@ flags.DEFINE_integer('live_migration_bandwidth', 0, 'Define live migration behavior') flags.DEFINE_string('qemu_img', 'qemu-img', 'binary to use for qemu-img commands') +flags.DEFINE_string('snapshot_image_format', 'raw', + 'Snapshot image format (valide option are : ' + 'all format supported by qemu-img binary') + FLAGS.snapshot_disk_format, flags.DEFINE_string('libvirt_vif_type', 'bridge', 'Type of VIF to create.') flags.DEFINE_string('libvirt_vif_driver', @@ -448,7 +452,7 @@ class LibvirtConnection(driver.ComputeDriver): '-f', 'qcow2', '-O', - 'raw', + FLAGS.snapshot_image_format, '-s', snapshot_name, disk_path, -- cgit From cae343eecdeba6b3f18dbdc330206edabd9ed287 Mon Sep 17 00:00:00 2001 From: Thuleau Édouard Date: Fri, 2 Sep 2011 17:39:37 +0200 Subject: Update snapshot image metada 'disk_format'. --- nova/virt/libvirt/connection.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 8e32ac2c4..5f53b9d5d 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -128,7 +128,8 @@ flags.DEFINE_string('qemu_img', 'qemu-img', 'binary to use for qemu-img commands') flags.DEFINE_string('snapshot_image_format', 'raw', 'Snapshot image format (valide option are : ' - 'all format supported by qemu-img binary') + 'raw, qcow2, vmdk, vdi.' + 'If the binary qemu_img supports it)') FLAGS.snapshot_disk_format, flags.DEFINE_string('libvirt_vif_type', 'bridge', 'Type of VIF to create.') @@ -424,7 +425,7 @@ class LibvirtConnection(driver.ComputeDriver): metadata['properties']['architecture'] = arch if 'disk_format' in base: - metadata['disk_format'] = base['disk_format'] + metadata['disk_format'] = FLAGS.snapshot_image_format if 'container_format' in base: metadata['container_format'] = base['container_format'] -- cgit From ccb5334c600de07f1c9aa2657dd29134fda29bc4 Mon Sep 17 00:00:00 2001 From: Thuleau Édouard Date: Fri, 2 Sep 2011 17:49:45 +0200 Subject: Add tests for flags 'snapshot_image_format'. --- nova/tests/test_libvirt.py | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 8c6775b29..a7b24c1b8 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -321,7 +321,7 @@ class LibvirtConnTestCase(test.TestCase): instance_data = dict(self.test_instance) self._check_xml_and_container(instance_data) - def test_snapshot(self): + def test_snapshot_in_raw_format(self): if not self.lazy_load_library_exists(): return @@ -354,8 +354,47 @@ class LibvirtConnTestCase(test.TestCase): snapshot = image_service.show(context, recv_meta['id']) self.assertEquals(snapshot['properties']['image_state'], 'available') self.assertEquals(snapshot['status'], 'active') + self.assertEquals(snapshot['disk_format'], FLAGS.snapshot_image_format) self.assertEquals(snapshot['name'], snapshot_name) + def test_snapshot_in_qcow2_format(self): + if not self.lazy_load_library_exists(): + return + + self.flags(image_service='nova.image.fake.FakeImageService') + self.flags(snapshot_image_format='qcow2') + + # Start test + image_service = utils.import_object(FLAGS.image_service) + + # Assuming that base image already exists in image_service + instance_ref = db.instance_create(self.context, self.test_instance) + properties = {'instance_id': instance_ref['id'], + 'user_id': str(self.context.user_id)} + snapshot_name = 'test-snap' + sent_meta = {'name': snapshot_name, 'is_public': False, + 'status': 'creating', 'properties': properties} + # Create new image. It will be updated in snapshot method + # To work with it from snapshot, the single image_service is needed + recv_meta = image_service.create(context, sent_meta) + + self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') + connection.LibvirtConnection._conn.lookupByName = self.fake_lookup + self.mox.StubOutWithMock(connection.utils, 'execute') + connection.utils.execute = self.fake_execute + + self.mox.ReplayAll() + + conn = connection.LibvirtConnection(False) + conn.snapshot(self.context, instance_ref, recv_meta['id']) + + snapshot = image_service.show(context, recv_meta['id']) + self.assertEquals(snapshot['properties']['image_state'], 'available') + self.assertEquals(snapshot['status'], 'active') + self.assertEquals(snapshot['disk_format'], FLAGS.snapshot_image_format) + self.assertEquals(snapshot['name'], snapshot_name) + + def test_snapshot_no_image_architecture(self): if not self.lazy_load_library_exists(): return -- cgit From 3a0df2ca9b145d0ef5808def1f2f990a74e607e0 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Fri, 9 Sep 2011 10:27:00 -0700 Subject: remove unnecessary qemu-img flag, use base image type by default --- nova/virt/libvirt/connection.py | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 5f53b9d5d..5a5802fb4 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -124,13 +124,10 @@ flags.DEFINE_string('block_migration_flag', 'Define block migration behavior.') flags.DEFINE_integer('live_migration_bandwidth', 0, 'Define live migration behavior') -flags.DEFINE_string('qemu_img', 'qemu-img', - 'binary to use for qemu-img commands') -flags.DEFINE_string('snapshot_image_format', 'raw', - 'Snapshot image format (valide option are : ' - 'raw, qcow2, vmdk, vdi.' - 'If the binary qemu_img supports it)') - FLAGS.snapshot_disk_format, +flags.DEFINE_string('snapshot_image_format', None, + 'Snapshot image format (valid options are : ' + 'raw, qcow2, vmdk, vdi).' + 'Defaults to same as source image') flags.DEFINE_string('libvirt_vif_type', 'bridge', 'Type of VIF to create.') flags.DEFINE_string('libvirt_vif_driver', @@ -395,10 +392,7 @@ class LibvirtConnection(driver.ComputeDriver): def snapshot(self, context, instance, image_href): """Create snapshot from a running VM instance. - This command only works with qemu 0.14+, the qemu_img flag is - provided so that a locally compiled binary of qemu-img can be used - to support this command. - + This command only works with qemu 0.14+ """ virt_dom = self._lookup_by_name(instance['name']) @@ -424,8 +418,11 @@ class LibvirtConnection(driver.ComputeDriver): arch = base['properties']['architecture'] metadata['properties']['architecture'] = arch - if 'disk_format' in base: - metadata['disk_format'] = FLAGS.snapshot_image_format + source_format = base.get('disk_format') or 'raw' + if FLAGS.use_cow_images: + source_format = 'qcow2' + image_format = FLAGS.snapshot_image_format or source_format + metadata['disk_format'] = image_format if 'container_format' in base: metadata['container_format'] = base['container_format'] @@ -448,12 +445,12 @@ class LibvirtConnection(driver.ComputeDriver): # Export the snapshot to a raw image temp_dir = tempfile.mkdtemp() out_path = os.path.join(temp_dir, snapshot_name) - qemu_img_cmd = (FLAGS.qemu_img, + qemu_img_cmd = ('qemu-img', 'convert', '-f', - 'qcow2', + source_format, '-O', - FLAGS.snapshot_image_format, + image_format, '-s', snapshot_name, disk_path, -- cgit From 2127b587a1870cd0f08466e8fe53697337292645 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Fri, 9 Sep 2011 10:44:06 -0700 Subject: remove extra line for pep8 --- nova/tests/test_libvirt.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index a7b24c1b8..61f98f63d 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -394,7 +394,6 @@ class LibvirtConnTestCase(test.TestCase): self.assertEquals(snapshot['disk_format'], FLAGS.snapshot_image_format) self.assertEquals(snapshot['name'], snapshot_name) - def test_snapshot_no_image_architecture(self): if not self.lazy_load_library_exists(): return -- cgit From 7139d7459f2bedc055080a5effc2377b55bffe6b Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Wed, 14 Sep 2011 09:37:24 -0700 Subject: fixed tests --- nova/tests/test_libvirt.py | 4 ++-- nova/virt/libvirt/connection.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 61f98f63d..9b349dd4e 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -354,7 +354,7 @@ class LibvirtConnTestCase(test.TestCase): snapshot = image_service.show(context, recv_meta['id']) self.assertEquals(snapshot['properties']['image_state'], 'available') self.assertEquals(snapshot['status'], 'active') - self.assertEquals(snapshot['disk_format'], FLAGS.snapshot_image_format) + self.assertEquals(snapshot['disk_format'], 'raw') self.assertEquals(snapshot['name'], snapshot_name) def test_snapshot_in_qcow2_format(self): @@ -391,7 +391,7 @@ class LibvirtConnTestCase(test.TestCase): snapshot = image_service.show(context, recv_meta['id']) self.assertEquals(snapshot['properties']['image_state'], 'available') self.assertEquals(snapshot['status'], 'active') - self.assertEquals(snapshot['disk_format'], FLAGS.snapshot_image_format) + self.assertEquals(snapshot['disk_format'], 'qcow2') self.assertEquals(snapshot['name'], snapshot_name) def test_snapshot_no_image_architecture(self): diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 5a5802fb4..02d06d98d 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -419,9 +419,9 @@ class LibvirtConnection(driver.ComputeDriver): metadata['properties']['architecture'] = arch source_format = base.get('disk_format') or 'raw' + image_format = FLAGS.snapshot_image_format or source_format if FLAGS.use_cow_images: source_format = 'qcow2' - image_format = FLAGS.snapshot_image_format or source_format metadata['disk_format'] = image_format if 'container_format' in base: -- cgit