]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuxmlconftest: Stablilize '-add-fd' arguments
authorPeter Krempa <pkrempa@redhat.com>
Wed, 13 May 2026 13:31:30 +0000 (15:31 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 25 May 2026 11:28:57 +0000 (13:28 +0200)
Add code which walks the generated argument list and allows to strip out
and replace by a substitution any field in either JSON or legacy qemu
argument string.

Use it to stabilize 'fd' field of '-add-fd'

This will allow us to rip out code which tries to allocate stable FD
numbers, which doesn't work reliably (e.g. if the environment passes
some FDs).

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
18 files changed:
tests/qemuxmlconfdata/aarch64-pci-serial.aarch64-latest.args
tests/qemuxmlconfdata/chardev-backends-json.x86_64-9.1.0.args
tests/qemuxmlconfdata/chardev-backends-json.x86_64-latest.args
tests/qemuxmlconfdata/chardev-backends.x86_64-9.1.0.args
tests/qemuxmlconfdata/chardev-backends.x86_64-latest.args
tests/qemuxmlconfdata/chardev-label.x86_64-latest.args
tests/qemuxmlconfdata/disk-source-fd.x86_64-latest.args
tests/qemuxmlconfdata/disk-vhostvdpa.x86_64-latest.args
tests/qemuxmlconfdata/name-escape.x86_64-latest.args
tests/qemuxmlconfdata/net-vdpa-multiqueue.x86_64-latest.args
tests/qemuxmlconfdata/net-vdpa.x86_64-latest.args
tests/qemuxmlconfdata/serial-file-chardev.x86_64-latest.args
tests/qemuxmlconfdata/serial-file-log.x86_64-latest.args
tests/qemuxmlconfdata/serial-many-chardev.x86_64-latest.args
tests/qemuxmlconfdata/tpm-passthrough-crb.x86_64-latest.args
tests/qemuxmlconfdata/tpm-passthrough.x86_64-latest.args
tests/qemuxmlconftest.c
tests/testutilsqemu.h

index d90e4cba1872ac4493914dd2cf85aaf2bf8612fb..9d3cf39d6a245f9f1d0eb3d7ca8749bff57669ff 100644 (file)
@@ -28,7 +28,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-aarch64test/.config \
 -device '{"driver":"pcie-root-port","port":8,"chassis":1,"id":"pci.1","bus":"pcie.0","multifunction":true,"addr":"0x1"}' \
 -device '{"driver":"pcie-pci-bridge","id":"pci.2","bus":"pci.1","addr":"0x0"}' \
 -device '{"driver":"pcie-root-port","port":9,"chassis":3,"id":"pci.3","bus":"pcie.0","addr":"0x1.0x1"}' \
--add-fd set=0,fd=1751,opaque=serial0-log \
+-add-fd set=0,fd=XXXXXXX,opaque=serial0-log \
 -chardev pty,id=charserial0,logfile=/dev/fdset/0,logappend=on \
 -device '{"driver":"pci-serial","chardev":"charserial0","id":"serial0","bus":"pci.2","addr":"0x1"}' \
 -audiodev '{"id":"audio1","driver":"none"}' \
index dce4a582d2696fa7ec1a65ee5a3c6f4a9e07df95..a363549b811285c6173a611000fe52c006d4e92a 100644 (file)
@@ -29,17 +29,17 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -device '{"driver":"virtio-serial-pci","id":"virtio-serial0","bus":"pci.0","addr":"0x3"}' \
 -chardev '{"id":"charparallel0","backend":{"type":"parallel","data":{"device":"/dev/parport0"}}}' \
 -device '{"driver":"isa-parallel","chardev":"charparallel0","id":"parallel0"}' \
--add-fd set=0,fd=1751,opaque=channel0-log \
+-add-fd set=0,fd=XXXXXXX,opaque=channel0-log \
 -chardev '{"id":"charchannel0","backend":{"type":"null","data":{"logfile":"/dev/fdset/0","logappend":true}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":1,"chardev":"charchannel0","id":"channel0","name":"chardev-null"}' \
