diff options
| -rw-r--r-- | nova/tests/test_libvirt.py | 38 | ||||
| -rw-r--r-- | nova/virt/libvirt/connection.py | 29 |
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 |
