diff --git a/.gitignore b/.gitignore
index edd5d26180c178690e40573f6c7e223363f416a7..b5824dcd6a9596885f89a82cd326ad39c83c3f3a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -176,6 +176,7 @@
/tests/openvzutilstest
/tests/qemuagenttest
/tests/qemuargv2xmltest
+/tests/qemucapabilitiestest
/tests/qemuhelptest
/tests/qemuhotplugtest
/tests/qemumonitorjsontest
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 17a2a724c6a1aed628b0bcfabc30a36d6b35462f..a691f13eea89ad3b344bff728c78ec252c88664c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
diff --git a/tests/qemucapabilitiesdata/caps_1.5.3-1.caps b/tests/qemucapabilitiesdata/caps_1.5.3-1.caps
new file mode 100644
index 0000000000000000000000000000000000000000..323ac8291bba89119ebcf707d40ef14e96676ad8
--- /dev/null
+++ b/tests/qemucapabilitiesdata/caps_1.5.3-1.caps
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemucapabilitiesdata/caps_1.5.3-1.replies b/tests/qemucapabilitiesdata/caps_1.5.3-1.replies
new file mode 100644
index 0000000000000000000000000000000000000000..8ff17cea4b7a7a7795bf970378205b00a3a768f9
--- /dev/null
+++ b/tests/qemucapabilitiesdata/caps_1.5.3-1.replies
@@ -0,0 +1,2519 @@
+{
+ "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"
+}
diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c
new file mode 100644
index 0000000000000000000000000000000000000000..f6d672f496b10b833f5db5a1af6f2957c0e53e21
--- /dev/null
+++ b/tests/qemucapabilitiestest.c
@@ -0,0 +1,241 @@
+/*
+ * 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
+ * .
+ *
+ */
+
+#include
+
+#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)