--add-fd set=1,fd=1751,opaque=channel1-log \
+-add-fd set=1,fd=XXXXXXX,opaque=channel1-log \
 -chardev '{"id":"charchannel1","backend":{"type":"vc","data":{"logfile":"/dev/fdset/1","logappend":true}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":2,"chardev":"charchannel1","id":"channel1","name":"chardev-vc"}' \
 -chardev '{"id":"charchannel2","backend":{"type":"pty","data":{}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":3,"chardev":"charchannel2","id":"channel2","name":"chardev-pty"}' \
 -chardev '{"id":"charchannel3","backend":{"type":"stdio","data":{}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":4,"chardev":"charchannel3","id":"channel3","name":"chardev-stdio"}' \
--add-fd set=2,fd=1750,opaque=channel4-source \
+-add-fd set=2,fd=XXXXXXX,opaque=channel4-source \
 -chardev '{"id":"charchannel4","backend":{"type":"file","data":{"out":"/dev/fdset/2","append":true}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":5,"chardev":"charchannel4","id":"channel4","name":"chardev-file"}' \
 -chardev '{"id":"charchannel5","backend":{"type":"pipe","data":{"device":"/path/to/pipe"}}}' \
index 2b7e614e8b5250ab37f02b1a1690ff1400c0ea7a..43a56f7c227e76bc80753dcc1818dafca0826ac9 100644 (file)
@@ -29,17 +29,17 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -device '{"driver":"virtio-serial-pci","id":"virtio-serial0","bus":"pci.0","addr":"0x3"}' \
 -chardev '{"id":"charparallel0","backend":{"type":"parallel","data":{"device":"/dev/parport0"}}}' \
 -device '{"driver":"isa-parallel","chardev":"charparallel0","id":"parallel0"}' \
--add-fd set=0,fd=1751,opaque=channel0-log \
+-add-fd set=0,fd=XXXXXXX,opaque=channel0-log \
 -chardev '{"id":"charchannel0","backend":{"type":"null","data":{"logfile":"/dev/fdset/0","logappend":true}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":1,"chardev":"charchannel0","id":"channel0","name":"chardev-null"}' \
--add-fd set=1,fd=1751,opaque=channel1-log \
+-add-fd set=1,fd=XXXXXXX,opaque=channel1-log \
 -chardev '{"id":"charchannel1","backend":{"type":"vc","data":{"logfile":"/dev/fdset/1","logappend":true}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":2,"chardev":"charchannel1","id":"channel1","name":"chardev-vc"}' \
 -chardev '{"id":"charchannel2","backend":{"type":"pty","data":{}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":3,"chardev":"charchannel2","id":"channel2","name":"chardev-pty"}' \
 -chardev '{"id":"charchannel3","backend":{"type":"stdio","data":{}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":4,"chardev":"charchannel3","id":"channel3","name":"chardev-stdio"}' \
--add-fd set=2,fd=1750,opaque=channel4-source \
+-add-fd set=2,fd=XXXXXXX,opaque=channel4-source \
 -chardev '{"id":"charchannel4","backend":{"type":"file","data":{"out":"/dev/fdset/2","append":true}}}' \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":5,"chardev":"charchannel4","id":"channel4","name":"chardev-file"}' \
 -chardev '{"id":"charchannel5","backend":{"type":"pipe","data":{"device":"/path/to/pipe"}}}' \
index 81773dcacd0d2a6fe78cdd73439928071c1b33f6..4d8511a95f1a4c17081bbd04b670ed31877e8bd9 100644 (file)
@@ -29,17 +29,17 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -device '{"driver":"virtio-serial-pci","id":"virtio-serial0","bus":"pci.0","addr":"0x3"}' \
 -chardev parallel,id=charparallel0,path=/dev/parport0 \
 -device '{"driver":"isa-parallel","chardev":"charparallel0","id":"parallel0"}' \
