summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-07-21 13:57:34 +0000
committerGerrit Code Review <review@openstack.org>2020-07-21 13:57:34 +0000
commit0a36218bcf169318caca5f262068412c0e5eef4f (patch)
treedeaf725fa5bc868e2d34308099b0b36454cc3dd7
parent938fb3385cac97225c3ae2cca34afc43d8379252 (diff)
parent041a62d0d5e4806591233e4868711563622eb19e (diff)
downloadnova-0a36218bcf169318caca5f262068412c0e5eef4f.tar.gz
Merge "fix scsi disk unit number of the attaching volume when cdrom bus is scsi" into stable/queens
-rw-r--r--nova/tests/unit/virt/libvirt/test_driver.py46
-rw-r--r--nova/virt/libvirt/driver.py10
2 files changed, 51 insertions, 5 deletions
diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py
index c0aceffdcf..69d0638831 100644
--- a/nova/tests/unit/virt/libvirt/test_driver.py
+++ b/nova/tests/unit/virt/libvirt/test_driver.py
@@ -4444,6 +4444,52 @@ class LibvirtConnTestCase(test.NoDBTestCase,
guest = libvirt_guest.Guest(FakeVirtDomain())
return drvr._get_serial_ports_from_guest(guest, mode=mode)
+ def test_get_scsi_controller_next_unit_from_guest(self):
+ xml = """
+ <domain type='kvm'>
+ <devices>
+ <disk type='file' device='disk'>
+ <target dev='sda' bus='scsi'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <target dev='vda' bus='virtio'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <target dev='sdc' bus='scsi'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='1'/>
+ </disk>
+ </devices>
+ </domain>
+ """
+ self._test_get_scsi_controller_next_unit_from_guest(xml, 2)
+
+ def test_get_scsi_controller_next_unit_from_guest_no_scsi(self):
+ xml = """
+ <domain type='kvm'>
+ <devices>
+ <disk type='file' device='disk'>
+ <target dev='vda' bus='virtio'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <target dev='vdb' bus='virtio'/>
+ </disk>
+ </devices>
+ </domain>
+ """
+ self._test_get_scsi_controller_next_unit_from_guest(xml, 0)
+
+ @mock.patch.object(libvirt_guest.Guest, "get_xml_desc")
+ def _test_get_scsi_controller_next_unit_from_guest(self, xml,
+ expect_num,
+ mock_get_xml_desc):
+ mock_get_xml_desc.return_value = xml
+
+ drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
+ guest = libvirt_guest.Guest(FakeVirtDomain())
+ i = drvr._get_scsi_controller_next_unit(guest)
+ self.assertEqual(expect_num, i)
+
def test_get_guest_config_with_type_xen(self):
self.flags(enabled=True, group='vnc')
self.flags(virt_type='xen',
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index 4432fc8d05..382e41f2c9 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -1222,16 +1222,16 @@ class LibvirtDriver(driver.ComputeDriver):
for source in tcp_devices:
yield (source.get("host"), int(source.get("service")))
- def _get_scsi_controller_max_unit(self, guest):
+ def _get_scsi_controller_next_unit(self, guest):
"""Returns the max disk unit used by scsi controller"""
xml = guest.get_xml_desc()
tree = etree.fromstring(xml)
- addrs = "./devices/disk[@device='disk']/address[@type='drive']"
+ addrs = "./devices/disk[target/@bus='scsi']/address[@type='drive']"
ret = []
- for obj in tree.findall(addrs):
+ for obj in tree.xpath(addrs):
ret.append(int(obj.get('unit', 0)))
- return max(ret)
+ return max(ret) + 1 if ret else 0
@staticmethod
def _get_rbd_driver():
@@ -1557,7 +1557,7 @@ class LibvirtDriver(driver.ComputeDriver):
disk_info = blockinfo.get_info_from_bdm(
instance, CONF.libvirt.virt_type, instance.image_meta, bdm)
if disk_info['bus'] == 'scsi':
- disk_info['unit'] = self._get_scsi_controller_max_unit(guest) + 1
+ disk_info['unit'] = self._get_scsi_controller_next_unit(guest)
conf = self._get_volume_config(connection_info, disk_info)