From b8831091a8d097bb55a0e65c3af254a8bfa88811 Mon Sep 17 00:00:00 2001 From: Chuck Short Date: Tue, 11 Dec 2012 10:02:28 -0600 Subject: [PATCH] Remove lxc attaching/detaching of volumes Remove lxc attach and detach of volumes since this will be handled by libvirt in upcoming versions of libvirt. This is expected to be in libvirt 1.0.1 or 1.0.2. This resolves (LP: #1067638) and (LP: #1009701) This removes a non-functional feature of the lxc driver with functionalilty that is coming with newer versions of libvirt. Change-Id: Iaf4bc2769632ba2e7dcfc67892dded7b4dfbb3ae Signed-off-by: Chuck Short --- nova/tests/test_libvirt.py | 16 ----- nova/virt/libvirt/driver.py | 114 +++++++----------------------------- 2 files changed, 21 insertions(+), 109 deletions(-) diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 6e941cb45a5e..6dcf49803b4d 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -406,22 +406,6 @@ class LibvirtVolumeTestCase(test.TestCase): self.assertEqual(tree.find('./auth/secret').get('uuid'), flags_uuid) libvirt_driver.disconnect_volume(connection_info, mount_device) - def test_libvirt_lxc_volume(self): - self.stubs.Set(os.path, 'exists', lambda x: True) - libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) - name = 'volume-00000001' - location = '10.0.2.15:3260' - iqn = 'iqn.2010-10.org.openstack:%s' % name - vol = {'id': 1, 'name': name} - connection_info = self.iscsi_connection(vol, location, iqn) - mount_device = "vde" - conf = libvirt_driver.connect_volume(connection_info, mount_device) - tree = conf.format_dom() - dev_str = '/dev/disk/by-path/ip-%s-iscsi-%s-lun-1' % (location, iqn) - self.assertEqual(tree.get('type'), 'block') - self.assertEqual(tree.find('./source').get('dev'), dev_str) - libvirt_driver.disconnect_volume(connection_info, mount_device) - def test_libvirt_nfs_driver(self): # NOTE(vish) exists is to make driver assume connecting worked mnt_base = '/mnt' diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 0661227fba26..3c78f58ebbb1 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -662,37 +662,28 @@ class LibvirtDriver(driver.ComputeDriver): connection_info, mount_device) - if CONF.libvirt_type == 'lxc': - self._attach_lxc_volume(conf.to_xml(), virt_dom, instance_name) - # TODO(danms) once libvirt has support for LXC hotplug, - # replace this re-define with use of the - # VIR_DOMAIN_AFFECT_LIVE & VIR_DOMAIN_AFFECT_CONFIG flags with - # attachDevice() - domxml = virt_dom.XMLDesc(libvirt.VIR_DOMAIN_XML_SECURE) - self._conn.defineXML(domxml) - else: - try: - # NOTE(vish): We can always affect config because our - # domains are persistent, but we should only - # affect live if the domain is running. - flags = libvirt.VIR_DOMAIN_AFFECT_CONFIG - state = LIBVIRT_POWER_STATE[virt_dom.info()[0]] - if state == power_state.RUNNING: - flags |= libvirt.VIR_DOMAIN_AFFECT_LIVE - virt_dom.attachDeviceFlags(conf.to_xml(), flags) - except Exception, ex: - if isinstance(ex, libvirt.libvirtError): - errcode = ex.get_error_code() - if errcode == libvirt.VIR_ERR_OPERATION_FAILED: - self.volume_driver_method('disconnect_volume', - connection_info, - mount_device) - raise exception.DeviceIsBusy(device=mount_device) - - with excutils.save_and_reraise_exception(): + try: + # NOTE(vish): We can always affect config because our + # domains are persistent, but we should only + # affect live if the domain is running. + flags = libvirt.VIR_DOMAIN_AFFECT_CONFIG + state = LIBVIRT_POWER_STATE[virt_dom.info()[0]] + if state == power_state.RUNNING: + flags |= libvirt.VIR_DOMAIN_AFFECT_LIVE + virt_dom.attachDeviceFlags(conf.to_xml(), flags) + except Exception, ex: + if isinstance(ex, libvirt.libvirtError): + errcode = ex.get_error_code() + if errcode == libvirt.VIR_ERR_OPERATION_FAILED: self.volume_driver_method('disconnect_volume', - connection_info, - mount_device) + connection_info, + mount_device) + raise exception.DeviceIsBusy(device=mount_device) + + with excutils.save_and_reraise_exception(): + self.volume_driver_method('disconnect_volume', + connection_info, + mount_device) @staticmethod def _get_disk_xml(xml, device): @@ -725,14 +716,6 @@ class LibvirtDriver(driver.ComputeDriver): xml = self._get_disk_xml(virt_dom.XMLDesc(0), mount_device) if not xml: raise exception.DiskNotFound(location=mount_device) - if CONF.libvirt_type == 'lxc': - self._detach_lxc_volume(xml, virt_dom, instance_name) - # TODO(danms) once libvirt has support for LXC hotplug, - # replace this re-define with use of the - # VIR_DOMAIN_AFFECT_LIVE & VIR_DOMAIN_AFFECT_CONFIG flags with - # detachDevice() - domxml = virt_dom.XMLDesc(libvirt.VIR_DOMAIN_XML_SECURE) - self._conn.defineXML(domxml) else: # NOTE(vish): We can always affect config because our # domains are persistent, but we should only @@ -757,61 +740,6 @@ class LibvirtDriver(driver.ComputeDriver): connection_info, mount_device) - @exception.wrap_exception() - def _attach_lxc_volume(self, xml, virt_dom, instance_name): - LOG.info(_('attaching LXC block device')) - - lxc_container_root = self.get_lxc_container_root(virt_dom) - lxc_host_volume = self.get_lxc_host_device(xml) - lxc_container_device = self.get_lxc_container_target(xml) - lxc_container_target = "%s/%s" % (lxc_container_root, - lxc_container_device) - - if lxc_container_target: - disk.bind(lxc_host_volume, lxc_container_target, instance_name) - s = os.stat(lxc_host_volume) - cgroup_info = "b %s:%s rwm\n" % (os.major(s.st_rdev), - os.minor(s.st_rdev)) - cgroups_path = ("/sys/fs/cgroup/devices/libvirt/lxc/" - "%s/devices.allow" % instance_name) - utils.execute('tee', cgroups_path, - process_input=cgroup_info, run_as_root=True) - - @exception.wrap_exception() - def _detach_lxc_volume(self, xml, virt_dom, instance_name): - LOG.info(_('detaching LXC block device')) - - lxc_container_root = self.get_lxc_container_root(virt_dom) - lxc_container_device = self.get_lxc_container_target(xml) - lxc_container_target = "%s/%s" % (lxc_container_root, - lxc_container_device) - - if lxc_container_target: - disk.unbind(lxc_container_target) - - @staticmethod - def get_lxc_container_root(virt_dom): - xml = virt_dom.XMLDesc(0) - doc = etree.fromstring(xml) - filesystem_block = doc.findall('./devices/filesystem') - for cnt, filesystem_nodes in enumerate(filesystem_block): - return filesystem_nodes[cnt].get('dir') - - @staticmethod - def get_lxc_host_device(xml): - dom = minidom.parseString(xml) - - for device in dom.getElementsByTagName('source'): - return device.getAttribute('dev') - - @staticmethod - def get_lxc_container_target(xml): - dom = minidom.parseString(xml) - - for device in dom.getElementsByTagName('target'): - filesystem = device.getAttribute('dev') - return 'dev/%s' % filesystem - @exception.wrap_exception() def snapshot(self, context, instance, image_href): """Create snapshot from a running VM instance.