--add-fd set=0,fd=1751,opaque=channel0-log \
+-add-fd set=0,fd=XXXXXXX,opaque=channel0-log \
 -chardev null,id=charchannel0,logfile=/dev/fdset/0,logappend=on \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":1,"chardev":"charchannel0","id":"channel0","name":"chardev-null"}' \
--add-fd set=1,fd=1751,opaque=channel1-log \
+-add-fd set=1,fd=XXXXXXX,opaque=channel1-log \
 -chardev vc,id=charchannel1,logfile=/dev/fdset/1,logappend=on \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":2,"chardev":"charchannel1","id":"channel1","name":"chardev-vc"}' \
 -chardev pty,id=charchannel2 \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":3,"chardev":"charchannel2","id":"channel2","name":"chardev-pty"}' \
 -chardev stdio,id=charchannel3 \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":4,"chardev":"charchannel3","id":"channel3","name":"chardev-stdio"}' \
--add-fd set=2,fd=1750,opaque=channel4-source \
+-add-fd set=2,fd=XXXXXXX,opaque=channel4-source \
 -chardev file,id=charchannel4,path=/dev/fdset/2,append=on \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":5,"chardev":"charchannel4","id":"channel4","name":"chardev-file"}' \
 -chardev pipe,id=charchannel5,path=/path/to/pipe \
index 9708b18735f0a85cc5dc355f8c0a3911f710a4cb..bd5af10bb759c643797c89946544d2947c913d3f 100644 (file)
@@ -29,17 +29,17 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -device '{"driver":"virtio-serial-pci","id":"virtio-serial0","bus":"pci.0","addr":"0x3"}' \
 -chardev parallel,id=charparallel0,path=/dev/parport0 \
 -device '{"driver":"isa-parallel","chardev":"charparallel0","id":"parallel0"}' \
--add-fd set=0,fd=1751,opaque=channel0-log \
+-add-fd set=0,fd=XXXXXXX,opaque=channel0-log \
 -chardev null,id=charchannel0,logfile=/dev/fdset/0,logappend=on \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":1,"chardev":"charchannel0","id":"channel0","name":"chardev-null"}' \
--add-fd set=1,fd=1751,opaque=channel1-log \
+-add-fd set=1,fd=XXXXXXX,opaque=channel1-log \
 -chardev vc,id=charchannel1,logfile=/dev/fdset/1,logappend=on \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":2,"chardev":"charchannel1","id":"channel1","name":"chardev-vc"}' \
 -chardev pty,id=charchannel2 \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":3,"chardev":"charchannel2","id":"channel2","name":"chardev-pty"}' \
 -chardev stdio,id=charchannel3 \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":4,"chardev":"charchannel3","id":"channel3","name":"chardev-stdio"}' \
--add-fd set=2,fd=1750,opaque=channel4-source \
+-add-fd set=2,fd=XXXXXXX,opaque=channel4-source \
 -chardev file,id=charchannel4,path=/dev/fdset/2,append=on \
 -device '{"driver":"virtserialport","bus":"virtio-serial0.0","nr":5,"chardev":"charchannel4","id":"channel4","name":"chardev-file"}' \
 -chardev pipe,id=charchannel5,path=/path/to/pipe \
index 9e54c0f7f30f33cae93a25c1cfba98c8f5229297..b3c79cfd18340669e390d315c0baf533c125613b 100644 (file)
@@ -27,7 +27,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-machine/.config \
 -no-shutdown \
 -boot strict=on \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
--add-fd set=0,fd=1750,opaque=serial0-source \
+-add-fd set=0,fd=XXXXXXX,opaque=serial0-source \
 -chardev file,id=charserial0,path=/dev/fdset/0,append=on \
 -device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","index":0}' \
 -chardev socket,id=charserial1,path=/tmp/serial.sock \
index 27d852cf329973d1057854fe34404b035b8a9012..148fe74233d07296be3321dbf35cb9f036e695ec 100644 (file)
@@ -27,26 +27,26 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -no-shutdown \
 -boot strict=on \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
