diff options
| author | Daniel P. Berrange <berrange@redhat.com> | 2012-07-20 11:45:04 +0100 |
|---|---|---|
| committer | Daniel P. Berrange <berrange@redhat.com> | 2012-07-20 13:39:20 +0100 |
| commit | 7b5a46b29fe994e9dc973bd7e5b60dee9f803f91 (patch) | |
| tree | 5b1f9c93bea44e4b8ad0af9a765d0bd7aaafcfd1 /nova | |
| parent | 7292473944762c42c0d04e16599822ab55d9b726 (diff) | |
Don't set device='cdrom' for all disks in libvirt driver
When the root disk image was tagged as being an ISO image,
the libvirt driver would mistakenly set device='cdrom' for
all disks, instead of just the first image
Change-Id: Idf29df5c460f8ebefd2e462a53d72280d5af4c5e
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/tests/test_libvirt.py | 49 | ||||
| -rw-r--r-- | nova/virt/libvirt/driver.py | 8 |
2 files changed, 44 insertions, 13 deletions
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 16dcd338b..f2ad9632d 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -860,11 +860,30 @@ class LibvirtConnTestCase(test.TestCase): def test_xml_disk_bus_virtio(self): self._check_xml_and_disk_bus({"disk_format": "raw"}, - "disk", "virtio") + None, + (("disk", "virtio"),)) def test_xml_disk_bus_ide(self): self._check_xml_and_disk_bus({"disk_format": "iso"}, - "cdrom", "ide") + None, + (("cdrom", "ide"),)) + + def test_xml_disk_bus_ide_and_virtio(self): + swap = {'device_name': '/dev/sdb', + 'swap_size': 1} + ephemerals = [{'num': 0, + 'virtual_name': 'ephemeral0', + 'device_name': '/dev/sdc1', + 'size': 1}] + block_device_info = { + 'swap': swap, + 'ephemerals': ephemerals} + + self._check_xml_and_disk_bus({"disk_format": "iso"}, + block_device_info, + (("cdrom", "ide"), + ("disk", "virtio"), + ("disk", "virtio"))) def test_list_instances(self): self.mox.StubOutWithMock(libvirt_driver.LibvirtDriver, '_conn') @@ -1295,18 +1314,30 @@ class LibvirtConnTestCase(test.TestCase): for disk in disks: self.assertEqual(disk.get("cache"), "writethrough") - def _check_xml_and_disk_bus(self, image_meta, device_type, bus): + def _check_xml_and_disk_bus(self, image_meta, + block_device_info, wantConfig): user_context = context.RequestContext(self.user_id, self.project_id) instance_ref = db.instance_create(user_context, self.test_instance) network_info = _fake_network_info(self.stubs, 1) - xml = libvirt_driver.LibvirtDriver(True).to_xml(instance_ref, - network_info, - image_meta) + xml = libvirt_driver.LibvirtDriver(True).to_xml( + instance_ref, + network_info, + image_meta, + block_device_info=block_device_info) tree = etree.fromstring(xml) - self.assertEqual(tree.find('./devices/disk').get('device'), - device_type) - self.assertEqual(tree.find('./devices/disk/target').get('bus'), bus) + + got_disks = tree.findall('./devices/disk') + got_disk_targets = tree.findall('./devices/disk/target') + for i in range(len(wantConfig)): + want_device_type = wantConfig[i][0] + want_device_bus = wantConfig[i][1] + + got_device_type = got_disks[i].get('device') + got_device_bus = got_disk_targets[i].get('bus') + + self.assertEqual(got_device_type, want_device_type) + self.assertEqual(got_device_bus, want_device_bus) def _check_xml_and_uuid(self, image_meta): user_context = context.RequestContext(self.user_id, self.project_id) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index bb460c8ea..d41a18304 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -1654,10 +1654,10 @@ class LibvirtDriver(driver.ComputeDriver): else: root_device_type = 'disk' - def disk_info(name): + def disk_info(name, device_type="disk"): image = self.image_backend.image(instance['name'], name) - return image.libvirt_info(root_device_type, + return image.libvirt_info(device_type, self.disk_cachemode) if FLAGS.libvirt_type == "uml": @@ -1668,7 +1668,7 @@ class LibvirtDriver(driver.ComputeDriver): ephemeral_disk_bus = "virtio" if rescue: - diskrescue = disk_info('disk.rescue') + diskrescue = disk_info('disk.rescue', root_device_type) diskrescue.target_dev = self.default_root_device diskrescue.target_bus = ephemeral_disk_bus guest.add_device(diskrescue) @@ -1682,7 +1682,7 @@ class LibvirtDriver(driver.ComputeDriver): block_device_info) if not ebs_root: - diskos = disk_info('disk') + diskos = disk_info('disk', root_device_type) diskos.target_dev = root_device if root_device_type == "cdrom": diskos.target_bus = "ide" |
