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.