devices: disk: Add change_bus()

Taken from virt-manager code. Move it here because it is strictly
an XML operation, and it will be easier to unit test

Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson 2020-01-28 20:03:38 -05:00
parent 0f295ec5dc
commit 4cb775773f
5 changed files with 88 additions and 26 deletions

View File

@ -0,0 +1,25 @@
<domain type='kvm'>
<name>f30</name>
<memory unit='KiB'>8294400</memory>
<os>
<type arch='x86_64'>hvm</type>
</os>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/mnt/data/devel/images/f30.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<target dev='hda' bus='ide'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='sda' bus='sata'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='3'/>
</disk>
</devices>
</domain>

View File

@ -0,0 +1,22 @@
<domain type="kvm">
<name>f30</name>
<memory unit="KiB">8294400</memory>
<os>
<type arch="x86_64">hvm</type>
</os>
<devices>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/mnt/data/devel/images/f30.qcow2"/>
<target dev="hdb" bus="ide"/>
</disk>
<disk type="file" device="cdrom">
<target dev="hda" bus="ide"/>
</disk>
<disk type="file" device="cdrom">
<driver name="qemu" type="raw"/>
<target dev="sda" bus="scsi"/>
<readonly/>
</disk>
</devices>
</domain>

View File

@ -1206,6 +1206,22 @@ class XMLParseTest(unittest.TestCase):
self._alter_compare(guest.get_xml(), outfile) self._alter_compare(guest.get_xml(), outfile)
def testDiskChangeBus(self):
guest, outfile = self._get_test_content("disk-change-bus")
disk = guest.devices.disk[0]
# Same bus is a no-op
origxml = disk.get_xml()
disk.change_bus(guest, "virtio")
assert origxml == disk.get_xml()
disk.change_bus(guest, "ide")
disk = guest.devices.disk[2]
disk.change_bus(guest, "scsi")
self._alter_compare(guest.get_xml(), outfile)
################## ##################
# Snapshot tests # # Snapshot tests #

View File

@ -648,31 +648,6 @@ class vmmDomain(vmmLibvirtObject):
if not editdev: if not editdev:
return return
def _change_bus():
oldprefix = editdev.get_target_prefix()[0]
oldbus = editdev.bus
editdev.bus = bus
if oldbus == bus:
return
editdev.address.clear()
if oldprefix == editdev.get_target_prefix()[0]:
return
used = []
disks = (self.xmlobj.devices.disk +
self.get_xmlobj(inactive=True).devices.disk)
for d in disks:
used.append(d.target)
if editdev.target:
used.remove(editdev.target)
editdev.target = None
editdev.generate_target(used)
if path != _SENTINEL: if path != _SENTINEL:
editdev.path = path editdev.path = path
if not do_hotplug: if not do_hotplug:
@ -693,7 +668,7 @@ class vmmDomain(vmmLibvirtObject):
editdev.driver_detect_zeroes = detect_zeroes or None editdev.driver_detect_zeroes = detect_zeroes or None
if bus != _SENTINEL: if bus != _SENTINEL:
_change_bus() editdev.change_bus(self.xmlobj, bus)
if do_hotplug: if do_hotplug:
self.hotplug(device=editdev) self.hotplug(device=editdev)

View File

@ -890,6 +890,30 @@ class DeviceDisk(Device):
raise ValueError(_("Only %s disks for bus '%s' are supported" raise ValueError(_("Only %s disks for bus '%s' are supported"
% (maxnode, self.bus))) % (maxnode, self.bus)))
def change_bus(self, guest, newbus):
"""
Change the bus value for an existing disk, which has some
follow on side effects.
"""
if self.bus == newbus:
return
oldprefix = self.get_target_prefix()[0]
self.bus = newbus
self.address.clear()
if oldprefix == self.get_target_prefix()[0]:
return
used = [disk.target for disk in guest.devices.disk]
if self.target:
used.remove(self.target)
self.target = None
self.generate_target(used)
################## ##################
# Default config # # Default config #