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 <chuck.short@canonical.com>
This commit is contained in:
parent
a52af4aee1
commit
b8831091a8
@ -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'
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user