--add-fd set=5,fd=200,opaque=libvirt-6-storage0 \
--add-fd set=5,fd=205,opaque=libvirt-6-storage1 \
+-add-fd set=5,fd=XXXXXXX,opaque=libvirt-6-storage0 \
+-add-fd set=5,fd=XXXXXXX,opaque=libvirt-6-storage1 \
 -blockdev '{"driver":"file","filename":"/dev/fdset/5","node-name":"libvirt-6-storage","auto-read-only":true,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-6-format","read-only":false,"driver":"qcow2","file":"libvirt-6-storage"}' \
 -device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x2","drive":"libvirt-6-format","id":"virtio-disk4","bootindex":1}' \
--add-fd set=4,fd=209,opaque=libvirt-5-storage0 \
+-add-fd set=4,fd=XXXXXXX,opaque=libvirt-5-storage0 \
 -blockdev '{"driver":"file","filename":"/dev/fdset/4","node-name":"libvirt-5-storage","read-only":false,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-5-format","read-only":true,"driver":"raw","file":"libvirt-5-storage"}' \
--add-fd set=3,fd=247,opaque=libvirt-4-storage0 \
--add-fd set=3,fd=248,opaque=libvirt-4-storage1 \
+-add-fd set=3,fd=XXXXXXX,opaque=libvirt-4-storage0 \
+-add-fd set=3,fd=XXXXXXX,opaque=libvirt-4-storage1 \
 -blockdev '{"driver":"file","filename":"/dev/fdset/3","node-name":"libvirt-4-storage","auto-read-only":true,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-4-format","read-only":true,"driver":"qcow2","file":"libvirt-4-storage","backing":"libvirt-5-format"}' \
--add-fd set=2,fd=204,opaque=libvirt-3-storage0 \
+-add-fd set=2,fd=XXXXXXX,opaque=libvirt-3-storage0 \
 -blockdev '{"driver":"file","filename":"/dev/fdset/2","node-name":"libvirt-3-storage","read-only":false,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"qcow2","file":"libvirt-3-storage","backing":"libvirt-4-format"}' \
 -device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x3","drive":"libvirt-3-format","id":"virtio-disk5"}' \
--add-fd set=1,fd=207,opaque=libvirt-2-storage0 \
+-add-fd set=1,fd=XXXXXXX,opaque=libvirt-2-storage0 \
 -blockdev '{"driver":"file","filename":"/dev/fdset/1","node-name":"libvirt-2-storage","read-only":true}' \
 -device '{"driver":"ide-cd","bus":"ide.0","unit":0,"drive":"libvirt-2-storage","id":"ide0-0-0"}' \
--add-fd set=0,fd=208,opaque=libvirt-1-storage0 \
+-add-fd set=0,fd=XXXXXXX,opaque=libvirt-1-storage0 \
 -blockdev '{"driver":"file","filename":"/dev/fdset/0","node-name":"libvirt-1-storage","read-only":false,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-1-format","read-only":true,"driver":"raw","file":"libvirt-1-storage"}' \
 -device '{"driver":"ide-cd","bus":"ide.0","unit":1,"drive":"libvirt-1-format","id":"ide0-0-1"}' \
index 93d2ef0d98cd0ef989650d63c9c3309ad522f4a7..f52fcd2eb0ac9f958f9ba2d3b3985d10ca572515 100644 (file)
@@ -27,7 +27,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -no-shutdown \
 -boot strict=on \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
--add-fd set=0,fd=201,opaque=libvirt-1-storage-vdpa \
+-add-fd set=0,fd=XXXXXXX,opaque=libvirt-1-storage-vdpa \
 -blockdev '{"driver":"virtio-blk-vhost-vdpa","path":"/dev/fdset/0","node-name":"libvirt-1-storage","read-only":false,"cache":{"direct":true,"no-flush":false}}' \
 -device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x2","drive":"libvirt-1-storage","id":"virtio-disk0","bootindex":1,"write-cache":"on"}' \
 -audiodev '{"id":"audio1","driver":"none"}' \
index 9eec8f5a9fc58d119875b8e1a31815248aaf2f21..6a7032d99a8a2b540c5fbec051977a6916634cee 100644 (file)
@@ -34,7 +34,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-foo=1,bar=2/.config \
 -device '{"driver":"ccid-card-emulated","backend":"certificates","cert1":"cert1,foo","cert2":"cert2","cert3":"cert3","db":"/etc/pki/nssdb,foo","id":"smartcard0","bus":"ccid0.0"}' \
 -chardev serial,id=charserial0,path=/dev/ttyS2,,foo \
 -device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","index":1}' \
--add-fd set=0,fd=1750,opaque=serial1-source \
+-add-fd set=0,fd=XXXXXXX,opaque=serial1-source \
 -chardev file,id=charserial1,path=/dev/fdset/0,append=on \
 -device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1","index":0}' \
 -chardev pipe,id=charchannel0,path=/tmp/guestfwd,,foo \
index e3aee785bfe8543ff9aeaf2d8ceb20a11c3cd182..313627eab0178619a1e987d7ffdf5d3f0737109f 100644 (file)
@@ -27,7 +27,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -no-shutdown \
 -boot strict=on \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
