mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
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:
parent
0f295ec5dc
commit
4cb775773f
25
tests/data/xmlparse/disk-change-bus-in.xml
Normal file
25
tests/data/xmlparse/disk-change-bus-in.xml
Normal 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>
|
||||
|
22
tests/data/xmlparse/disk-change-bus-out.xml
Normal file
22
tests/data/xmlparse/disk-change-bus-out.xml
Normal 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>
|
@ -1206,6 +1206,22 @@ class XMLParseTest(unittest.TestCase):
|
||||
|
||||
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 #
|
||||
|
@ -648,31 +648,6 @@ class vmmDomain(vmmLibvirtObject):
|
||||
if not editdev:
|
||||
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:
|
||||
editdev.path = path
|
||||
if not do_hotplug:
|
||||
@ -693,7 +668,7 @@ class vmmDomain(vmmLibvirtObject):
|
||||
editdev.driver_detect_zeroes = detect_zeroes or None
|
||||
|
||||
if bus != _SENTINEL:
|
||||
_change_bus()
|
||||
editdev.change_bus(self.xmlobj, bus)
|
||||
|
||||
if do_hotplug:
|
||||
self.hotplug(device=editdev)
|
||||
|
@ -890,6 +890,30 @@ class DeviceDisk(Device):
|
||||
raise ValueError(_("Only %s disks for bus '%s' are supported"
|
||||
% (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 #
|
||||
|
Loading…
Reference in New Issue
Block a user