From: Peter Krempa <pkrempa(a)redhat.com>
The QEMU_CAPS_DEVICE_USB_BOT device can be compiled out but
realistically it makes no sense to do it thus also makes no sense to
have another variant of input data for it.
Add another invocation of "disk-usb-device" clearing QEMU_CAPS_DEVICE_USB_BOT
to show the fallback code paths.
Also add "ABI_UPDATE" version for the two cases above as the ABI of
usb-bot cdrom is not migration-compatible and we'll be wanting to update
to the fixed configuration.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
...est.QEMU_CAPS_DEVICE_USB_BOT-disabled.args | 59 +++++++++
...test.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml | 107 +++++++++++++++
...ate.QEMU_CAPS_DEVICE_USB_BOT-disabled.args | 59 +++++++++
...date.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml | 125 ++++++++++++++++++
...k-usb-device.x86_64-latest.abi-update.args | 59 +++++++++
...sk-usb-device.x86_64-latest.abi-update.xml | 125 ++++++++++++++++++
tests/qemuxmlconftest.c | 12 ++
7 files changed, 546 insertions(+)
create mode 100644
tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.QEMU_CAPS_DEVICE_USB_BOT-disabled.args
create mode 100644
tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml
create mode 100644
tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.QEMU_CAPS_DEVICE_USB_BOT-disabled.args
create mode 100644
tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml
create mode 100644 tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.args
create mode 100644 tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.xml
diff --git
a/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.QEMU_CAPS_DEVICE_USB_BOT-disabled.args
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.QEMU_CAPS_DEVICE_USB_BOT-disabled.args
new file mode 100644
index 0000000000..079dfe5d99
--- /dev/null
+++
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.QEMU_CAPS_DEVICE_USB_BOT-disabled.args
@@ -0,0 +1,59 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest1,debug-threads=on \
+-S \
+-object
'{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}'
\
+-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
+-accel tcg \
+-cpu qemu64 \
+-m size=219136k \
+-object
'{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}'
\
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-boot strict=on \
+-device
'{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}'
\
+-device
'{"driver":"usb-hub","id":"hub0","bus":"usb.0","port":"1"}'
\
+-device
'{"driver":"usb-hub","id":"hub1","bus":"usb.0","port":"2"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img1","node-name":"libvirt-12-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.1","drive":"libvirt-12-storage","id":"usb-disk0","bootindex":1,"removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img2","node-name":"libvirt-11-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.2","drive":"libvirt-11-storage","id":"usb-disk1","removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img3","node-name":"libvirt-10-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.3","drive":"libvirt-10-storage","id":"usb-disk2","removable":false,"serial":"testserial1"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img4","node-name":"libvirt-9-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.4","drive":"libvirt-9-storage","id":"usb-disk3","removable":false,"serial":"testserial2"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img5","node-name":"libvirt-8-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.5","drive":"libvirt-8-storage","id":"ua-test1","removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img6","node-name":"libvirt-7-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.6","drive":"libvirt-7-storage","id":"ua-test2","removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img7","node-name":"libvirt-6-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.7","drive":"libvirt-6-storage","id":"ua-test3","removable":false,"serial":"testserial3"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img8","node-name":"libvirt-5-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.8","drive":"libvirt-5-storage","id":"ua-test4","removable":false,"serial":"testserial4"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img9","node-name":"libvirt-4-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.1","drive":"libvirt-4-storage","id":"usb-disk8","removable":true}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/imga","node-name":"libvirt-3-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.2","drive":"libvirt-3-storage","id":"usb-disk9","removable":true,"serial":"testserial5"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/imgb","node-name":"libvirt-2-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.3","drive":"libvirt-2-storage","id":"ua-test5","removable":true}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/imgc","node-name":"libvirt-1-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.4","drive":"libvirt-1-storage","id":"ua-test6","removable":true,"serial":"testserial6"}'
\
+-audiodev
'{"id":"audio1","driver":"none"}' \
+-device
'{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}'
\
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git
a/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml
new file mode 100644
index 0000000000..8b78f77e63
--- /dev/null
+++
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml
@@ -0,0 +1,107 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <cpu mode='custom' match='exact' check='none'>
+ <model fallback='forbid'>qemu64</model>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img1'/>
+ <target dev='sda' bus='usb'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img2'/>
+ <target dev='sdb' bus='usb'/>
+ <readonly/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img3'/>
+ <target dev='sdc' bus='usb'/>
+ <serial>testserial1</serial>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img4'/>
+ <target dev='sdd' bus='usb'/>
+ <readonly/>
+ <serial>testserial2</serial>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img5'/>
+ <target dev='sde' bus='usb'/>
+ <alias name='ua-test1'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img6'/>
+ <target dev='sdf' bus='usb'/>
+ <readonly/>
+ <alias name='ua-test2'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img7'/>
+ <target dev='sdg' bus='usb'/>
+ <serial>testserial3</serial>
+ <alias name='ua-test3'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img8'/>
+ <target dev='sdh' bus='usb'/>
+ <readonly/>
+ <serial>testserial4</serial>
+ <alias name='ua-test4'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img9'/>
+ <target dev='sdi' bus='usb' removable='on'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/imga'/>
+ <target dev='sdj' bus='usb' removable='on'/>
+ <serial>testserial5</serial>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/imgb'/>
+ <target dev='sdk' bus='usb' removable='on'/>
+ <alias name='ua-test5'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/imgc'/>
+ <target dev='sdl' bus='usb' removable='on'/>
+ <serial>testserial6</serial>
+ <alias name='ua-test6'/>
+ </disk>
+ <controller type='usb' index='0' model='piix3-uhci'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git
a/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.QEMU_CAPS_DEVICE_USB_BOT-disabled.args
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.QEMU_CAPS_DEVICE_USB_BOT-disabled.args
new file mode 100644
index 0000000000..079dfe5d99
--- /dev/null
+++
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.QEMU_CAPS_DEVICE_USB_BOT-disabled.args
@@ -0,0 +1,59 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest1,debug-threads=on \
+-S \
+-object
'{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}'
\
+-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
+-accel tcg \
+-cpu qemu64 \
+-m size=219136k \
+-object
'{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}'
\
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-boot strict=on \
+-device
'{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}'
\
+-device
'{"driver":"usb-hub","id":"hub0","bus":"usb.0","port":"1"}'
\
+-device
'{"driver":"usb-hub","id":"hub1","bus":"usb.0","port":"2"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img1","node-name":"libvirt-12-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.1","drive":"libvirt-12-storage","id":"usb-disk0","bootindex":1,"removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img2","node-name":"libvirt-11-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.2","drive":"libvirt-11-storage","id":"usb-disk1","removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img3","node-name":"libvirt-10-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.3","drive":"libvirt-10-storage","id":"usb-disk2","removable":false,"serial":"testserial1"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img4","node-name":"libvirt-9-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.4","drive":"libvirt-9-storage","id":"usb-disk3","removable":false,"serial":"testserial2"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img5","node-name":"libvirt-8-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.5","drive":"libvirt-8-storage","id":"ua-test1","removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img6","node-name":"libvirt-7-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.6","drive":"libvirt-7-storage","id":"ua-test2","removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img7","node-name":"libvirt-6-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.7","drive":"libvirt-6-storage","id":"ua-test3","removable":false,"serial":"testserial3"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img8","node-name":"libvirt-5-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.8","drive":"libvirt-5-storage","id":"ua-test4","removable":false,"serial":"testserial4"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img9","node-name":"libvirt-4-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.1","drive":"libvirt-4-storage","id":"usb-disk8","removable":true}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/imga","node-name":"libvirt-3-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.2","drive":"libvirt-3-storage","id":"usb-disk9","removable":true,"serial":"testserial5"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/imgb","node-name":"libvirt-2-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.3","drive":"libvirt-2-storage","id":"ua-test5","removable":true}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/imgc","node-name":"libvirt-1-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.4","drive":"libvirt-1-storage","id":"ua-test6","removable":true,"serial":"testserial6"}'
\
+-audiodev
'{"id":"audio1","driver":"none"}' \
+-device
'{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}'
\
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git
a/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml
new file mode 100644
index 0000000000..732230e722
--- /dev/null
+++
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.QEMU_CAPS_DEVICE_USB_BOT-disabled.xml
@@ -0,0 +1,125 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <cpu mode='custom' match='exact' check='none'>
+ <model fallback='forbid'>qemu64</model>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img1'/>
+ <target dev='sda' bus='usb'/>
+ <address type='usb' bus='0' port='1.1'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img2'/>
+ <target dev='sdb' bus='usb'/>
+ <readonly/>
+ <address type='usb' bus='0' port='1.2'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img3'/>
+ <target dev='sdc' bus='usb'/>
+ <serial>testserial1</serial>
+ <address type='usb' bus='0' port='1.3'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img4'/>
+ <target dev='sdd' bus='usb'/>
+ <readonly/>
+ <serial>testserial2</serial>
+ <address type='usb' bus='0' port='1.4'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img5'/>
+ <target dev='sde' bus='usb'/>
+ <alias name='ua-test1'/>
+ <address type='usb' bus='0' port='1.5'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img6'/>
+ <target dev='sdf' bus='usb'/>
+ <readonly/>
+ <alias name='ua-test2'/>
+ <address type='usb' bus='0' port='1.6'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img7'/>
+ <target dev='sdg' bus='usb'/>
+ <serial>testserial3</serial>
+ <alias name='ua-test3'/>
+ <address type='usb' bus='0' port='1.7'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img8'/>
+ <target dev='sdh' bus='usb'/>
+ <readonly/>
+ <serial>testserial4</serial>
+ <alias name='ua-test4'/>
+ <address type='usb' bus='0' port='1.8'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img9'/>
+ <target dev='sdi' bus='usb' removable='on'/>
+ <address type='usb' bus='0' port='2.1'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/imga'/>
+ <target dev='sdj' bus='usb' removable='on'/>
+ <serial>testserial5</serial>
+ <address type='usb' bus='0' port='2.2'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/imgb'/>
+ <target dev='sdk' bus='usb' removable='on'/>
+ <alias name='ua-test5'/>
+ <address type='usb' bus='0' port='2.3'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/imgc'/>
+ <target dev='sdl' bus='usb' removable='on'/>
+ <serial>testserial6</serial>
+ <alias name='ua-test6'/>
+ <address type='usb' bus='0' port='2.4'/>
+ </disk>
+ <controller type='usb' index='0' model='piix3-uhci'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <hub type='usb'>
+ <address type='usb' bus='0' port='1'/>
+ </hub>
+ <hub type='usb'>
+ <address type='usb' bus='0' port='2'/>
+ </hub>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.args
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.args
new file mode 100644
index 0000000000..079dfe5d99
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.args
@@ -0,0 +1,59 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest1,debug-threads=on \
+-S \
+-object
'{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}'
\
+-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
+-accel tcg \
+-cpu qemu64 \
+-m size=219136k \
+-object
'{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}'
\
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-boot strict=on \
+-device
'{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}'
\
+-device
'{"driver":"usb-hub","id":"hub0","bus":"usb.0","port":"1"}'
\
+-device
'{"driver":"usb-hub","id":"hub1","bus":"usb.0","port":"2"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img1","node-name":"libvirt-12-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.1","drive":"libvirt-12-storage","id":"usb-disk0","bootindex":1,"removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img2","node-name":"libvirt-11-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.2","drive":"libvirt-11-storage","id":"usb-disk1","removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img3","node-name":"libvirt-10-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.3","drive":"libvirt-10-storage","id":"usb-disk2","removable":false,"serial":"testserial1"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img4","node-name":"libvirt-9-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.4","drive":"libvirt-9-storage","id":"usb-disk3","removable":false,"serial":"testserial2"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img5","node-name":"libvirt-8-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.5","drive":"libvirt-8-storage","id":"ua-test1","removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img6","node-name":"libvirt-7-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.6","drive":"libvirt-7-storage","id":"ua-test2","removable":false}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img7","node-name":"libvirt-6-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.7","drive":"libvirt-6-storage","id":"ua-test3","removable":false,"serial":"testserial3"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img8","node-name":"libvirt-5-storage","read-only":true}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"1.8","drive":"libvirt-5-storage","id":"ua-test4","removable":false,"serial":"testserial4"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/img9","node-name":"libvirt-4-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.1","drive":"libvirt-4-storage","id":"usb-disk8","removable":true}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/imga","node-name":"libvirt-3-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.2","drive":"libvirt-3-storage","id":"usb-disk9","removable":true,"serial":"testserial5"}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/imgb","node-name":"libvirt-2-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.3","drive":"libvirt-2-storage","id":"ua-test5","removable":true}'
\
+-blockdev
'{"driver":"file","filename":"/tmp/imgc","node-name":"libvirt-1-storage","read-only":false}'
\
+-device
'{"driver":"usb-storage","bus":"usb.0","port":"2.4","drive":"libvirt-1-storage","id":"ua-test6","removable":true,"serial":"testserial6"}'
\
+-audiodev
'{"id":"audio1","driver":"none"}' \
+-device
'{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}'
\
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.xml
b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.xml
new file mode 100644
index 0000000000..732230e722
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-usb-device.x86_64-latest.abi-update.xml
@@ -0,0 +1,125 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <cpu mode='custom' match='exact' check='none'>
+ <model fallback='forbid'>qemu64</model>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img1'/>
+ <target dev='sda' bus='usb'/>
+ <address type='usb' bus='0' port='1.1'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img2'/>
+ <target dev='sdb' bus='usb'/>
+ <readonly/>
+ <address type='usb' bus='0' port='1.2'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img3'/>
+ <target dev='sdc' bus='usb'/>
+ <serial>testserial1</serial>
+ <address type='usb' bus='0' port='1.3'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img4'/>
+ <target dev='sdd' bus='usb'/>
+ <readonly/>
+ <serial>testserial2</serial>
+ <address type='usb' bus='0' port='1.4'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img5'/>
+ <target dev='sde' bus='usb'/>
+ <alias name='ua-test1'/>
+ <address type='usb' bus='0' port='1.5'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img6'/>
+ <target dev='sdf' bus='usb'/>
+ <readonly/>
+ <alias name='ua-test2'/>
+ <address type='usb' bus='0' port='1.6'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img7'/>
+ <target dev='sdg' bus='usb'/>
+ <serial>testserial3</serial>
+ <alias name='ua-test3'/>
+ <address type='usb' bus='0' port='1.7'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img8'/>
+ <target dev='sdh' bus='usb'/>
+ <readonly/>
+ <serial>testserial4</serial>
+ <alias name='ua-test4'/>
+ <address type='usb' bus='0' port='1.8'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/img9'/>
+ <target dev='sdi' bus='usb' removable='on'/>
+ <address type='usb' bus='0' port='2.1'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/imga'/>
+ <target dev='sdj' bus='usb' removable='on'/>
+ <serial>testserial5</serial>
+ <address type='usb' bus='0' port='2.2'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/imgb'/>
+ <target dev='sdk' bus='usb' removable='on'/>
+ <alias name='ua-test5'/>
+ <address type='usb' bus='0' port='2.3'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/imgc'/>
+ <target dev='sdl' bus='usb' removable='on'/>
+ <serial>testserial6</serial>
+ <alias name='ua-test6'/>
+ <address type='usb' bus='0' port='2.4'/>
+ </disk>
+ <controller type='usb' index='0' model='piix3-uhci'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <hub type='usb'>
+ <address type='usb' bus='0' port='1'/>
+ </hub>
+ <hub type='usb'>
+ <address type='usb' bus='0' port='2'/>
+ </hub>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index c7b6df5a6a..f2fc09d9fd 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -1609,6 +1609,18 @@ mymain(void)
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-device-lun-type-invalid");
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-attaching-partition-nosupport");
DO_TEST_CAPS_LATEST("disk-usb-device");
+ DO_TEST_CAPS_ARCH_LATEST_ABI_UPDATE("disk-usb-device",
"x86_64");
+ DO_TEST_FULL("disk-usb-device",
".x86_64-latest.QEMU_CAPS_DEVICE_USB_BOT-disabled",
+ ARG_CAPS_ARCH, "x86_64",
+ ARG_CAPS_VER, "latest",
+ ARG_QEMU_CAPS_DEL, QEMU_CAPS_DEVICE_USB_BOT, QEMU_CAPS_LAST,
+ ARG_END);
+ DO_TEST_FULL("disk-usb-device",
".x86_64-latest.abi-update.QEMU_CAPS_DEVICE_USB_BOT-disabled",
+ ARG_CAPS_ARCH, "x86_64",
+ ARG_CAPS_VER, "latest",
+ ARG_PARSEFLAGS, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE,
+ ARG_QEMU_CAPS_DEL, QEMU_CAPS_DEVICE_USB_BOT, QEMU_CAPS_LAST,
+ ARG_END);
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-usb-pci");
DO_TEST_CAPS_LATEST("disk-scsi");
DO_TEST_CAPS_LATEST("disk-scsi-device-auto");
--
2.49.0