--add-fd set=0,fd=1732,opaque=net0-vdpa \
+-add-fd set=0,fd=XXXXXXX,opaque=net0-vdpa \
 -netdev '{"type":"vhost-vdpa","vhostdev":"/dev/fdset/0","queues":2,"id":"hostnet0"}' \
 -device '{"driver":"virtio-net-pci","mq":true,"vectors":6,"netdev":"hostnet0","id":"net0","mac":"52:54:00:95:db:c0","bus":"pci.0","addr":"0x2"}' \
 -audiodev '{"id":"audio1","driver":"none"}' \
index 1fccd80199c7a93a413a07c7b1842e07d5814f71..118dd5dcb820a2985486e770c3c260006ad6b166 100644 (file)
@@ -27,7 +27,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -no-shutdown \
 -boot strict=on \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
--add-fd set=0,fd=1732,opaque=net0-vdpa \
+-add-fd set=0,fd=XXXXXXX,opaque=net0-vdpa \
 -netdev '{"type":"vhost-vdpa","vhostdev":"/dev/fdset/0","id":"hostnet0"}' \
 -device '{"driver":"virtio-net-pci","netdev":"hostnet0","id":"net0","mac":"52:54:00:95:db:c0","bus":"pci.0","addr":"0x2"}' \
 -audiodev '{"id":"audio1","driver":"none"}' \
index ca1867c247e69fd1bd37bf2c3b03e36b38fe3715..59021c4443e05fe306d18311f03bf0bbb33c3f92 100644 (file)
@@ -29,7 +29,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
 -blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","read-only":false}' \
 -device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-storage","id":"ide0-0-0","bootindex":1}' \
--add-fd set=0,fd=1750,opaque=serial0-source \
+-add-fd set=0,fd=XXXXXXX,opaque=serial0-source \
 -chardev file,id=charserial0,path=/dev/fdset/0,append=on \
 -device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","index":0}' \
 -audiodev '{"id":"audio1","driver":"none"}' \
index 6cae9e89cdb26a8291eace24c428482120a51e01..260fb2f37a6a03949577299ffe91752b0f1fc979 100644 (file)
@@ -29,8 +29,8 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
 -blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","read-only":false}' \
 -device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-storage","id":"ide0-0-0","bootindex":1}' \
--add-fd set=0,fd=1750,opaque=serial0-source \
--add-fd set=1,fd=1751,opaque=serial0-log \
+-add-fd set=0,fd=XXXXXXX,opaque=serial0-source \
+-add-fd set=1,fd=XXXXXXX,opaque=serial0-log \
 -chardev file,id=charserial0,path=/dev/fdset/0,append=on,logfile=/dev/fdset/1,logappend=on \
 -device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","index":0}' \
 -audiodev '{"id":"audio1","driver":"none"}' \
index 38d0033c9fff79f751832412b3be0209b5fe8030..2841bbd3bae6ba46f3b215e66922af9c925147e5 100644 (file)
@@ -31,7 +31,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-storage","id":"ide0-0-0","bootindex":1}' \
 -chardev pty,id=charserial0 \
 -device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","index":0}' \
--add-fd set=0,fd=1750,opaque=serial1-source \
+-add-fd set=0,fd=XXXXXXX,opaque=serial1-source \
 -chardev file,id=charserial1,path=/dev/fdset/0,append=on \
 -device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1","index":1}' \
 -audiodev '{"id":"audio1","driver":"none"}' \
index cd210b50a036eeb48f9f02d90c121e0f41e37c66..319bf9579c11c71600ba37ffe6d4b073d6f9f4e7 100644 (file)
@@ -27,8 +27,8 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-TPM-VM/.config \
 -no-shutdown \
 -boot menu=on,strict=on \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
--add-fd set=0,fd=1730,opaque=tpm0-tpm \
--add-fd set=1,fd=1731,opaque=tpm0-cancel \
+-add-fd set=0,fd=XXXXXXX,opaque=tpm0-tpm \
+-add-fd set=1,fd=XXXXXXX,opaque=tpm0-cancel \
 -tpmdev passthrough,id=tpm-tpm0,path=/dev/fdset/0,cancel-path=/dev/fdset/1 \
 -device '{"driver":"tpm-crb","tpmdev":"tpm-tpm0","id":"tpm0"}' \
 -audiodev '{"id":"audio1","driver":"none"}' \
index cab016b666f92b182a9fbd158683b3521c3ed000..896b6c3040b4c973ad4154a652ae9f9281041222 100644 (file)
@@ -27,8 +27,8 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-TPM-VM/.config \
 -no-shutdown \
 -boot menu=on,strict=on \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
