summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-12-28 11:25:11 +0000
committerGerrit Code Review <review@openstack.org>2012-12-28 11:25:11 +0000
commit32eb83be79ff19e06b5057dce32052b98368ce40 (patch)
tree1261d1c2bd4242a844605d09ccf8f07375ade4a3
parentab135433464865f6612f4b543157d62c05d2fb13 (diff)
parentb8831091a8d097bb55a0e65c3af254a8bfa88811 (diff)
downloadnova-32eb83be79ff19e06b5057dce32052b98368ce40.tar.gz
nova-32eb83be79ff19e06b5057dce32052b98368ce40.tar.xz
nova-32eb83be79ff19e06b5057dce32052b98368ce40.zip
Merge "Remove lxc attaching/detaching of volumes"
-rw-r--r--nova/tests/test_libvirt.py16
-rw-r--r--nova/virt/libvirt/driver.py114
2 files changed, 21 insertions, 109 deletions
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py
index 02578e888..c1016f1f4 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 bf45aad1d..cfed962d0 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -657,37 +657,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):
@@ -720,14 +711,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
@@ -753,61 +736,6 @@ class LibvirtDriver(driver.ComputeDriver):
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.