summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2011-11-18 19:53:44 +0000
committerGerrit Code Review <review@openstack.org>2011-11-18 19:53:44 +0000
commite27a0798a82b2a40cf95cdbab46ae491aafbec69 (patch)
tree2e94844da8d3da278e524c17e3c4ac8d05246e0d
parent8449c6f9b1e2ea2ac713ae67dcb205654bf8523c (diff)
parent658d0bc153c15c931bee6418c2c51f48f1f46411 (diff)
Merge "Add a "libvirt_disk_prefix" flag to libvirt driver"
-rw-r--r--nova/tests/test_libvirt.py38
-rw-r--r--nova/virt/libvirt/connection.py29
2 files changed, 54 insertions, 13 deletions
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py
index 61ba21692..c1fae1df2 100644
--- a/nova/tests/test_libvirt.py
+++ b/nova/tests/test_libvirt.py
@@ -357,6 +357,10 @@ class LibvirtConnTestCase(test.TestCase):
instance_data = dict(self.test_instance)
self._check_xml_and_container(instance_data)
+ def test_xml_disk_prefix(self):
+ instance_data = dict(self.test_instance)
+ self._check_xml_and_disk_prefix(instance_data)
+
@test.skip_if(missing_libvirt(), "Test requires libvirt")
def test_snapshot_in_ami_format(self):
self.flags(image_service='nova.image.fake.FakeImageService')
@@ -557,6 +561,40 @@ class LibvirtConnTestCase(test.TestCase):
target = tree.find('./devices/filesystem/source').get('dir')
self.assertTrue(len(target) > 0)
+ def _check_xml_and_disk_prefix(self, instance):
+ user_context = context.RequestContext(self.user_id,
+ self.project_id)
+ instance_ref = db.instance_create(user_context, instance)
+
+ type_disk_map = {
+ 'qemu': [
+ (lambda t: t.find('.').get('type'), 'qemu'),
+ (lambda t: t.find('./devices/disk/target').get('dev'), 'vda')],
+ 'xen': [
+ (lambda t: t.find('.').get('type'), 'xen'),
+ (lambda t: t.find('./devices/disk/target').get('dev'), 'sda')],
+ 'kvm': [
+ (lambda t: t.find('.').get('type'), 'kvm'),
+ (lambda t: t.find('./devices/disk/target').get('dev'), 'vda')],
+ 'uml': [
+ (lambda t: t.find('.').get('type'), 'uml'),
+ (lambda t: t.find('./devices/disk/target').get('dev'), 'ubda')]
+ }
+
+ for (libvirt_type, checks) in type_disk_map.iteritems():
+ self.flags(libvirt_type=libvirt_type)
+ conn = connection.LibvirtConnection(True)
+
+ network_info = _fake_network_info(self.stubs, 1)
+ xml = conn.to_xml(instance_ref, network_info)
+ tree = xml_to_tree(xml)
+
+ for i, (check, expected_result) in enumerate(checks):
+ self.assertEqual(check(tree),
+ expected_result,
+ '%s != %s failed check %d' %
+ (check(tree), expected_result, i))
+
def _check_xml_and_uri(self, instance, expect_ramdisk, expect_kernel,
rescue=False):
user_context = context.RequestContext(self.user_id, self.project_id)
diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py
index fb7f71ad1..71ca21d1b 100644
--- a/nova/virt/libvirt/connection.py
+++ b/nova/virt/libvirt/connection.py
@@ -29,6 +29,8 @@ Supports KVM, LXC, QEMU, UML, and XEN.
(default: kvm).
:libvirt_uri: Override for the default libvirt URI (depends on libvirt_type).
:libvirt_xml_template: Libvirt XML Template.
+:libvirt_disk_prefix: Override the default disk prefix for the devices
+ attached to a server.
:rescue_image_id: Rescue ami image (None = original image).
:rescue_kernel_id: Rescue aki image (None = original image).
:rescue_ramdisk_id: Rescue ari image (None = original image).
@@ -146,6 +148,11 @@ flags.DEFINE_string('default_local_format',
flags.DEFINE_bool('libvirt_use_virtio_for_bridges',
False,
'Use virtio for bridge interfaces')
+flags.DEFINE_string('libvirt_disk_prefix',
+ None,
+ 'Override the default disk prefix for the devices '
+ 'attached to a server, which is dependent on '
+ 'libvirt_type. (valid options are: sd, xvd, uvd, vd)')
def get_connection(read_only):
@@ -193,6 +200,15 @@ class LibvirtConnection(driver.ComputeDriver):
self.volume_drivers[driver_type] = driver_class(self)
self._host_state = None
+ disk_prefix_map = {"lxc": "", "uml": "ubd", "xen": "sd"}
+ if FLAGS.libvirt_disk_prefix:
+ self._disk_prefix = FLAGS.libvirt_disk_prefix
+ else:
+ self._disk_prefix = disk_prefix_map.get(FLAGS.libvirt_type, 'vd')
+ self.default_root_device = self._disk_prefix + 'a'
+ self.default_local_device = self._disk_prefix + 'b'
+ self.default_swap_device = self._disk_prefix + 'c'
+
@property
def host_state(self):
if not self._host_state:
@@ -1064,19 +1080,6 @@ class LibvirtConnection(driver.ComputeDriver):
if FLAGS.libvirt_type == 'uml':
utils.execute('chown', 'root', basepath('disk'), run_as_root=True)
- if FLAGS.libvirt_type == 'uml':
- _disk_prefix = 'ubd'
- elif FLAGS.libvirt_type == 'xen':
- _disk_prefix = 'sd'
- elif FLAGS.libvirt_type == 'lxc':
- _disk_prefix = ''
- else:
- _disk_prefix = 'vd'
-
- default_root_device = _disk_prefix + 'a'
- default_local_device = _disk_prefix + 'b'
- default_swap_device = _disk_prefix + 'c'
-
def _volume_in_mapping(self, mount_device, block_device_info):
block_device_list = [block_device.strip_dev(vol['mount_device'])
for vol in