--add-fd set=0,fd=1730,opaque=tpm0-tpm \
--add-fd set=1,fd=1731,opaque=tpm0-cancel \
+-add-fd set=0,fd=XXXXXXX,opaque=tpm0-tpm \
+-add-fd set=1,fd=XXXXXXX,opaque=tpm0-cancel \
 -tpmdev passthrough,id=tpm-tpm0,path=/dev/fdset/0,cancel-path=/dev/fdset/1 \
 -device '{"driver":"tpm-tis","tpmdev":"tpm-tpm0","id":"tpm0"}' \
 -audiodev '{"id":"audio1","driver":"none"}' \
index ab6274801316b07d1ce8426183bab2a58a0d625d..6f5852657cd2fc34deead48d92f2bd20db8fb372 100644 (file)
 
 static virQEMUDriver driver;
 
+/* this test case uses virTestDummyFDContextNew so we want to mock dup() to
+ * track FD hints properly */
+#include "virmock.h"
+VIR_TEST_MAKE_DUMMY_FD_INSTALL_DUP_MOCK
 
 static void
 testQemuPrepareHostdevPCI(virDomainHostdevDef *hostdev)
@@ -344,6 +348,191 @@ testCompareXMLToArgvValidateSchema(virCommand *cmd,
 }
 
 
