summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2012-07-20 11:45:04 +0100
committerDaniel P. Berrange <berrange@redhat.com>2012-07-20 13:39:20 +0100
commit7b5a46b29fe994e9dc973bd7e5b60dee9f803f91 (patch)
tree5b1f9c93bea44e4b8ad0af9a765d0bd7aaafcfd1 /nova
parent7292473944762c42c0d04e16599822ab55d9b726 (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.py49
-rw-r--r--nova/virt/libvirt/driver.py8
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"