提交 63857eb4 编写于 作者: M Michal Privoznik

tests: Introduce qemucapabilitiestest

This test is there to ensure that our capabilities detection code isn't
broken somehow.

How to gather test data:

Firstly, the data is split into two separate files. The former (with
suffix .replies) contains all the qemu replies. This is very fragile as
introducing a new device can mean yet another monitor command and hence
edit of this file in the future. But there's no better way of doing
this. To get this data simply turn on debug logs and copy all the
QEMU_MONITOR_IO_PROCESS lines. But be careful to not copy incomplete
ones (yeah, we report some incomplete lines too). Long story short, at
the libvirtd startup, a dummy qemu is spawn to get all the capabilities.

The latter (with suffix .caps) contains capabilities XML. Just start a
domain and copy the corresponding part from its state XML file.
Including <qemuCaps> tag.
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
上级 bd958586
......@@ -176,6 +176,7 @@
/tests/openvzutilstest
/tests/qemuagenttest
/tests/qemuargv2xmltest
/tests/qemucapabilitiestest
/tests/qemuhelptest
/tests/qemuhotplugtest
/tests/qemumonitorjsontest
......
......@@ -82,6 +82,7 @@ EXTRA_DIST = \
nwfilterxml2xmlin \
nwfilterxml2xmlout \
oomtrace.pl \
qemucapabilitiesdata \
qemuhelpdata \
qemuhotplugtestdata \
qemuxml2argvdata \
......@@ -173,7 +174,7 @@ if WITH_QEMU
test_programs += qemuxml2argvtest qemuxml2xmltest qemuxmlnstest \
qemuargv2xmltest qemuhelptest domainsnapshotxml2xmltest \
qemumonitortest qemumonitorjsontest qemuhotplugtest \
qemuagenttest
qemuagenttest qemucapabilitiestest
endif WITH_QEMU
if WITH_LXC
......@@ -440,6 +441,13 @@ qemumonitorjsontest_SOURCES = \
$(NULL)
qemumonitorjsontest_LDADD = libqemumonitortestutils.la $(qemu_LDADDS)
qemucapabilitiestest_SOURCES = \
qemucapabilitiestest.c \
testutils.c testutils.h \
testutilsqemu.c testutilsqemu.h \
$(NULL)
qemucapabilitiestest_LDADD = libqemumonitortestutils.la $(qemu_LDADDS)
qemuagenttest_SOURCES = \
qemuagenttest.c \
testutils.c testutils.h \
......@@ -463,7 +471,7 @@ EXTRA_DIST += qemuxml2argvtest.c qemuxml2xmltest.c qemuargv2xmltest.c \
qemuxmlnstest.c qemuhelptest.c domainsnapshotxml2xmltest.c \
qemumonitortest.c testutilsqemu.c testutilsqemu.h \
qemumonitorjsontest.c qemuhotplugtest.c \
qemuagenttest.c \
qemuagenttest.c qemucapabilitiestest.c \
$(QEMUMONITORTESTUTILS_SOURCES)
endif ! WITH_QEMU
......
<qemuCaps>
<flag name='vnc-colon'/>
<flag name='no-reboot'/>
<flag name='drive'/>
<flag name='name'/>
<flag name='uuid'/>
<flag name='vnet-hdr'/>
<flag name='migrate-qemu-tcp'/>
<flag name='migrate-qemu-exec'/>
<flag name='drive-cache-v2'/>
<flag name='drive-format'/>
<flag name='vga'/>
<flag name='0.10'/>
<flag name='mem-path'/>
<flag name='drive-serial'/>
<flag name='migrate-qemu-unix'/>
<flag name='chardev'/>
<flag name='enable-kvm'/>
<flag name='monitor-json'/>
<flag name='balloon'/>
<flag name='device'/>
<flag name='sdl'/>
<flag name='smp-topology'/>
<flag name='netdev'/>
<flag name='rtc'/>
<flag name='vhost-net'/>
<flag name='no-hpet'/>
<flag name='no-kvm-pit'/>
<flag name='pci-configfd'/>
<flag name='nodefconfig'/>
<flag name='boot-menu'/>
<flag name='fsdev'/>
<flag name='name-process'/>
<flag name='drive-readonly'/>
<flag name='smbios-type'/>
<flag name='vga-qxl'/>
<flag name='spice'/>
<flag name='vga-none'/>
<flag name='migrate-qemu-fd'/>
<flag name='boot-index'/>
<flag name='hda-duplex'/>
<flag name='drive-aio'/>
<flag name='pci-multibus'/>
<flag name='pci-bootindex'/>
<flag name='ccid-passthru'/>
<flag name='chardev-spicevmc'/>
<flag name='virtio-tx-alg'/>
<flag name='device-qxl-vga'/>
<flag name='pci-multifunction'/>
<flag name='virtio-blk-pci.ioeventfd'/>
<flag name='sga'/>
<flag name='virtio-blk-pci.event_idx'/>
<flag name='virtio-net-pci.event_idx'/>
<flag name='cache-directsync'/>
<flag name='piix3-usb-uhci'/>
<flag name='piix4-usb-uhci'/>
<flag name='usb-ehci'/>
<flag name='ich9-usb-ehci1'/>
<flag name='vt82c686b-usb-uhci'/>
<flag name='pci-ohci'/>
<flag name='usb-hub'/>
<flag name='no-shutdown'/>
<flag name='cache-unsafe'/>
<flag name='rombar'/>
<flag name='ich9-ahci'/>
<flag name='no-acpi'/>
<flag name='fsdev-readonly'/>
<flag name='virtio-blk-pci.scsi'/>
<flag name='blk-sg-io'/>
<flag name='drive-copy-on-read'/>
<flag name='cpu-host'/>
<flag name='fsdev-writeout'/>
<flag name='drive-iotune'/>
<flag name='system_wakeup'/>
<flag name='scsi-disk.channel'/>
<flag name='scsi-block'/>
<flag name='transaction'/>
<flag name='block-job-async'/>
<flag name='scsi-cd'/>
<flag name='ide-cd'/>
<flag name='no-user-config'/>
<flag name='hda-micro'/>
<flag name='dump-guest-memory'/>
<flag name='nec-usb-xhci'/>
<flag name='balloon-event'/>
<flag name='bridge'/>
<flag name='lsi'/>
<flag name='virtio-scsi-pci'/>
<flag name='blockio'/>
<flag name='disable-s3'/>
<flag name='disable-s4'/>
<flag name='ide-drive.wwn'/>
<flag name='scsi-disk.wwn'/>
<flag name='seccomp-sandbox'/>
<flag name='dump-guest-core'/>
<flag name='seamless-migration'/>
<flag name='block-commit'/>
<flag name='vnc'/>
<flag name='drive-mirror'/>
<flag name='usb-host.bootindex'/>
<flag name='blockdev-snapshot-sync'/>
<flag name='qxl'/>
<flag name='VGA'/>
<flag name='cirrus-vga'/>
<flag name='vmware-svga'/>
<flag name='usb-serial'/>
<flag name='usb-net'/>
<flag name='add-fd'/>
<flag name='nbd-server'/>
<flag name='virtio-rng'/>
<flag name='rng-random'/>
<flag name='rng-egd'/>
<flag name='dtb'/>
<flag name='megasas'/>
<flag name='ipv6-migration'/>
<flag name='machine-opt'/>
<flag name='machine-usb-opt'/>
<flag name='pci-bridge'/>
<flag name='vfio-pci'/>
<flag name='vfio-pci.bootindex'/>
<flag name='scsi-generic'/>
<flag name='scsi-generic.bootindex'/>
<flag name='mem-merge'/>
<flag name='vnc-websocket'/>
<flag name='drive-discard'/>
<flag name='mlock'/>
<flag name='vnc-share-policy'/>
<flag name='device-del-event'/>
<flag name='dmi-to-pci-bridge'/>
<flag name='usb-storage'/>
<flag name='usb-storage.removable'/>
<flag name='ich9-intel-hda'/>
</qemuCaps>
{
"QMP": {
"version": {
"qemu": {
"micro": 3,
"minor": 5,
"major": 1
},
"package": ""
},
"capabilities": [
]
}
}
{
"return": {
},
"id": "libvirt-1"
}
{
"return": {
"qemu": {
"micro": 3,
"minor": 5,
"major": 1
},
"package": ""
},
"id": "libvirt-2"
}
{
"return": {
"arch": "x86_64"
},
"id": "libvirt-3"
}
{
"return": [
{
"name": "chardev-remove"
},
{
"name": "chardev-add"
},
{
"name": "query-tpm-types"
},
{
"name": "query-tpm-models"
},
{
"name": "query-tpm"
},
{
"name": "query-target"
},
{
"name": "query-cpu-definitions"
},
{
"name": "query-machines"
},
{
"name": "device-list-properties"
},
{
"name": "qom-list-types"
},
{
"name": "change-vnc-password"
},
{
"name": "nbd-server-stop"
},
{
"name": "nbd-server-add"
},
{
"name": "nbd-server-start"
},
{
"name": "qom-get"
},
{
"name": "qom-set"
},
{
"name": "qom-list"
},
{
"name": "query-block-jobs"
},
{
"name": "query-balloon"
},
{
"name": "query-migrate-capabilities"
},
{
"name": "migrate-set-capabilities"
},
{
"name": "query-migrate"
},
{
"name": "query-command-line-options"
},
{
"name": "query-uuid"
},
{
"name": "query-name"
},
{
"name": "query-spice"
},
{
"name": "query-vnc"
},
{
"name": "query-mice"
},
{
"name": "query-status"
},
{
"name": "query-kvm"
},
{
"name": "query-pci"
},
{
"name": "query-cpus"
},
{
"name": "query-blockstats"
},
{
"name": "query-block"
},
{
"name": "query-chardev"
},
{
"name": "query-events"
},
{
"name": "query-commands"
},
{
"name": "query-version"
},
{
"name": "human-monitor-command"
},
{
"name": "qmp_capabilities"
},
{
"name": "add_client"
},
{
"name": "expire_password"
},
{
"name": "set_password"
},
{
"name": "block_set_io_throttle"
},
{
"name": "block_passwd"
},
{
"name": "query-fdsets"
},
{
"name": "remove-fd"
},
{
"name": "add-fd"
},
{
"name": "closefd"
},
{
"name": "getfd"
},
{
"name": "set_link"
},
{
"name": "balloon"
},
{
"name": "drive-mirror"
},
{
"name": "blockdev-snapshot-sync"
},
{
"name": "transaction"
},
{
"name": "block-job-complete"
},
{
"name": "block-job-resume"
},
{
"name": "block-job-pause"
},
{
"name": "block-job-cancel"
},
{
"name": "block-job-set-speed"
},
{
"name": "block-commit"
},
{
"name": "block-stream"
},
{
"name": "block_resize"
},
{
"name": "netdev_del"
},
{
"name": "netdev_add"
},
{
"name": "dump-guest-memory"
},
{
"name": "client_migrate_info"
},
{
"name": "migrate_set_downtime"
},
{
"name": "migrate_set_speed"
},
{
"name": "query-migrate-cache-size"
},
{
"name": "migrate-set-cache-size"
},
{
"name": "migrate_cancel"
},
{
"name": "migrate"
},
{
"name": "xen-set-global-dirty-log"
},
{
"name": "xen-save-devices-state"
},
{
"name": "ringbuf-read"
},
{
"name": "ringbuf-write"
},
{
"name": "inject-nmi"
},
{
"name": "pmemsave"
},
{
"name": "memsave"
},
{
"name": "cpu-add"
},
{
"name": "cpu"
},
{
"name": "send-key"
},
{
"name": "device_del"
},
{
"name": "device_add"
},
{
"name": "system_powerdown"
},
{
"name": "system_reset"
},
{
"name": "system_wakeup"
},
{
"name": "cont"
},
{
"name": "stop"
},
{
"name": "screendump"
},
{
"name": "change"
},
{
"name": "eject"
},
{
"name": "quit"
}
],
"id": "libvirt-4"
}
{
"return": {
"fd": 10,
"fdset-id": 0
},
"id": "libvirt-5"
}
{
"return": [
{
"name": "GUEST_PANICKED"
},
{
"name": "SPICE_MIGRATE_COMPLETED"
},
{
"name": "BALLOON_CHANGE"
},
{
"name": "WAKEUP"
},
{
"name": "SUSPEND_DISK"
},
{
"name": "SUSPEND"
},
{
"name": "DEVICE_TRAY_MOVED"
},
{
"name": "DEVICE_DELETED"
},
{
"name": "BLOCK_JOB_READY"
},
{
"name": "BLOCK_JOB_ERROR"
},
{
"name": "BLOCK_JOB_CANCELLED"
},
{
"name": "BLOCK_JOB_COMPLETED"
},
{
"name": "SPICE_DISCONNECTED"
},
{
"name": "SPICE_INITIALIZED"
},
{
"name": "SPICE_CONNECTED"
},
{
"name": "WATCHDOG"
},
{
"name": "RTC_CHANGE"
},
{
"name": "BLOCK_IO_ERROR"
},
{
"name": "VNC_DISCONNECTED"
},
{
"name": "VNC_INITIALIZED"
},
{
"name": "VNC_CONNECTED"
},
{
"name": "RESUME"
},
{
"name": "STOP"
},
{
"name": "POWERDOWN"
},
{
"name": "RESET"
},
{
"name": "SHUTDOWN"
}
],
"id": "libvirt-6"
}
{
"return": [
{
"name": "ICH9 LPC"
},
{
"name": "x86_64-cpu"
},
{
"name": "port92"
},
{
"name": "virtio-net-pci"
},
{
"name": "virtio-scsi-device"
},
{
"name": "apic"
},
{
"name": "pc-testdev"
},
{
"name": "virtio-blk-device"
},
{
"name": "virtio-scsi-pci"
},
{
"name": "exynos4210-ehci-usb"
},
{
"name": "i6300esb"
},
{
"name": "usb-host"
},
{
"name": "ich9-usb-ehci2"
},
{
"name": "usb-ehci"
},
{
"name": "ich9-ahci"
},
{
"name": "ich9-usb-ehci1"
},
{
"name": "isa-ide"
},
{
"name": "ICH9 SMB"
},
{
"name": "virtio-balloon-pci"
},
{
"name": "vt82c686b-usb-uhci"
},
{
"name": "i82558b"
},
{
"name": "i82558a"
},
{
"name": "isa-fdc"
},
{
"name": "isabus-bridge"
},
{
"name": "pvpanic"
},
{
"name": "i2c-bus"
},
{
"name": "piix3-ide"
},
{
"name": "ioapic"
},
{
"name": "pci-bridge"
},
{
"name": "HDA"
},
{
"name": "am53c974"
},
{
"name": "xlnx,ps7-usb"
},
{
"name": "vmmouse"
},
{
"name": "sb16"
},
{
"name": "i82801b11-bridge"
},
{
"name": "vmxnet3"
},
{
"name": "isa-cirrus-vga"
},
{
"name": "dc390"
},
{
"name": "vmware-svga"
},
{
"name": "smbus-eeprom"
},
{
"name": "piix4-usb-uhci"
},
{
"name": "ccid-card-passthru"
},
{
"name": "i82801"
},
{
"name": "fw_cfg"
},
{
"name": "qxl"
},
{
"name": "piix3-usb-uhci"
},
{
"name": "ib700"
},
{
"name": "usb-audio"
},
{
"name": "i82557c"
},
{
"name": "i82557b"
},
{
"name": "i82557a"
},
{
"name": "IndustryPack"
},
{
"name": "hpet"
},
{
"name": "pvscsi"
},
{
"name": "rtl8139"
},
{
"name": "isa-applesmc"
},
{
"name": "kvm-pci-assign"
},
{
"name": "container"
},
{
"name": "cfi.pflash01"
},
{
"name": "usb-kbd"
},
{
"name": "vfio-pci"
},
{
"name": "isa-vga"
},
{
"name": "pci-testdev"
},
{
"name": "usb-tablet"
},
{
"name": "vmport"
},
{
"name": "virtio-rng-pci"
},
{
"name": "kvmvapic"
},
{
"name": "usb-bt-dongle"
},
{
"name": "sysbus-fdc"
},
{
"name": "piix4-ide"
},
{
"name": "e1000"
},
{
"name": "AC97"
},
{
"name": "ipoctal232"
},
{
"name": "mch"
},
{
"name": "mc146818rtc"
},
{
"name": "ivshmem"
},
{
"name": "usb-ccid"
},
{
"name": "sysbus-ahci"
},
{
"name": "kvmclock"
},
{
"name": "i82562"
},
{
"name": "hda-output"
},
{
"name": "pci-serial-4x"
},
{
"name": "ccid-bus"
},
{
"name": "i82559er"
},
{
"name": "virtio-balloon-device"
},
{
"name": "i8042"
},
{
"name": "megasas"
},
{
"name": "intel-hda"
},
{
"name": "hda-duplex"
},
{
"name": "virtio-serial-pci"
},
{
"name": "ne2k_pci"
},
{
"name": "ich9-usb-uhci6"
},
{
"name": "ich9-usb-uhci5"
},
{
"name": "ich9-usb-uhci3"
},
{
"name": "virtconsole"
},
{
"name": "ich9-usb-uhci4"
},
{
"name": "isa-parallel"
},
{
"name": "pci-serial"
},
{
"name": "ich9-usb-uhci2"
},
{
"name": "ich9-usb-uhci1"
},
{
"name": "PCI"
},
{
"name": "adlib"
},
{
"name": "SUNW,fdtwo"
},
{
"name": "ide-cd"
},
{
"name": "isa-debugcon"
},
{
"name": "usb-bot"
},
{
"name": "i82551"
},
{
"name": "i82550"
},
{
"name": "isa-serial"
},
{
"name": "PCIE"
},
{
"name": "kvm-ioapic"
},
{
"name": "nec-usb-xhci"
},
{
"name": "System"
},
{
"name": "kvm-apic"
},
{
"name": "ich9-intel-hda"
},
{
"name": "virtio-net-device"
},
{
"name": "usb-wacom-tablet"
},
{
"name": "PIIX4_PM"
},
{
"name": "kvm-i8259"
},
{
"name": "q35-pcihost"
},
{
"name": "scsi-cd"
},
{
"name": "pci-ohci"
},
{
"name": "i440FX"
},
{
"name": "usb-braille"
},
{
"name": "virtserialport"
},
{
"name": "pci-serial-2x"
},
{
"name": "xio3130-downstream"
},
{
"name": "rng-random"
},
{
"name": "hda-micro"
},
{
"name": "scsi-disk"
},
{
"name": "vhost-scsi"
},
{
"name": "lsi53c895a"
},
{
"name": "qxl-vga"
},
{
"name": "SCSI"
},
{
"name": "pcnet"
},
{
"name": "scsi-generic"
},
{
"name": "virtio-scsi-common"
},
{
"name": "virtio-serial-device"
},
{
"name": "virtio-serial-bus"
},
{
"name": "icc-bridge"
},
{
"name": "usb-bus"
},
{
"name": "ne2k_isa"
},
{
"name": "IDE"
},
{
"name": "usb-net"
},
{
"name": "usb-hub"
},
{
"name": "i440FX-pcihost"
},
{
"name": "usb-mouse"
},
{
"name": "isa-i8259"
},
{
"name": "ISA"
},
{
"name": "cs4231a"
},
{
"name": "usb-serial"
},
{
"name": "pc-sysfw"
},
{
"name": "scsi-block"
},
{
"name": "sga"
},
{
"name": "isa-debug-exit"
},
{
"name": "virtio-rng-device"
},
{
"name": "ioh3420"
},
{
"name": "ES1370"
},
{
"name": "PIIX3"
},
{
"name": "isa-pcspk"
},
{
"name": "ide-hd"
},
{
"name": "rng-egd"
},
{
"name": "cirrus-vga"
},
{
"name": "kvm-pit"
},
{
"name": "qemu-console"
},
{
"name": "icc-bus"
},
{
"name": "ide-drive"
},
{
"name": "x3130-upstream"
},
{
"name": "virtio-pci-bus"
},
{
"name": "usb-uas"
},
{
"name": "vhost-scsi-pci"
},
{
"name": "virtio-blk-pci"
},
{
"name": "sysbus-ohci"
},
{
"name": "esp"
},
{
"name": "piix3-ide-xen"
},
{
"name": "i82559c"
},
{
"name": "i82559b"
},
{
"name": "i82559a"
},
{
"name": "scsi-hd"
},
{
"name": "PIIX3-xen"
},
{
"name": "usb-storage"
},
{
"name": "isa-pit"
},
{
"name": "tpci200"
},
{
"name": "gus"
},
{
"name": "VGA"
}
],
"id": "libvirt-7"
}
{
"return": [
{
"name": "command_serr_enable",
"type": "on/off"
},
{
"name": "multifunction",
"type": "on/off"
},
{
"name": "rombar",
"type": "uint32"
},
{
"name": "romfile",
"type": "string"
},
{
"name": "addr",
"type": "pci-devfn"
},
{
"name": "scsi",
"type": "on/off"
},
{
"name": "config-wce",
"type": "on/off"
},
{
"name": "serial",
"type": "string"
},
{
"name": "secs",
"type": "uint32"
},
{
"name": "heads",
"type": "uint32"
},
{
"name": "cyls",
"type": "uint32"
},
{
"name": "discard_granularity",
"type": "uint32"
},
{
"name": "bootindex",
"type": "int32"
},
{
"name": "opt_io_size",
"type": "uint32"
},
{
"name": "min_io_size",
"type": "uint16"
},
{
"name": "physical_block_size",
"type": "blocksize"
},
{
"name": "logical_block_size",
"type": "blocksize"
},
{
"name": "drive",
"type": "drive"
},
{
"name": "event_idx",
"type": "on/off"
},
{
"name": "indirect_desc",
"type": "on/off"
},
{
"name": "x-data-plane",
"type": "on/off"
},
{
"name": "vectors",
"type": "uint32"
},
{
"name": "ioeventfd",
"type": "on/off"
},
{
"name": "class",
"type": "hex32"
}
],
"id": "libvirt-8"
}
{
"return": [
{
"name": "command_serr_enable",
"type": "on/off"
},
{
"name": "multifunction",
"type": "on/off"
},
{
"name": "rombar",
"type": "uint32"
},
{
"name": "romfile",
"type": "string"
},
{
"name": "addr",
"type": "pci-devfn"
},
{
"name": "tx",
"type": "string"
},
{
"name": "x-txburst",
"type": "int32"
},
{
"name": "x-txtimer",
"type": "uint32"
},
{
"name": "bootindex",
"type": "int32"
},
{
"name": "netdev",
"type": "netdev"
},
{
"name": "vlan",
"type": "vlan"
},
{
"name": "mac",
"type": "macaddr"
},
{
"name": "mq",
"type": "on/off"
},
{
"name": "ctrl_mac_addr",
"type": "on/off"
},
{
"name": "ctrl_rx_extra",
"type": "on/off"
},
{
"name": "ctrl_vlan",
"type": "on/off"
},
{
"name": "ctrl_rx",
"type": "on/off"
},
{
"name": "ctrl_vq",
"type": "on/off"
},
{
"name": "status",
"type": "on/off"
},
{
"name": "mrg_rxbuf",
"type": "on/off"
},
{
"name": "host_ufo",
"type": "on/off"
},
{
"name": "host_ecn",
"type": "on/off"
},
{
"name": "host_tso6",
"type": "on/off"
},
{
"name": "host_tso4",
"type": "on/off"
},
{
"name": "guest_ufo",
"type": "on/off"
},
{
"name": "guest_ecn",
"type": "on/off"
},
{
"name": "guest_tso6",
"type": "on/off"
},
{
"name": "guest_tso4",
"type": "on/off"
},
{
"name": "gso",
"type": "on/off"
},
{
"name": "guest_csum",
"type": "on/off"
},
{
"name": "csum",
"type": "on/off"
},
{
"name": "event_idx",
"type": "on/off"
},
{
"name": "indirect_desc",
"type": "on/off"
},
{
"name": "vectors",
"type": "uint32"
},
{
"name": "ioeventfd",
"type": "on/off"
}
],
"id": "libvirt-9"
}
{
"id": "libvirt-10",
"error": {
"class": "DeviceNotFound",
"desc": "Device 'virtio-blk-ccw' not found"
}
}
{
"id": "libvirt-11",
"error": {
"class": "DeviceNotFound",
"desc": "Device 'virtio-net-ccw' not found"
}
}
{
"id": "libvirt-12",
"error": {
"class": "DeviceNotFound",
"desc": "Device 'virtio-blk-s390' not found"
}
}
{
"id": "libvirt-13",
"error": {
"class": "DeviceNotFound",
"desc": "Device 'virtio-net-s390' not found"
}
}
{
"id": "libvirt-14",
"error": {
"class": "DeviceNotFound",
"desc": "Device 'pci-assign' not found"
}
}
{
"return": [
{
"name": "command_serr_enable",
"type": "on/off"
},
{
"name": "multifunction",
"type": "on/off"
},
{
"name": "rombar",
"type": "uint32"
},
{
"name": "romfile",
"type": "string"
},
{
"name": "addr",
"type": "pci-devfn"
},
{
"name": "configfd",
"type": "string"
},
{
"name": "bootindex",
"type": "int32"
},
{
"name": "share_intx",
"type": "on/off"
},
{
"name": "prefer_msi",
"type": "on/off"
},
{
"name": "host",
"type": "pci-host-devaddr"
}
],
"id": "libvirt-15"
}
{
"return": [
{
"name": "command_serr_enable",
"type": "on/off"
},
{
"name": "multifunction",
"type": "on/off"
},
{
"name": "rombar",
"type": "uint32"
},
{
"name": "romfile",
"type": "string"
},
{
"name": "addr",
"type": "pci-devfn"
},
{
"name": "bootindex",
"type": "int32"
},
{
"name": "x-vga",
"type": "on/off"
},
{
"name": "x-intx-mmap-timeout-ms",
"type": "uint32"
},
{
"name": "host",
"type": "pci-host-devaddr"
}
],
"id": "libvirt-16"
}
{
"return": [
{
"name": "lun",
"type": "uint32"
},
{
"name": "scsi-id",
"type": "uint32"
},
{
"name": "channel",
"type": "uint32"
},
{
"name": "wwn",
"type": "hex64"
},
{
"name": "dpofua",
"type": "on/off"
},
{
"name": "removable",
"type": "on/off"
},
{
"name": "product",
"type": "string"
},
{
"name": "vendor",
"type": "string"
},
{
"name": "serial",
"type": "string"
},
{
"name": "ver",
"type": "string"
},
{
"name": "discard_granularity",
"type": "uint32"
},
{
"name": "bootindex",
"type": "int32"
},
{
"name": "opt_io_size",
"type": "uint32"
},
{
"name": "min_io_size",
"type": "uint16"
},
{
"name": "physical_block_size",
"type": "blocksize"
},
{
"name": "logical_block_size",
"type": "blocksize"
},
{
"name": "drive",
"type": "drive"
}
],
"id": "libvirt-17"
}
{
"return": [
{
"name": "unit",
"type": "uint32"
},
{
"name": "model",
"type": "string"
},
{
"name": "serial",
"type": "string"
},
{
"name": "wwn",
"type": "hex64"
},
{
"name": "ver",
"type": "string"
},
{
"name": "discard_granularity",
"type": "uint32"
},
{
"name": "bootindex",
"type": "int32"
},
{
"name": "opt_io_size",
"type": "uint32"
},
{
"name": "min_io_size",
"type": "uint16"
},
{
"name": "physical_block_size",
"type": "blocksize"
},
{
"name": "logical_block_size",
"type": "blocksize"
},
{
"name": "drive",
"type": "drive"
}
],
"id": "libvirt-18"
}
{
"return": [
{
"name": "command_serr_enable",
"type": "on/off"
},
{
"name": "multifunction",
"type": "on/off"
},
{
"name": "rombar",
"type": "uint32"
},
{
"name": "romfile",
"type": "string"
},
{
"name": "addr",
"type": "pci-devfn"
},
{
"name": "s4_val",
"type": "uint8"
},
{
"name": "disable_s4",
"type": "uint8"
},
{
"name": "disable_s3",
"type": "uint8"
},
{
"name": "smb_io_base",
"type": "uint32"
}
],
"id": "libvirt-19"
}
{
"id": "libvirt-20",
"error": {
"class": "DeviceNotFound",
"desc": "Device 'usb-redir' not found"
}
}
{
"return": [
{
"name": "full-path",
"type": "on/off"
},
{
"name": "port",
"type": "string"
},
{
"name": "pipeline",
"type": "on/off"
},
{
"name": "bootindex",
"type": "int32"
},
{
"name": "isobufs",
"type": "uint32"
},
{
"name": "productid",
"type": "hex32"
},
{
"name": "vendorid",
"type": "hex32"
},
{
"name": "hostport",
"type": "string"
},
{
"name": "hostaddr",
"type": "uint32"
},
{
"name": "hostbus",
"type": "uint32"
}
],
"id": "libvirt-21"
}
{
"return": [
{
"name": "lun",
"type": "uint32"
},
{
"name": "scsi-id",
"type": "uint32"
},
{
"name": "channel",
"type": "uint32"
},
{
"name": "bootindex",
"type": "int32"
},
{
"name": "drive",
"type": "drive"
}
],
"id": "libvirt-22"
}
{
"return": [
],
"id": "libvirt-23"
}
{
"return": [
{
"name": "MCFG",
"type": "uint64"
}
],
"id": "libvirt-24"
}
{
"return": [
{
"name": "full-path",
"type": "on/off"
},
{
"name": "port",
"type": "string"
},
{
"name": "removable",
"type": "on/off"
},
{
"name": "serial",
"type": "string"
},
{
"name": "discard_granularity",
"type": "uint32"
},
{
"name": "bootindex",
"type": "int32"
},
{
"name": "opt_io_size",
"type": "uint32"
},
{
"name": "min_io_size",
"type": "uint16"
},
{
"name": "physical_block_size",
"type": "blocksize"
},
{
"name": "logical_block_size",
"type": "blocksize"
},
{
"name": "drive",
"type": "drive"
}
],
"id": "libvirt-25"
}
{
"return": [
{
"name": "pc-q35-1.4",
"cpu-max": 255
},
{
"name": "pc-q35-1.5",
"cpu-max": 255,
"alias": "q35"
},
{
"name": "isapc",
"cpu-max": 1
},
{
"name": "pc-0.10",
"cpu-max": 255
},
{
"name": "pc-0.11",
"cpu-max": 255
},
{
"name": "pc-0.12",
"cpu-max": 255
},
{
"name": "pc-0.13",
"cpu-max": 255
},
{
"name": "pc-0.14",
"cpu-max": 255
},
{
"name": "pc-0.15",
"cpu-max": 255
},
{
"name": "pc-1.0",
"cpu-max": 255
},
{
"name": "pc-1.1",
"cpu-max": 255
},
{
"name": "pc-1.2",
"cpu-max": 255
},
{
"name": "pc-1.3",
"cpu-max": 255
},
{
"name": "pc-i440fx-1.4",
"cpu-max": 255
},
{
"name": "pc-i440fx-1.5",
"is-default": true,
"cpu-max": 255,
"alias": "pc"
},
{
"name": "none",
"cpu-max": 1
}
],
"id": "libvirt-26"
}
{
"return": [
{
"name": "Opteron_G5"
},
{
"name": "Opteron_G4"
},
{
"name": "Opteron_G3"
},
{
"name": "Opteron_G2"
},
{
"name": "Opteron_G1"
},
{
"name": "Haswell"
},
{
"name": "SandyBridge"
},
{
"name": "Westmere"
},
{
"name": "Nehalem"
},
{
"name": "Penryn"
},
{
"name": "Conroe"
},
{
"name": "n270"
},
{
"name": "athlon"
},
{
"name": "pentium3"
},
{
"name": "pentium2"
},
{
"name": "pentium"
},
{
"name": "486"
},
{
"name": "coreduo"
},
{
"name": "kvm32"
},
{
"name": "qemu32"
},
{
"name": "kvm64"
},
{
"name": "core2duo"
},
{
"name": "phenom"
},
{
"name": "qemu64"
}
],
"id": "libvirt-27"
}
{
"return": {
"enabled": false,
"present": true
},
"id": "libvirt-28"
}
{
"return": [
],
"id": "libvirt-29"
}
{
"return": [
],
"id": "libvirt-30"
}
{
"return": [
{
"parameters": [
{
"name": "seamless-migration",
"type": "boolean"
},
{
"name": "playback-compression",
"type": "boolean"
},
{
"name": "agent-mouse",
"type": "boolean"
},
{
"name": "streaming-video",
"type": "string"
},
{
"name": "zlib-glz-wan-compression",
"type": "string"
},
{
"name": "jpeg-wan-compression",
"type": "string"
},
{
"name": "image-compression",
"type": "string"
},
{
"name": "plaintext-channel",
"type": "string"
},
{
"name": "tls-channel",
"type": "string"
},
{
"name": "tls-ciphers",
"type": "string"
},
{
"name": "x509-dh-key-file",
"type": "string"
},
{
"name": "x509-cacert-file",
"type": "string"
},
{
"name": "x509-cert-file",
"type": "string"
},
{
"name": "x509-key-password",
"type": "string"
},
{
"name": "x509-key-file",
"type": "string"
},
{
"name": "x509-dir",
"type": "string"
},
{
"name": "sasl",
"type": "boolean"
},
{
"name": "disable-copy-paste",
"type": "boolean"
},
{
"name": "disable-ticketing",
"type": "boolean"
},
{
"name": "password",
"type": "string"
},
{
"name": "ipv6",
"type": "boolean"
},
{
"name": "ipv4",
"type": "boolean"
},
{
"name": "addr",
"type": "string"
},
{
"name": "tls-port",
"type": "number"
},
{
"name": "port",
"type": "number"
}
],
"option": "spice"
},
{
"parameters": [
],
"option": "acpi"
},
{
"parameters": [
{
"name": "sock_fd",
"type": "number"
},
{
"name": "socket",
"type": "string"
},
{
"name": "readonly",
"type": "boolean"
},
{
"name": "writeout",
"type": "string"
},
{
"name": "security_model",
"type": "string"
},
{
"name": "mount_tag",
"type": "string"
},
{
"name": "path",
"type": "string"
},
{
"name": "fsdriver",
"type": "string"
}
],
"option": "virtfs"
},
{
"parameters": [
{
"name": "sock_fd",
"type": "number"
},
{
"name": "socket",
"type": "string"
},
{
"name": "readonly",
"type": "boolean"
},
{
"name": "writeout",
"type": "string"
},
{
"name": "security_model",
"type": "string"
},
{
"name": "path",
"type": "string"
},
{
"name": "fsdriver",
"type": "string"
}
],
"option": "fsdev"
},
{
"parameters": [
{
"name": "mlock",
"type": "boolean"
}
],
"option": "realtime"
},
{
"parameters": [
],
"option": "tpmdev"
},
{
"parameters": [
],
"option": "object"
},
{
"parameters": [
{
"name": "opaque",
"help": "free-form string used to describe fd",
"type": "string"
},
{
"name": "set",
"help": "ID of the fd set to add fd to",
"type": "number"
},
{
"name": "fd",
"help": "file descriptor of which a duplicate is added to fd set",
"type": "number"
}
],
"option": "add-fd"
},
{
"parameters": [
{
"name": "enable",
"type": "boolean"
}
],
"option": "sandbox"
},
{
"parameters": [
{
"name": "strict",
"type": "string"
},
{
"name": "reboot-timeout",
"type": "string"
},
{
"name": "splash-time",
"type": "string"
},
{
"name": "splash",
"type": "string"
},
{
"name": "menu",
"type": "string"
},
{
"name": "once",
"type": "string"
},
{
"name": "order",
"type": "string"
}
],
"option": "boot-opts"
},
{
"parameters": [
{
"name": "usb",
"help": "Set on/off to enable/disable usb",
"type": "boolean"
},
{
"name": "mem-merge",
"help": "enable/disable memory merge support",
"type": "boolean"
},
{
"name": "dump-guest-core",
"help": "Include guest memory in a core dump",
"type": "boolean"
},
{
"name": "dt_compatible",
"help": "Overrides the \"compatible\" property of the dt root node",
"type": "string"
},
{
"name": "phandle_start",
"help": "The first phandle ID we may generate dynamically",
"type": "string"
},
{
"name": "dumpdtb",
"help": "Dump current dtb to a file and quit",
"type": "string"
},
{
"name": "dtb",
"help": "Linux kernel device tree file",
"type": "string"
},
{
"name": "append",
"help": "Linux kernel command line",
"type": "string"
},
{
"name": "initrd",
"help": "Linux initial ramdisk file",
"type": "string"
},
{
"name": "kernel",
"help": "Linux kernel image file",
"type": "string"
},
{
"name": "kvm_shadow_mem",
"help": "KVM shadow MMU size",
"type": "size"
},
{
"name": "kernel_irqchip",
"help": "use KVM in-kernel irqchip",
"type": "boolean"
},
{
"name": "accel",
"help": "accelerator list",
"type": "string"
},
{
"name": "type",
"help": "emulated machine",
"type": "string"
}
],
"option": "machine"
},
{
"parameters": [
{
"name": "romfile",
"type": "string"
},
{
"name": "bootindex",
"type": "number"
}
],
"option": "option-rom"
},
{
"parameters": [
{
"name": "file",
"type": "string"
},
{
"name": "events",
"type": "string"
}
],
"option": "trace"
},
{
"parameters": [
{
"name": "pretty",
"type": "boolean"
},
{
"name": "default",
"type": "boolean"
},
{
"name": "chardev",
"type": "string"
},
{
"name": "mode",
"type": "string"
}
],
"option": "mon"
},
{
"parameters": [
{
"name": "value",
"type": "string"
},
{
"name": "property",
"type": "string"
},
{
"name": "driver",
"type": "string"
}
],
"option": "global"
},
{
"parameters": [
{
"name": "driftfix",
"type": "string"
},
{
"name": "clock",
"type": "string"
},
{
"name": "base",
"type": "string"
}
],
"option": "rtc"
},
{
"parameters": [
],
"option": "net"
},
{
"parameters": [
],
"option": "netdev"
},
{
"parameters": [
],
"option": "device"
},
{
"parameters": [
{
"name": "size",
"type": "size"
},
{
"name": "debug",
"type": "number"
},
{
"name": "name",
"type": "string"
},
{
"name": "signal",
"type": "boolean"
},
{
"name": "mux",
"type": "boolean"
},
{
"name": "rows",
"type": "number"
},
{
"name": "cols",
"type": "number"
},
{
"name": "height",
"type": "number"
},
{
"name": "width",
"type": "number"
},
{
"name": "telnet",
"type": "boolean"
},
{
"name": "delay",
"type": "boolean"
},
{
"name": "server",
"type": "boolean"
},
{
"name": "wait",
"type": "boolean"
},
{
"name": "ipv6",
"type": "boolean"
},
{
"name": "ipv4",
"type": "boolean"
},
{
"name": "to",
"type": "number"
},
{
"name": "localport",
"type": "string"
},
{
"name": "localaddr",
"type": "string"
},
{
"name": "port",
"type": "string"
},
{
"name": "host",
"type": "string"
},
{
"name": "path",
"type": "string"
},
{
"name": "backend",
"type": "string"
}
],
"option": "chardev"
},
{
"parameters": [
{
"name": "boot",
"help": "(deprecated, ignored)",
"type": "boolean"
},
{
"name": "copy-on-read",
"help": "copy read data from backing file into image file",
"type": "boolean"
},
{
"name": "bps_wr",
"help": "limit write bytes per second",
"type": "number"
},
{
"name": "bps_rd",
"help": "limit read bytes per second",
"type": "number"
},
{
"name": "bps",
"help": "limit total bytes per second",
"type": "number"
},
{
"name": "iops_wr",
"help": "limit write operations per second",
"type": "number"
},
{
"name": "iops_rd",
"help": "limit read operations per second",
"type": "number"
},
{
"name": "iops",
"help": "limit total I/O operations per second",
"type": "number"
},
{
"name": "readonly",
"help": "open drive file as read-only",
"type": "boolean"
},
{
"name": "addr",
"help": "pci address (virtio only)",
"type": "string"
},
{
"name": "werror",
"help": "write error action",
"type": "string"
},
{
"name": "rerror",
"help": "read error action",
"type": "string"
},
{
"name": "serial",
"help": "disk serial number",
"type": "string"
},
{
"name": "format",
"help": "disk format (raw, qcow2, ...)",
"type": "string"
},
{
"name": "aio",
"help": "host AIO implementation (threads, native)",
"type": "string"
},
{
"name": "cache",
"help": "host cache usage (none, writeback, writethrough, directsync, unsafe)",
"type": "string"
},
{
"name": "discard",
"help": "discard operation (ignore/off, unmap/on)",
"type": "string"
},
{
"name": "file",
"help": "disk image",
"type": "string"
},
{
"name": "snapshot",
"help": "enable/disable snapshot mode",
"type": "boolean"
},
{
"name": "media",
"help": "media type (disk, cdrom)",
"type": "string"
},
{
"name": "trans",
"help": "chs translation (auto, lba. none)",
"type": "string"
},
{
"name": "secs",
"help": "number of sectors (ide disk geometry)",
"type": "number"
},
{
"name": "heads",
"help": "number of heads (ide disk geometry)",
"type": "number"
},
{
"name": "cyls",
"help": "number of cylinders (ide disk geometry)",
"type": "number"
},
{
"name": "index",
"help": "index number",
"type": "number"
},
{
"name": "if",
"help": "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)",
"type": "string"
},
{
"name": "unit",
"help": "unit number (i.e. lun for scsi)",
"type": "number"
},
{
"name": "bus",
"help": "bus number",
"type": "number"
}
],
"option": "drive"
}
],
"id": "libvirt-31"
}
/*
* Copyright (C) 2011-2013 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
*
*/
#include <config.h>
#include "testutils.h"
#include "testutilsqemu.h"
#include "qemumonitortestutils.h"
#define VIR_FROM_THIS VIR_FROM_NONE
typedef struct _testQemuData testQemuData;
typedef testQemuData * testQemuDataPtr;
struct _testQemuData {
virDomainXMLOptionPtr xmlopt;
const char *base;
};
static qemuMonitorTestPtr
testQemuFeedMonitor(char *replies,
virDomainXMLOptionPtr xmlopt)
{
qemuMonitorTestPtr test = NULL;
char *tmp = replies;
char *singleReply = tmp;
/* Our JSON parser expects replies to be separated by a newline character.
* Hence we must preprocess the file a bit. */
while ((tmp = strchr(tmp, '\n'))) {
/* It is safe to touch tmp[1] since all strings ends with '\0'. */
bool eof = !tmp[1];
if (*(tmp + 1) != '\n') {
*tmp = ' ';
tmp++;
} else {
/* Cut off a single reply. */
*(tmp + 1) = '\0';
if (test) {
if (qemuMonitorTestAddItem(test, NULL, singleReply) < 0)
goto error;
} else {
/* Create new mocked monitor with our greeting */
if (!(test = qemuMonitorTestNew(true, xmlopt, NULL, NULL, singleReply)))
goto error;
}
if (!eof) {
/* Move the @tmp and @singleReply. */
tmp += 2;
singleReply = tmp;
}
}
if (eof)
break;
}
if (test && qemuMonitorTestAddItem(test, NULL, singleReply) < 0)
goto error;
return test;
error:
qemuMonitorTestFree(test);
return NULL;
}
static virQEMUCapsPtr
testQemuGetCaps(char *caps)
{
virQEMUCapsPtr qemuCaps = NULL;
xmlDocPtr xml;
xmlXPathContextPtr ctxt = NULL;
ssize_t i, n;
xmlNodePtr *nodes = NULL;
if (!(xml = virXMLParseStringCtxt(caps, "(test caps)", &ctxt)))
goto error;
if ((n = virXPathNodeSet("/qemuCaps/flag", ctxt, &nodes)) < 0) {
fprintf(stderr, "failed to parse qemu capabilities flags");
goto error;
}
if (n > 0) {
if (!(qemuCaps = virQEMUCapsNew()))
goto error;
for (i = 0; i < n; i++) {
char *str = virXMLPropString(nodes[i], "name");
if (str) {
int flag = virQEMUCapsTypeFromString(str);
if (flag < 0) {
fprintf(stderr, "Unknown qemu capabilities flag %s", str);
VIR_FREE(str);
goto error;
}
VIR_FREE(str);
virQEMUCapsSet(qemuCaps, flag);
}
}
}
VIR_FREE(nodes);
xmlFreeDoc(xml);
xmlXPathFreeContext(ctxt);
return qemuCaps;
error:
VIR_FREE(nodes);
virObjectUnref(qemuCaps);
xmlFreeDoc(xml);
xmlXPathFreeContext(ctxt);
return NULL;
}
static int
testQemuCapsCompare(virQEMUCapsPtr capsProvided,
virQEMUCapsPtr capsComputed)
{
int ret = 0;
size_t i;
for (i = 0; i < QEMU_CAPS_LAST; i++) {
if (virQEMUCapsGet(capsProvided, i) &&
!virQEMUCapsGet(capsComputed, i)) {
fprintf(stderr, "Caps mismatch: capsComputed is missing %s\n",
virQEMUCapsTypeToString(i));
ret = -1;
}
if (virQEMUCapsGet(capsComputed, i) &&
!virQEMUCapsGet(capsProvided, i)) {
fprintf(stderr, "Caps mismatch: capsProvided is missing %s\n",
virQEMUCapsTypeToString(i));
ret = -1;
}
}
return ret;
}
static int
testQemuCaps(const void *opaque)
{
int ret = -1;
const testQemuDataPtr data = (const testQemuDataPtr) opaque;
char *repliesFile = NULL, *capsFile = NULL;
char *replies = NULL, *caps = NULL;
qemuMonitorTestPtr mon = NULL;
virQEMUCapsPtr capsProvided = NULL, capsComputed = NULL;
if (virAsprintf(&repliesFile, "%s/qemucapabilitiesdata/%s.replies",
abs_srcdir, data->base) < 0 ||
virAsprintf(&capsFile, "%s/qemucapabilitiesdata/%s.caps",
abs_srcdir, data->base) < 0)
goto cleanup;
if (virtTestLoadFile(repliesFile, &replies) < 0 ||
virtTestLoadFile(capsFile, &caps) < 0)
goto cleanup;
if (!(mon = testQemuFeedMonitor(replies, data->xmlopt)))
goto cleanup;
if (!(capsProvided = testQemuGetCaps(caps)))
goto cleanup;
if (!(capsComputed = virQEMUCapsNew()))
goto cleanup;
if (virQEMUCapsInitQMPMonitor(capsComputed,
qemuMonitorTestGetMonitor(mon)) < 0)
goto cleanup;
if (testQemuCapsCompare(capsProvided, capsComputed) < 0)
goto cleanup;
ret = 0;
cleanup:
VIR_FREE(repliesFile);
VIR_FREE(capsFile);
VIR_FREE(replies);
VIR_FREE(caps);
qemuMonitorTestFree(mon);
virObjectUnref(capsProvided);
virObjectUnref(capsComputed);
return ret;
}
static int
mymain(void)
{
int ret = 0;
virDomainXMLOptionPtr xmlopt;
testQemuData data;
#if !WITH_YAJL
fputs("libvirt not compiled with yajl, skipping this test\n", stderr);
return EXIT_AM_SKIP;
#endif
if (virThreadInitialize() < 0 ||
!(xmlopt = virQEMUDriverCreateXMLConf(NULL)))
return EXIT_FAILURE;
virEventRegisterDefaultImpl();
data.xmlopt = xmlopt;
#define DO_TEST(name) \
data.base = name; \
if (virtTestRun(name, 1, testQemuCaps, &data) < 0) \
ret = -1
DO_TEST("caps_1.5.3-1");
virObjectUnref(xmlopt);
return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}
VIRT_TEST_MAIN(mymain)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册