+struct testCompareXMLToArgvStabilizeOneFindJSONObjectIterData {
+    const char *field;
+    bool recurse;
+    virJSONValue *ret;
+};
+
+static int
+testCompareXMLToArgvStabilizeOneFindJSONObjectIter(const char *key,
+                                                   virJSONValue *value,
+                                                   void *opaque)
+{
+    struct testCompareXMLToArgvStabilizeOneFindJSONObjectIterData *data = opaque;
+
+    /* negative value breaks iteration and returns specific return value */
+    if (STREQ(data->field, key))
+        return -1;
+
+    if (!data->recurse)
+        return 0;
+
+    if (!virJSONValueIsObject(value))
+        return 0;
+
+    if (virJSONValueObjectForeachKeyValue(value,
+                                          testCompareXMLToArgvStabilizeOneFindJSONObjectIter,
+                                          data) == -2) {
+        /* -2 means that the callback found something; now if it was the above
+         * call that found the key we need to fill the pointer to what we've
+         * called it with */
+        if (data->ret == NULL)
+            data->ret = value;
+
+        return -1;
+    }
+
+    return 0;
+}
+
+
+/**
+ * testCompareXMLToArgvStabilizeOne:
+ * @arg: argument to modify (may be replaced by other memory)
+ * @field: field to replace
+ * @substitutions: optional hash-table to look up value of @field and replace
+ *                 it with the stored string
+ *
+ * Takes one qemu argument @arg and replaces the value of '@field' by a stable
+ * string, either 'XXXXXXX' if @substitutions is NULL or the value of @field
+ * wasn't found in @substitutions, or with the string from @substitutions if
+ * found.
+ *
+ * Works both on JSON and normal arguments.
+ */
+static void
+testCompareXMLToArgvStabilizeOne(char **arg,
+                                 const char *field,
+                                 GHashTable *substitutions,
+                                 bool recurseJSON)
+{
+    g_autofree char *oldarg = g_steal_pointer(arg);
+
+    if (*oldarg == '{') {
+        g_autoptr(virJSONValue) j = virJSONValueFromString(oldarg);
+        struct testCompareXMLToArgvStabilizeOneFindJSONObjectIterData data = {
+            .field = field,
+            .recurse = recurseJSON,
+        };
+        const char *curstr = NULL;
+
+        /* Any JSON args will be validated so this ought not to happen */
+        if (!j) {
+            *arg = g_steal_pointer(&oldarg);
+            return;
+        }
+
+        if (virJSONValueObjectForeachKeyValue(j,
+                                              testCompareXMLToArgvStabilizeOneFindJSONObjectIter,
+                                              &data) == -2) {
+            /* -2 means that the callback found something; now if it was the above
+             * call that found the key we need to fill the pointer to what we've
+             * called it with */
+            if (data.ret == NULL)
+                data.ret = j;
+        }
+
+        if (data.ret) {
+            virJSONValue *cur = virJSONValueObjectGet(data.ret, field);
+
+            if (cur) {
+                switch (virJSONValueGetType(cur)) {
+                case VIR_JSON_TYPE_STRING:
+                    curstr = virJSONValueGetString(cur);
+                    break;
+
+                case VIR_JSON_TYPE_NUMBER:
+                    curstr = virJSONValueGetNumberString(cur);
+                    break;
+
+                case VIR_JSON_TYPE_OBJECT:
+                case VIR_JSON_TYPE_ARRAY:
+                case VIR_JSON_TYPE_BOOLEAN:
+                case VIR_JSON_TYPE_NULL:
+                    break;
+                }
+            }
+        }
+
+        if (curstr) {
+            g_autoptr(virJSONValue) newval = NULL;
+            const char *subst = NULL;
+
+            if (substitutions)
+                subst = g_hash_table_lookup(substitutions, curstr);
+
+            if (!subst)
+                subst = "XXXXXXX";
+
+            newval = virJSONValueNewString(g_strdup(subst));
+
+            ignore_value(virJSONValueObjectReplaceKey(data.ret, field, &newval));
+
+            *arg = virJSONValueToString(j, false);
+            return;
+        } else {
+            *arg = g_steal_pointer(&oldarg);
+            return;
+        }
+    } else {
+        g_autofree char *fieldmatch = g_strdup_printf("%s=", field);
+        char *match;
+        char *val;
+        char *rest;
+        const char *subst = NULL;
+
+        if (!(match = strstr(oldarg, fieldmatch))) {
+            *arg = g_steal_pointer(&oldarg);
+            return;
+        }
+
+        if ((rest = strchr(match, ',')))
+            *rest = '\0';
+
+        *match = '\0';
+
+        val = match + strlen(fieldmatch);
+
+        if (substitutions)
+            subst = g_hash_table_lookup(substitutions, val);
+
+        if (!subst)
+            subst = "XXXXXXX";
+
+        if (rest)
+            *rest = ',';
+
+        *arg = g_strdup_printf("%s%s%s%s", oldarg, fieldmatch, subst, NULLSTR_EMPTY(rest));
+    }
+}
+
+
+static void
+testCompareXMLToArgvStabilizeArgs(virCommand *cmd,
+                                  GHashTable *fdsubsts)
+{
+    char **args;
+    size_t nargs;
+    size_t a;
+
+    virCommandArgListAccess(cmd, &args, &nargs);
+
+    for (a = 0; a < nargs; a++) {
+        /* Any following replacements want also an argument for an option so
+         * so we guarantee that there's at least one extra arg */
+        if (a + 1 >= nargs)
+            break;
+
+        if (STREQ(args[a], "-add-fd")) {
+            testCompareXMLToArgvStabilizeOne(&args[a + 1], "fd", fdsubsts, false);
+
+            a++;
+        }
+    }
+}
+
+
 static int
 testInfoCheckDuplicate(testQemuInfo *info)
 {
@@ -724,6 +913,8 @@ testCompareXMLToArgv(const void *data)
     if (testCompareXMLToArgvValidateSchema(cmd, info) < 0)
         goto cleanup;
 
+    testCompareXMLToArgvStabilizeArgs(cmd, info->fdsubsts);
+
     if (virCommandToStringBuf(cmd, &actualBuf, true, false) < 0)
         goto cleanup;
 
@@ -801,10 +992,12 @@ testRun(const char *name,
     g_autofree char *name_argv = g_strdup_printf("QEMU XML def -> ARGV %s%s", name, suffix);
     g_autoptr(testQemuInfo) info = g_new0(testQemuInfo, 1);
     va_list ap;
+    g_autoptr(virTestDummyFDContext) fdsubsts = virTestDummyFDContextNew();
 
     info->name = name;
     info->suffix = suffix;
     info->conf = testConf;
+    info->fdsubsts = fdsubsts;
 
     va_start(ap, testConf);
     testQemuInfoSetArgs(info, ap);
index dbc8e2dbdfc68eed99d9fa657a9c181460a4ff61..a39f03518be42ad3dc76fb98a351ba3273bfbf7d 100644 (file)
@@ -120,6 +120,8 @@ struct _testQemuInfo {
 
     struct testQemuArgs args;
     struct testQemuConf *conf;
+
+    GHashTable *fdsubsts;
 };
 
 typedef struct _testQemuInfo testQemuInfo;