From b60646965de26974f8a8b81f6e43b72a6c8d44f5 Mon Sep 17 00:00:00 2001 From: David Kang Date: Mon, 22 Oct 2012 16:56:56 -0400 Subject: Fixes bug Snapshotting LXC instance fails Fixes bug 1058273. The path of the disk for snapshotting LXC instance is debugged. Also, virt_dom.managedSave(0) and self._create_domain(domain=virt_dom) are not called for LXC instance, because they are supported by libvirt. Change-Id: Idf8275a0222b2eb289e16dd245f7721e17fce21d --- nova/virt/libvirt/driver.py | 13 +++++++++---- nova/virt/libvirt/utils.py | 10 ++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) (limited to 'nova/virt') diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 2d3b1d954..8ef469b76 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -830,8 +830,10 @@ class LibvirtDriver(driver.ComputeDriver): (state, _max_mem, _mem, _cpus, _t) = virt_dom.info() state = LIBVIRT_POWER_STATE[state] - if state == power_state.RUNNING: - virt_dom.managedSave(0) + # NOTE(dkang): managedSave does not work for LXC + if FLAGS.libvirt_type != 'lxc': + if state == power_state.RUNNING: + virt_dom.managedSave(0) # Make the snapshot snapshot = self.image_backend.snapshot(disk_path, snapshot_name, @@ -848,8 +850,11 @@ class LibvirtDriver(driver.ComputeDriver): snapshot.extract(out_path, image_format) finally: snapshot.delete() - if state == power_state.RUNNING: - self._create_domain(domain=virt_dom) + # NOTE(dkang): because previous managedSave is not called + # for LXC, _create_domain must not be called. + if FLAGS.libvirt_type != 'lxc': + if state == power_state.RUNNING: + self._create_domain(domain=virt_dom) # Upload that image to the image service with libvirt_utils.file_open(out_path) as image_file: diff --git a/nova/virt/libvirt/utils.py b/nova/virt/libvirt/utils.py index 17c9efdda..8df923c9f 100644 --- a/nova/virt/libvirt/utils.py +++ b/nova/virt/libvirt/utils.py @@ -417,8 +417,14 @@ def find_disk(virt_dom): May be file or device""" xml_desc = virt_dom.XMLDesc(0) domain = etree.fromstring(xml_desc) - source = domain.find('devices/disk/source') - disk_path = source.get('file') or source.get('dev') + if FLAGS.libvirt_type == 'lxc': + source = domain.find('devices/filesystem/source') + disk_path = source.get('dir') + disk_path = disk_path[0:disk_path.rfind('rootfs')] + disk_path = os.path.join(disk_path, 'disk') + else: + source = domain.find('devices/disk/source') + disk_path = source.get('file') or source.get('dev') if not disk_path: raise RuntimeError(_("Can't retrieve root device path " -- cgit