[libvirt] [PATCH v7 00/11] Add support for Veritas HyperScale (VxHS) block device protocol

v6: https://www.redhat.com/archives/libvir-list/2017-August/msg00993.html Changes/notes since v6: Patch1 - Used the "right" process to create the files. There's also a separate patch on list which I used mainly to "extract" the details/needs from being associated specifically with the addition of VxHS support Patch2 - Altered the commit message slightly to note that lack of ability to actually check that even though something is introspectible, there's no "non-hacky" way to determine if the QEMU image being used was built "--enable=vxhs" *unless* (as Jeff Cody points out) we scan --help output for vxhs within the "Supported formats:" line. We're avoiding that path for many different reasons. Patch3 -> Patch5 - No change, patches ACKed. Patch6 - Removed qemuCaps from qemuBlockStorageSourceGetVxHSProps and created a qemuProcessStartValidateDisks which will run the disk list looking for NETWORK and VXHS to ensure the QEMU_CAPS_VXHS bit is set. Also added a note here similar to patch2 describing the "gotcha" with the processing. Patch7 - Altered the text of the vxhs_tls description a bit, not much Patch8 - Altered the formatdomain.html.in description a bit in order to remove the previous restriction surrounding when vxhs_tls = 0, but src->haveTLS = YES. Added a tlsFromConfig boolean to virStorageSource to match the same logic as chardev's use. Documented it's use though as every time I've read that for chardev, I've first said tlsFromConfig must mean domain config, when in fact it's meant to be qemu.conf. Make code adjustments to handle tlsFromConfig Patch9 - Altered the order here - used to be flip-flopped with subsequent patch. Create the qemuDomainPrepareDiskSource[TLS] API's in order manage the src->haveTLS setting just as we've done for chardev. Also, introduce and manage a virStorageSource "tlsAlias" field. This is where we'll "set" the alias to be used. Patch10- Fixed up the virStorageSourceParseBackingJSONVxHS and TEST_BACKING_PARSE to manage the new src->tlsAlias field. Patch11- Make this all work for qemu_command *and* qemu_hotplug - well theoretically at least. The hotplug code is new in this patch - it has essentially copied what was needed from qemuDomainAddChardevTLSObjects and applied it to the needs for disks in general, but mainly for VxHS in particular. The qemuDomainAddDiskTLSObjects also doesn't set a 'tlscreds' boolean like Chardev does since JSON object generation doesn't occur in the depths of qemu_monitor_json, but rather it occurs in qemu_block and we have everything we need there. Probably could have done the chardev code differently to keep the TLS alias around... Although I don't believe VxHS has support/need for MassUSB and SCSI Disk operations, adding the infrastructure there should be usable for future needs. I also left a note about future needs that may arise if some network disk type requires a secret to decrypt a server key (although I cannot imagine the need, someone else may have a better imagination than me). The rest of the qemu_command changes remove the qemuCaps and diskAlias parameters from the qemuBlockStorageSourceGetBackendProps API and use what's been (hopefully) properly set up during qemuDomainPrepareDiskSourceTLS. Finally former patch12 has been removed since there is no restriction regarding vxhs_tls = 0 and "tls = 'yes'"... Also former patch13 has been merged into patch11. Still to be done: Patch12 - A news.xml article for 3.8.0, but 3.7.0 isn't closed yet so I'm waiting... Testing, testing, testing, testing, testing, and more testing. Hopefully even some hotplug testing as I have absolutely no way to know if the changes I've made actually work since I don't have a Veritas enviroment set up. I leave the testing/debugging to Ashish. I do believe that patches 1-5 (e.g. everything not TLS related are reasonable and ready once 3.8.0 opens for business). Ashish Mittal (8): storage: Introduce VIR_STORAGE_NET_PROTOCOL_VXHS docs: Add schema and docs for Veritas HyperScale (VxHS) util: storage: Add JSON backing volume parse for VxHS qemu: Add qemu command line generation for a VxHS block device conf: Introduce TLS options for VxHS block device clients util: Add TLS attributes to virStorageSource util: Add virstoragetest to parse/format a tls='yes' qemu: Add TLS support for Veritas HyperScale (VxHS) John Ferlan (3): qemu: Add QEMU 2.10 x86_64 the generated capabilities qemu: Detect support for vxhs qemu: Introduce qemuDomainPrepareDiskSource docs/formatdomain.html.in | 45 +- docs/schemas/domaincommon.rng | 18 + src/conf/domain_conf.c | 28 +- src/libxl/libxl_conf.c | 1 + src/qemu/libvirtd_qemu.aug | 4 + src/qemu/qemu.conf | 34 + src/qemu/qemu_block.c | 44 + src/qemu/qemu_capabilities.c | 4 + src/qemu/qemu_capabilities.h | 3 + src/qemu/qemu_command.c | 38 + src/qemu/qemu_conf.c | 16 + src/qemu/qemu_conf.h | 3 + src/qemu/qemu_domain.c | 71 + src/qemu/qemu_domain.h | 11 + src/qemu/qemu_driver.c | 3 + src/qemu/qemu_hotplug.c | 73 + src/qemu/qemu_parse_command.c | 15 + src/qemu/qemu_process.c | 33 + src/qemu/test_libvirtd_qemu.aug.in | 2 + src/util/virstoragefile.c | 58 +- src/util/virstoragefile.h | 14 + src/xenconfig/xen_xl.c | 1 + .../caps_2.10.0.x86_64.replies | 18144 +++++++++++++++++++ tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 799 + tests/qemucapabilitiestest.c | 1 + ...-disk-drive-network-tlsx509-multidisk-vxhs.args | 43 + ...v-disk-drive-network-tlsx509-multidisk-vxhs.xml | 50 + ...muxml2argv-disk-drive-network-tlsx509-vxhs.args | 30 + ...emuxml2argv-disk-drive-network-tlsx509-vxhs.xml | 32 + .../qemuxml2argv-disk-drive-network-vxhs.args | 27 + .../qemuxml2argv-disk-drive-network-vxhs.xml | 32 + tests/qemuxml2argvtest.c | 8 + ...uxml2xmlout-disk-drive-network-tlsx509-vxhs.xml | 34 + .../qemuxml2xmlout-disk-drive-network-vxhs.xml | 34 + tests/qemuxml2xmltest.c | 2 + tests/virstoragetest.c | 23 + 36 files changed, 19766 insertions(+), 12 deletions(-) create mode 100644 tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies create mode 100644 tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-tlsx509-vxhs.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-vxhs.xml -- 2.9.5

For reference, these were generated by updating a local qemu git repository to the latest upstream, making sure the latest dependencies were met via "dnf builddep qemu" from my sufficiently privileged root account, checking out the v2.10.0 tag, and building in order to generate an "x86_64-softmmu/qemu-system-x86_64" image. Then using a clean libvirt tree updated to master and built, the image was then provided as input: tests/qemucapsprobe /path/to/x86_64-softmmu/qemu-system-x86_64 > \ tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies With the .replies file in place and the DO_TEST line added and build, then running the following commands: touch tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml VIR_TEST_REGENERATE_OUTPUT=1 ./tests/qemucapabilitiestest to generate tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml and both were added to the commit. Signed-off-by: John Ferlan <jferlan@redhat.com> --- .../caps_2.10.0.x86_64.replies | 18144 +++++++++++++++++++ tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 798 + tests/qemucapabilitiestest.c | 1 + 3 files changed, 18943 insertions(+) create mode 100644 tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies create mode 100644 tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies new file mode 100644 index 0000000..5ddaa03 --- /dev/null +++ b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies @@ -0,0 +1,18144 @@ +{ + "QMP": { + "version": { + "qemu": { + "micro": 0, + "minor": 10, + "major": 2 + }, + "package": " (v2.10.0)" + }, + "capabilities": [ + ] + } +} + +{ + "return": { + }, + "id": "libvirt-1" +} + +{ + "return": { + "qemu": { + "micro": 0, + "minor": 10, + "major": 2 + }, + "package": " (v2.10.0)" + }, + "id": "libvirt-2" +} + +{ + "return": { + "arch": "x86_64" + }, + "id": "libvirt-3" +} + +{ + "return": [ + { + "name": "netdev_add" + }, + { + "name": "device_add" + }, + { + "name": "query-qmp-schema" + }, + { + "name": "xen-set-replication" + }, + { + "name": "xen-set-global-dirty-log" + }, + { + "name": "xen-save-devices-state" + }, + { + "name": "xen-load-devices-state" + }, + { + "name": "xen-colo-do-checkpoint" + }, + { + "name": "x-debug-block-dirty-bitmap-sha256" + }, + { + "name": "x-colo-lost-heartbeat" + }, + { + "name": "x-blockdev-remove-medium" + }, + { + "name": "x-blockdev-insert-medium" + }, + { + "name": "x-blockdev-change" + }, + { + "name": "transaction" + }, + { + "name": "trace-event-set-state" + }, + { + "name": "trace-event-get-state" + }, + { + "name": "system_wakeup" + }, + { + "name": "system_reset" + }, + { + "name": "system_powerdown" + }, + { + "name": "stop" + }, + { + "name": "set_password" + }, + { + "name": "set_link" + }, + { + "name": "send-key" + }, + { + "name": "screendump" + }, + { + "name": "rtc-reset-reinjection" + }, + { + "name": "ringbuf-write" + }, + { + "name": "ringbuf-read" + }, + { + "name": "remove-fd" + }, + { + "name": "quit" + }, + { + "name": "query-xen-replication-status" + }, + { + "name": "query-vnc-servers" + }, + { + "name": "query-vnc" + }, + { + "name": "query-vm-generation-id" + }, + { + "name": "query-version" + }, + { + "name": "query-uuid" + }, + { + "name": "query-tpm-types" + }, + { + "name": "query-tpm-models" + }, + { + "name": "query-tpm" + }, + { + "name": "query-target" + }, + { + "name": "query-status" + }, + { + "name": "query-spice" + }, + { + "name": "query-rx-filter" + }, + { + "name": "query-rocker-ports" + }, + { + "name": "query-rocker-of-dpa-groups" + }, + { + "name": "query-rocker-of-dpa-flows" + }, + { + "name": "query-rocker" + }, + { + "name": "query-pci" + }, + { + "name": "query-named-block-nodes" + }, + { + "name": "query-name" + }, + { + "name": "query-migrate-parameters" + }, + { + "name": "query-migrate-capabilities" + }, + { + "name": "query-migrate-cache-size" + }, + { + "name": "query-migrate" + }, + { + "name": "query-mice" + }, + { + "name": "query-memory-devices" + }, + { + "name": "query-memdev" + }, + { + "name": "query-machines" + }, + { + "name": "query-kvm" + }, + { + "name": "query-iothreads" + }, + { + "name": "query-hotpluggable-cpus" + }, + { + "name": "query-fdsets" + }, + { + "name": "query-events" + }, + { + "name": "query-dump-guest-memory-capability" + }, + { + "name": "query-dump" + }, + { + "name": "query-cpus" + }, + { + "name": "query-cpu-model-expansion" + }, + { + "name": "query-cpu-definitions" + }, + { + "name": "query-commands" + }, + { + "name": "query-command-line-options" + }, + { + "name": "query-chardev-backends" + }, + { + "name": "query-chardev" + }, + { + "name": "query-blockstats" + }, + { + "name": "query-block-jobs" + }, + { + "name": "query-block" + }, + { + "name": "query-balloon" + }, + { + "name": "query-acpi-ospm-status" + }, + { + "name": "qom-set" + }, + { + "name": "qom-list-types" + }, + { + "name": "qom-list" + }, + { + "name": "qom-get" + }, + { + "name": "qmp_capabilities" + }, + { + "name": "pmemsave" + }, + { + "name": "object-del" + }, + { + "name": "object-add" + }, + { + "name": "netdev_del" + }, + { + "name": "nbd-server-stop" + }, + { + "name": "nbd-server-start" + }, + { + "name": "nbd-server-add" + }, + { + "name": "migrate_set_speed" + }, + { + "name": "migrate_set_downtime" + }, + { + "name": "migrate_cancel" + }, + { + "name": "migrate-start-postcopy" + }, + { + "name": "migrate-set-parameters" + }, + { + "name": "migrate-set-capabilities" + }, + { + "name": "migrate-set-cache-size" + }, + { + "name": "migrate-incoming" + }, + { + "name": "migrate" + }, + { + "name": "memsave" + }, + { + "name": "input-send-event" + }, + { + "name": "inject-nmi" + }, + { + "name": "human-monitor-command" + }, + { + "name": "getfd" + }, + { + "name": "expire_password" + }, + { + "name": "eject" + }, + { + "name": "dump-guest-memory" + }, + { + "name": "drive-mirror" + }, + { + "name": "drive-backup" + }, + { + "name": "device_del" + }, + { + "name": "device-list-properties" + }, + { + "name": "cpu-add" + }, + { + "name": "cpu" + }, + { + "name": "cont" + }, + { + "name": "closefd" + }, + { + "name": "client_migrate_info" + }, + { + "name": "chardev-send-break" + }, + { + "name": "chardev-remove" + }, + { + "name": "chardev-change" + }, + { + "name": "chardev-add" + }, + { + "name": "change-vnc-password" + }, + { + "name": "change-backing-file" + }, + { + "name": "change" + }, + { + "name": "blockdev-snapshot-sync" + }, + { + "name": "blockdev-snapshot-internal-sync" + }, + { + "name": "blockdev-snapshot-delete-internal-sync" + }, + { + "name": "blockdev-snapshot" + }, + { + "name": "blockdev-open-tray" + }, + { + "name": "blockdev-mirror" + }, + { + "name": "blockdev-del" + }, + { + "name": "blockdev-close-tray" + }, + { + "name": "blockdev-change-medium" + }, + { + "name": "blockdev-backup" + }, + { + "name": "blockdev-add" + }, + { + "name": "block_set_io_throttle" + }, + { + "name": "block_resize" + }, + { + "name": "block_passwd" + }, + { + "name": "block-stream" + }, + { + "name": "block-set-write-threshold" + }, + { + "name": "block-job-set-speed" + }, + { + "name": "block-job-resume" + }, + { + "name": "block-job-pause" + }, + { + "name": "block-job-complete" + }, + { + "name": "block-job-cancel" + }, + { + "name": "block-dirty-bitmap-remove" + }, + { + "name": "block-dirty-bitmap-clear" + }, + { + "name": "block-dirty-bitmap-add" + }, + { + "name": "block-commit" + }, + { + "name": "balloon" + }, + { + "name": "add_client" + }, + { + "name": "add-fd" + } + ], + "id": "libvirt-4" +} + +{ + "return": { + "fd": 15, + "fdset-id": 0 + }, + "id": "libvirt-5" +} + +{ + "id": "libvirt-6", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'bogus' not found" + } +} + +{ + "return": { + "enabled": true, + "present": true + }, + "id": "libvirt-7" +} + +{ + "return": [ + { + "name": "WATCHDOG" + }, + { + "name": "WAKEUP" + }, + { + "name": "VSERPORT_CHANGE" + }, + { + "name": "VNC_INITIALIZED" + }, + { + "name": "VNC_DISCONNECTED" + }, + { + "name": "VNC_CONNECTED" + }, + { + "name": "SUSPEND_DISK" + }, + { + "name": "SUSPEND" + }, + { + "name": "STOP" + }, + { + "name": "SPICE_MIGRATE_COMPLETED" + }, + { + "name": "SPICE_INITIALIZED" + }, + { + "name": "SPICE_DISCONNECTED" + }, + { + "name": "SPICE_CONNECTED" + }, + { + "name": "SHUTDOWN" + }, + { + "name": "RTC_CHANGE" + }, + { + "name": "RESUME" + }, + { + "name": "RESET" + }, + { + "name": "QUORUM_REPORT_BAD" + }, + { + "name": "QUORUM_FAILURE" + }, + { + "name": "POWERDOWN" + }, + { + "name": "NIC_RX_FILTER_CHANGED" + }, + { + "name": "MIGRATION_PASS" + }, + { + "name": "MIGRATION" + }, + { + "name": "MEM_UNPLUG_ERROR" + }, + { + "name": "GUEST_PANICKED" + }, + { + "name": "DUMP_COMPLETED" + }, + { + "name": "DEVICE_TRAY_MOVED" + }, + { + "name": "DEVICE_DELETED" + }, + { + "name": "BLOCK_WRITE_THRESHOLD" + }, + { + "name": "BLOCK_JOB_READY" + }, + { + "name": "BLOCK_JOB_ERROR" + }, + { + "name": "BLOCK_JOB_COMPLETED" + }, + { + "name": "BLOCK_JOB_CANCELLED" + }, + { + "name": "BLOCK_IO_ERROR" + }, + { + "name": "BLOCK_IMAGE_CORRUPTED" + }, + { + "name": "BALLOON_CHANGE" + }, + { + "name": "ACPI_DEVICE_OST" + } + ], + "id": "libvirt-8" +} + +{ + "return": [ + { + "name": "vhost-vsock-pci", + "parent": "virtio-pci" + }, + { + "name": "xen-sysdev", + "parent": "sys-bus-device" + }, + { + "name": "pc-q35-2.10-machine", + "parent": "generic-pc-machine" + }, + { + "name": "generic-sdhci", + "parent": "sys-bus-device" + }, + { + "name": "pc-0.13-machine", + "parent": "generic-pc-machine" + }, + { + "name": "cfi.pflash01", + "parent": "sys-bus-device" + }, + { + "name": "i82551", + "parent": "pci-device" + }, + { + "name": "i82550", + "parent": "pci-device" + }, + { + "name": "Westmere-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "pci-serial-4x", + "parent": "pci-device" + }, + { + "name": "cryptodev-backend", + "parent": "object" + }, + { + "name": "Penryn-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "Haswell-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "iothread", + "parent": "object" + }, + { + "name": "pc-i440fx-2.9-machine", + "parent": "generic-pc-machine" + }, + { + "name": "Skylake-Client-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "virtio-gpu-device", + "parent": "virtio-device" + }, + { + "name": "Opteron_G3-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "floppy-bus", + "parent": "bus" + }, + { + "name": "e1000e", + "parent": "pci-device" + }, + { + "name": "Broadwell-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "piix3-ide", + "parent": "pci-ide" + }, + { + "name": "secret", + "parent": "object" + }, + { + "name": "amd-iommu-iommu-memory-region", + "parent": "qemu:iommu-memory-region" + }, + { + "name": "base-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "isa-parallel", + "parent": "isa-device" + }, + { + "name": "megasas", + "parent": "megasas-base" + }, + { + "name": "i2c-bus", + "parent": "bus" + }, + { + "name": "pc-q35-2.4-machine", + "parent": "generic-pc-machine" + }, + { + "name": "vhost-vsock-device", + "parent": "virtio-device" + }, + { + "name": "usb-braille", + "parent": "usb-serial-dev" + }, + { + "name": "mptsas1068", + "parent": "pci-device" + }, + { + "name": "vmware-svga", + "parent": "pci-device" + }, + { + "name": "qio-channel-tls", + "parent": "qio-channel" + }, + { + "name": "filter-buffer", + "parent": "netfilter" + }, + { + "name": "PIIX3-xen", + "parent": "pci-piix3" + }, + { + "name": "ccid-bus", + "parent": "bus" + }, + { + "name": "scsi-cd", + "parent": "scsi-disk-base" + }, + { + "name": "pc-i440fx-2.0-machine", + "parent": "generic-pc-machine" + }, + { + "name": "isa-serial", + "parent": "isa-device" + }, + { + "name": "usb-ehci", + "parent": "pci-ehci-usb" + }, + { + "name": "container", + "parent": "object" + }, + { + "name": "qio-channel-rdma", + "parent": "qio-channel" + }, + { + "name": "chardev-null", + "parent": "chardev" + }, + { + "name": "host-x86_64-cpu", + "parent": "max-x86_64-cpu" + }, + { + "name": "qemu64-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "pci-serial-2x", + "parent": "pci-device" + }, + { + "name": "piix4-ide", + "parent": "pci-ide" + }, + { + "name": "scsi-generic", + "parent": "scsi-device" + }, + { + "name": "isa-ipmi-bt", + "parent": "isa-device" + }, + { + "name": "pc-1.0-machine", + "parent": "generic-pc-machine" + }, + { + "name": "virtio-net-pci", + "parent": "virtio-pci" + }, + { + "name": "hyperv-testdev", + "parent": "isa-device" + }, + { + "name": "pc-dimm", + "parent": "device" + }, + { + "name": "pc-q35-2.8-machine", + "parent": "generic-pc-machine" + }, + { + "name": "Haswell-noTSX-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "pc-i440fx-2.1-machine", + "parent": "generic-pc-machine" + }, + { + "name": "virtio-mouse-pci", + "parent": "virtio-input-hid-pci" + }, + { + "name": "virtio-mouse-device", + "parent": "virtio-input-hid-device" + }, + { + "name": "isa-debugcon", + "parent": "isa-device" + }, + { + "name": "intel-iommu-iommu-memory-region", + "parent": "qemu:iommu-memory-region" + }, + { + "name": "AMDVI-PCI", + "parent": "pci-device" + }, + { + "name": "ide-hd", + "parent": "ide-device" + }, + { + "name": "virtio-vga", + "parent": "virtio-pci" + }, + { + "name": "rng-egd", + "parent": "rng-backend" + }, + { + "name": "isa-pcspk", + "parent": "isa-device" + }, + { + "name": "isa-pit", + "parent": "pit-common" + }, + { + "name": "pc-1.1-machine", + "parent": "generic-pc-machine" + }, + { + "name": "ich9-usb-ehci2", + "parent": "pci-ehci-usb" + }, + { + "name": "ich9-usb-ehci1", + "parent": "pci-ehci-usb" + }, + { + "name": "pxb-host", + "parent": "pci-host-bridge" + }, + { + "name": "pc-q35-2.9-machine", + "parent": "generic-pc-machine" + }, + { + "name": "intel-iommu", + "parent": "x86-iommu" + }, + { + "name": "irq", + "parent": "object" + }, + { + "name": "qio-dns-resolver", + "parent": "object" + }, + { + "name": "ipmi-bmc-sim", + "parent": "ipmi-bmc" + }, + { + "name": "cirrus-vga", + "parent": "pci-device" + }, + { + "name": "virtconsole", + "parent": "virtserialport" + }, + { + "name": "chardev-serial", + "parent": "chardev-fd" + }, + { + "name": "virtio-rng-pci", + "parent": "virtio-pci" + }, + { + "name": "PCIE", + "parent": "PCI" + }, + { + "name": "qio-channel-buffer", + "parent": "qio-channel" + }, + { + "name": "chardev-pty", + "parent": "chardev" + }, + { + "name": "qio-channel-file", + "parent": "qio-channel" + }, + { + "name": "pentium3-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "qxl-vga", + "parent": "pci-qxl" + }, + { + "name": "xen-sysbus", + "parent": "bus" + }, + { + "name": "ioapic", + "parent": "ioapic-common" + }, + { + "name": "kvm-pit", + "parent": "pit-common" + }, + { + "name": "chardev-memory", + "parent": "chardev-ringbuf" + }, + { + "name": "pc-i440fx-2.5-machine", + "parent": "generic-pc-machine" + }, + { + "name": "filter-rewriter", + "parent": "netfilter" + }, + { + "name": "pcie-root-port", + "parent": "pcie-root-port-base" + }, + { + "name": "vhost-scsi-pci", + "parent": "virtio-pci" + }, + { + "name": "usb-kbd", + "parent": "usb-hid" + }, + { + "name": "usb-host", + "parent": "usb-device" + }, + { + "name": "xen-apic", + "parent": "apic-common" + }, + { + "name": "usb-ccid", + "parent": "usb-device" + }, + { + "name": "usb-bus", + "parent": "bus" + }, + { + "name": "Skylake-Server-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "pc-i440fx-1.4-machine", + "parent": "generic-pc-machine" + }, + { + "name": "PIIX3", + "parent": "pci-piix3" + }, + { + "name": "486-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "ES1370", + "parent": "pci-device" + }, + { + "name": "gus", + "parent": "isa-device" + }, + { + "name": "kvm-pci-assign", + "parent": "pci-device" + }, + { + "name": "isa-applesmc", + "parent": "isa-device" + }, + { + "name": "pc-i440fx-2.6-machine", + "parent": "generic-pc-machine" + }, + { + "name": "xen-pci-passthrough", + "parent": "pci-device" + }, + { + "name": "i82559er", + "parent": "pci-device" + }, + { + "name": "q35-pcihost", + "parent": "pcie-host-bridge" + }, + { + "name": "usb-bt-dongle", + "parent": "usb-device" + }, + { + "name": "e1000-82545em", + "parent": "e1000-base" + }, + { + "name": "e1000-82544gc", + "parent": "e1000-base" + }, + { + "name": "i6300esb", + "parent": "pci-device" + }, + { + "name": "pc-i440fx-1.5-machine", + "parent": "generic-pc-machine" + }, + { + "name": "tls-creds-x509", + "parent": "tls-creds" + }, + { + "name": "or-irq", + "parent": "device" + }, + { + "name": "pc-0.14-machine", + "parent": "generic-pc-machine" + }, + { + "name": "mc146818rtc", + "parent": "isa-device" + }, + { + "name": "AC97", + "parent": "pci-device" + }, + { + "name": "PIIX4_PM", + "parent": "pci-device" + }, + { + "name": "piix4-usb-uhci", + "parent": "pci-uhci-usb" + }, + { + "name": "sysbus-ahci", + "parent": "sys-bus-device" + }, + { + "name": "virtio-tablet-device", + "parent": "virtio-input-hid-device" + }, + { + "name": "filter-redirector", + "parent": "netfilter" + }, + { + "name": "kvm-ioapic", + "parent": "ioapic-common" + }, + { + "name": "chardev-pipe", + "parent": "chardev-fd" + }, + { + "name": "unimplemented-device", + "parent": "sys-bus-device" + }, + { + "name": "pvpanic", + "parent": "isa-device" + }, + { + "name": "core2duo-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "qio-channel-command", + "parent": "qio-channel" + }, + { + "name": "virtio-9p-pci", + "parent": "virtio-pci" + }, + { + "name": "scsi-disk", + "parent": "scsi-disk-base" + }, + { + "name": "vfio-pci-igd-lpc-bridge", + "parent": "pci-device" + }, + { + "name": "chardev-ringbuf", + "parent": "chardev" + }, + { + "name": "sb16", + "parent": "isa-device" + }, + { + "name": "chardev-socket", + "parent": "chardev" + }, + { + "name": "qemu-console", + "parent": "object" + }, + { + "name": "pc-0.15-machine", + "parent": "generic-pc-machine" + }, + { + "name": "filter-replay", + "parent": "netfilter" + }, + { + "name": "usb-mouse", + "parent": "usb-hid" + }, + { + "name": "virtio-blk-pci", + "parent": "virtio-pci" + }, + { + "name": "xenfv-machine", + "parent": "generic-pc-machine" + }, + { + "name": "filter-dump", + "parent": "netfilter" + }, + { + "name": "virtio-keyboard-pci", + "parent": "virtio-input-hid-pci" + }, + { + "name": "chardev-stdio", + "parent": "chardev-fd" + }, + { + "name": "piix3-usb-uhci", + "parent": "pci-uhci-usb" + }, + { + "name": "virtio-scsi-device", + "parent": "virtio-scsi-common" + }, + { + "name": "tpci200", + "parent": "pci-device" + }, + { + "name": "chardev-file", + "parent": "chardev-fd" + }, + { + "name": "virtio-9p-device", + "parent": "virtio-device" + }, + { + "name": "pc-q35-2.5-machine", + "parent": "generic-pc-machine" + }, + { + "name": "SUNW,fdtwo", + "parent": "base-sysbus-fdc" + }, + { + "name": "hda-output", + "parent": "hda-audio" + }, + { + "name": "i8257", + "parent": "isa-device" + }, + { + "name": "filter-mirror", + "parent": "netfilter" + }, + { + "name": "Opteron_G4-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "virtio-mmio", + "parent": "sys-bus-device" + }, + { + "name": "vhost-user-scsi", + "parent": "vhost-scsi-common" + }, + { + "name": "isa-i8259", + "parent": "pic-common" + }, + { + "name": "System", + "parent": "bus" + }, + { + "name": "pvscsi", + "parent": "pci-device" + }, + { + "name": "amd-iommu", + "parent": "x86-iommu" + }, + { + "name": "virtio-net-device", + "parent": "virtio-device" + }, + { + "name": "input-linux", + "parent": "object" + }, + { + "name": "colo-compare", + "parent": "object" + }, + { + "name": "sd-bus", + "parent": "bus" + }, + { + "name": "xen-accel", + "parent": "accel" + }, + { + "name": "usb-hub", + "parent": "usb-device" + }, + { + "name": "chardev-testdev", + "parent": "chardev" + }, + { + "name": "IvyBridge-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "hda-duplex", + "parent": "hda-audio" + }, + { + "name": "igd-passthrough-i440FX", + "parent": "i440FX" + }, + { + "name": "ccid-card-passthru", + "parent": "ccid-card" + }, + { + "name": "chardev-hci", + "parent": "chardev" + }, + { + "name": "igd-passthrough-isa-bridge", + "parent": "pci-device" + }, + { + "name": "rocker", + "parent": "pci-device" + }, + { + "name": "nec-usb-xhci", + "parent": "base-xhci" + }, + { + "name": "megasas-gen2", + "parent": "megasas-base" + }, + { + "name": "pci-ohci", + "parent": "pci-device" + }, + { + "name": "ib700", + "parent": "isa-device" + }, + { + "name": "xio3130-downstream", + "parent": "pcie-slot" + }, + { + "name": "chardev-vc", + "parent": "chardev" + }, + { + "name": "isapc-machine", + "parent": "generic-pc-machine" + }, + { + "name": "ipoctal232", + "parent": "ipack-device" + }, + { + "name": "ide-cd", + "parent": "ide-device" + }, + { + "name": "tls-creds-anon", + "parent": "tls-creds" + }, + { + "name": "pc-i440fx-2.2-machine", + "parent": "generic-pc-machine" + }, + { + "name": "isabus-bridge", + "parent": "sys-bus-device" + }, + { + "name": "isa-ipmi-kcs", + "parent": "isa-device" + }, + { + "name": "memory-backend-file", + "parent": "memory-backend" + }, + { + "name": "virtio-crypto-pci", + "parent": "virtio-pci" + }, + { + "name": "qemu:memory-region", + "parent": "object" + }, + { + "name": "isa-vga", + "parent": "isa-device" + }, + { + "name": "isa-ide", + "parent": "isa-device" + }, + { + "name": "virtio-keyboard-device", + "parent": "virtio-input-hid-device" + }, + { + "name": "ipmi-bmc-extern", + "parent": "ipmi-bmc" + }, + { + "name": "rng-random", + "parent": "rng-backend" + }, + { + "name": "kvm-i8259", + "parent": "pic-common" + }, + { + "name": "i440FX-pcihost", + "parent": "pci-host-bridge" + }, + { + "name": "sga", + "parent": "isa-device" + }, + { + "name": "tpm-tis", + "parent": "isa-device" + }, + { + "name": "tpm-passthrough", + "parent": "tpm-backend" + }, + { + "name": "pc-1.2-machine", + "parent": "generic-pc-machine" + }, + { + "name": "isa-debug-exit", + "parent": "isa-device" + }, + { + "name": "Opteron_G1-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "pc-testdev", + "parent": "isa-device" + }, + { + "name": "pc-0.10-machine", + "parent": "generic-pc-machine" + }, + { + "name": "pc-i440fx-2.3-machine", + "parent": "generic-pc-machine" + }, + { + "name": "xen-pvdevice", + "parent": "pci-device" + }, + { + "name": "qemu32-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "pcnet", + "parent": "pci-device" + }, + { + "name": "apic", + "parent": "apic-common" + }, + { + "name": "ivshmem", + "parent": "ivshmem-common" + }, + { + "name": "ich9-usb-uhci2", + "parent": "pci-uhci-usb" + }, + { + "name": "hpet", + "parent": "sys-bus-device" + }, + { + "name": "adlib", + "parent": "isa-device" + }, + { + "name": "chardev-gdb", + "parent": "chardev" + }, + { + "name": "virtio-pci-bus", + "parent": "virtio-bus" + }, + { + "name": "vhost-user-scsi-pci", + "parent": "virtio-pci" + }, + { + "name": "lsi53c895a", + "parent": "pci-device" + }, + { + "name": "usb-audio", + "parent": "usb-device" + }, + { + "name": "chardev-udp", + "parent": "chardev" + }, + { + "name": "chardev-mux", + "parent": "chardev" + }, + { + "name": "pxb-bus", + "parent": "PCI" + }, + { + "name": "dc390", + "parent": "am53c974" + }, + { + "name": "usb-wacom-tablet", + "parent": "usb-device" + }, + { + "name": "virtio-mmio-bus", + "parent": "virtio-bus" + }, + { + "name": "pc-0.11-machine", + "parent": "generic-pc-machine" + }, + { + "name": "kvm-apic", + "parent": "apic-common" + }, + { + "name": "phenom-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "fw_cfg_io", + "parent": "fw_cfg" + }, + { + "name": "usb-net", + "parent": "usb-device" + }, + { + "name": "ioh3420", + "parent": "pcie-root-port-base" + }, + { + "name": "virtio-crypto-device", + "parent": "virtio-device" + }, + { + "name": "cs4231a", + "parent": "isa-device" + }, + { + "name": "chardev-braille", + "parent": "chardev" + }, + { + "name": "nvme", + "parent": "pci-device" + }, + { + "name": "chardev-wctablet", + "parent": "chardev" + }, + { + "name": "i82801b11-bridge", + "parent": "base-pci-bridge" + }, + { + "name": "kvmvapic", + "parent": "sys-bus-device" + }, + { + "name": "usb-tablet", + "parent": "usb-hid" + }, + { + "name": "pc-i440fx-2.10-machine", + "parent": "generic-pc-machine" + }, + { + "name": "sdhci-bus", + "parent": "sd-bus" + }, + { + "name": "pci-bridge-seat", + "parent": "pci-bridge" + }, + { + "name": "mch", + "parent": "pci-device" + }, + { + "name": "pc-i440fx-2.7-machine", + "parent": "generic-pc-machine" + }, + { + "name": "vhost-scsi", + "parent": "vhost-scsi-common" + }, + { + "name": "virtio-balloon-pci", + "parent": "virtio-pci" + }, + { + "name": "tcg-accel", + "parent": "accel" + }, + { + "name": "usb-bot", + "parent": "usb-storage-dev" + }, + { + "name": "mmio_interface", + "parent": "device" + }, + { + "name": "esp", + "parent": "sys-bus-device" + }, + { + "name": "ICH9-LPC", + "parent": "pci-device" + }, + { + "name": "edu", + "parent": "pci-device" + }, + { + "name": "accel", + "parent": "object" + }, + { + "name": "isa-cirrus-vga", + "parent": "isa-device" + }, + { + "name": "pxb-pcie-bus", + "parent": "PCIE" + }, + { + "name": "pc-i440fx-1.6-machine", + "parent": "generic-pc-machine" + }, + { + "name": "lsi53c810", + "parent": "lsi53c895a" + }, + { + "name": "kvmclock", + "parent": "sys-bus-device" + }, + { + "name": "loader", + "parent": "device" + }, + { + "name": "migration", + "parent": "device" + }, + { + "name": "pc-i440fx-2.8-machine", + "parent": "generic-pc-machine" + }, + { + "name": "ich9-usb-uhci4", + "parent": "pci-uhci-usb" + }, + { + "name": "virtio-serial-bus", + "parent": "bus" + }, + { + "name": "nvdimm", + "parent": "pc-dimm" + }, + { + "name": "x3130-upstream", + "parent": "pcie-port" + }, + { + "name": "ich9-usb-uhci6", + "parent": "pci-uhci-usb" + }, + { + "name": "SandyBridge-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "chardev-spiceport", + "parent": "chardev-spice" + }, + { + "name": "virtio-balloon-device", + "parent": "virtio-device" + }, + { + "name": "qxl", + "parent": "pci-qxl" + }, + { + "name": "chardev-spicevmc", + "parent": "chardev-spice" + }, + { + "name": "intel-hda", + "parent": "intel-hda-generic" + }, + { + "name": "pc-i440fx-1.7-machine", + "parent": "generic-pc-machine" + }, + { + "name": "max-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "virtio-serial-device", + "parent": "virtio-device" + }, + { + "name": "ich9-usb-uhci3", + "parent": "pci-uhci-usb" + }, + { + "name": "ICH9 SMB", + "parent": "pci-device" + }, + { + "name": "ich9-usb-uhci5", + "parent": "pci-uhci-usb" + }, + { + "name": "pxb-pcie", + "parent": "pci-device" + }, + { + "name": "piix3-ide-xen", + "parent": "pci-ide" + }, + { + "name": "virtio-input-host-device", + "parent": "virtio-input-device" + }, + { + "name": "vmxnet3", + "parent": "pci-device" + }, + { + "name": "IDE", + "parent": "bus" + }, + { + "name": "VGA", + "parent": "pci-vga" + }, + { + "name": "pci-testdev", + "parent": "pci-device" + }, + { + "name": "ich9-usb-uhci1", + "parent": "pci-uhci-usb" + }, + { + "name": "xenpv-machine", + "parent": "machine" + }, + { + "name": "pci-bridge", + "parent": "base-pci-bridge" + }, + { + "name": "SCSI", + "parent": "bus" + }, + { + "name": "none-machine", + "parent": "machine" + }, + { + "name": "sysbus-fdc", + "parent": "base-sysbus-fdc" + }, + { + "name": "allwinner-ahci", + "parent": "sysbus-ahci" + }, + { + "name": "n270-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "pci-serial", + "parent": "pci-device" + }, + { + "name": "pc-q35-2.6-machine", + "parent": "generic-pc-machine" + }, + { + "name": "athlon-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "virtio-rng-device", + "parent": "virtio-device" + }, + { + "name": "ccid-card-emulated", + "parent": "ccid-card" + }, + { + "name": "am53c974", + "parent": "pci-device" + }, + { + "name": "ISA", + "parent": "bus" + }, + { + "name": "i8042", + "parent": "isa-device" + }, + { + "name": "kvm-accel", + "parent": "accel" + }, + { + "name": "i82559c", + "parent": "pci-device" + }, + { + "name": "floppy", + "parent": "device" + }, + { + "name": "i82559b", + "parent": "pci-device" + }, + { + "name": "i82559a", + "parent": "pci-device" + }, + { + "name": "scsi-hd", + "parent": "scsi-disk-base" + }, + { + "name": "qtest-accel", + "parent": "accel" + }, + { + "name": "virtio-scsi-pci", + "parent": "virtio-pci" + }, + { + "name": "hda-micro", + "parent": "hda-audio" + }, + { + "name": "scsi-block", + "parent": "scsi-disk-base" + }, + { + "name": "ich9-intel-hda", + "parent": "intel-hda-generic" + }, + { + "name": "rtl8139", + "parent": "pci-device" + }, + { + "name": "vmmouse", + "parent": "isa-device" + }, + { + "name": "pc-q35-2.7-machine", + "parent": "generic-pc-machine" + }, + { + "name": "usb-mtp", + "parent": "usb-device" + }, + { + "name": "ide-drive", + "parent": "ide-device" + }, + { + "name": "qio-channel-websock", + "parent": "qio-channel" + }, + { + "name": "fw_cfg_mem", + "parent": "fw_cfg" + }, + { + "name": "PCI", + "parent": "bus" + }, + { + "name": "Opteron_G5-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "vmport", + "parent": "isa-device" + }, + { + "name": "coreduo-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "xen-backend", + "parent": "xen-sysdev" + }, + { + "name": "usb-redir", + "parent": "usb-device" + }, + { + "name": "virtio-serial-pci", + "parent": "virtio-pci" + }, + { + "name": "xen-platform", + "parent": "pci-device" + }, + { + "name": "virtio-input-host-pci", + "parent": "virtio-input-pci" + }, + { + "name": "pentium2-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "i82558b", + "parent": "pci-device" + }, + { + "name": "cryptodev-backend-builtin", + "parent": "cryptodev-backend" + }, + { + "name": "i82558a", + "parent": "pci-device" + }, + { + "name": "qemu,register", + "parent": "device" + }, + { + "name": "ne2k_isa", + "parent": "isa-device" + }, + { + "name": "sdhci-pci", + "parent": "pci-device" + }, + { + "name": "chardev-parallel", + "parent": "chardev" + }, + { + "name": "qemu-xhci", + "parent": "base-xhci" + }, + { + "name": "pxb", + "parent": "pci-device" + }, + { + "name": "port92", + "parent": "isa-device" + }, + { + "name": "e1000", + "parent": "e1000-base" + }, + { + "name": "Conroe-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "kvm64-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "usb-storage", + "parent": "usb-storage-dev" + }, + { + "name": "vt82c686b-usb-uhci", + "parent": "pci-uhci-usb" + }, + { + "name": "HDA", + "parent": "bus" + }, + { + "name": "vmgenid", + "parent": "device" + }, + { + "name": "pc-1.3-machine", + "parent": "generic-pc-machine" + }, + { + "name": "usb-serial", + "parent": "usb-serial-dev" + }, + { + "name": "i82801", + "parent": "pci-device" + }, + { + "name": "sysbus-ohci", + "parent": "sys-bus-device" + }, + { + "name": "chardev-msmouse", + "parent": "chardev" + }, + { + "name": "pc-i440fx-2.4-machine", + "parent": "generic-pc-machine" + }, + { + "name": "i82557b", + "parent": "pci-device" + }, + { + "name": "usb-uas", + "parent": "usb-device" + }, + { + "name": "Broadwell-noTSX-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "i82557c", + "parent": "pci-device" + }, + { + "name": "Nehalem-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "memory-backend-ram", + "parent": "memory-backend" + }, + { + "name": "i82557a", + "parent": "pci-device" + }, + { + "name": "virtserialport", + "parent": "virtio-serial-port" + }, + { + "name": "i440FX", + "parent": "pci-device" + }, + { + "name": "ne2k_pci", + "parent": "pci-device" + }, + { + "name": "smbus-eeprom", + "parent": "smbus-device" + }, + { + "name": "i82562", + "parent": "pci-device" + }, + { + "name": "ich9-ahci", + "parent": "pci-device" + }, + { + "name": "isa-fdc", + "parent": "isa-device" + }, + { + "name": "sd-card", + "parent": "device" + }, + { + "name": "pc-0.12-machine", + "parent": "generic-pc-machine" + }, + { + "name": "kvm32-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "Opteron_G2-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "vfio-pci", + "parent": "pci-device" + }, + { + "name": "IndustryPack", + "parent": "bus" + }, + { + "name": "virtio-gpu-pci", + "parent": "virtio-pci" + }, + { + "name": "ivshmem-plain", + "parent": "ivshmem-common" + }, + { + "name": "secondary-vga", + "parent": "pci-vga" + }, + { + "name": "ivshmem-doorbell", + "parent": "ivshmem-common" + }, + { + "name": "qio-channel-socket", + "parent": "qio-channel" + }, + { + "name": "pentium-x86_64-cpu", + "parent": "x86_64-cpu" + }, + { + "name": "virtio-blk-device", + "parent": "virtio-device" + }, + { + "name": "virtio-tablet-pci", + "parent": "virtio-input-hid-pci" + } + ], + "id": "libvirt-9" +} + +{ + "return": [ + { + "name": "secs", + "type": "uint32" + }, + { + "name": "request-merging", + "description": "on/off", + "type": "bool" + }, + { + "name": "min_io_size", + "type": "uint16" + }, + { + "name": "event_idx", + "description": "on/off", + "type": "bool" + }, + { + "name": "serial", + "type": "str" + }, + { + "name": "heads", + "type": "uint32" + }, + { + "name": "ioeventfd", + "description": "on/off", + "type": "bool" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "scsi", + "description": "on/off", + "type": "bool" + }, + { + "name": "cyls", + "type": "uint32" + }, + { + "name": "x-disable-pcie", + "description": "on/off", + "type": "bool" + }, + { + "name": "logical_block_size", + "description": "A power of two between 512 and 32768", + "type": "uint16" + }, + { + "name": "indirect_desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "iothread", + "type": "link<iothread>" + }, + { + "name": "disable-modern", + "type": "bool" + }, + { + "name": "drive", + "description": "Node name or ID of a block device to use as a backend", + "type": "str" + }, + { + "name": "disable-legacy", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-lnkctl-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "werror", + "description": "Error handling policy, report/ignore/enospc/stop/auto", + "type": "BlockdevOnError" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "discard_granularity", + "type": "uint32" + }, + { + "name": "rerror", + "description": "Error handling policy, report/ignore/enospc/stop/auto", + "type": "BlockdevOnError" + }, + { + "name": "page-per-vq", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-deverr-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-pm-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "any_layout", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "share-rw", + "type": "bool" + }, + { + "name": "physical_block_size", + "description": "A power of two between 512 and 32768", + "type": "uint16" + }, + { + "name": "config-wce", + "description": "on/off", + "type": "bool" + }, + { + "name": "class", + "type": "uint32" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "migrate-extra", + "description": "on/off", + "type": "bool" + }, + { + "name": "modern-pio-notify", + "description": "on/off", + "type": "bool" + }, + { + "name": "vectors", + "type": "uint32" + }, + { + "name": "iommu_platform", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-backend", + "type": "child<virtio-blk-device>" + }, + { + "name": "x-ignore-backend-features", + "type": "bool" + }, + { + "name": "notify_on_empty", + "description": "on/off", + "type": "bool" + }, + { + "name": "write-cache", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "num-queues", + "type": "uint16" + }, + { + "name": "opt_io_size", + "type": "uint32" + }, + { + "name": "ats", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-pci-bus-master-bug-migration", + "description": "on/off", + "type": "bool" + }, + { + "name": "romfile", + "type": "str" + } + ], + "id": "libvirt-10" +} + +{ + "return": [ + { + "name": "ctrl_mac_addr", + "description": "on/off", + "type": "bool" + }, + { + "name": "romfile", + "type": "str" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "status", + "description": "on/off", + "type": "bool" + }, + { + "name": "notify_on_empty", + "description": "on/off", + "type": "bool" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-pm-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "indirect_desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "guest_csum", + "description": "on/off", + "type": "bool" + }, + { + "name": "ctrl_rx", + "description": "on/off", + "type": "bool" + }, + { + "name": "ctrl_vq", + "description": "on/off", + "type": "bool" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "disable-modern", + "type": "bool" + }, + { + "name": "mrg_rxbuf", + "description": "on/off", + "type": "bool" + }, + { + "name": "host_tso6", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-txtimer", + "type": "uint32" + }, + { + "name": "host_tso4", + "description": "on/off", + "type": "bool" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "ctrl_rx_extra", + "description": "on/off", + "type": "bool" + }, + { + "name": "gso", + "description": "on/off", + "type": "bool" + }, + { + "name": "page-per-vq", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-disable-pcie", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-ignore-backend-features", + "type": "bool" + }, + { + "name": "vlan", + "description": "Integer VLAN id to connect to", + "type": "int32" + }, + { + "name": "x-txburst", + "type": "int32" + }, + { + "name": "iommu_platform", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-lnkctl-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "host_mtu", + "type": "uint16" + }, + { + "name": "ctrl_vlan", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-backend", + "type": "child<virtio-net-device>" + }, + { + "name": "event_idx", + "description": "on/off", + "type": "bool" + }, + { + "name": "vectors", + "type": "uint32" + }, + { + "name": "guest_announce", + "description": "on/off", + "type": "bool" + }, + { + "name": "host_ecn", + "description": "on/off", + "type": "bool" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "ats", + "description": "on/off", + "type": "bool" + }, + { + "name": "host_ufo", + "description": "on/off", + "type": "bool" + }, + { + "name": "guest_tso4", + "description": "on/off", + "type": "bool" + }, + { + "name": "guest_tso6", + "description": "on/off", + "type": "bool" + }, + { + "name": "ctrl_guest_offloads", + "description": "on/off", + "type": "bool" + }, + { + "name": "csum", + "description": "on/off", + "type": "bool" + }, + { + "name": "modern-pio-notify", + "description": "on/off", + "type": "bool" + }, + { + "name": "ioeventfd", + "description": "on/off", + "type": "bool" + }, + { + "name": "mq", + "description": "on/off", + "type": "bool" + }, + { + "name": "any_layout", + "description": "on/off", + "type": "bool" + }, + { + "name": "guest_ecn", + "description": "on/off", + "type": "bool" + }, + { + "name": "guest_ufo", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-pci-bus-master-bug-migration", + "description": "on/off", + "type": "bool" + }, + { + "name": "mac", + "description": "Ethernet 6-byte MAC Address, example: 52:54:00:12:34:56", + "type": "str" + }, + { + "name": "tx_queue_size", + "type": "uint16" + }, + { + "name": "disable-legacy", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "tx", + "type": "str" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-mtu-bypass-backend", + "type": "bool" + }, + { + "name": "x-pcie-deverr-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "netdev", + "description": "ID of a netdev to use as a backend", + "type": "str" + }, + { + "name": "migrate-extra", + "description": "on/off", + "type": "bool" + }, + { + "name": "rx_queue_size", + "type": "uint16" + } + ], + "id": "libvirt-11" +} + +{ + "return": [ + { + "name": "event_idx", + "description": "on/off", + "type": "bool" + }, + { + "name": "ioeventfd", + "description": "on/off", + "type": "bool" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "x-disable-pcie", + "description": "on/off", + "type": "bool" + }, + { + "name": "indirect_desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "cmd_per_lun", + "type": "uint32" + }, + { + "name": "disable-modern", + "type": "bool" + }, + { + "name": "num_queues", + "type": "uint32" + }, + { + "name": "disable-legacy", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-lnkctl-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "hotplug", + "description": "on/off", + "type": "bool" + }, + { + "name": "page-per-vq", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-deverr-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-pm-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "max_sectors", + "type": "uint32" + }, + { + "name": "param_change", + "description": "on/off", + "type": "bool" + }, + { + "name": "any_layout", + "description": "on/off", + "type": "bool" + }, + { + "name": "iothread", + "type": "link<iothread>" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "migrate-extra", + "description": "on/off", + "type": "bool" + }, + { + "name": "modern-pio-notify", + "description": "on/off", + "type": "bool" + }, + { + "name": "vectors", + "type": "uint32" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-backend", + "type": "child<virtio-scsi-device>" + }, + { + "name": "x-ignore-backend-features", + "type": "bool" + }, + { + "name": "notify_on_empty", + "description": "on/off", + "type": "bool" + }, + { + "name": "iommu_platform", + "description": "on/off", + "type": "bool" + }, + { + "name": "ats", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-pci-bus-master-bug-migration", + "description": "on/off", + "type": "bool" + }, + { + "name": "romfile", + "type": "str" + } + ], + "id": "libvirt-12" +} + +{ + "id": "libvirt-13", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-blk-ccw' not found" + } +} + +{ + "id": "libvirt-14", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-net-ccw' not found" + } +} + +{ + "id": "libvirt-15", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-scsi-ccw' not found" + } +} + +{ + "id": "libvirt-16", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-blk-s390' not found" + } +} + +{ + "id": "libvirt-17", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-net-s390' not found" + } +} + +{ + "id": "libvirt-18", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'pci-assign' not found" + } +} + +{ + "return": [ + { + "name": "share_intx", + "description": "on/off", + "type": "bool" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "host", + "description": "Address (bus/device/function) of the host device, example: 04:10.0", + "type": "str" + }, + { + "name": "romfile", + "type": "str" + }, + { + "name": "configfd", + "type": "str" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "prefer_msi", + "description": "on/off", + "type": "bool" + } + ], + "id": "libvirt-19" +} + +{ + "return": [ + { + "name": "x-pci-sub-device-id", + "type": "uint32" + }, + { + "name": "x-no-kvm-msi", + "type": "bool" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-igd-opregion", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-vga", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pci-vendor-id", + "type": "uint32" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "x-req", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-igd-gms", + "type": "uint32" + }, + { + "name": "romfile", + "type": "str" + }, + { + "name": "x-no-kvm-intx", + "type": "bool" + }, + { + "name": "x-pci-device-id", + "type": "uint32" + }, + { + "name": "host", + "description": "Address (bus/device/function) of the host device, example: 04:10.0", + "type": "str" + }, + { + "name": "x-no-kvm-msix", + "type": "bool" + }, + { + "name": "x-intx-mmap-timeout-ms", + "type": "uint32" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "x-pci-sub-vendor-id", + "type": "uint32" + }, + { + "name": "sysfsdev", + "type": "str" + }, + { + "name": "x-no-mmap", + "type": "bool" + } + ], + "id": "libvirt-20" +} + +{ + "return": [ + { + "name": "serial", + "type": "str" + }, + { + "name": "port_index", + "type": "uint16" + }, + { + "name": "dpofua", + "description": "on/off", + "type": "bool" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "logical_block_size", + "description": "A power of two between 512 and 32768", + "type": "uint16" + }, + { + "name": "discard_granularity", + "type": "uint32" + }, + { + "name": "lun", + "type": "uint32" + }, + { + "name": "max_unmap_size", + "type": "uint64" + }, + { + "name": "drive", + "description": "Node name or ID of a block device to use as a backend", + "type": "str" + }, + { + "name": "port_wwn", + "type": "uint64" + }, + { + "name": "write-cache", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "share-rw", + "type": "bool" + }, + { + "name": "opt_io_size", + "type": "uint32" + }, + { + "name": "min_io_size", + "type": "uint16" + }, + { + "name": "product", + "type": "str" + }, + { + "name": "scsi-id", + "type": "uint32" + }, + { + "name": "channel", + "type": "uint32" + }, + { + "name": "vendor", + "type": "str" + }, + { + "name": "wwn", + "type": "uint64" + }, + { + "name": "werror", + "description": "Error handling policy, report/ignore/enospc/stop/auto", + "type": "BlockdevOnError" + }, + { + "name": "removable", + "description": "on/off", + "type": "bool" + }, + { + "name": "rerror", + "description": "Error handling policy, report/ignore/enospc/stop/auto", + "type": "BlockdevOnError" + }, + { + "name": "ver", + "type": "str" + }, + { + "name": "physical_block_size", + "description": "A power of two between 512 and 32768", + "type": "uint16" + }, + { + "name": "max_io_size", + "type": "uint64" + } + ], + "id": "libvirt-21" +} + +{ + "return": [ + { + "name": "serial", + "type": "str" + }, + { + "name": "logical_block_size", + "description": "A power of two between 512 and 32768", + "type": "uint16" + }, + { + "name": "discard_granularity", + "type": "uint32" + }, + { + "name": "drive", + "description": "Node name or ID of a block device to use as a backend", + "type": "str" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "write-cache", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "share-rw", + "type": "bool" + }, + { + "name": "opt_io_size", + "type": "uint32" + }, + { + "name": "min_io_size", + "type": "uint16" + }, + { + "name": "unit", + "type": "uint32" + }, + { + "name": "wwn", + "type": "uint64" + }, + { + "name": "werror", + "description": "Error handling policy, report/ignore/enospc/stop/auto", + "type": "BlockdevOnError" + }, + { + "name": "model", + "type": "str" + }, + { + "name": "rerror", + "description": "Error handling policy, report/ignore/enospc/stop/auto", + "type": "BlockdevOnError" + }, + { + "name": "ver", + "type": "str" + }, + { + "name": "physical_block_size", + "description": "A power of two between 512 and 32768", + "type": "uint16" + } + ], + "id": "libvirt-22" +} + +{ + "return": [ + { + "name": "memory-hotplug-support", + "type": "bool" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "acpi-pci-hotplug-with-bridge-support", + "type": "bool" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "romfile", + "type": "str" + }, + { + "name": "disable_s4", + "type": "uint8" + }, + { + "name": "disable_s3", + "type": "uint8" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "s4_val", + "type": "uint8" + }, + { + "name": "smb_io_base", + "type": "uint32" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + } + ], + "id": "libvirt-23" +} + +{ + "return": [ + { + "name": "filter", + "type": "str" + }, + { + "name": "msos-desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "serial", + "type": "str" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "port", + "type": "str" + }, + { + "name": "debug", + "type": "uint8" + }, + { + "name": "streams", + "type": "bool" + }, + { + "name": "chardev", + "description": "ID of a chardev to use as a backend", + "type": "str" + }, + { + "name": "full-path", + "description": "on/off", + "type": "bool" + }, + { + "name": "attached", + "type": "bool" + } + ], + "id": "libvirt-24" +} + +{ + "return": [ + { + "name": "isobufs", + "type": "uint32" + }, + { + "name": "hostaddr", + "type": "uint32" + }, + { + "name": "msos-desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "productid", + "type": "uint32" + }, + { + "name": "serial", + "type": "str" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "isobsize", + "type": "uint32" + }, + { + "name": "port", + "type": "str" + }, + { + "name": "vendorid", + "type": "uint32" + }, + { + "name": "pipeline", + "description": "on/off", + "type": "bool" + }, + { + "name": "attached", + "type": "bool" + }, + { + "name": "hostport", + "type": "str" + }, + { + "name": "full-path", + "description": "on/off", + "type": "bool" + }, + { + "name": "loglevel", + "type": "uint32" + }, + { + "name": "hostbus", + "type": "uint32" + } + ], + "id": "libvirt-25" +} + +{ + "return": [ + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "drive", + "description": "Node name or ID of a block device to use as a backend", + "type": "str" + }, + { + "name": "lun", + "type": "uint32" + }, + { + "name": "channel", + "type": "uint32" + }, + { + "name": "scsi-id", + "type": "uint32" + } + ], + "id": "libvirt-26" +} + +{ + "return": [ + { + "name": "short_root_bus", + "type": "uint32" + }, + { + "name": "pci-conf-idx[0]", + "type": "child<qemu:memory-region>" + }, + { + "name": "pci-hole64-end", + "type": "uint64" + }, + { + "name": "pci-hole-end", + "type": "uint32" + }, + { + "name": "pci-hole-start", + "type": "uint32" + }, + { + "name": "pci-hole64-start", + "type": "uint64" + }, + { + "name": "pci-hole64-size", + "type": "size" + }, + { + "name": "pci-conf-data[0]", + "type": "child<qemu:memory-region>" + } + ], + "id": "libvirt-27" +} + +{ + "return": [ + { + "name": "short_root_bus", + "type": "uint32" + }, + { + "name": "system-mem", + "type": "link<qemu:memory-region>" + }, + { + "name": "pci-conf-idx[0]", + "type": "child<qemu:memory-region>" + }, + { + "name": "pcie-mmcfg-mmio[0]", + "type": "child<qemu:memory-region>" + }, + { + "name": "pci-hole64-start", + "type": "uint64" + }, + { + "name": "io-mem", + "type": "link<qemu:memory-region>" + }, + { + "name": "pci-hole64-end", + "type": "uint64" + }, + { + "name": "pci-hole-end", + "type": "uint32" + }, + { + "name": "above-4g-mem-size", + "type": "size" + }, + { + "name": "below-4g-mem-size", + "type": "size" + }, + { + "name": "ram-mem", + "type": "link<qemu:memory-region>" + }, + { + "name": "pci-hole-start", + "type": "uint32" + }, + { + "name": "MCFG", + "type": "uint64" + }, + { + "name": "mch", + "type": "child<mch>" + }, + { + "name": "pci-hole64-size", + "type": "size" + }, + { + "name": "pci-mem", + "type": "link<qemu:memory-region>" + }, + { + "name": "pci-conf-data[0]", + "type": "child<qemu:memory-region>" + }, + { + "name": "mcfg_size", + "type": "uint64" + } + ], + "id": "libvirt-28" +} + +{ + "return": [ + { + "name": "serial", + "type": "str" + }, + { + "name": "msos-desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "logical_block_size", + "description": "A power of two between 512 and 32768", + "type": "uint16" + }, + { + "name": "discard_granularity", + "type": "uint32" + }, + { + "name": "drive", + "description": "Node name or ID of a block device to use as a backend", + "type": "str" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "write-cache", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "share-rw", + "type": "bool" + }, + { + "name": "opt_io_size", + "type": "uint32" + }, + { + "name": "min_io_size", + "type": "uint16" + }, + { + "name": "port", + "type": "str" + }, + { + "name": "attached", + "type": "bool" + }, + { + "name": "full-path", + "description": "on/off", + "type": "bool" + }, + { + "name": "removable", + "description": "on/off", + "type": "bool" + }, + { + "name": "physical_block_size", + "description": "A power of two between 512 and 32768", + "type": "uint16" + } + ], + "id": "libvirt-29" +} + +{ + "return": [ + { + "name": "iobase", + "type": "uint32" + }, + { + "name": "lost_tick_policy", + "type": "LostTickPolicy" + } + ], + "id": "libvirt-30" +} + +{ + "return": [ + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "mmio", + "description": "on/off", + "type": "bool" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "qemu-extended-regs", + "description": "on/off", + "type": "bool" + }, + { + "name": "big-endian-framebuffer", + "type": "bool" + }, + { + "name": "romfile", + "type": "str" + }, + { + "name": "vgamem_mb", + "type": "uint32" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + } + ], + "id": "libvirt-31" +} + +{ + "return": [ + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "romfile", + "type": "str" + }, + { + "name": "vgamem_mb", + "type": "uint32" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + } + ], + "id": "libvirt-32" +} + +{ + "return": [ + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "yres", + "type": "uint32" + }, + { + "name": "ram_size_mb", + "type": "uint32" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "vgamem_mb", + "type": "uint32" + }, + { + "name": "romfile", + "type": "str" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "debug", + "type": "uint32" + }, + { + "name": "vram_size_mb", + "type": "uint32" + }, + { + "name": "revision", + "type": "uint32" + }, + { + "name": "ram_size", + "type": "uint32" + }, + { + "name": "vram64_size_mb", + "type": "uint32" + }, + { + "name": "guestdebug", + "type": "uint32" + }, + { + "name": "vram_size", + "type": "uint64" + }, + { + "name": "surfaces", + "type": "int32" + }, + { + "name": "max_outputs", + "type": "uint16" + }, + { + "name": "xres", + "type": "uint32" + }, + { + "name": "cmdlog", + "type": "uint32" + } + ], + "id": "libvirt-33" +} + +{ + "return": [ + { + "name": "event_idx", + "description": "on/off", + "type": "bool" + }, + { + "name": "yres", + "type": "uint32" + }, + { + "name": "ioeventfd", + "description": "on/off", + "type": "bool" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "xres", + "type": "uint32" + }, + { + "name": "x-disable-pcie", + "description": "on/off", + "type": "bool" + }, + { + "name": "indirect_desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "disable-modern", + "type": "bool" + }, + { + "name": "disable-legacy", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-lnkctl-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "page-per-vq", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-deverr-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-pm-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "max_outputs", + "type": "uint32" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "any_layout", + "description": "on/off", + "type": "bool" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "migrate-extra", + "description": "on/off", + "type": "bool" + }, + { + "name": "modern-pio-notify", + "description": "on/off", + "type": "bool" + }, + { + "name": "vectors", + "type": "uint32" + }, + { + "name": "iommu_platform", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-backend", + "type": "child<virtio-gpu-device>" + }, + { + "name": "max_hostmem", + "type": "size" + }, + { + "name": "x-ignore-backend-features", + "type": "bool" + }, + { + "name": "stats", + "description": "on/off", + "type": "bool" + }, + { + "name": "notify_on_empty", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-pci-bus-master-bug-migration", + "description": "on/off", + "type": "bool" + }, + { + "name": "ats", + "description": "on/off", + "type": "bool" + }, + { + "name": "virgl", + "description": "on/off", + "type": "bool" + }, + { + "name": "romfile", + "type": "str" + } + ], + "id": "libvirt-34" +} + +{ + "return": [ + { + "name": "notify_on_empty", + "description": "on/off", + "type": "bool" + }, + { + "name": "any_layout", + "description": "on/off", + "type": "bool" + }, + { + "name": "indirect_desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "event_idx", + "description": "on/off", + "type": "bool" + }, + { + "name": "yres", + "type": "uint32" + }, + { + "name": "stats", + "description": "on/off", + "type": "bool" + }, + { + "name": "iommu_platform", + "description": "on/off", + "type": "bool" + }, + { + "name": "xres", + "type": "uint32" + }, + { + "name": "max_outputs", + "type": "uint32" + }, + { + "name": "virgl", + "description": "on/off", + "type": "bool" + }, + { + "name": "max_hostmem", + "type": "size" + } + ], + "id": "libvirt-35" +} + +{ + "return": [ + { + "name": "memory-hotplug-support", + "type": "bool" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "sci_int", + "type": "uint32" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "gpe0_blk_len", + "type": "uint32" + }, + { + "name": "pm_io_base", + "type": "uint32" + }, + { + "name": "noreboot", + "type": "bool" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "cpu-hotplug-legacy", + "type": "bool" + }, + { + "name": "acpi_disable_cmd", + "type": "uint8" + }, + { + "name": "x-smi-broadcast", + "description": "on/off", + "type": "bool" + }, + { + "name": "disable_s3", + "type": "uint8" + }, + { + "name": "romfile", + "type": "str" + }, + { + "name": "acpi_enable_cmd", + "type": "uint8" + }, + { + "name": "s4_val", + "type": "uint8" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "enable_tco", + "type": "bool" + }, + { + "name": "disable_s4", + "type": "uint8" + }, + { + "name": "gpe0_blk", + "type": "uint32" + } + ], + "id": "libvirt-36" +} + +{ + "return": [ + { + "name": "guest-stats-polling-interval", + "type": "int" + }, + { + "name": "event_idx", + "description": "on/off", + "type": "bool" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-disable-pcie", + "description": "on/off", + "type": "bool" + }, + { + "name": "indirect_desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "disable-modern", + "type": "bool" + }, + { + "name": "disable-legacy", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-lnkctl-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "guest-stats", + "type": "guest statistics" + }, + { + "name": "deflate-on-oom", + "description": "on/off", + "type": "bool" + }, + { + "name": "page-per-vq", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-deverr-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-pm-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "any_layout", + "description": "on/off", + "type": "bool" + }, + { + "name": "class", + "type": "uint32" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "migrate-extra", + "description": "on/off", + "type": "bool" + }, + { + "name": "modern-pio-notify", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-backend", + "type": "child<virtio-balloon-device>" + }, + { + "name": "x-ignore-backend-features", + "type": "bool" + }, + { + "name": "notify_on_empty", + "description": "on/off", + "type": "bool" + }, + { + "name": "iommu_platform", + "description": "on/off", + "type": "bool" + }, + { + "name": "ats", + "description": "on/off", + "type": "bool" + }, + { + "name": "virtio-pci-bus-master-bug-migration", + "description": "on/off", + "type": "bool" + }, + { + "name": "romfile", + "type": "str" + } + ], + "id": "libvirt-37" +} + +{ + "id": "libvirt-38", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-balloon-ccw' not found" + } +} + +{ + "return": [ + { + "name": "notify_on_empty", + "description": "on/off", + "type": "bool" + }, + { + "name": "any_layout", + "description": "on/off", + "type": "bool" + }, + { + "name": "indirect_desc", + "description": "on/off", + "type": "bool" + }, + { + "name": "guest-stats", + "type": "guest statistics" + }, + { + "name": "guest-stats-polling-interval", + "type": "int" + }, + { + "name": "event_idx", + "description": "on/off", + "type": "bool" + }, + { + "name": "iommu_platform", + "description": "on/off", + "type": "bool" + }, + { + "name": "deflate-on-oom", + "description": "on/off", + "type": "bool" + } + ], + "id": "libvirt-39" +} + +{ + "return": [ + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "intrs", + "type": "uint32" + }, + { + "name": "x-pcie-lnksta-dllla", + "description": "on/off", + "type": "bool" + }, + { + "name": "msix", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "multifunction", + "description": "on/off", + "type": "bool" + }, + { + "name": "msi", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "superspeed-ports-first", + "description": "on/off", + "type": "bool" + }, + { + "name": "streams", + "description": "on/off", + "type": "bool" + }, + { + "name": "romfile", + "type": "str" + }, + { + "name": "force-pcie-endcap", + "description": "on/off", + "type": "bool" + }, + { + "name": "command_serr_enable", + "description": "on/off", + "type": "bool" + }, + { + "name": "x-pcie-extcap-init", + "description": "on/off", + "type": "bool" + }, + { + "name": "addr", + "description": "Slot and optional function number, example: 06.0 or 06", + "type": "int32" + }, + { + "name": "p3", + "type": "uint32" + }, + { + "name": "p2", + "type": "uint32" + }, + { + "name": "slots", + "type": "uint32" + } + ], + "id": "libvirt-40" +} + +{ + "return": [ + { + "name": "eim", + "description": "on/off/auto", + "type": "OnOffAuto" + }, + { + "name": "caching-mode", + "type": "bool" + }, + { + "name": "x-buggy-eim", + "type": "bool" + }, + { + "name": "intremap", + "type": "bool" + }, + { + "name": "version", + "type": "uint32" + }, + { + "name": "pt", + "type": "bool" + }, + { + "name": "device-iotlb", + "type": "bool" + } + ], + "id": "libvirt-41" +} + +{ + "return": [ + { + "hotpluggable-cpus": true, + "name": "pc-0.12", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.4", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-1.3", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-q35-2.7", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-q35-2.6", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": false, + "name": "none", + "cpu-max": 1 + }, + { + "hotpluggable-cpus": false, + "name": "xenpv", + "cpu-max": 1 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-1.7", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.8", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-1.6", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.7", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.10", + "is-default": true, + "cpu-max": 255, + "alias": "pc" + }, + { + "hotpluggable-cpus": true, + "name": "pc-0.11", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.3", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-0.10", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-1.2", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.2", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "isapc", + "cpu-max": 1 + }, + { + "hotpluggable-cpus": true, + "name": "pc-q35-2.5", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "xenfv", + "cpu-max": 128 + }, + { + "hotpluggable-cpus": true, + "name": "pc-0.15", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-0.14", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-1.5", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.6", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-1.4", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.5", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-q35-2.9", + "cpu-max": 288 + }, + { + "hotpluggable-cpus": true, + "name": "pc-1.1", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.1", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-q35-2.8", + "cpu-max": 288 + }, + { + "hotpluggable-cpus": true, + "name": "pc-1.0", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.0", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-q35-2.4", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-i440fx-2.9", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-0.13", + "cpu-max": 255 + }, + { + "hotpluggable-cpus": true, + "name": "pc-q35-2.10", + "cpu-max": 288, + "alias": "q35" + } + ], + "id": "libvirt-42" +} + +{ + "return": [ + { + "name": "max", + "typename": "max-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": false + }, + { + "name": "host", + "typename": "host-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": false + }, + { + "name": "base", + "typename": "base-x86_64-cpu", + "unavailable-features": [ + ], + "static": true, + "migration-safe": true + }, + { + "name": "qemu64", + "typename": "qemu64-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "qemu32", + "typename": "qemu32-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "phenom", + "typename": "phenom-x86_64-cpu", + "unavailable-features": [ + "mmxext", + "fxsr-opt", + "3dnowext", + "3dnow", + "sse4a", + "npt" + ], + "static": false, + "migration-safe": true + }, + { + "name": "pentium3", + "typename": "pentium3-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "pentium2", + "typename": "pentium2-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "pentium", + "typename": "pentium-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "n270", + "typename": "n270-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "kvm64", + "typename": "kvm64-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "kvm32", + "typename": "kvm32-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "coreduo", + "typename": "coreduo-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "core2duo", + "typename": "core2duo-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "athlon", + "typename": "athlon-x86_64-cpu", + "unavailable-features": [ + "mmxext", + "3dnowext", + "3dnow" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Westmere", + "typename": "Westmere-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Skylake-Server", + "typename": "Skylake-Server-x86_64-cpu", + "unavailable-features": [ + "hle", + "rtm", + "mpx", + "avx512f", + "avx512dq", + "rdseed", + "adx", + "smap", + "clwb", + "avx512cd", + "avx512bw", + "avx512vl", + "3dnowprefetch", + "xsavec", + "xgetbv1", + "mpx", + "mpx", + "avx512f", + "avx512f", + "avx512f" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Skylake-Client", + "typename": "Skylake-Client-x86_64-cpu", + "unavailable-features": [ + "hle", + "rtm", + "mpx", + "rdseed", + "adx", + "smap", + "3dnowprefetch", + "xsavec", + "xgetbv1", + "mpx", + "mpx" + ], + "static": false, + "migration-safe": true + }, + { + "name": "SandyBridge", + "typename": "SandyBridge-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Penryn", + "typename": "Penryn-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G5", + "typename": "Opteron_G5-x86_64-cpu", + "unavailable-features": [ + "sse4a", + "misalignsse", + "3dnowprefetch", + "xop", + "fma4", + "tbm" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G4", + "typename": "Opteron_G4-x86_64-cpu", + "unavailable-features": [ + "sse4a", + "misalignsse", + "3dnowprefetch", + "xop", + "fma4" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G3", + "typename": "Opteron_G3-x86_64-cpu", + "unavailable-features": [ + "sse4a", + "misalignsse" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G2", + "typename": "Opteron_G2-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G1", + "typename": "Opteron_G1-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Nehalem", + "typename": "Nehalem-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "IvyBridge", + "typename": "IvyBridge-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Haswell", + "typename": "Haswell-x86_64-cpu", + "unavailable-features": [ + "hle", + "rtm" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Haswell-noTSX", + "typename": "Haswell-noTSX-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Conroe", + "typename": "Conroe-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Broadwell", + "typename": "Broadwell-x86_64-cpu", + "unavailable-features": [ + "hle", + "rtm", + "rdseed", + "adx", + "smap", + "3dnowprefetch" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Broadwell-noTSX", + "typename": "Broadwell-noTSX-x86_64-cpu", + "unavailable-features": [ + "rdseed", + "adx", + "smap", + "3dnowprefetch" + ], + "static": false, + "migration-safe": true + }, + { + "name": "486", + "typename": "486-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + } + ], + "id": "libvirt-43" +} + +{ + "return": [ + "tpm-tis" + ], + "id": "libvirt-44" +} + +{ + "return": [ + "passthrough" + ], + "id": "libvirt-45" +} + +{ + "return": [ + { + "parameters": [ + { + "name": "timeout", + "help": "Request timeout in seconds (default 0 = no timeout)", + "type": "number" + }, + { + "name": "initiator-name", + "help": "Initiator iqn name to use when connecting", + "type": "string" + }, + { + "name": "header-digest", + "help": "HeaderDigest setting. {CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}", + "type": "string" + }, + { + "name": "password-secret", + "help": "ID of the secret providing password for CHAP authentication to target", + "type": "string" + }, + { + "name": "password", + "help": "password for CHAP authentication to target", + "type": "string" + }, + { + "name": "user", + "help": "username for CHAP authentication to target", + "type": "string" + } + ], + "option": "iscsi" + }, + { + "parameters": [ + { + "name": "non-adaptive", + "type": "boolean" + }, + { + "name": "lossy", + "type": "boolean" + }, + { + "name": "acl", + "type": "boolean" + }, + { + "name": "x509verify", + "type": "string" + }, + { + "name": "tls", + "type": "boolean" + }, + { + "name": "sasl", + "type": "boolean" + }, + { + "name": "key-delay-ms", + "type": "number" + }, + { + "name": "lock-key-sync", + "type": "boolean" + }, + { + "name": "reverse", + "type": "boolean" + }, + { + "name": "password", + "type": "boolean" + }, + { + "name": "ipv6", + "type": "boolean" + }, + { + "name": "ipv4", + "type": "boolean" + }, + { + "name": "to", + "type": "number" + }, + { + "name": "connections", + "type": "number" + }, + { + "name": "head", + "type": "number" + }, + { + "name": "display", + "type": "string" + }, + { + "name": "share", + "type": "string" + }, + { + "name": "x509", + "type": "string" + }, + { + "name": "tls-creds", + "type": "string" + }, + { + "name": "websocket", + "type": "string" + }, + { + "name": "vnc", + "type": "string" + } + ], + "option": "vnc" + }, + { + "parameters": [ + { + "name": "rendernode", + "type": "string" + }, + { + "name": "gl", + "type": "boolean" + }, + { + "name": "head", + "type": "number" + }, + { + "name": "display", + "type": "string" + }, + { + "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-agent-file-xfer", + "type": "boolean" + }, + { + "name": "disable-copy-paste", + "type": "boolean" + }, + { + "name": "disable-ticketing", + "type": "boolean" + }, + { + "name": "password", + "type": "string" + }, + { + "name": "unix", + "type": "boolean" + }, + { + "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": "smbios" + }, + { + "parameters": [ + ], + "option": "acpi" + }, + { + "parameters": [ + { + "name": "dmode", + "type": "number" + }, + { + "name": "fmode", + "type": "number" + }, + { + "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": "throttling.iops-size", + "help": "when limiting by iops max size of an I/O in bytes", + "type": "number" + }, + { + "name": "throttling.bps-write-max-length", + "help": "length of the bps-write-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.bps-read-max-length", + "help": "length of the bps-read-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.bps-total-max-length", + "help": "length of the bps-total-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.iops-write-max-length", + "help": "length of the iops-write-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.iops-read-max-length", + "help": "length of the iops-read-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.iops-total-max-length", + "help": "length of the iops-total-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.bps-write-max", + "help": "total bytes write burst", + "type": "number" + }, + { + "name": "throttling.bps-read-max", + "help": "total bytes read burst", + "type": "number" + }, + { + "name": "throttling.bps-total-max", + "help": "total bytes burst", + "type": "number" + }, + { + "name": "throttling.iops-write-max", + "help": "I/O operations write burst", + "type": "number" + }, + { + "name": "throttling.iops-read-max", + "help": "I/O operations read burst", + "type": "number" + }, + { + "name": "throttling.iops-total-max", + "help": "I/O operations burst", + "type": "number" + }, + { + "name": "throttling.bps-write", + "help": "limit write bytes per second", + "type": "number" + }, + { + "name": "throttling.bps-read", + "help": "limit read bytes per second", + "type": "number" + }, + { + "name": "throttling.bps-total", + "help": "limit total bytes per second", + "type": "number" + }, + { + "name": "throttling.iops-write", + "help": "limit write operations per second", + "type": "number" + }, + { + "name": "throttling.iops-read", + "help": "limit read operations per second", + "type": "number" + }, + { + "name": "throttling.iops-total", + "help": "limit total I/O operations per second", + "type": "number" + }, + { + "name": "dmode", + "type": "number" + }, + { + "name": "fmode", + "type": "number" + }, + { + "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": "string", + "help": "Sets content of the blob to be inserted from a string", + "type": "string" + }, + { + "name": "file", + "help": "Sets the name of the file from which\nthe fw_cfg blob will be loaded", + "type": "string" + }, + { + "name": "name", + "help": "Sets the fw_cfg name of the blob to be inserted", + "type": "string" + } + ], + "option": "fw_cfg" + }, + { + "parameters": [ + { + "name": "arg", + "type": "string" + }, + { + "name": "target", + "type": "string" + }, + { + "name": "enable", + "type": "boolean" + } + ], + "option": "semihosting-config" + }, + { + "parameters": [ + { + "name": "rrsnapshot", + "type": "string" + }, + { + "name": "rrfile", + "type": "string" + }, + { + "name": "rr", + "type": "string" + }, + { + "name": "sleep", + "type": "boolean" + }, + { + "name": "align", + "type": "boolean" + }, + { + "name": "shift", + "type": "string" + } + ], + "option": "icount" + }, + { + "parameters": [ + ], + "option": "numa" + }, + { + "parameters": [ + { + "name": "debug-threads", + "help": "When enabled, name the individual threads; defaults off.\nNOTE: The thread names are for debugging and not a\nstable API.", + "type": "boolean" + }, + { + "name": "process", + "help": "Sets the name of the QEMU process, as shown in top etc", + "type": "string" + }, + { + "name": "guest", + "help": "Sets the name of the guest.\nThis name will be displayed in the SDL window caption.\nThe name will also be used for the VNC server", + "type": "string" + } + ], + "option": "name" + }, + { + "parameters": [ + { + "name": "timestamp", + "type": "boolean" + } + ], + "option": "msg" + }, + { + "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": "boolean" + }, + { + "name": "reboot-timeout", + "type": "string" + }, + { + "name": "splash-time", + "type": "string" + }, + { + "name": "splash", + "type": "string" + }, + { + "name": "menu", + "type": "boolean" + }, + { + "name": "once", + "type": "string" + }, + { + "name": "order", + "type": "string" + } + ], + "option": "boot-opts" + }, + { + "parameters": [ + { + "name": "maxcpus", + "type": "number" + }, + { + "name": "threads", + "type": "number" + }, + { + "name": "cores", + "type": "number" + }, + { + "name": "sockets", + "type": "number" + }, + { + "name": "cpus", + "type": "number" + } + ], + "option": "smp-opts" + }, + { + "parameters": [ + { + "name": "maxmem", + "type": "size" + }, + { + "name": "slots", + "type": "number" + }, + { + "name": "size", + "type": "size" + } + ], + "option": "memory" + }, + { + "parameters": [ + { + "name": "thread", + "help": "Enable/disable multi-threaded TCG", + "type": "string" + }, + { + "name": "accel", + "help": "Select the type of accelerator", + "type": "string" + } + ], + "option": "accel" + }, + { + "parameters": [ + { + "name": "loadparm", + "help": "Up to 8 chars in set of [A-Za-z0-9. ](lower case chars converted to upper case) to pass to machine loader, boot manager, and guest kernel", + "type": "string" + }, + { + "name": "dea-key-wrap", + "help": "enable/disable DEA key wrapping using the CPACF wrapping key", + "type": "boolean" + }, + { + "name": "aes-key-wrap", + "help": "enable/disable AES key wrapping using the CPACF wrapping key", + "type": "boolean" + }, + { + "name": "suppress-vmdesc", + "help": "Set on to disable self-describing migration", + "type": "boolean" + }, + { + "name": "iommu", + "help": "Set on/off to enable/disable Intel IOMMU (VT-d)", + "type": "boolean" + }, + { + "name": "firmware", + "help": "firmware image", + "type": "string" + }, + { + "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": "number" + }, + { + "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" + }, + { + "name": "enable", + "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": "logappend", + "type": "boolean" + }, + { + "name": "logfile", + "type": "string" + }, + { + "name": "append", + "type": "boolean" + }, + { + "name": "chardev", + "type": "string" + }, + { + "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": "tls-creds", + "type": "string" + }, + { + "name": "tn3270", + "type": "boolean" + }, + { + "name": "telnet", + "type": "boolean" + }, + { + "name": "reconnect", + "type": "number" + }, + { + "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": "copy-on-read", + "help": "copy read data from backing file into image file", + "type": "boolean" + }, + { + "name": "werror", + "help": "write error action", + "type": "string" + }, + { + "name": "rerror", + "help": "read error action", + "type": "string" + }, + { + "name": "read-only", + "help": "open drive file as read-only", + "type": "boolean" + }, + { + "name": "file", + "help": "file name", + "type": "string" + }, + { + "name": "serial", + "help": "disk serial number", + "type": "string" + }, + { + "name": "addr", + "help": "pci address (virtio only)", + "type": "string" + }, + { + "name": "boot", + "help": "(deprecated, ignored)", + "type": "boolean" + }, + { + "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": "if", + "help": "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)", + "type": "string" + }, + { + "name": "media", + "help": "media type (disk, cdrom)", + "type": "string" + }, + { + "name": "index", + "help": "index number", + "type": "number" + }, + { + "name": "unit", + "help": "unit number (i.e. lun for scsi)", + "type": "number" + }, + { + "name": "bus", + "help": "bus number", + "type": "number" + }, + { + "name": "stats-account-failed", + "help": "whether to account for failed I/O operations in the statistics", + "type": "boolean" + }, + { + "name": "stats-account-invalid", + "help": "whether to account for invalid I/O operations in the statistics", + "type": "boolean" + }, + { + "name": "detect-zeroes", + "help": "try to optimize zero writes (off, on, unmap)", + "type": "string" + }, + { + "name": "throttling.group", + "help": "name of the block throttling group", + "type": "string" + }, + { + "name": "throttling.iops-size", + "help": "when limiting by iops max size of an I/O in bytes", + "type": "number" + }, + { + "name": "throttling.bps-write-max-length", + "help": "length of the bps-write-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.bps-read-max-length", + "help": "length of the bps-read-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.bps-total-max-length", + "help": "length of the bps-total-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.iops-write-max-length", + "help": "length of the iops-write-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.iops-read-max-length", + "help": "length of the iops-read-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.iops-total-max-length", + "help": "length of the iops-total-max burst period, in seconds", + "type": "number" + }, + { + "name": "throttling.bps-write-max", + "help": "total bytes write burst", + "type": "number" + }, + { + "name": "throttling.bps-read-max", + "help": "total bytes read burst", + "type": "number" + }, + { + "name": "throttling.bps-total-max", + "help": "total bytes burst", + "type": "number" + }, + { + "name": "throttling.iops-write-max", + "help": "I/O operations write burst", + "type": "number" + }, + { + "name": "throttling.iops-read-max", + "help": "I/O operations read burst", + "type": "number" + }, + { + "name": "throttling.iops-total-max", + "help": "I/O operations burst", + "type": "number" + }, + { + "name": "throttling.bps-write", + "help": "limit write bytes per second", + "type": "number" + }, + { + "name": "throttling.bps-read", + "help": "limit read bytes per second", + "type": "number" + }, + { + "name": "throttling.bps-total", + "help": "limit total bytes per second", + "type": "number" + }, + { + "name": "throttling.iops-write", + "help": "limit write operations per second", + "type": "number" + }, + { + "name": "throttling.iops-read", + "help": "limit read operations per second", + "type": "number" + }, + { + "name": "throttling.iops-total", + "help": "limit total I/O operations per second", + "type": "number" + }, + { + "name": "werror", + "help": "write error action", + "type": "string" + }, + { + "name": "format", + "help": "disk format (raw, qcow2, ...)", + "type": "string" + }, + { + "name": "cache.writeback", + "help": "Enable writeback mode", + "type": "boolean" + }, + { + "name": "aio", + "help": "host AIO implementation (threads, native)", + "type": "string" + }, + { + "name": "snapshot", + "help": "enable/disable snapshot mode", + "type": "boolean" + }, + { + "name": "force-share", + "help": "always accept other writers (default: off)", + "type": "boolean" + }, + { + "name": "discard", + "help": "discard operation (ignore/off, unmap/on)", + "type": "string" + }, + { + "name": "read-only", + "help": "Node is opened in read-only mode", + "type": "boolean" + }, + { + "name": "cache.no-flush", + "help": "Ignore flush requests", + "type": "boolean" + }, + { + "name": "cache.direct", + "help": "Bypass software writeback cache on the host", + "type": "boolean" + }, + { + "name": "driver", + "help": "Block driver to use for the node", + "type": "string" + }, + { + "name": "node-name", + "help": "Node name of the block device node", + "type": "string" + } + ], + "option": "drive" + } + ], + "id": "libvirt-46" +} + +{ + "return": [ + { + "state": false, + "capability": "xbzrle" + }, + { + "state": false, + "capability": "rdma-pin-all" + }, + { + "state": false, + "capability": "auto-converge" + }, + { + "state": false, + "capability": "zero-blocks" + }, + { + "state": false, + "capability": "compress" + }, + { + "state": false, + "capability": "events" + }, + { + "state": false, + "capability": "postcopy-ram" + }, + { + "state": false, + "capability": "x-colo" + }, + { + "state": false, + "capability": "release-ram" + }, + { + "state": false, + "capability": "block" + }, + { + "state": false, + "capability": "return-path" + } + ], + "id": "libvirt-47" +} + +{ + "return": [ + { + "name": "ACPI_DEVICE_OST", + "meta-type": "event", + "arg-type": "0" + }, + { + "name": "BALLOON_CHANGE", + "meta-type": "event", + "arg-type": "1" + }, + { + "name": "BLOCK_IMAGE_CORRUPTED", + "meta-type": "event", + "arg-type": "2" + }, + { + "name": "BLOCK_IO_ERROR", + "meta-type": "event", + "arg-type": "3" + }, + { + "name": "BLOCK_JOB_CANCELLED", + "meta-type": "event", + "arg-type": "4" + }, + { + "name": "BLOCK_JOB_COMPLETED", + "meta-type": "event", + "arg-type": "5" + }, + { + "name": "BLOCK_JOB_ERROR", + "meta-type": "event", + "arg-type": "6" + }, + { + "name": "BLOCK_JOB_READY", + "meta-type": "event", + "arg-type": "7" + }, + { + "name": "BLOCK_WRITE_THRESHOLD", + "meta-type": "event", + "arg-type": "8" + }, + { + "name": "DEVICE_DELETED", + "meta-type": "event", + "arg-type": "9" + }, + { + "name": "DEVICE_TRAY_MOVED", + "meta-type": "event", + "arg-type": "10" + }, + { + "name": "DUMP_COMPLETED", + "meta-type": "event", + "arg-type": "11" + }, + { + "name": "GUEST_PANICKED", + "meta-type": "event", + "arg-type": "12" + }, + { + "name": "MEM_UNPLUG_ERROR", + "meta-type": "event", + "arg-type": "13" + }, + { + "name": "MIGRATION", + "meta-type": "event", + "arg-type": "14" + }, + { + "name": "MIGRATION_PASS", + "meta-type": "event", + "arg-type": "15" + }, + { + "name": "NIC_RX_FILTER_CHANGED", + "meta-type": "event", + "arg-type": "16" + }, + { + "name": "POWERDOWN", + "meta-type": "event", + "arg-type": "17" + }, + { + "name": "QUORUM_FAILURE", + "meta-type": "event", + "arg-type": "18" + }, + { + "name": "QUORUM_REPORT_BAD", + "meta-type": "event", + "arg-type": "19" + }, + { + "name": "RESET", + "meta-type": "event", + "arg-type": "20" + }, + { + "name": "RESUME", + "meta-type": "event", + "arg-type": "17" + }, + { + "name": "RTC_CHANGE", + "meta-type": "event", + "arg-type": "21" + }, + { + "name": "SHUTDOWN", + "meta-type": "event", + "arg-type": "22" + }, + { + "name": "SPICE_CONNECTED", + "meta-type": "event", + "arg-type": "23" + }, + { + "name": "SPICE_DISCONNECTED", + "meta-type": "event", + "arg-type": "24" + }, + { + "name": "SPICE_INITIALIZED", + "meta-type": "event", + "arg-type": "25" + }, + { + "name": "SPICE_MIGRATE_COMPLETED", + "meta-type": "event", + "arg-type": "17" + }, + { + "name": "STOP", + "meta-type": "event", + "arg-type": "17" + }, + { + "name": "SUSPEND", + "meta-type": "event", + "arg-type": "17" + }, + { + "name": "SUSPEND_DISK", + "meta-type": "event", + "arg-type": "17" + }, + { + "name": "VNC_CONNECTED", + "meta-type": "event", + "arg-type": "26" + }, + { + "name": "VNC_DISCONNECTED", + "meta-type": "event", + "arg-type": "27" + }, + { + "name": "VNC_INITIALIZED", + "meta-type": "event", + "arg-type": "28" + }, + { + "name": "VSERPORT_CHANGE", + "meta-type": "event", + "arg-type": "29" + }, + { + "name": "WAKEUP", + "meta-type": "event", + "arg-type": "17" + }, + { + "name": "WATCHDOG", + "meta-type": "event", + "arg-type": "30" + }, + { + "name": "add-fd", + "ret-type": "32", + "meta-type": "command", + "arg-type": "31" + }, + { + "name": "add_client", + "ret-type": "17", + "meta-type": "command", + "arg-type": "33" + }, + { + "name": "balloon", + "ret-type": "17", + "meta-type": "command", + "arg-type": "34" + }, + { + "name": "block-commit", + "ret-type": "17", + "meta-type": "command", + "arg-type": "35" + }, + { + "name": "block-dirty-bitmap-add", + "ret-type": "17", + "meta-type": "command", + "arg-type": "36" + }, + { + "name": "block-dirty-bitmap-clear", + "ret-type": "17", + "meta-type": "command", + "arg-type": "37" + }, + { + "name": "block-dirty-bitmap-remove", + "ret-type": "17", + "meta-type": "command", + "arg-type": "37" + }, + { + "name": "block-job-cancel", + "ret-type": "17", + "meta-type": "command", + "arg-type": "38" + }, + { + "name": "block-job-complete", + "ret-type": "17", + "meta-type": "command", + "arg-type": "39" + }, + { + "name": "block-job-pause", + "ret-type": "17", + "meta-type": "command", + "arg-type": "40" + }, + { + "name": "block-job-resume", + "ret-type": "17", + "meta-type": "command", + "arg-type": "41" + }, + { + "name": "block-job-set-speed", + "ret-type": "17", + "meta-type": "command", + "arg-type": "42" + }, + { + "name": "block-set-write-threshold", + "ret-type": "17", + "meta-type": "command", + "arg-type": "43" + }, + { + "name": "block-stream", + "ret-type": "17", + "meta-type": "command", + "arg-type": "44" + }, + { + "name": "block_passwd", + "ret-type": "17", + "meta-type": "command", + "arg-type": "45" + }, + { + "name": "block_resize", + "ret-type": "17", + "meta-type": "command", + "arg-type": "46" + }, + { + "name": "block_set_io_throttle", + "ret-type": "17", + "meta-type": "command", + "arg-type": "47" + }, + { + "name": "blockdev-add", + "ret-type": "17", + "meta-type": "command", + "arg-type": "48" + }, + { + "name": "blockdev-backup", + "ret-type": "17", + "meta-type": "command", + "arg-type": "49" + }, + { + "name": "blockdev-change-medium", + "ret-type": "17", + "meta-type": "command", + "arg-type": "50" + }, + { + "name": "blockdev-close-tray", + "ret-type": "17", + "meta-type": "command", + "arg-type": "51" + }, + { + "name": "blockdev-del", + "ret-type": "17", + "meta-type": "command", + "arg-type": "52" + }, + { + "name": "blockdev-mirror", + "ret-type": "17", + "meta-type": "command", + "arg-type": "53" + }, + { + "name": "blockdev-open-tray", + "ret-type": "17", + "meta-type": "command", + "arg-type": "54" + }, + { + "name": "blockdev-snapshot", + "ret-type": "17", + "meta-type": "command", + "arg-type": "55" + }, + { + "name": "blockdev-snapshot-delete-internal-sync", + "ret-type": "57", + "meta-type": "command", + "arg-type": "56" + }, + { + "name": "blockdev-snapshot-internal-sync", + "ret-type": "17", + "meta-type": "command", + "arg-type": "58" + }, + { + "name": "blockdev-snapshot-sync", + "ret-type": "17", + "meta-type": "command", + "arg-type": "59" + }, + { + "name": "change", + "ret-type": "17", + "meta-type": "command", + "arg-type": "60" + }, + { + "name": "change-backing-file", + "ret-type": "17", + "meta-type": "command", + "arg-type": "61" + }, + { + "name": "change-vnc-password", + "ret-type": "17", + "meta-type": "command", + "arg-type": "62" + }, + { + "name": "chardev-add", + "ret-type": "64", + "meta-type": "command", + "arg-type": "63" + }, + { + "name": "chardev-change", + "ret-type": "64", + "meta-type": "command", + "arg-type": "65" + }, + { + "name": "chardev-remove", + "ret-type": "17", + "meta-type": "command", + "arg-type": "66" + }, + { + "name": "chardev-send-break", + "ret-type": "17", + "meta-type": "command", + "arg-type": "67" + }, + { + "name": "client_migrate_info", + "ret-type": "17", + "meta-type": "command", + "arg-type": "68" + }, + { + "name": "closefd", + "ret-type": "17", + "meta-type": "command", + "arg-type": "69" + }, + { + "name": "cont", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "cpu", + "ret-type": "17", + "meta-type": "command", + "arg-type": "70" + }, + { + "name": "cpu-add", + "ret-type": "17", + "meta-type": "command", + "arg-type": "71" + }, + { + "name": "device-list-properties", + "ret-type": "[73]", + "meta-type": "command", + "arg-type": "72" + }, + { + "name": "device_add", + "ret-type": "17", + "meta-type": "command", + "arg-type": "74" + }, + { + "name": "device_del", + "ret-type": "17", + "meta-type": "command", + "arg-type": "75" + }, + { + "name": "drive-backup", + "ret-type": "17", + "meta-type": "command", + "arg-type": "76" + }, + { + "name": "drive-mirror", + "ret-type": "17", + "meta-type": "command", + "arg-type": "77" + }, + { + "name": "dump-guest-memory", + "ret-type": "17", + "meta-type": "command", + "arg-type": "78" + }, + { + "name": "dump-skeys", + "ret-type": "17", + "meta-type": "command", + "arg-type": "79" + }, + { + "name": "eject", + "ret-type": "17", + "meta-type": "command", + "arg-type": "80" + }, + { + "name": "expire_password", + "ret-type": "17", + "meta-type": "command", + "arg-type": "81" + }, + { + "name": "getfd", + "ret-type": "17", + "meta-type": "command", + "arg-type": "82" + }, + { + "name": "human-monitor-command", + "ret-type": "str", + "meta-type": "command", + "arg-type": "83" + }, + { + "name": "inject-nmi", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "input-send-event", + "ret-type": "17", + "meta-type": "command", + "arg-type": "84" + }, + { + "name": "memsave", + "ret-type": "17", + "meta-type": "command", + "arg-type": "85" + }, + { + "name": "migrate", + "ret-type": "17", + "meta-type": "command", + "arg-type": "86" + }, + { + "name": "migrate-incoming", + "ret-type": "17", + "meta-type": "command", + "arg-type": "87" + }, + { + "name": "migrate-set-cache-size", + "ret-type": "17", + "meta-type": "command", + "arg-type": "88" + }, + { + "name": "migrate-set-capabilities", + "ret-type": "17", + "meta-type": "command", + "arg-type": "89" + }, + { + "name": "migrate-set-parameters", + "ret-type": "17", + "meta-type": "command", + "arg-type": "90" + }, + { + "name": "migrate-start-postcopy", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "migrate_cancel", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "migrate_set_downtime", + "ret-type": "17", + "meta-type": "command", + "arg-type": "91" + }, + { + "name": "migrate_set_speed", + "ret-type": "17", + "meta-type": "command", + "arg-type": "92" + }, + { + "name": "nbd-server-add", + "ret-type": "17", + "meta-type": "command", + "arg-type": "93" + }, + { + "name": "nbd-server-start", + "ret-type": "17", + "meta-type": "command", + "arg-type": "94" + }, + { + "name": "nbd-server-stop", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "netdev_add", + "ret-type": "17", + "meta-type": "command", + "arg-type": "95" + }, + { + "name": "netdev_del", + "ret-type": "17", + "meta-type": "command", + "arg-type": "96" + }, + { + "name": "object-add", + "ret-type": "17", + "meta-type": "command", + "arg-type": "97" + }, + { + "name": "object-del", + "ret-type": "17", + "meta-type": "command", + "arg-type": "98" + }, + { + "name": "pmemsave", + "ret-type": "17", + "meta-type": "command", + "arg-type": "99" + }, + { + "name": "qmp_capabilities", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "qom-get", + "ret-type": "any", + "meta-type": "command", + "arg-type": "100" + }, + { + "name": "qom-list", + "ret-type": "[102]", + "meta-type": "command", + "arg-type": "101" + }, + { + "name": "qom-list-types", + "ret-type": "[104]", + "meta-type": "command", + "arg-type": "103" + }, + { + "name": "qom-set", + "ret-type": "17", + "meta-type": "command", + "arg-type": "105" + }, + { + "name": "query-acpi-ospm-status", + "ret-type": "[106]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-balloon", + "ret-type": "107", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-block", + "ret-type": "[108]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-block-jobs", + "ret-type": "[109]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-blockstats", + "ret-type": "[111]", + "meta-type": "command", + "arg-type": "110" + }, + { + "name": "query-chardev", + "ret-type": "[112]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-chardev-backends", + "ret-type": "[113]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-command-line-options", + "ret-type": "[115]", + "meta-type": "command", + "arg-type": "114" + }, + { + "name": "query-commands", + "ret-type": "[116]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-cpu-definitions", + "ret-type": "[117]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-cpu-model-baseline", + "ret-type": "119", + "meta-type": "command", + "arg-type": "118" + }, + { + "name": "query-cpu-model-comparison", + "ret-type": "121", + "meta-type": "command", + "arg-type": "120" + }, + { + "name": "query-cpu-model-expansion", + "ret-type": "123", + "meta-type": "command", + "arg-type": "122" + }, + { + "name": "query-cpus", + "ret-type": "[124]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-dump", + "ret-type": "125", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-dump-guest-memory-capability", + "ret-type": "126", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-events", + "ret-type": "[127]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-fdsets", + "ret-type": "[128]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-gic-capabilities", + "ret-type": "[129]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-hotpluggable-cpus", + "ret-type": "[130]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-iothreads", + "ret-type": "[131]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-kvm", + "ret-type": "132", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-machines", + "ret-type": "[133]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-memdev", + "ret-type": "[134]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-memory-devices", + "ret-type": "[135]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-mice", + "ret-type": "[136]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-migrate", + "ret-type": "137", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-migrate-cache-size", + "ret-type": "int", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-migrate-capabilities", + "ret-type": "[138]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-migrate-parameters", + "ret-type": "139", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-name", + "ret-type": "140", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-named-block-nodes", + "ret-type": "[141]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-pci", + "ret-type": "[142]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-qmp-schema", + "ret-type": "[143]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-rocker", + "ret-type": "145", + "meta-type": "command", + "arg-type": "144" + }, + { + "name": "query-rocker-of-dpa-flows", + "ret-type": "[147]", + "meta-type": "command", + "arg-type": "146" + }, + { + "name": "query-rocker-of-dpa-groups", + "ret-type": "[149]", + "meta-type": "command", + "arg-type": "148" + }, + { + "name": "query-rocker-ports", + "ret-type": "[151]", + "meta-type": "command", + "arg-type": "150" + }, + { + "name": "query-rx-filter", + "ret-type": "[153]", + "meta-type": "command", + "arg-type": "152" + }, + { + "name": "query-spice", + "ret-type": "154", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-status", + "ret-type": "155", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-target", + "ret-type": "156", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-tpm", + "ret-type": "[157]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-tpm-models", + "ret-type": "[158]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-tpm-types", + "ret-type": "[159]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-uuid", + "ret-type": "160", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-version", + "ret-type": "161", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-vm-generation-id", + "ret-type": "162", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-vnc", + "ret-type": "163", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-vnc-servers", + "ret-type": "[164]", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "query-xen-replication-status", + "ret-type": "165", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "quit", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "remove-fd", + "ret-type": "17", + "meta-type": "command", + "arg-type": "166" + }, + { + "name": "ringbuf-read", + "ret-type": "str", + "meta-type": "command", + "arg-type": "167" + }, + { + "name": "ringbuf-write", + "ret-type": "17", + "meta-type": "command", + "arg-type": "168" + }, + { + "name": "rtc-reset-reinjection", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "screendump", + "ret-type": "17", + "meta-type": "command", + "arg-type": "169" + }, + { + "name": "send-key", + "ret-type": "17", + "meta-type": "command", + "arg-type": "170" + }, + { + "name": "set_link", + "ret-type": "17", + "meta-type": "command", + "arg-type": "171" + }, + { + "name": "set_password", + "ret-type": "17", + "meta-type": "command", + "arg-type": "172" + }, + { + "name": "stop", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "system_powerdown", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "system_reset", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "system_wakeup", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "trace-event-get-state", + "ret-type": "[174]", + "meta-type": "command", + "arg-type": "173" + }, + { + "name": "trace-event-set-state", + "ret-type": "17", + "meta-type": "command", + "arg-type": "175" + }, + { + "name": "transaction", + "ret-type": "17", + "meta-type": "command", + "arg-type": "176" + }, + { + "name": "x-blockdev-change", + "ret-type": "17", + "meta-type": "command", + "arg-type": "177" + }, + { + "name": "x-blockdev-insert-medium", + "ret-type": "17", + "meta-type": "command", + "arg-type": "178" + }, + { + "name": "x-blockdev-remove-medium", + "ret-type": "17", + "meta-type": "command", + "arg-type": "179" + }, + { + "name": "x-colo-lost-heartbeat", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "x-debug-block-dirty-bitmap-sha256", + "ret-type": "180", + "meta-type": "command", + "arg-type": "37" + }, + { + "name": "xen-colo-do-checkpoint", + "ret-type": "17", + "meta-type": "command", + "arg-type": "17" + }, + { + "name": "xen-load-devices-state", + "ret-type": "17", + "meta-type": "command", + "arg-type": "181" + }, + { + "name": "xen-save-devices-state", + "ret-type": "17", + "meta-type": "command", + "arg-type": "182" + }, + { + "name": "xen-set-global-dirty-log", + "ret-type": "17", + "meta-type": "command", + "arg-type": "183" + }, + { + "name": "xen-set-replication", + "ret-type": "17", + "meta-type": "command", + "arg-type": "184" + }, + { + "name": "0", + "members": [ + { + "name": "info", + "type": "106" + } + ], + "meta-type": "object" + }, + { + "name": "1", + "members": [ + { + "name": "actual", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "2", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "node-name", + "default": null, + "type": "str" + }, + { + "name": "msg", + "type": "str" + }, + { + "name": "offset", + "default": null, + "type": "int" + }, + { + "name": "size", + "default": null, + "type": "int" + }, + { + "name": "fatal", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "3", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "node-name", + "type": "str" + }, + { + "name": "operation", + "type": "185" + }, + { + "name": "action", + "type": "186" + }, + { + "name": "nospace", + "default": null, + "type": "bool" + }, + { + "name": "reason", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "4", + "members": [ + { + "name": "type", + "type": "187" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "len", + "type": "int" + }, + { + "name": "offset", + "type": "int" + }, + { + "name": "speed", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "5", + "members": [ + { + "name": "type", + "type": "187" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "len", + "type": "int" + }, + { + "name": "offset", + "type": "int" + }, + { + "name": "speed", + "type": "int" + }, + { + "name": "error", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "6", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "operation", + "type": "185" + }, + { + "name": "action", + "type": "186" + } + ], + "meta-type": "object" + }, + { + "name": "7", + "members": [ + { + "name": "type", + "type": "187" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "len", + "type": "int" + }, + { + "name": "offset", + "type": "int" + }, + { + "name": "speed", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "8", + "members": [ + { + "name": "node-name", + "type": "str" + }, + { + "name": "amount-exceeded", + "type": "int" + }, + { + "name": "write-threshold", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "9", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "path", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "10", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "id", + "type": "str" + }, + { + "name": "tray-open", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "11", + "members": [ + { + "name": "result", + "type": "125" + }, + { + "name": "error", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "12", + "members": [ + { + "name": "action", + "type": "188" + }, + { + "name": "info", + "default": null, + "type": "189" + } + ], + "meta-type": "object" + }, + { + "name": "13", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "msg", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "14", + "members": [ + { + "name": "status", + "type": "190" + } + ], + "meta-type": "object" + }, + { + "name": "15", + "members": [ + { + "name": "pass", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "16", + "members": [ + { + "name": "name", + "default": null, + "type": "str" + }, + { + "name": "path", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "17", + "members": [ + ], + "meta-type": "object" + }, + { + "name": "18", + "members": [ + { + "name": "reference", + "type": "str" + }, + { + "name": "sector-num", + "type": "int" + }, + { + "name": "sectors-count", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "19", + "members": [ + { + "name": "type", + "type": "191" + }, + { + "name": "error", + "default": null, + "type": "str" + }, + { + "name": "node-name", + "type": "str" + }, + { + "name": "sector-num", + "type": "int" + }, + { + "name": "sectors-count", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "20", + "members": [ + { + "name": "guest", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "21", + "members": [ + { + "name": "offset", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "22", + "members": [ + { + "name": "guest", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "23", + "members": [ + { + "name": "server", + "type": "192" + }, + { + "name": "client", + "type": "192" + } + ], + "meta-type": "object" + }, + { + "name": "24", + "members": [ + { + "name": "server", + "type": "192" + }, + { + "name": "client", + "type": "192" + } + ], + "meta-type": "object" + }, + { + "name": "25", + "members": [ + { + "name": "server", + "type": "193" + }, + { + "name": "client", + "type": "194" + } + ], + "meta-type": "object" + }, + { + "name": "26", + "members": [ + { + "name": "server", + "type": "195" + }, + { + "name": "client", + "type": "196" + } + ], + "meta-type": "object" + }, + { + "name": "27", + "members": [ + { + "name": "server", + "type": "195" + }, + { + "name": "client", + "type": "197" + } + ], + "meta-type": "object" + }, + { + "name": "28", + "members": [ + { + "name": "server", + "type": "195" + }, + { + "name": "client", + "type": "197" + } + ], + "meta-type": "object" + }, + { + "name": "29", + "members": [ + { + "name": "id", + "type": "str" + }, + { + "name": "open", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "30", + "members": [ + { + "name": "action", + "type": "198" + } + ], + "meta-type": "object" + }, + { + "name": "31", + "members": [ + { + "name": "fdset-id", + "default": null, + "type": "int" + }, + { + "name": "opaque", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "32", + "members": [ + { + "name": "fdset-id", + "type": "int" + }, + { + "name": "fd", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "33", + "members": [ + { + "name": "protocol", + "type": "str" + }, + { + "name": "fdname", + "type": "str" + }, + { + "name": "skipauth", + "default": null, + "type": "bool" + }, + { + "name": "tls", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "34", + "members": [ + { + "name": "value", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "35", + "members": [ + { + "name": "job-id", + "default": null, + "type": "str" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "base", + "default": null, + "type": "str" + }, + { + "name": "top", + "default": null, + "type": "str" + }, + { + "name": "backing-file", + "default": null, + "type": "str" + }, + { + "name": "speed", + "default": null, + "type": "int" + }, + { + "name": "filter-node-name", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "36", + "members": [ + { + "name": "node", + "type": "str" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "granularity", + "default": null, + "type": "int" + }, + { + "name": "persistent", + "default": null, + "type": "bool" + }, + { + "name": "autoload", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "37", + "members": [ + { + "name": "node", + "type": "str" + }, + { + "name": "name", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "38", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "force", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "39", + "members": [ + { + "name": "device", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "40", + "members": [ + { + "name": "device", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "41", + "members": [ + { + "name": "device", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "42", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "speed", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "43", + "members": [ + { + "name": "node-name", + "type": "str" + }, + { + "name": "write-threshold", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "44", + "members": [ + { + "name": "job-id", + "default": null, + "type": "str" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "base", + "default": null, + "type": "str" + }, + { + "name": "base-node", + "default": null, + "type": "str" + }, + { + "name": "backing-file", + "default": null, + "type": "str" + }, + { + "name": "speed", + "default": null, + "type": "int" + }, + { + "name": "on-error", + "default": null, + "type": "199" + } + ], + "meta-type": "object" + }, + { + "name": "45", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "node-name", + "default": null, + "type": "str" + }, + { + "name": "password", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "46", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "node-name", + "default": null, + "type": "str" + }, + { + "name": "size", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "47", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "id", + "default": null, + "type": "str" + }, + { + "name": "bps", + "type": "int" + }, + { + "name": "bps_rd", + "type": "int" + }, + { + "name": "bps_wr", + "type": "int" + }, + { + "name": "iops", + "type": "int" + }, + { + "name": "iops_rd", + "type": "int" + }, + { + "name": "iops_wr", + "type": "int" + }, + { + "name": "bps_max", + "default": null, + "type": "int" + }, + { + "name": "bps_rd_max", + "default": null, + "type": "int" + }, + { + "name": "bps_wr_max", + "default": null, + "type": "int" + }, + { + "name": "iops_max", + "default": null, + "type": "int" + }, + { + "name": "iops_rd_max", + "default": null, + "type": "int" + }, + { + "name": "iops_wr_max", + "default": null, + "type": "int" + }, + { + "name": "bps_max_length", + "default": null, + "type": "int" + }, + { + "name": "bps_rd_max_length", + "default": null, + "type": "int" + }, + { + "name": "bps_wr_max_length", + "default": null, + "type": "int" + }, + { + "name": "iops_max_length", + "default": null, + "type": "int" + }, + { + "name": "iops_rd_max_length", + "default": null, + "type": "int" + }, + { + "name": "iops_wr_max_length", + "default": null, + "type": "int" + }, + { + "name": "iops_size", + "default": null, + "type": "int" + }, + { + "name": "group", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "48", + "tag": "driver", + "variants": [ + { + "case": "blkdebug", + "type": "204" + }, + { + "case": "blkverify", + "type": "205" + }, + { + "case": "bochs", + "type": "206" + }, + { + "case": "cloop", + "type": "206" + }, + { + "case": "dmg", + "type": "206" + }, + { + "case": "file", + "type": "207" + }, + { + "case": "ftp", + "type": "208" + }, + { + "case": "ftps", + "type": "209" + }, + { + "case": "gluster", + "type": "210" + }, + { + "case": "host_cdrom", + "type": "207" + }, + { + "case": "host_device", + "type": "207" + }, + { + "case": "http", + "type": "211" + }, + { + "case": "https", + "type": "212" + }, + { + "case": "iscsi", + "type": "213" + }, + { + "case": "luks", + "type": "214" + }, + { + "case": "nbd", + "type": "215" + }, + { + "case": "nfs", + "type": "216" + }, + { + "case": "null-aio", + "type": "217" + }, + { + "case": "null-co", + "type": "217" + }, + { + "case": "parallels", + "type": "206" + }, + { + "case": "qcow2", + "type": "218" + }, + { + "case": "qcow", + "type": "219" + }, + { + "case": "qed", + "type": "220" + }, + { + "case": "quorum", + "type": "221" + }, + { + "case": "raw", + "type": "222" + }, + { + "case": "rbd", + "type": "223" + }, + { + "case": "replication", + "type": "224" + }, + { + "case": "sheepdog", + "type": "225" + }, + { + "case": "ssh", + "type": "226" + }, + { + "case": "vdi", + "type": "206" + }, + { + "case": "vhdx", + "type": "206" + }, + { + "case": "vmdk", + "type": "220" + }, + { + "case": "vpc", + "type": "206" + }, + { + "case": "vvfat", + "type": "227" + }, + { + "case": "vxhs", + "type": "228" + } + ], + "members": [ + { + "name": "driver", + "type": "200" + }, + { + "name": "node-name", + "default": null, + "type": "str" + }, + { + "name": "discard", + "default": null, + "type": "201" + }, + { + "name": "cache", + "default": null, + "type": "202" + }, + { + "name": "read-only", + "default": null, + "type": "bool" + }, + { + "name": "force-share", + "default": null, + "type": "bool" + }, + { + "name": "detect-zeroes", + "default": null, + "type": "203" + } + ], + "meta-type": "object" + }, + { + "name": "49", + "members": [ + { + "name": "job-id", + "default": null, + "type": "str" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "target", + "type": "str" + }, + { + "name": "sync", + "type": "229" + }, + { + "name": "speed", + "default": null, + "type": "int" + }, + { + "name": "compress", + "default": null, + "type": "bool" + }, + { + "name": "on-source-error", + "default": null, + "type": "199" + }, + { + "name": "on-target-error", + "default": null, + "type": "199" + } + ], + "meta-type": "object" + }, + { + "name": "50", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "id", + "default": null, + "type": "str" + }, + { + "name": "filename", + "type": "str" + }, + { + "name": "format", + "default": null, + "type": "str" + }, + { + "name": "read-only-mode", + "default": null, + "type": "230" + } + ], + "meta-type": "object" + }, + { + "name": "51", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "id", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "52", + "members": [ + { + "name": "node-name", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "53", + "members": [ + { + "name": "job-id", + "default": null, + "type": "str" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "target", + "type": "str" + }, + { + "name": "replaces", + "default": null, + "type": "str" + }, + { + "name": "sync", + "type": "229" + }, + { + "name": "speed", + "default": null, + "type": "int" + }, + { + "name": "granularity", + "default": null, + "type": "int" + }, + { + "name": "buf-size", + "default": null, + "type": "int" + }, + { + "name": "on-source-error", + "default": null, + "type": "199" + }, + { + "name": "on-target-error", + "default": null, + "type": "199" + }, + { + "name": "filter-node-name", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "54", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "id", + "default": null, + "type": "str" + }, + { + "name": "force", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "55", + "members": [ + { + "name": "node", + "type": "str" + }, + { + "name": "overlay", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "56", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "id", + "default": null, + "type": "str" + }, + { + "name": "name", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "57", + "members": [ + { + "name": "id", + "type": "str" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "vm-state-size", + "type": "int" + }, + { + "name": "date-sec", + "type": "int" + }, + { + "name": "date-nsec", + "type": "int" + }, + { + "name": "vm-clock-sec", + "type": "int" + }, + { + "name": "vm-clock-nsec", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "58", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "name", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "59", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "node-name", + "default": null, + "type": "str" + }, + { + "name": "snapshot-file", + "type": "str" + }, + { + "name": "snapshot-node-name", + "default": null, + "type": "str" + }, + { + "name": "format", + "default": null, + "type": "str" + }, + { + "name": "mode", + "default": null, + "type": "231" + } + ], + "meta-type": "object" + }, + { + "name": "60", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "target", + "type": "str" + }, + { + "name": "arg", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "61", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "image-node-name", + "type": "str" + }, + { + "name": "backing-file", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "62", + "members": [ + { + "name": "password", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "63", + "members": [ + { + "name": "id", + "type": "str" + }, + { + "name": "backend", + "type": "232" + } + ], + "meta-type": "object" + }, + { + "name": "64", + "members": [ + { + "name": "pty", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "65", + "members": [ + { + "name": "id", + "type": "str" + }, + { + "name": "backend", + "type": "232" + } + ], + "meta-type": "object" + }, + { + "name": "66", + "members": [ + { + "name": "id", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "67", + "members": [ + { + "name": "id", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "68", + "members": [ + { + "name": "protocol", + "type": "str" + }, + { + "name": "hostname", + "type": "str" + }, + { + "name": "port", + "default": null, + "type": "int" + }, + { + "name": "tls-port", + "default": null, + "type": "int" + }, + { + "name": "cert-subject", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "69", + "members": [ + { + "name": "fdname", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "70", + "members": [ + { + "name": "index", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "71", + "members": [ + { + "name": "id", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "72", + "members": [ + { + "name": "typename", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[73]", + "element-type": "73", + "meta-type": "array" + }, + { + "name": "73", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "type", + "type": "str" + }, + { + "name": "description", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "74", + "members": [ + { + "name": "driver", + "type": "str" + }, + { + "name": "bus", + "default": null, + "type": "str" + }, + { + "name": "id", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "75", + "members": [ + { + "name": "id", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "76", + "members": [ + { + "name": "job-id", + "default": null, + "type": "str" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "target", + "type": "str" + }, + { + "name": "format", + "default": null, + "type": "str" + }, + { + "name": "sync", + "type": "229" + }, + { + "name": "mode", + "default": null, + "type": "231" + }, + { + "name": "speed", + "default": null, + "type": "int" + }, + { + "name": "bitmap", + "default": null, + "type": "str" + }, + { + "name": "compress", + "default": null, + "type": "bool" + }, + { + "name": "on-source-error", + "default": null, + "type": "199" + }, + { + "name": "on-target-error", + "default": null, + "type": "199" + } + ], + "meta-type": "object" + }, + { + "name": "77", + "members": [ + { + "name": "job-id", + "default": null, + "type": "str" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "target", + "type": "str" + }, + { + "name": "format", + "default": null, + "type": "str" + }, + { + "name": "node-name", + "default": null, + "type": "str" + }, + { + "name": "replaces", + "default": null, + "type": "str" + }, + { + "name": "sync", + "type": "229" + }, + { + "name": "mode", + "default": null, + "type": "231" + }, + { + "name": "speed", + "default": null, + "type": "int" + }, + { + "name": "granularity", + "default": null, + "type": "int" + }, + { + "name": "buf-size", + "default": null, + "type": "int" + }, + { + "name": "on-source-error", + "default": null, + "type": "199" + }, + { + "name": "on-target-error", + "default": null, + "type": "199" + }, + { + "name": "unmap", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "78", + "members": [ + { + "name": "paging", + "type": "bool" + }, + { + "name": "protocol", + "type": "str" + }, + { + "name": "detach", + "default": null, + "type": "bool" + }, + { + "name": "begin", + "default": null, + "type": "int" + }, + { + "name": "length", + "default": null, + "type": "int" + }, + { + "name": "format", + "default": null, + "type": "233" + } + ], + "meta-type": "object" + }, + { + "name": "79", + "members": [ + { + "name": "filename", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "80", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "id", + "default": null, + "type": "str" + }, + { + "name": "force", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "81", + "members": [ + { + "name": "protocol", + "type": "str" + }, + { + "name": "time", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "82", + "members": [ + { + "name": "fdname", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "83", + "members": [ + { + "name": "command-line", + "type": "str" + }, + { + "name": "cpu-index", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "str", + "json-type": "string", + "meta-type": "builtin" + }, + { + "name": "84", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "head", + "default": null, + "type": "int" + }, + { + "name": "events", + "type": "[234]" + } + ], + "meta-type": "object" + }, + { + "name": "85", + "members": [ + { + "name": "val", + "type": "int" + }, + { + "name": "size", + "type": "int" + }, + { + "name": "filename", + "type": "str" + }, + { + "name": "cpu-index", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "86", + "members": [ + { + "name": "uri", + "type": "str" + }, + { + "name": "blk", + "default": null, + "type": "bool" + }, + { + "name": "inc", + "default": null, + "type": "bool" + }, + { + "name": "detach", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "87", + "members": [ + { + "name": "uri", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "88", + "members": [ + { + "name": "value", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "89", + "members": [ + { + "name": "capabilities", + "type": "[138]" + } + ], + "meta-type": "object" + }, + { + "name": "90", + "members": [ + { + "name": "compress-level", + "default": null, + "type": "int" + }, + { + "name": "compress-threads", + "default": null, + "type": "int" + }, + { + "name": "decompress-threads", + "default": null, + "type": "int" + }, + { + "name": "cpu-throttle-initial", + "default": null, + "type": "int" + }, + { + "name": "cpu-throttle-increment", + "default": null, + "type": "int" + }, + { + "name": "tls-creds", + "default": null, + "type": "235" + }, + { + "name": "tls-hostname", + "default": null, + "type": "235" + }, + { + "name": "max-bandwidth", + "default": null, + "type": "int" + }, + { + "name": "downtime-limit", + "default": null, + "type": "int" + }, + { + "name": "x-checkpoint-delay", + "default": null, + "type": "int" + }, + { + "name": "block-incremental", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "91", + "members": [ + { + "name": "value", + "type": "number" + } + ], + "meta-type": "object" + }, + { + "name": "92", + "members": [ + { + "name": "value", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "93", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "writable", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "94", + "members": [ + { + "name": "addr", + "type": "236" + }, + { + "name": "tls-creds", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "95", + "members": [ + { + "name": "type", + "type": "str" + }, + { + "name": "id", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "96", + "members": [ + { + "name": "id", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "97", + "members": [ + { + "name": "qom-type", + "type": "str" + }, + { + "name": "id", + "type": "str" + }, + { + "name": "props", + "default": null, + "type": "any" + } + ], + "meta-type": "object" + }, + { + "name": "98", + "members": [ + { + "name": "id", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "99", + "members": [ + { + "name": "val", + "type": "int" + }, + { + "name": "size", + "type": "int" + }, + { + "name": "filename", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "100", + "members": [ + { + "name": "path", + "type": "str" + }, + { + "name": "property", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "any", + "json-type": "value", + "meta-type": "builtin" + }, + { + "name": "101", + "members": [ + { + "name": "path", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[102]", + "element-type": "102", + "meta-type": "array" + }, + { + "name": "102", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "type", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "103", + "members": [ + { + "name": "implements", + "default": null, + "type": "str" + }, + { + "name": "abstract", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "[104]", + "element-type": "104", + "meta-type": "array" + }, + { + "name": "104", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "abstract", + "default": null, + "type": "bool" + }, + { + "name": "parent", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "105", + "members": [ + { + "name": "path", + "type": "str" + }, + { + "name": "property", + "type": "str" + }, + { + "name": "value", + "type": "any" + } + ], + "meta-type": "object" + }, + { + "name": "[106]", + "element-type": "106", + "meta-type": "array" + }, + { + "name": "106", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "slot", + "type": "str" + }, + { + "name": "slot-type", + "type": "237" + }, + { + "name": "source", + "type": "int" + }, + { + "name": "status", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "107", + "members": [ + { + "name": "actual", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "[108]", + "element-type": "108", + "meta-type": "array" + }, + { + "name": "108", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "qdev", + "default": null, + "type": "str" + }, + { + "name": "type", + "type": "str" + }, + { + "name": "removable", + "type": "bool" + }, + { + "name": "locked", + "type": "bool" + }, + { + "name": "inserted", + "default": null, + "type": "141" + }, + { + "name": "tray_open", + "default": null, + "type": "bool" + }, + { + "name": "io-status", + "default": null, + "type": "238" + }, + { + "name": "dirty-bitmaps", + "default": null, + "type": "[239]" + } + ], + "meta-type": "object" + }, + { + "name": "[109]", + "element-type": "109", + "meta-type": "array" + }, + { + "name": "109", + "members": [ + { + "name": "type", + "type": "str" + }, + { + "name": "device", + "type": "str" + }, + { + "name": "len", + "type": "int" + }, + { + "name": "offset", + "type": "int" + }, + { + "name": "busy", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "speed", + "type": "int" + }, + { + "name": "io-status", + "type": "238" + }, + { + "name": "ready", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "110", + "members": [ + { + "name": "query-nodes", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "[111]", + "element-type": "111", + "meta-type": "array" + }, + { + "name": "111", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "node-name", + "default": null, + "type": "str" + }, + { + "name": "stats", + "type": "240" + }, + { + "name": "parent", + "default": null, + "type": "111" + }, + { + "name": "backing", + "default": null, + "type": "111" + } + ], + "meta-type": "object" + }, + { + "name": "[112]", + "element-type": "112", + "meta-type": "array" + }, + { + "name": "112", + "members": [ + { + "name": "label", + "type": "str" + }, + { + "name": "filename", + "type": "str" + }, + { + "name": "frontend-open", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "[113]", + "element-type": "113", + "meta-type": "array" + }, + { + "name": "113", + "members": [ + { + "name": "name", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "114", + "members": [ + { + "name": "option", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[115]", + "element-type": "115", + "meta-type": "array" + }, + { + "name": "115", + "members": [ + { + "name": "option", + "type": "str" + }, + { + "name": "parameters", + "type": "[241]" + } + ], + "meta-type": "object" + }, + { + "name": "[116]", + "element-type": "116", + "meta-type": "array" + }, + { + "name": "116", + "members": [ + { + "name": "name", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[117]", + "element-type": "117", + "meta-type": "array" + }, + { + "name": "117", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "migration-safe", + "default": null, + "type": "bool" + }, + { + "name": "static", + "type": "bool" + }, + { + "name": "unavailable-features", + "default": null, + "type": "[str]" + }, + { + "name": "typename", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "118", + "members": [ + { + "name": "modela", + "type": "242" + }, + { + "name": "modelb", + "type": "242" + } + ], + "meta-type": "object" + }, + { + "name": "119", + "members": [ + { + "name": "model", + "type": "242" + } + ], + "meta-type": "object" + }, + { + "name": "120", + "members": [ + { + "name": "modela", + "type": "242" + }, + { + "name": "modelb", + "type": "242" + } + ], + "meta-type": "object" + }, + { + "name": "121", + "members": [ + { + "name": "result", + "type": "243" + }, + { + "name": "responsible-properties", + "type": "[str]" + } + ], + "meta-type": "object" + }, + { + "name": "122", + "members": [ + { + "name": "type", + "type": "244" + }, + { + "name": "model", + "type": "242" + } + ], + "meta-type": "object" + }, + { + "name": "123", + "members": [ + { + "name": "model", + "type": "242" + } + ], + "meta-type": "object" + }, + { + "name": "[124]", + "element-type": "124", + "meta-type": "array" + }, + { + "name": "124", + "tag": "arch", + "variants": [ + { + "case": "x86", + "type": "247" + }, + { + "case": "sparc", + "type": "248" + }, + { + "case": "ppc", + "type": "249" + }, + { + "case": "mips", + "type": "250" + }, + { + "case": "tricore", + "type": "251" + }, + { + "case": "other", + "type": "252" + } + ], + "members": [ + { + "name": "CPU", + "type": "int" + }, + { + "name": "current", + "type": "bool" + }, + { + "name": "halted", + "type": "bool" + }, + { + "name": "qom_path", + "type": "str" + }, + { + "name": "thread_id", + "type": "int" + }, + { + "name": "props", + "default": null, + "type": "245" + }, + { + "name": "arch", + "type": "246" + } + ], + "meta-type": "object" + }, + { + "name": "125", + "members": [ + { + "name": "status", + "type": "253" + }, + { + "name": "completed", + "type": "int" + }, + { + "name": "total", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "126", + "members": [ + { + "name": "formats", + "type": "[233]" + } + ], + "meta-type": "object" + }, + { + "name": "[127]", + "element-type": "127", + "meta-type": "array" + }, + { + "name": "127", + "members": [ + { + "name": "name", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[128]", + "element-type": "128", + "meta-type": "array" + }, + { + "name": "128", + "members": [ + { + "name": "fdset-id", + "type": "int" + }, + { + "name": "fds", + "type": "[254]" + } + ], + "meta-type": "object" + }, + { + "name": "[129]", + "element-type": "129", + "meta-type": "array" + }, + { + "name": "129", + "members": [ + { + "name": "version", + "type": "int" + }, + { + "name": "emulated", + "type": "bool" + }, + { + "name": "kernel", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "[130]", + "element-type": "130", + "meta-type": "array" + }, + { + "name": "130", + "members": [ + { + "name": "type", + "type": "str" + }, + { + "name": "vcpus-count", + "type": "int" + }, + { + "name": "props", + "type": "245" + }, + { + "name": "qom-path", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[131]", + "element-type": "131", + "meta-type": "array" + }, + { + "name": "131", + "members": [ + { + "name": "id", + "type": "str" + }, + { + "name": "thread-id", + "type": "int" + }, + { + "name": "poll-max-ns", + "type": "int" + }, + { + "name": "poll-grow", + "type": "int" + }, + { + "name": "poll-shrink", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "132", + "members": [ + { + "name": "enabled", + "type": "bool" + }, + { + "name": "present", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "[133]", + "element-type": "133", + "meta-type": "array" + }, + { + "name": "133", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "alias", + "default": null, + "type": "str" + }, + { + "name": "is-default", + "default": null, + "type": "bool" + }, + { + "name": "cpu-max", + "type": "int" + }, + { + "name": "hotpluggable-cpus", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "[134]", + "element-type": "134", + "meta-type": "array" + }, + { + "name": "134", + "members": [ + { + "name": "id", + "default": null, + "type": "str" + }, + { + "name": "size", + "type": "int" + }, + { + "name": "merge", + "type": "bool" + }, + { + "name": "dump", + "type": "bool" + }, + { + "name": "prealloc", + "type": "bool" + }, + { + "name": "host-nodes", + "type": "[int]" + }, + { + "name": "policy", + "type": "255" + } + ], + "meta-type": "object" + }, + { + "name": "[135]", + "element-type": "135", + "meta-type": "array" + }, + { + "name": "135", + "tag": "type", + "variants": [ + { + "case": "dimm", + "type": "257" + } + ], + "members": [ + { + "name": "type", + "type": "256" + } + ], + "meta-type": "object" + }, + { + "name": "[136]", + "element-type": "136", + "meta-type": "array" + }, + { + "name": "136", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "index", + "type": "int" + }, + { + "name": "current", + "type": "bool" + }, + { + "name": "absolute", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "137", + "members": [ + { + "name": "status", + "default": null, + "type": "190" + }, + { + "name": "ram", + "default": null, + "type": "258" + }, + { + "name": "disk", + "default": null, + "type": "258" + }, + { + "name": "xbzrle-cache", + "default": null, + "type": "259" + }, + { + "name": "total-time", + "default": null, + "type": "int" + }, + { + "name": "expected-downtime", + "default": null, + "type": "int" + }, + { + "name": "downtime", + "default": null, + "type": "int" + }, + { + "name": "setup-time", + "default": null, + "type": "int" + }, + { + "name": "cpu-throttle-percentage", + "default": null, + "type": "int" + }, + { + "name": "error-desc", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "int", + "json-type": "int", + "meta-type": "builtin" + }, + { + "name": "[138]", + "element-type": "138", + "meta-type": "array" + }, + { + "name": "138", + "members": [ + { + "name": "capability", + "type": "260" + }, + { + "name": "state", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "139", + "members": [ + { + "name": "compress-level", + "default": null, + "type": "int" + }, + { + "name": "compress-threads", + "default": null, + "type": "int" + }, + { + "name": "decompress-threads", + "default": null, + "type": "int" + }, + { + "name": "cpu-throttle-initial", + "default": null, + "type": "int" + }, + { + "name": "cpu-throttle-increment", + "default": null, + "type": "int" + }, + { + "name": "tls-creds", + "default": null, + "type": "str" + }, + { + "name": "tls-hostname", + "default": null, + "type": "str" + }, + { + "name": "max-bandwidth", + "default": null, + "type": "int" + }, + { + "name": "downtime-limit", + "default": null, + "type": "int" + }, + { + "name": "x-checkpoint-delay", + "default": null, + "type": "int" + }, + { + "name": "block-incremental", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "140", + "members": [ + { + "name": "name", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[141]", + "element-type": "141", + "meta-type": "array" + }, + { + "name": "141", + "members": [ + { + "name": "file", + "type": "str" + }, + { + "name": "node-name", + "default": null, + "type": "str" + }, + { + "name": "ro", + "type": "bool" + }, + { + "name": "drv", + "type": "str" + }, + { + "name": "backing_file", + "default": null, + "type": "str" + }, + { + "name": "backing_file_depth", + "type": "int" + }, + { + "name": "encrypted", + "type": "bool" + }, + { + "name": "encryption_key_missing", + "type": "bool" + }, + { + "name": "detect_zeroes", + "type": "203" + }, + { + "name": "bps", + "type": "int" + }, + { + "name": "bps_rd", + "type": "int" + }, + { + "name": "bps_wr", + "type": "int" + }, + { + "name": "iops", + "type": "int" + }, + { + "name": "iops_rd", + "type": "int" + }, + { + "name": "iops_wr", + "type": "int" + }, + { + "name": "image", + "type": "261" + }, + { + "name": "bps_max", + "default": null, + "type": "int" + }, + { + "name": "bps_rd_max", + "default": null, + "type": "int" + }, + { + "name": "bps_wr_max", + "default": null, + "type": "int" + }, + { + "name": "iops_max", + "default": null, + "type": "int" + }, + { + "name": "iops_rd_max", + "default": null, + "type": "int" + }, + { + "name": "iops_wr_max", + "default": null, + "type": "int" + }, + { + "name": "bps_max_length", + "default": null, + "type": "int" + }, + { + "name": "bps_rd_max_length", + "default": null, + "type": "int" + }, + { + "name": "bps_wr_max_length", + "default": null, + "type": "int" + }, + { + "name": "iops_max_length", + "default": null, + "type": "int" + }, + { + "name": "iops_rd_max_length", + "default": null, + "type": "int" + }, + { + "name": "iops_wr_max_length", + "default": null, + "type": "int" + }, + { + "name": "iops_size", + "default": null, + "type": "int" + }, + { + "name": "group", + "default": null, + "type": "str" + }, + { + "name": "cache", + "type": "262" + }, + { + "name": "write_threshold", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "[142]", + "element-type": "142", + "meta-type": "array" + }, + { + "name": "142", + "members": [ + { + "name": "bus", + "type": "int" + }, + { + "name": "devices", + "type": "[263]" + } + ], + "meta-type": "object" + }, + { + "name": "[143]", + "element-type": "143", + "meta-type": "array" + }, + { + "name": "143", + "tag": "meta-type", + "variants": [ + { + "case": "builtin", + "type": "265" + }, + { + "case": "enum", + "type": "266" + }, + { + "case": "array", + "type": "267" + }, + { + "case": "object", + "type": "268" + }, + { + "case": "alternate", + "type": "269" + }, + { + "case": "command", + "type": "270" + }, + { + "case": "event", + "type": "271" + } + ], + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "meta-type", + "type": "264" + } + ], + "meta-type": "object" + }, + { + "name": "144", + "members": [ + { + "name": "name", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "145", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "id", + "type": "int" + }, + { + "name": "ports", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "146", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "tbl-id", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "[147]", + "element-type": "147", + "meta-type": "array" + }, + { + "name": "147", + "members": [ + { + "name": "cookie", + "type": "int" + }, + { + "name": "hits", + "type": "int" + }, + { + "name": "key", + "type": "272" + }, + { + "name": "mask", + "type": "273" + }, + { + "name": "action", + "type": "274" + } + ], + "meta-type": "object" + }, + { + "name": "148", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "type", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "[149]", + "element-type": "149", + "meta-type": "array" + }, + { + "name": "149", + "members": [ + { + "name": "id", + "type": "int" + }, + { + "name": "type", + "type": "int" + }, + { + "name": "vlan-id", + "default": null, + "type": "int" + }, + { + "name": "pport", + "default": null, + "type": "int" + }, + { + "name": "index", + "default": null, + "type": "int" + }, + { + "name": "out-pport", + "default": null, + "type": "int" + }, + { + "name": "group-id", + "default": null, + "type": "int" + }, + { + "name": "set-vlan-id", + "default": null, + "type": "int" + }, + { + "name": "pop-vlan", + "default": null, + "type": "int" + }, + { + "name": "group-ids", + "default": null, + "type": "[int]" + }, + { + "name": "set-eth-src", + "default": null, + "type": "str" + }, + { + "name": "set-eth-dst", + "default": null, + "type": "str" + }, + { + "name": "ttl-check", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "150", + "members": [ + { + "name": "name", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[151]", + "element-type": "151", + "meta-type": "array" + }, + { + "name": "151", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "enabled", + "type": "bool" + }, + { + "name": "link-up", + "type": "bool" + }, + { + "name": "speed", + "type": "int" + }, + { + "name": "duplex", + "type": "275" + }, + { + "name": "autoneg", + "type": "276" + } + ], + "meta-type": "object" + }, + { + "name": "152", + "members": [ + { + "name": "name", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[153]", + "element-type": "153", + "meta-type": "array" + }, + { + "name": "153", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "promiscuous", + "type": "bool" + }, + { + "name": "multicast", + "type": "277" + }, + { + "name": "unicast", + "type": "277" + }, + { + "name": "vlan", + "type": "277" + }, + { + "name": "broadcast-allowed", + "type": "bool" + }, + { + "name": "multicast-overflow", + "type": "bool" + }, + { + "name": "unicast-overflow", + "type": "bool" + }, + { + "name": "main-mac", + "type": "str" + }, + { + "name": "vlan-table", + "type": "[int]" + }, + { + "name": "unicast-table", + "type": "[str]" + }, + { + "name": "multicast-table", + "type": "[str]" + } + ], + "meta-type": "object" + }, + { + "name": "154", + "members": [ + { + "name": "enabled", + "type": "bool" + }, + { + "name": "migrated", + "type": "bool" + }, + { + "name": "host", + "default": null, + "type": "str" + }, + { + "name": "port", + "default": null, + "type": "int" + }, + { + "name": "tls-port", + "default": null, + "type": "int" + }, + { + "name": "auth", + "default": null, + "type": "str" + }, + { + "name": "compiled-version", + "default": null, + "type": "str" + }, + { + "name": "mouse-mode", + "type": "278" + }, + { + "name": "channels", + "default": null, + "type": "[194]" + } + ], + "meta-type": "object" + }, + { + "name": "155", + "members": [ + { + "name": "running", + "type": "bool" + }, + { + "name": "singlestep", + "type": "bool" + }, + { + "name": "status", + "type": "279" + } + ], + "meta-type": "object" + }, + { + "name": "156", + "members": [ + { + "name": "arch", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[157]", + "element-type": "157", + "meta-type": "array" + }, + { + "name": "157", + "members": [ + { + "name": "id", + "type": "str" + }, + { + "name": "model", + "type": "158" + }, + { + "name": "options", + "type": "280" + } + ], + "meta-type": "object" + }, + { + "name": "[158]", + "element-type": "158", + "meta-type": "array" + }, + { + "name": "158", + "meta-type": "enum", + "values": [ + "tpm-tis" + ] + }, + { + "name": "[159]", + "element-type": "159", + "meta-type": "array" + }, + { + "name": "159", + "meta-type": "enum", + "values": [ + "passthrough" + ] + }, + { + "name": "160", + "members": [ + { + "name": "UUID", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "161", + "members": [ + { + "name": "qemu", + "type": "281" + }, + { + "name": "package", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "162", + "members": [ + { + "name": "guid", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "163", + "members": [ + { + "name": "enabled", + "type": "bool" + }, + { + "name": "host", + "default": null, + "type": "str" + }, + { + "name": "family", + "default": null, + "type": "282" + }, + { + "name": "service", + "default": null, + "type": "str" + }, + { + "name": "auth", + "default": null, + "type": "str" + }, + { + "name": "clients", + "default": null, + "type": "[197]" + } + ], + "meta-type": "object" + }, + { + "name": "[164]", + "element-type": "164", + "meta-type": "array" + }, + { + "name": "164", + "members": [ + { + "name": "id", + "type": "str" + }, + { + "name": "server", + "type": "[283]" + }, + { + "name": "clients", + "type": "[197]" + }, + { + "name": "auth", + "type": "284" + }, + { + "name": "vencrypt", + "default": null, + "type": "285" + }, + { + "name": "display", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "165", + "members": [ + { + "name": "error", + "type": "bool" + }, + { + "name": "desc", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "166", + "members": [ + { + "name": "fdset-id", + "type": "int" + }, + { + "name": "fd", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "167", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "size", + "type": "int" + }, + { + "name": "format", + "default": null, + "type": "286" + } + ], + "meta-type": "object" + }, + { + "name": "168", + "members": [ + { + "name": "device", + "type": "str" + }, + { + "name": "data", + "type": "str" + }, + { + "name": "format", + "default": null, + "type": "286" + } + ], + "meta-type": "object" + }, + { + "name": "169", + "members": [ + { + "name": "filename", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "170", + "members": [ + { + "name": "keys", + "type": "[287]" + }, + { + "name": "hold-time", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "171", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "up", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "172", + "members": [ + { + "name": "protocol", + "type": "str" + }, + { + "name": "password", + "type": "str" + }, + { + "name": "connected", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "173", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "vcpu", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "[174]", + "element-type": "174", + "meta-type": "array" + }, + { + "name": "174", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "state", + "type": "288" + }, + { + "name": "vcpu", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "175", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "enable", + "type": "bool" + }, + { + "name": "ignore-unavailable", + "default": null, + "type": "bool" + }, + { + "name": "vcpu", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "176", + "members": [ + { + "name": "actions", + "type": "[289]" + }, + { + "name": "properties", + "default": null, + "type": "290" + } + ], + "meta-type": "object" + }, + { + "name": "177", + "members": [ + { + "name": "parent", + "type": "str" + }, + { + "name": "child", + "default": null, + "type": "str" + }, + { + "name": "node", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "178", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "id", + "default": null, + "type": "str" + }, + { + "name": "node-name", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "179", + "members": [ + { + "name": "device", + "default": null, + "type": "str" + }, + { + "name": "id", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "180", + "members": [ + { + "name": "sha256", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "181", + "members": [ + { + "name": "filename", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "182", + "members": [ + { + "name": "filename", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "183", + "members": [ + { + "name": "enable", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "184", + "members": [ + { + "name": "enable", + "type": "bool" + }, + { + "name": "primary", + "type": "bool" + }, + { + "name": "failover", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "bool", + "json-type": "boolean", + "meta-type": "builtin" + }, + { + "name": "185", + "meta-type": "enum", + "values": [ + "read", + "write" + ] + }, + { + "name": "186", + "meta-type": "enum", + "values": [ + "ignore", + "report", + "stop" + ] + }, + { + "name": "187", + "meta-type": "enum", + "values": [ + "commit", + "stream", + "mirror", + "backup" + ] + }, + { + "name": "188", + "meta-type": "enum", + "values": [ + "pause", + "poweroff" + ] + }, + { + "name": "189", + "tag": "type", + "variants": [ + { + "case": "hyper-v", + "type": "292" + } + ], + "members": [ + { + "name": "type", + "type": "291" + } + ], + "meta-type": "object" + }, + { + "name": "190", + "meta-type": "enum", + "values": [ + "none", + "setup", + "cancelling", + "cancelled", + "active", + "postcopy-active", + "completed", + "failed", + "colo" + ] + }, + { + "name": "191", + "meta-type": "enum", + "values": [ + "read", + "write", + "flush" + ] + }, + { + "name": "192", + "members": [ + { + "name": "host", + "type": "str" + }, + { + "name": "port", + "type": "str" + }, + { + "name": "family", + "type": "282" + } + ], + "meta-type": "object" + }, + { + "name": "193", + "members": [ + { + "name": "host", + "type": "str" + }, + { + "name": "port", + "type": "str" + }, + { + "name": "family", + "type": "282" + }, + { + "name": "auth", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "194", + "members": [ + { + "name": "host", + "type": "str" + }, + { + "name": "port", + "type": "str" + }, + { + "name": "family", + "type": "282" + }, + { + "name": "connection-id", + "type": "int" + }, + { + "name": "channel-type", + "type": "int" + }, + { + "name": "channel-id", + "type": "int" + }, + { + "name": "tls", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "195", + "members": [ + { + "name": "host", + "type": "str" + }, + { + "name": "service", + "type": "str" + }, + { + "name": "family", + "type": "282" + }, + { + "name": "websocket", + "type": "bool" + }, + { + "name": "auth", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "196", + "members": [ + { + "name": "host", + "type": "str" + }, + { + "name": "service", + "type": "str" + }, + { + "name": "family", + "type": "282" + }, + { + "name": "websocket", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "197", + "members": [ + { + "name": "host", + "type": "str" + }, + { + "name": "service", + "type": "str" + }, + { + "name": "family", + "type": "282" + }, + { + "name": "websocket", + "type": "bool" + }, + { + "name": "x509_dname", + "default": null, + "type": "str" + }, + { + "name": "sasl_username", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "198", + "meta-type": "enum", + "values": [ + "reset", + "shutdown", + "poweroff", + "pause", + "debug", + "none", + "inject-nmi" + ] + }, + { + "name": "199", + "meta-type": "enum", + "values": [ + "report", + "ignore", + "enospc", + "stop", + "auto" + ] + }, + { + "name": "200", + "meta-type": "enum", + "values": [ + "blkdebug", + "blkverify", + "bochs", + "cloop", + "dmg", + "file", + "ftp", + "ftps", + "gluster", + "host_cdrom", + "host_device", + "http", + "https", + "iscsi", + "luks", + "nbd", + "nfs", + "null-aio", + "null-co", + "parallels", + "qcow", + "qcow2", + "qed", + "quorum", + "raw", + "rbd", + "replication", + "sheepdog", + "ssh", + "vdi", + "vhdx", + "vmdk", + "vpc", + "vvfat", + "vxhs" + ] + }, + { + "name": "201", + "meta-type": "enum", + "values": [ + "ignore", + "unmap" + ] + }, + { + "name": "202", + "members": [ + { + "name": "direct", + "default": null, + "type": "bool" + }, + { + "name": "no-flush", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "203", + "meta-type": "enum", + "values": [ + "off", + "on", + "unmap" + ] + }, + { + "name": "204", + "members": [ + { + "name": "image", + "type": "293" + }, + { + "name": "config", + "default": null, + "type": "str" + }, + { + "name": "align", + "default": null, + "type": "int" + }, + { + "name": "max-transfer", + "default": null, + "type": "int" + }, + { + "name": "opt-write-zero", + "default": null, + "type": "int" + }, + { + "name": "max-write-zero", + "default": null, + "type": "int" + }, + { + "name": "opt-discard", + "default": null, + "type": "int" + }, + { + "name": "max-discard", + "default": null, + "type": "int" + }, + { + "name": "inject-error", + "default": null, + "type": "[294]" + }, + { + "name": "set-state", + "default": null, + "type": "[295]" + } + ], + "meta-type": "object" + }, + { + "name": "205", + "members": [ + { + "name": "test", + "type": "293" + }, + { + "name": "raw", + "type": "293" + } + ], + "meta-type": "object" + }, + { + "name": "206", + "members": [ + { + "name": "file", + "type": "293" + } + ], + "meta-type": "object" + }, + { + "name": "207", + "members": [ + { + "name": "filename", + "type": "str" + }, + { + "name": "locking", + "default": null, + "type": "296" + }, + { + "name": "aio", + "default": null, + "type": "297" + } + ], + "meta-type": "object" + }, + { + "name": "208", + "members": [ + { + "name": "url", + "type": "str" + }, + { + "name": "readahead", + "default": null, + "type": "int" + }, + { + "name": "timeout", + "default": null, + "type": "int" + }, + { + "name": "username", + "default": null, + "type": "str" + }, + { + "name": "password-secret", + "default": null, + "type": "str" + }, + { + "name": "proxy-username", + "default": null, + "type": "str" + }, + { + "name": "proxy-password-secret", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "209", + "members": [ + { + "name": "url", + "type": "str" + }, + { + "name": "readahead", + "default": null, + "type": "int" + }, + { + "name": "timeout", + "default": null, + "type": "int" + }, + { + "name": "username", + "default": null, + "type": "str" + }, + { + "name": "password-secret", + "default": null, + "type": "str" + }, + { + "name": "proxy-username", + "default": null, + "type": "str" + }, + { + "name": "proxy-password-secret", + "default": null, + "type": "str" + }, + { + "name": "sslverify", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "210", + "members": [ + { + "name": "volume", + "type": "str" + }, + { + "name": "path", + "type": "str" + }, + { + "name": "server", + "type": "[298]" + }, + { + "name": "debug", + "default": null, + "type": "int" + }, + { + "name": "logfile", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "211", + "members": [ + { + "name": "url", + "type": "str" + }, + { + "name": "readahead", + "default": null, + "type": "int" + }, + { + "name": "timeout", + "default": null, + "type": "int" + }, + { + "name": "username", + "default": null, + "type": "str" + }, + { + "name": "password-secret", + "default": null, + "type": "str" + }, + { + "name": "proxy-username", + "default": null, + "type": "str" + }, + { + "name": "proxy-password-secret", + "default": null, + "type": "str" + }, + { + "name": "cookie", + "default": null, + "type": "str" + }, + { + "name": "cookie-secret", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "212", + "members": [ + { + "name": "url", + "type": "str" + }, + { + "name": "readahead", + "default": null, + "type": "int" + }, + { + "name": "timeout", + "default": null, + "type": "int" + }, + { + "name": "username", + "default": null, + "type": "str" + }, + { + "name": "password-secret", + "default": null, + "type": "str" + }, + { + "name": "proxy-username", + "default": null, + "type": "str" + }, + { + "name": "proxy-password-secret", + "default": null, + "type": "str" + }, + { + "name": "cookie", + "default": null, + "type": "str" + }, + { + "name": "sslverify", + "default": null, + "type": "bool" + }, + { + "name": "cookie-secret", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "213", + "members": [ + { + "name": "transport", + "type": "299" + }, + { + "name": "portal", + "type": "str" + }, + { + "name": "target", + "type": "str" + }, + { + "name": "lun", + "default": null, + "type": "int" + }, + { + "name": "user", + "default": null, + "type": "str" + }, + { + "name": "password-secret", + "default": null, + "type": "str" + }, + { + "name": "initiator-name", + "default": null, + "type": "str" + }, + { + "name": "header-digest", + "default": null, + "type": "300" + }, + { + "name": "timeout", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "214", + "members": [ + { + "name": "file", + "type": "293" + }, + { + "name": "key-secret", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "215", + "members": [ + { + "name": "server", + "type": "298" + }, + { + "name": "export", + "default": null, + "type": "str" + }, + { + "name": "tls-creds", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "216", + "members": [ + { + "name": "server", + "type": "301" + }, + { + "name": "path", + "type": "str" + }, + { + "name": "user", + "default": null, + "type": "int" + }, + { + "name": "group", + "default": null, + "type": "int" + }, + { + "name": "tcp-syn-count", + "default": null, + "type": "int" + }, + { + "name": "readahead-size", + "default": null, + "type": "int" + }, + { + "name": "page-cache-size", + "default": null, + "type": "int" + }, + { + "name": "debug", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "217", + "members": [ + { + "name": "size", + "default": null, + "type": "int" + }, + { + "name": "latency-ns", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "218", + "members": [ + { + "name": "file", + "type": "293" + }, + { + "name": "backing", + "default": null, + "type": "302" + }, + { + "name": "lazy-refcounts", + "default": null, + "type": "bool" + }, + { + "name": "pass-discard-request", + "default": null, + "type": "bool" + }, + { + "name": "pass-discard-snapshot", + "default": null, + "type": "bool" + }, + { + "name": "pass-discard-other", + "default": null, + "type": "bool" + }, + { + "name": "overlap-check", + "default": null, + "type": "303" + }, + { + "name": "cache-size", + "default": null, + "type": "int" + }, + { + "name": "l2-cache-size", + "default": null, + "type": "int" + }, + { + "name": "refcount-cache-size", + "default": null, + "type": "int" + }, + { + "name": "cache-clean-interval", + "default": null, + "type": "int" + }, + { + "name": "encrypt", + "default": null, + "type": "304" + } + ], + "meta-type": "object" + }, + { + "name": "219", + "members": [ + { + "name": "file", + "type": "293" + }, + { + "name": "backing", + "default": null, + "type": "302" + }, + { + "name": "encrypt", + "default": null, + "type": "305" + } + ], + "meta-type": "object" + }, + { + "name": "220", + "members": [ + { + "name": "file", + "type": "293" + }, + { + "name": "backing", + "default": null, + "type": "302" + } + ], + "meta-type": "object" + }, + { + "name": "221", + "members": [ + { + "name": "blkverify", + "default": null, + "type": "bool" + }, + { + "name": "children", + "type": "[293]" + }, + { + "name": "vote-threshold", + "type": "int" + }, + { + "name": "rewrite-corrupted", + "default": null, + "type": "bool" + }, + { + "name": "read-pattern", + "default": null, + "type": "306" + } + ], + "meta-type": "object" + }, + { + "name": "222", + "members": [ + { + "name": "file", + "type": "293" + }, + { + "name": "offset", + "default": null, + "type": "int" + }, + { + "name": "size", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "223", + "members": [ + { + "name": "pool", + "type": "str" + }, + { + "name": "image", + "type": "str" + }, + { + "name": "conf", + "default": null, + "type": "str" + }, + { + "name": "snapshot", + "default": null, + "type": "str" + }, + { + "name": "user", + "default": null, + "type": "str" + }, + { + "name": "server", + "default": null, + "type": "[307]" + } + ], + "meta-type": "object" + }, + { + "name": "224", + "members": [ + { + "name": "file", + "type": "293" + }, + { + "name": "mode", + "type": "308" + }, + { + "name": "top-id", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "225", + "members": [ + { + "name": "server", + "type": "298" + }, + { + "name": "vdi", + "type": "str" + }, + { + "name": "snap-id", + "default": null, + "type": "int" + }, + { + "name": "tag", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "226", + "members": [ + { + "name": "server", + "type": "309" + }, + { + "name": "path", + "type": "str" + }, + { + "name": "user", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "227", + "members": [ + { + "name": "dir", + "type": "str" + }, + { + "name": "fat-type", + "default": null, + "type": "int" + }, + { + "name": "floppy", + "default": null, + "type": "bool" + }, + { + "name": "label", + "default": null, + "type": "str" + }, + { + "name": "rw", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "228", + "members": [ + { + "name": "vdisk-id", + "type": "str" + }, + { + "name": "server", + "type": "307" + }, + { + "name": "tls-creds", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "229", + "meta-type": "enum", + "values": [ + "top", + "full", + "none", + "incremental" + ] + }, + { + "name": "230", + "meta-type": "enum", + "values": [ + "retain", + "read-only", + "read-write" + ] + }, + { + "name": "231", + "meta-type": "enum", + "values": [ + "existing", + "absolute-paths" + ] + }, + { + "name": "232", + "tag": "type", + "variants": [ + { + "case": "file", + "type": "311" + }, + { + "case": "serial", + "type": "312" + }, + { + "case": "parallel", + "type": "312" + }, + { + "case": "pipe", + "type": "312" + }, + { + "case": "socket", + "type": "313" + }, + { + "case": "udp", + "type": "314" + }, + { + "case": "pty", + "type": "315" + }, + { + "case": "null", + "type": "315" + }, + { + "case": "mux", + "type": "316" + }, + { + "case": "msmouse", + "type": "315" + }, + { + "case": "wctablet", + "type": "315" + }, + { + "case": "braille", + "type": "315" + }, + { + "case": "testdev", + "type": "315" + }, + { + "case": "stdio", + "type": "317" + }, + { + "case": "console", + "type": "315" + }, + { + "case": "spicevmc", + "type": "318" + }, + { + "case": "spiceport", + "type": "319" + }, + { + "case": "vc", + "type": "320" + }, + { + "case": "ringbuf", + "type": "321" + }, + { + "case": "memory", + "type": "321" + } + ], + "members": [ + { + "name": "type", + "type": "310" + } + ], + "meta-type": "object" + }, + { + "name": "233", + "meta-type": "enum", + "values": [ + "elf", + "kdump-zlib", + "kdump-lzo", + "kdump-snappy" + ] + }, + { + "name": "[234]", + "element-type": "234", + "meta-type": "array" + }, + { + "name": "234", + "tag": "type", + "variants": [ + { + "case": "key", + "type": "323" + }, + { + "case": "btn", + "type": "324" + }, + { + "case": "rel", + "type": "325" + }, + { + "case": "abs", + "type": "325" + } + ], + "members": [ + { + "name": "type", + "type": "322" + } + ], + "meta-type": "object" + }, + { + "name": "235", + "members": [ + { + "type": "str" + }, + { + "type": "null" + } + ], + "meta-type": "alternate" + }, + { + "name": "number", + "json-type": "number", + "meta-type": "builtin" + }, + { + "name": "236", + "tag": "type", + "variants": [ + { + "case": "inet", + "type": "327" + }, + { + "case": "unix", + "type": "328" + }, + { + "case": "vsock", + "type": "329" + }, + { + "case": "fd", + "type": "330" + } + ], + "members": [ + { + "name": "type", + "type": "326" + } + ], + "meta-type": "object" + }, + { + "name": "237", + "meta-type": "enum", + "values": [ + "DIMM", + "CPU" + ] + }, + { + "name": "238", + "meta-type": "enum", + "values": [ + "ok", + "failed", + "nospace" + ] + }, + { + "name": "[239]", + "element-type": "239", + "meta-type": "array" + }, + { + "name": "239", + "members": [ + { + "name": "name", + "default": null, + "type": "str" + }, + { + "name": "count", + "type": "int" + }, + { + "name": "granularity", + "type": "int" + }, + { + "name": "status", + "type": "331" + } + ], + "meta-type": "object" + }, + { + "name": "240", + "members": [ + { + "name": "rd_bytes", + "type": "int" + }, + { + "name": "wr_bytes", + "type": "int" + }, + { + "name": "rd_operations", + "type": "int" + }, + { + "name": "wr_operations", + "type": "int" + }, + { + "name": "flush_operations", + "type": "int" + }, + { + "name": "flush_total_time_ns", + "type": "int" + }, + { + "name": "wr_total_time_ns", + "type": "int" + }, + { + "name": "rd_total_time_ns", + "type": "int" + }, + { + "name": "wr_highest_offset", + "type": "int" + }, + { + "name": "rd_merged", + "type": "int" + }, + { + "name": "wr_merged", + "type": "int" + }, + { + "name": "idle_time_ns", + "default": null, + "type": "int" + }, + { + "name": "failed_rd_operations", + "type": "int" + }, + { + "name": "failed_wr_operations", + "type": "int" + }, + { + "name": "failed_flush_operations", + "type": "int" + }, + { + "name": "invalid_rd_operations", + "type": "int" + }, + { + "name": "invalid_wr_operations", + "type": "int" + }, + { + "name": "invalid_flush_operations", + "type": "int" + }, + { + "name": "account_invalid", + "type": "bool" + }, + { + "name": "account_failed", + "type": "bool" + }, + { + "name": "timed_stats", + "type": "[332]" + } + ], + "meta-type": "object" + }, + { + "name": "[241]", + "element-type": "241", + "meta-type": "array" + }, + { + "name": "241", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "type", + "type": "333" + }, + { + "name": "help", + "default": null, + "type": "str" + }, + { + "name": "default", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[str]", + "element-type": "str", + "meta-type": "array" + }, + { + "name": "242", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "props", + "default": null, + "type": "any" + } + ], + "meta-type": "object" + }, + { + "name": "243", + "meta-type": "enum", + "values": [ + "incompatible", + "identical", + "superset", + "subset" + ] + }, + { + "name": "244", + "meta-type": "enum", + "values": [ + "static", + "full" + ] + }, + { + "name": "245", + "members": [ + { + "name": "node-id", + "default": null, + "type": "int" + }, + { + "name": "socket-id", + "default": null, + "type": "int" + }, + { + "name": "core-id", + "default": null, + "type": "int" + }, + { + "name": "thread-id", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "246", + "meta-type": "enum", + "values": [ + "x86", + "sparc", + "ppc", + "mips", + "tricore", + "other" + ] + }, + { + "name": "247", + "members": [ + { + "name": "pc", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "248", + "members": [ + { + "name": "pc", + "type": "int" + }, + { + "name": "npc", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "249", + "members": [ + { + "name": "nip", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "250", + "members": [ + { + "name": "PC", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "251", + "members": [ + { + "name": "PC", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "252", + "members": [ + ], + "meta-type": "object" + }, + { + "name": "253", + "meta-type": "enum", + "values": [ + "none", + "active", + "completed", + "failed" + ] + }, + { + "name": "[233]", + "element-type": "233", + "meta-type": "array" + }, + { + "name": "[254]", + "element-type": "254", + "meta-type": "array" + }, + { + "name": "254", + "members": [ + { + "name": "fd", + "type": "int" + }, + { + "name": "opaque", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[int]", + "element-type": "int", + "meta-type": "array" + }, + { + "name": "255", + "meta-type": "enum", + "values": [ + "default", + "preferred", + "bind", + "interleave" + ] + }, + { + "name": "256", + "meta-type": "enum", + "values": [ + "dimm" + ] + }, + { + "name": "257", + "members": [ + { + "name": "data", + "type": "334" + } + ], + "meta-type": "object" + }, + { + "name": "258", + "members": [ + { + "name": "transferred", + "type": "int" + }, + { + "name": "remaining", + "type": "int" + }, + { + "name": "total", + "type": "int" + }, + { + "name": "duplicate", + "type": "int" + }, + { + "name": "skipped", + "type": "int" + }, + { + "name": "normal", + "type": "int" + }, + { + "name": "normal-bytes", + "type": "int" + }, + { + "name": "dirty-pages-rate", + "type": "int" + }, + { + "name": "mbps", + "type": "number" + }, + { + "name": "dirty-sync-count", + "type": "int" + }, + { + "name": "postcopy-requests", + "type": "int" + }, + { + "name": "page-size", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "259", + "members": [ + { + "name": "cache-size", + "type": "int" + }, + { + "name": "bytes", + "type": "int" + }, + { + "name": "pages", + "type": "int" + }, + { + "name": "cache-miss", + "type": "int" + }, + { + "name": "cache-miss-rate", + "type": "number" + }, + { + "name": "overflow", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "260", + "meta-type": "enum", + "values": [ + "xbzrle", + "rdma-pin-all", + "auto-converge", + "zero-blocks", + "compress", + "events", + "postcopy-ram", + "x-colo", + "release-ram", + "block", + "return-path" + ] + }, + { + "name": "261", + "members": [ + { + "name": "filename", + "type": "str" + }, + { + "name": "format", + "type": "str" + }, + { + "name": "dirty-flag", + "default": null, + "type": "bool" + }, + { + "name": "actual-size", + "default": null, + "type": "int" + }, + { + "name": "virtual-size", + "type": "int" + }, + { + "name": "cluster-size", + "default": null, + "type": "int" + }, + { + "name": "encrypted", + "default": null, + "type": "bool" + }, + { + "name": "compressed", + "default": null, + "type": "bool" + }, + { + "name": "backing-filename", + "default": null, + "type": "str" + }, + { + "name": "full-backing-filename", + "default": null, + "type": "str" + }, + { + "name": "backing-filename-format", + "default": null, + "type": "str" + }, + { + "name": "snapshots", + "default": null, + "type": "[57]" + }, + { + "name": "backing-image", + "default": null, + "type": "261" + }, + { + "name": "format-specific", + "default": null, + "type": "335" + } + ], + "meta-type": "object" + }, + { + "name": "262", + "members": [ + { + "name": "writeback", + "type": "bool" + }, + { + "name": "direct", + "type": "bool" + }, + { + "name": "no-flush", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "[263]", + "element-type": "263", + "meta-type": "array" + }, + { + "name": "263", + "members": [ + { + "name": "bus", + "type": "int" + }, + { + "name": "slot", + "type": "int" + }, + { + "name": "function", + "type": "int" + }, + { + "name": "class_info", + "type": "336" + }, + { + "name": "id", + "type": "337" + }, + { + "name": "irq", + "default": null, + "type": "int" + }, + { + "name": "qdev_id", + "type": "str" + }, + { + "name": "pci_bridge", + "default": null, + "type": "338" + }, + { + "name": "regions", + "type": "[339]" + } + ], + "meta-type": "object" + }, + { + "name": "264", + "meta-type": "enum", + "values": [ + "builtin", + "enum", + "array", + "object", + "alternate", + "command", + "event" + ] + }, + { + "name": "265", + "members": [ + { + "name": "json-type", + "type": "340" + } + ], + "meta-type": "object" + }, + { + "name": "266", + "members": [ + { + "name": "values", + "type": "[str]" + } + ], + "meta-type": "object" + }, + { + "name": "267", + "members": [ + { + "name": "element-type", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "268", + "members": [ + { + "name": "members", + "type": "[341]" + }, + { + "name": "tag", + "default": null, + "type": "str" + }, + { + "name": "variants", + "default": null, + "type": "[342]" + } + ], + "meta-type": "object" + }, + { + "name": "269", + "members": [ + { + "name": "members", + "type": "[343]" + } + ], + "meta-type": "object" + }, + { + "name": "270", + "members": [ + { + "name": "arg-type", + "type": "str" + }, + { + "name": "ret-type", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "271", + "members": [ + { + "name": "arg-type", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "272", + "members": [ + { + "name": "priority", + "type": "int" + }, + { + "name": "tbl-id", + "type": "int" + }, + { + "name": "in-pport", + "default": null, + "type": "int" + }, + { + "name": "tunnel-id", + "default": null, + "type": "int" + }, + { + "name": "vlan-id", + "default": null, + "type": "int" + }, + { + "name": "eth-type", + "default": null, + "type": "int" + }, + { + "name": "eth-src", + "default": null, + "type": "str" + }, + { + "name": "eth-dst", + "default": null, + "type": "str" + }, + { + "name": "ip-proto", + "default": null, + "type": "int" + }, + { + "name": "ip-tos", + "default": null, + "type": "int" + }, + { + "name": "ip-dst", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "273", + "members": [ + { + "name": "in-pport", + "default": null, + "type": "int" + }, + { + "name": "tunnel-id", + "default": null, + "type": "int" + }, + { + "name": "vlan-id", + "default": null, + "type": "int" + }, + { + "name": "eth-src", + "default": null, + "type": "str" + }, + { + "name": "eth-dst", + "default": null, + "type": "str" + }, + { + "name": "ip-proto", + "default": null, + "type": "int" + }, + { + "name": "ip-tos", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "274", + "members": [ + { + "name": "goto-tbl", + "default": null, + "type": "int" + }, + { + "name": "group-id", + "default": null, + "type": "int" + }, + { + "name": "tunnel-lport", + "default": null, + "type": "int" + }, + { + "name": "vlan-id", + "default": null, + "type": "int" + }, + { + "name": "new-vlan-id", + "default": null, + "type": "int" + }, + { + "name": "out-pport", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "275", + "meta-type": "enum", + "values": [ + "half", + "full" + ] + }, + { + "name": "276", + "meta-type": "enum", + "values": [ + "off", + "on" + ] + }, + { + "name": "277", + "meta-type": "enum", + "values": [ + "normal", + "none", + "all" + ] + }, + { + "name": "278", + "meta-type": "enum", + "values": [ + "client", + "server", + "unknown" + ] + }, + { + "name": "[194]", + "element-type": "194", + "meta-type": "array" + }, + { + "name": "279", + "meta-type": "enum", + "values": [ + "debug", + "inmigrate", + "internal-error", + "io-error", + "paused", + "postmigrate", + "prelaunch", + "finish-migrate", + "restore-vm", + "running", + "save-vm", + "shutdown", + "suspended", + "watchdog", + "guest-panicked", + "colo" + ] + }, + { + "name": "280", + "tag": "type", + "variants": [ + { + "case": "passthrough", + "type": "345" + } + ], + "members": [ + { + "name": "type", + "type": "344" + } + ], + "meta-type": "object" + }, + { + "name": "281", + "members": [ + { + "name": "major", + "type": "int" + }, + { + "name": "minor", + "type": "int" + }, + { + "name": "micro", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "282", + "meta-type": "enum", + "values": [ + "ipv4", + "ipv6", + "unix", + "vsock", + "unknown" + ] + }, + { + "name": "[197]", + "element-type": "197", + "meta-type": "array" + }, + { + "name": "[283]", + "element-type": "283", + "meta-type": "array" + }, + { + "name": "283", + "members": [ + { + "name": "host", + "type": "str" + }, + { + "name": "service", + "type": "str" + }, + { + "name": "family", + "type": "282" + }, + { + "name": "websocket", + "type": "bool" + }, + { + "name": "auth", + "type": "284" + }, + { + "name": "vencrypt", + "default": null, + "type": "285" + } + ], + "meta-type": "object" + }, + { + "name": "284", + "meta-type": "enum", + "values": [ + "none", + "vnc", + "ra2", + "ra2ne", + "tight", + "ultra", + "tls", + "vencrypt", + "sasl" + ] + }, + { + "name": "285", + "meta-type": "enum", + "values": [ + "plain", + "tls-none", + "x509-none", + "tls-vnc", + "x509-vnc", + "tls-plain", + "x509-plain", + "tls-sasl", + "x509-sasl" + ] + }, + { + "name": "286", + "meta-type": "enum", + "values": [ + "utf8", + "base64" + ] + }, + { + "name": "[287]", + "element-type": "287", + "meta-type": "array" + }, + { + "name": "287", + "tag": "type", + "variants": [ + { + "case": "number", + "type": "347" + }, + { + "case": "qcode", + "type": "348" + } + ], + "members": [ + { + "name": "type", + "type": "346" + } + ], + "meta-type": "object" + }, + { + "name": "288", + "meta-type": "enum", + "values": [ + "unavailable", + "disabled", + "enabled" + ] + }, + { + "name": "[289]", + "element-type": "289", + "meta-type": "array" + }, + { + "name": "289", + "tag": "type", + "variants": [ + { + "case": "abort", + "type": "350" + }, + { + "case": "block-dirty-bitmap-add", + "type": "351" + }, + { + "case": "block-dirty-bitmap-clear", + "type": "352" + }, + { + "case": "blockdev-backup", + "type": "353" + }, + { + "case": "blockdev-snapshot", + "type": "354" + }, + { + "case": "blockdev-snapshot-internal-sync", + "type": "355" + }, + { + "case": "blockdev-snapshot-sync", + "type": "356" + }, + { + "case": "drive-backup", + "type": "357" + } + ], + "members": [ + { + "name": "type", + "type": "349" + } + ], + "meta-type": "object" + }, + { + "name": "290", + "members": [ + { + "name": "completion-mode", + "default": null, + "type": "358" + } + ], + "meta-type": "object" + }, + { + "name": "291", + "meta-type": "enum", + "values": [ + "hyper-v" + ] + }, + { + "name": "292", + "members": [ + { + "name": "arg1", + "type": "int" + }, + { + "name": "arg2", + "type": "int" + }, + { + "name": "arg3", + "type": "int" + }, + { + "name": "arg4", + "type": "int" + }, + { + "name": "arg5", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "293", + "members": [ + { + "type": "48" + }, + { + "type": "str" + } + ], + "meta-type": "alternate" + }, + { + "name": "[294]", + "element-type": "294", + "meta-type": "array" + }, + { + "name": "294", + "members": [ + { + "name": "event", + "type": "359" + }, + { + "name": "state", + "default": null, + "type": "int" + }, + { + "name": "errno", + "default": null, + "type": "int" + }, + { + "name": "sector", + "default": null, + "type": "int" + }, + { + "name": "once", + "default": null, + "type": "bool" + }, + { + "name": "immediately", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "[295]", + "element-type": "295", + "meta-type": "array" + }, + { + "name": "295", + "members": [ + { + "name": "event", + "type": "359" + }, + { + "name": "state", + "default": null, + "type": "int" + }, + { + "name": "new_state", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "296", + "meta-type": "enum", + "values": [ + "auto", + "on", + "off" + ] + }, + { + "name": "297", + "meta-type": "enum", + "values": [ + "threads", + "native" + ] + }, + { + "name": "[298]", + "element-type": "298", + "meta-type": "array" + }, + { + "name": "298", + "tag": "type", + "variants": [ + { + "case": "inet", + "type": "309" + }, + { + "case": "unix", + "type": "361" + }, + { + "case": "vsock", + "type": "362" + }, + { + "case": "fd", + "type": "363" + } + ], + "members": [ + { + "name": "type", + "type": "360" + } + ], + "meta-type": "object" + }, + { + "name": "299", + "meta-type": "enum", + "values": [ + "tcp", + "iser" + ] + }, + { + "name": "300", + "meta-type": "enum", + "values": [ + "crc32c", + "none", + "crc32c-none", + "none-crc32c" + ] + }, + { + "name": "301", + "members": [ + { + "name": "type", + "type": "364" + }, + { + "name": "host", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "302", + "members": [ + { + "type": "48" + }, + { + "type": "str" + }, + { + "type": "null" + } + ], + "meta-type": "alternate" + }, + { + "name": "303", + "members": [ + { + "type": "365" + }, + { + "type": "366" + } + ], + "meta-type": "alternate" + }, + { + "name": "304", + "tag": "format", + "variants": [ + { + "case": "aes", + "type": "368" + }, + { + "case": "luks", + "type": "369" + } + ], + "members": [ + { + "name": "format", + "type": "367" + } + ], + "meta-type": "object" + }, + { + "name": "305", + "tag": "format", + "variants": [ + { + "case": "aes", + "type": "368" + } + ], + "members": [ + { + "name": "format", + "type": "370" + } + ], + "meta-type": "object" + }, + { + "name": "[293]", + "element-type": "293", + "meta-type": "array" + }, + { + "name": "306", + "meta-type": "enum", + "values": [ + "quorum", + "fifo" + ] + }, + { + "name": "[307]", + "element-type": "307", + "meta-type": "array" + }, + { + "name": "307", + "members": [ + { + "name": "host", + "type": "str" + }, + { + "name": "port", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "308", + "meta-type": "enum", + "values": [ + "primary", + "secondary" + ] + }, + { + "name": "309", + "members": [ + { + "name": "host", + "type": "str" + }, + { + "name": "port", + "type": "str" + }, + { + "name": "numeric", + "default": null, + "type": "bool" + }, + { + "name": "to", + "default": null, + "type": "int" + }, + { + "name": "ipv4", + "default": null, + "type": "bool" + }, + { + "name": "ipv6", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "310", + "meta-type": "enum", + "values": [ + "file", + "serial", + "parallel", + "pipe", + "socket", + "udp", + "pty", + "null", + "mux", + "msmouse", + "wctablet", + "braille", + "testdev", + "stdio", + "console", + "spicevmc", + "spiceport", + "vc", + "ringbuf", + "memory" + ] + }, + { + "name": "311", + "members": [ + { + "name": "data", + "type": "371" + } + ], + "meta-type": "object" + }, + { + "name": "312", + "members": [ + { + "name": "data", + "type": "372" + } + ], + "meta-type": "object" + }, + { + "name": "313", + "members": [ + { + "name": "data", + "type": "373" + } + ], + "meta-type": "object" + }, + { + "name": "314", + "members": [ + { + "name": "data", + "type": "374" + } + ], + "meta-type": "object" + }, + { + "name": "315", + "members": [ + { + "name": "data", + "type": "375" + } + ], + "meta-type": "object" + }, + { + "name": "316", + "members": [ + { + "name": "data", + "type": "376" + } + ], + "meta-type": "object" + }, + { + "name": "317", + "members": [ + { + "name": "data", + "type": "377" + } + ], + "meta-type": "object" + }, + { + "name": "318", + "members": [ + { + "name": "data", + "type": "378" + } + ], + "meta-type": "object" + }, + { + "name": "319", + "members": [ + { + "name": "data", + "type": "379" + } + ], + "meta-type": "object" + }, + { + "name": "320", + "members": [ + { + "name": "data", + "type": "380" + } + ], + "meta-type": "object" + }, + { + "name": "321", + "members": [ + { + "name": "data", + "type": "381" + } + ], + "meta-type": "object" + }, + { + "name": "322", + "meta-type": "enum", + "values": [ + "key", + "btn", + "rel", + "abs" + ] + }, + { + "name": "323", + "members": [ + { + "name": "data", + "type": "382" + } + ], + "meta-type": "object" + }, + { + "name": "324", + "members": [ + { + "name": "data", + "type": "383" + } + ], + "meta-type": "object" + }, + { + "name": "325", + "members": [ + { + "name": "data", + "type": "384" + } + ], + "meta-type": "object" + }, + { + "name": "null", + "json-type": "null", + "meta-type": "builtin" + }, + { + "name": "326", + "meta-type": "enum", + "values": [ + "inet", + "unix", + "vsock", + "fd" + ] + }, + { + "name": "327", + "members": [ + { + "name": "data", + "type": "309" + } + ], + "meta-type": "object" + }, + { + "name": "328", + "members": [ + { + "name": "data", + "type": "361" + } + ], + "meta-type": "object" + }, + { + "name": "329", + "members": [ + { + "name": "data", + "type": "362" + } + ], + "meta-type": "object" + }, + { + "name": "330", + "members": [ + { + "name": "data", + "type": "363" + } + ], + "meta-type": "object" + }, + { + "name": "331", + "meta-type": "enum", + "values": [ + "active", + "disabled", + "frozen" + ] + }, + { + "name": "[332]", + "element-type": "332", + "meta-type": "array" + }, + { + "name": "332", + "members": [ + { + "name": "interval_length", + "type": "int" + }, + { + "name": "min_rd_latency_ns", + "type": "int" + }, + { + "name": "max_rd_latency_ns", + "type": "int" + }, + { + "name": "avg_rd_latency_ns", + "type": "int" + }, + { + "name": "min_wr_latency_ns", + "type": "int" + }, + { + "name": "max_wr_latency_ns", + "type": "int" + }, + { + "name": "avg_wr_latency_ns", + "type": "int" + }, + { + "name": "min_flush_latency_ns", + "type": "int" + }, + { + "name": "max_flush_latency_ns", + "type": "int" + }, + { + "name": "avg_flush_latency_ns", + "type": "int" + }, + { + "name": "avg_rd_queue_depth", + "type": "number" + }, + { + "name": "avg_wr_queue_depth", + "type": "number" + } + ], + "meta-type": "object" + }, + { + "name": "333", + "meta-type": "enum", + "values": [ + "string", + "boolean", + "number", + "size" + ] + }, + { + "name": "334", + "members": [ + { + "name": "id", + "default": null, + "type": "str" + }, + { + "name": "addr", + "type": "int" + }, + { + "name": "size", + "type": "int" + }, + { + "name": "slot", + "type": "int" + }, + { + "name": "node", + "type": "int" + }, + { + "name": "memdev", + "type": "str" + }, + { + "name": "hotplugged", + "type": "bool" + }, + { + "name": "hotpluggable", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "[57]", + "element-type": "57", + "meta-type": "array" + }, + { + "name": "335", + "tag": "type", + "variants": [ + { + "case": "qcow2", + "type": "386" + }, + { + "case": "vmdk", + "type": "387" + }, + { + "case": "luks", + "type": "388" + } + ], + "members": [ + { + "name": "type", + "type": "385" + } + ], + "meta-type": "object" + }, + { + "name": "336", + "members": [ + { + "name": "desc", + "default": null, + "type": "str" + }, + { + "name": "class", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "337", + "members": [ + { + "name": "device", + "type": "int" + }, + { + "name": "vendor", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "338", + "members": [ + { + "name": "bus", + "type": "389" + }, + { + "name": "devices", + "default": null, + "type": "[263]" + } + ], + "meta-type": "object" + }, + { + "name": "[339]", + "element-type": "339", + "meta-type": "array" + }, + { + "name": "339", + "members": [ + { + "name": "bar", + "type": "int" + }, + { + "name": "type", + "type": "str" + }, + { + "name": "address", + "type": "int" + }, + { + "name": "size", + "type": "int" + }, + { + "name": "prefetch", + "default": null, + "type": "bool" + }, + { + "name": "mem_type_64", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "340", + "meta-type": "enum", + "values": [ + "string", + "number", + "int", + "boolean", + "null", + "object", + "array", + "value" + ] + }, + { + "name": "[341]", + "element-type": "341", + "meta-type": "array" + }, + { + "name": "341", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "type", + "type": "str" + }, + { + "name": "default", + "default": null, + "type": "any" + } + ], + "meta-type": "object" + }, + { + "name": "[342]", + "element-type": "342", + "meta-type": "array" + }, + { + "name": "342", + "members": [ + { + "name": "case", + "type": "str" + }, + { + "name": "type", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "[343]", + "element-type": "343", + "meta-type": "array" + }, + { + "name": "343", + "members": [ + { + "name": "type", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "344", + "meta-type": "enum", + "values": [ + "passthrough" + ] + }, + { + "name": "345", + "members": [ + { + "name": "data", + "type": "390" + } + ], + "meta-type": "object" + }, + { + "name": "346", + "meta-type": "enum", + "values": [ + "number", + "qcode" + ] + }, + { + "name": "347", + "members": [ + { + "name": "data", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "348", + "members": [ + { + "name": "data", + "type": "391" + } + ], + "meta-type": "object" + }, + { + "name": "349", + "meta-type": "enum", + "values": [ + "abort", + "block-dirty-bitmap-add", + "block-dirty-bitmap-clear", + "blockdev-backup", + "blockdev-snapshot", + "blockdev-snapshot-internal-sync", + "blockdev-snapshot-sync", + "drive-backup" + ] + }, + { + "name": "350", + "members": [ + { + "name": "data", + "type": "392" + } + ], + "meta-type": "object" + }, + { + "name": "351", + "members": [ + { + "name": "data", + "type": "36" + } + ], + "meta-type": "object" + }, + { + "name": "352", + "members": [ + { + "name": "data", + "type": "37" + } + ], + "meta-type": "object" + }, + { + "name": "353", + "members": [ + { + "name": "data", + "type": "49" + } + ], + "meta-type": "object" + }, + { + "name": "354", + "members": [ + { + "name": "data", + "type": "55" + } + ], + "meta-type": "object" + }, + { + "name": "355", + "members": [ + { + "name": "data", + "type": "58" + } + ], + "meta-type": "object" + }, + { + "name": "356", + "members": [ + { + "name": "data", + "type": "59" + } + ], + "meta-type": "object" + }, + { + "name": "357", + "members": [ + { + "name": "data", + "type": "76" + } + ], + "meta-type": "object" + }, + { + "name": "358", + "meta-type": "enum", + "values": [ + "individual", + "grouped" + ] + }, + { + "name": "359", + "meta-type": "enum", + "values": [ + "l1_update", + "l1_grow_alloc_table", + "l1_grow_write_table", + "l1_grow_activate_table", + "l2_load", + "l2_update", + "l2_update_compressed", + "l2_alloc_cow_read", + "l2_alloc_write", + "read_aio", + "read_backing_aio", + "read_compressed", + "write_aio", + "write_compressed", + "vmstate_load", + "vmstate_save", + "cow_read", + "cow_write", + "reftable_load", + "reftable_grow", + "reftable_update", + "refblock_load", + "refblock_update", + "refblock_update_part", + "refblock_alloc", + "refblock_alloc_hookup", + "refblock_alloc_write", + "refblock_alloc_write_blocks", + "refblock_alloc_write_table", + "refblock_alloc_switch_table", + "cluster_alloc", + "cluster_alloc_bytes", + "cluster_free", + "flush_to_os", + "flush_to_disk", + "pwritev_rmw_head", + "pwritev_rmw_after_head", + "pwritev_rmw_tail", + "pwritev_rmw_after_tail", + "pwritev", + "pwritev_zero", + "pwritev_done", + "empty_image_prepare" + ] + }, + { + "name": "360", + "meta-type": "enum", + "values": [ + "inet", + "unix", + "vsock", + "fd" + ] + }, + { + "name": "361", + "members": [ + { + "name": "path", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "362", + "members": [ + { + "name": "cid", + "type": "str" + }, + { + "name": "port", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "363", + "members": [ + { + "name": "str", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "364", + "meta-type": "enum", + "values": [ + "inet" + ] + }, + { + "name": "365", + "members": [ + { + "name": "template", + "default": null, + "type": "366" + }, + { + "name": "main-header", + "default": null, + "type": "bool" + }, + { + "name": "active-l1", + "default": null, + "type": "bool" + }, + { + "name": "active-l2", + "default": null, + "type": "bool" + }, + { + "name": "refcount-table", + "default": null, + "type": "bool" + }, + { + "name": "refcount-block", + "default": null, + "type": "bool" + }, + { + "name": "snapshot-table", + "default": null, + "type": "bool" + }, + { + "name": "inactive-l1", + "default": null, + "type": "bool" + }, + { + "name": "inactive-l2", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "366", + "meta-type": "enum", + "values": [ + "none", + "constant", + "cached", + "all" + ] + }, + { + "name": "367", + "meta-type": "enum", + "values": [ + "aes", + "luks" + ] + }, + { + "name": "368", + "members": [ + { + "name": "key-secret", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "369", + "members": [ + { + "name": "key-secret", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "370", + "meta-type": "enum", + "values": [ + "aes" + ] + }, + { + "name": "371", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "in", + "default": null, + "type": "str" + }, + { + "name": "out", + "type": "str" + }, + { + "name": "append", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "372", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "device", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "373", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "addr", + "type": "236" + }, + { + "name": "tls-creds", + "default": null, + "type": "str" + }, + { + "name": "server", + "default": null, + "type": "bool" + }, + { + "name": "wait", + "default": null, + "type": "bool" + }, + { + "name": "nodelay", + "default": null, + "type": "bool" + }, + { + "name": "telnet", + "default": null, + "type": "bool" + }, + { + "name": "tn3270", + "default": null, + "type": "bool" + }, + { + "name": "reconnect", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "374", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "remote", + "type": "236" + }, + { + "name": "local", + "default": null, + "type": "236" + } + ], + "meta-type": "object" + }, + { + "name": "375", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "376", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "chardev", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "377", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "signal", + "default": null, + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "378", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "type", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "379", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "fqdn", + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "380", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "width", + "default": null, + "type": "int" + }, + { + "name": "height", + "default": null, + "type": "int" + }, + { + "name": "cols", + "default": null, + "type": "int" + }, + { + "name": "rows", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "381", + "members": [ + { + "name": "logfile", + "default": null, + "type": "str" + }, + { + "name": "logappend", + "default": null, + "type": "bool" + }, + { + "name": "size", + "default": null, + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "382", + "members": [ + { + "name": "key", + "type": "287" + }, + { + "name": "down", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "383", + "members": [ + { + "name": "button", + "type": "393" + }, + { + "name": "down", + "type": "bool" + } + ], + "meta-type": "object" + }, + { + "name": "384", + "members": [ + { + "name": "axis", + "type": "394" + }, + { + "name": "value", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "385", + "meta-type": "enum", + "values": [ + "qcow2", + "vmdk", + "luks" + ] + }, + { + "name": "386", + "members": [ + { + "name": "data", + "type": "395" + } + ], + "meta-type": "object" + }, + { + "name": "387", + "members": [ + { + "name": "data", + "type": "396" + } + ], + "meta-type": "object" + }, + { + "name": "388", + "members": [ + { + "name": "data", + "type": "397" + } + ], + "meta-type": "object" + }, + { + "name": "389", + "members": [ + { + "name": "number", + "type": "int" + }, + { + "name": "secondary", + "type": "int" + }, + { + "name": "subordinate", + "type": "int" + }, + { + "name": "io_range", + "type": "398" + }, + { + "name": "memory_range", + "type": "398" + }, + { + "name": "prefetchable_range", + "type": "398" + } + ], + "meta-type": "object" + }, + { + "name": "390", + "members": [ + { + "name": "path", + "default": null, + "type": "str" + }, + { + "name": "cancel-path", + "default": null, + "type": "str" + } + ], + "meta-type": "object" + }, + { + "name": "391", + "meta-type": "enum", + "values": [ + "unmapped", + "shift", + "shift_r", + "alt", + "alt_r", + "ctrl", + "ctrl_r", + "menu", + "esc", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "0", + "minus", + "equal", + "backspace", + "tab", + "q", + "w", + "e", + "r", + "t", + "y", + "u", + "i", + "o", + "p", + "bracket_left", + "bracket_right", + "ret", + "a", + "s", + "d", + "f", + "g", + "h", + "j", + "k", + "l", + "semicolon", + "apostrophe", + "grave_accent", + "backslash", + "z", + "x", + "c", + "v", + "b", + "n", + "m", + "comma", + "dot", + "slash", + "asterisk", + "spc", + "caps_lock", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "num_lock", + "scroll_lock", + "kp_divide", + "kp_multiply", + "kp_subtract", + "kp_add", + "kp_enter", + "kp_decimal", + "sysrq", + "kp_0", + "kp_1", + "kp_2", + "kp_3", + "kp_4", + "kp_5", + "kp_6", + "kp_7", + "kp_8", + "kp_9", + "less", + "f11", + "f12", + "print", + "home", + "pgup", + "pgdn", + "end", + "left", + "up", + "down", + "right", + "insert", + "delete", + "stop", + "again", + "props", + "undo", + "front", + "copy", + "open", + "paste", + "find", + "cut", + "lf", + "help", + "meta_l", + "meta_r", + "compose", + "pause", + "ro", + "hiragana", + "henkan", + "yen", + "kp_comma", + "kp_equals", + "power", + "sleep", + "wake", + "audionext", + "audioprev", + "audiostop", + "audioplay", + "audiomute", + "volumeup", + "volumedown", + "mediaselect", + "mail", + "calculator", + "computer", + "ac_home", + "ac_back", + "ac_forward", + "ac_refresh", + "ac_bookmarks" + ] + }, + { + "name": "392", + "members": [ + ], + "meta-type": "object" + }, + { + "name": "393", + "meta-type": "enum", + "values": [ + "left", + "middle", + "right", + "wheel-up", + "wheel-down", + "side", + "extra" + ] + }, + { + "name": "394", + "meta-type": "enum", + "values": [ + "x", + "y" + ] + }, + { + "name": "395", + "members": [ + { + "name": "compat", + "type": "str" + }, + { + "name": "lazy-refcounts", + "default": null, + "type": "bool" + }, + { + "name": "corrupt", + "default": null, + "type": "bool" + }, + { + "name": "refcount-bits", + "type": "int" + }, + { + "name": "encrypt", + "default": null, + "type": "399" + } + ], + "meta-type": "object" + }, + { + "name": "396", + "members": [ + { + "name": "create-type", + "type": "str" + }, + { + "name": "cid", + "type": "int" + }, + { + "name": "parent-cid", + "type": "int" + }, + { + "name": "extents", + "type": "[261]" + } + ], + "meta-type": "object" + }, + { + "name": "397", + "members": [ + { + "name": "cipher-alg", + "type": "400" + }, + { + "name": "cipher-mode", + "type": "401" + }, + { + "name": "ivgen-alg", + "type": "402" + }, + { + "name": "ivgen-hash-alg", + "default": null, + "type": "403" + }, + { + "name": "hash-alg", + "type": "403" + }, + { + "name": "payload-offset", + "type": "int" + }, + { + "name": "master-key-iters", + "type": "int" + }, + { + "name": "uuid", + "type": "str" + }, + { + "name": "slots", + "type": "[404]" + } + ], + "meta-type": "object" + }, + { + "name": "398", + "members": [ + { + "name": "base", + "type": "int" + }, + { + "name": "limit", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "399", + "tag": "format", + "variants": [ + { + "case": "aes", + "type": "405" + }, + { + "case": "luks", + "type": "397" + } + ], + "members": [ + { + "name": "format", + "type": "367" + } + ], + "meta-type": "object" + }, + { + "name": "[261]", + "element-type": "261", + "meta-type": "array" + }, + { + "name": "400", + "meta-type": "enum", + "values": [ + "aes-128", + "aes-192", + "aes-256", + "des-rfb", + "3des", + "cast5-128", + "serpent-128", + "serpent-192", + "serpent-256", + "twofish-128", + "twofish-192", + "twofish-256" + ] + }, + { + "name": "401", + "meta-type": "enum", + "values": [ + "ecb", + "cbc", + "xts", + "ctr" + ] + }, + { + "name": "402", + "meta-type": "enum", + "values": [ + "plain", + "plain64", + "essiv" + ] + }, + { + "name": "403", + "meta-type": "enum", + "values": [ + "md5", + "sha1", + "sha224", + "sha256", + "sha384", + "sha512", + "ripemd160" + ] + }, + { + "name": "[404]", + "element-type": "404", + "meta-type": "array" + }, + { + "name": "404", + "members": [ + { + "name": "active", + "type": "bool" + }, + { + "name": "iters", + "default": null, + "type": "int" + }, + { + "name": "stripes", + "default": null, + "type": "int" + }, + { + "name": "key-offset", + "type": "int" + } + ], + "meta-type": "object" + }, + { + "name": "405", + "members": [ + ], + "meta-type": "object" + } + ], + "id": "libvirt-48" +} + +{ + "return": { + "model": { + "name": "base", + "props": { + "cmov": true, + "ia64": false, + "aes": true, + "mmx": true, + "rdpid": false, + "arat": true, + "pause-filter": false, + "xsavec": false, + "osxsave": false, + "kvm-asyncpf": true, + "perfctr-core": false, + "mpx": false, + "pbe": false, + "avx512cd": false, + "decodeassists": false, + "sse4.1": true, + "family": 6, + "avx512f": false, + "msr": true, + "mce": true, + "mca": true, + "xcrypt": false, + "min-level": 13, + "xgetbv1": false, + "cid": false, + "ds": false, + "fxsr": true, + "xsaveopt": true, + "xtpr": false, + "avx512vl": false, + "avx512-vpopcntdq": false, + "phe": false, + "extapic": false, + "3dnowprefetch": false, + "cr8legacy": false, + "xcrypt-en": false, + "pn": false, + "dca": false, + "vendor": "GenuineIntel", + "pku": false, + "smx": false, + "cmp-legacy": false, + "avx512-4fmaps": false, + "vmcb-clean": false, + "hle": false, + "3dnowext": false, + "npt": false, + "clwb": false, + "lbrv": false, + "adx": false, + "ss": true, + "pni": true, + "svm-lock": false, + "smep": true, + "smap": false, + "pfthreshold": false, + "x2apic": true, + "avx512vbmi": false, + "flushbyasid": false, + "f16c": true, + "ace2-en": false, + "pae": true, + "pat": true, + "sse": true, + "phe-en": false, + "kvm-nopiodelay": true, + "tm": false, + "kvmclock-stable-bit": true, + "hypervisor": true, + "pcommit": false, + "syscall": true, + "avx512dq": false, + "svm": false, + "invtsc": false, + "sse2": true, + "est": false, + "avx512ifma": false, + "tm2": false, + "kvm-pv-eoi": true, + "cx8": true, + "kvm-mmu": false, + "sse4.2": true, + "pge": true, + "pdcm": false, + "model": 60, + "movbe": true, + "nrip-save": false, + "ssse3": true, + "sse4a": false, + "invpcid": true, + "pdpe1gb": true, + "tsc-deadline": true, + "fma": true, + "cx16": true, + "de": true, + "stepping": 3, + "xsave": true, + "clflush": true, + "skinit": false, + "tsc": true, + "tce": false, + "fpu": true, + "ds-cpl": false, + "ibs": false, + "fma4": false, + "la57": false, + "osvw": false, + "apic": true, + "pmm": false, + "tsc-adjust": true, + "kvm-steal-time": true, + "kvmclock": true, + "lwp": false, + "xop": false, + "avx": true, + "ospke": false, + "acpi": false, + "avx512bw": false, + "ace2": false, + "fsgsbase": true, + "ht": false, + "nx": true, + "pclmulqdq": true, + "mmxext": false, + "popcnt": true, + "xsaves": false, + "lm": true, + "umip": false, + "pse": true, + "avx2": true, + "sep": true, + "nodeid-msr": false, + "misalignsse": false, + "min-xlevel": 2147483656, + "bmi1": true, + "bmi2": true, + "kvm-pv-unhalt": true, + "tsc-scale": false, + "topoext": false, + "clflushopt": false, + "monitor": false, + "avx512er": false, + "pmm-en": false, + "pcid": true, + "3dnow": false, + "erms": true, + "lahf-lm": true, + "fxsr-opt": false, + "xstore": false, + "rtm": false, + "lmce": true, + "perfctr-nb": false, + "rdrand": true, + "rdseed": false, + "avx512-4vnniw": false, + "vme": true, + "vmx": true, + "dtes64": false, + "mtrr": true, + "rdtscp": true, + "pse36": true, + "tbm": false, + "wdt": false, + "model-id": "Intel(R) Core(TM) i7-4810MQ CPU @ 2.80GHz", + "sha-ni": false, + "abm": true, + "avx512pf": false, + "xstore-en": false + } + } + }, + "id": "libvirt-49" +} + +{ + "return": { + "model": { + "name": "base", + "props": { + "phys-bits": 0, + "core-id": -1, + "xlevel": 2147483656, + "cmov": true, + "ia64": false, + "aes": true, + "mmx": true, + "arat": true, + "rdpid": false, + "pause-filter": false, + "xsavec": false, + "osxsave": false, + "tsc-frequency": 0, + "xd": true, + "hv-vendor-id": "", + "kvm-asyncpf": true, + "kvm_asyncpf": true, + "perfctr_core": false, + "perfctr-core": false, + "mpx": false, + "avx512cd": false, + "decodeassists": false, + "pbe": false, + "sse4_1": true, + "sse4.1": true, + "sse4-1": true, + "family": 6, + "vmware-cpuid-freq": true, + "avx512f": false, + "xcrypt": false, + "hv-runtime": false, + "msr": true, + "mce": true, + "mca": true, + "thread-id": -1, + "min-level": 13, + "xgetbv1": false, + "cid": false, + "hv-relaxed": false, + "fxsr": true, + "ds": false, + "hv-crash": false, + "xsaveopt": true, + "xtpr": false, + "avx512-vpopcntdq": false, + "phe": false, + "avx512vl": false, + "extapic": false, + "3dnowprefetch": false, + "cr8legacy": false, + "cpuid-0xb": true, + "xcrypt-en": false, + "kvm_pv_eoi": true, + "apic-id": 4294967295, + "pn": false, + "dca": false, + "vendor": "GenuineIntel", + "pku": false, + "smx": false, + "cmp-legacy": false, + "cmp_legacy": false, + "node-id": -1, + "avx512-4fmaps": false, + "vmcb-clean": false, + "vmcb_clean": false, + "3dnowext": false, + "hle": false, + "npt": false, + "memory": "/machine/unattached/system[0]", + "clwb": false, + "lbrv": false, + "adx": false, + "ss": true, + "pni": true, + "svm_lock": false, + "svm-lock": false, + "smep": true, + "pfthreshold": false, + "smap": false, + "x2apic": true, + "avx512vbmi": false, + "hv-stimer": false, + "i64": true, + "flushbyasid": false, + "f16c": true, + "ace2-en": false, + "pat": true, + "pae": true, + "sse": true, + "phe-en": false, + "kvm-nopiodelay": true, + "kvm_nopiodelay": true, + "tm": false, + "kvmclock-stable-bit": true, + "hypervisor": true, + "socket-id": -1, + "pcommit": false, + "syscall": true, + "level": 13, + "avx512dq": false, + "svm": false, + "full-cpuid-auto-level": true, + "hv-reset": false, + "invtsc": false, + "sse3": true, + "sse2": true, + "est": false, + "avx512ifma": false, + "tm2": false, + "kvm-pv-eoi": true, + "cx8": true, + "kvm-mmu": false, + "kvm_mmu": false, + "sse4_2": true, + "sse4.2": true, + "sse4-2": true, + "pge": true, + "fill-mtrr-mask": true, + "pdcm": false, + "nodeid_msr": false, + "model": 60, + "movbe": true, + "nrip-save": false, + "nrip_save": false, + "sse4a": false, + "ssse3": true, + "kvm_pv_unhalt": true, + "invpcid": true, + "pdpe1gb": true, + "tsc-deadline": true, + "fma": true, + "cx16": true, + "de": true, + "enforce": false, + "stepping": 3, + "xsave": true, + "clflush": true, + "skinit": false, + "tce": false, + "tsc": true, + "fpu": true, + "ds-cpl": false, + "ds_cpl": false, + "ibs": false, + "host-phys-bits": false, + "fma4": false, + "la57": false, + "osvw": false, + "check": true, + "hv-spinlocks": -1, + "pmm": false, + "apic": true, + "pmu": false, + "min-xlevel2": 0, + "tsc-adjust": true, + "tsc_adjust": true, + "kvm-steal-time": true, + "kvm_steal_time": true, + "kvmclock": true, + "l3-cache": true, + "lwp": false, + "xop": false, + "avx": true, + "ospke": false, + "ace2": false, + "acpi": false, + "avx512bw": false, + "hv-vapic": false, + "fsgsbase": true, + "ht": false, + "nx": true, + "pclmulqdq": true, + "mmxext": false, + "popcnt": true, + "xsaves": false, + "tcg-cpuid": true, + "lm": true, + "umip": false, + "avx2": true, + "pse": true, + "sep": true, + "pclmuldq": true, + "nodeid-msr": false, + "kvm": true, + "misalignsse": false, + "min-xlevel": 2147483656, + "bmi2": true, + "bmi1": true, + "kvm-pv-unhalt": true, + "realized": false, + "tsc_scale": false, + "tsc-scale": false, + "topoext": false, + "hv-vpindex": false, + "xlevel2": 0, + "clflushopt": false, + "kvm-no-smi-migration": false, + "monitor": false, + "avx512er": false, + "pmm-en": false, + "pcid": true, + "3dnow": false, + "erms": true, + "lahf-lm": true, + "lahf_lm": true, + "xstore": false, + "hv-synic": false, + "fxsr-opt": false, + "fxsr_opt": false, + "rtm": false, + "lmce": true, + "hv-time": false, + "perfctr-nb": false, + "perfctr_nb": false, + "ffxsr": false, + "rdrand": true, + "rdseed": false, + "avx512-4vnniw": false, + "vme": true, + "vmx": true, + "dtes64": false, + "mtrr": true, + "rdtscp": true, + "pse36": true, + "tbm": false, + "wdt": false, + "pause_filter": false, + "model-id": "Intel(R) Core(TM) i7-4810MQ CPU @ 2.80GHz", + "sha-ni": false, + "abm": true, + "avx512pf": false, + "xstore-en": false + } + } + }, + "id": "libvirt-50" +} + +{ + "return": { + "model": { + "name": "base", + "props": { + "cmov": true, + "ia64": false, + "aes": true, + "mmx": true, + "rdpid": false, + "arat": true, + "pause-filter": false, + "xsavec": false, + "osxsave": false, + "kvm-asyncpf": true, + "perfctr-core": false, + "mpx": false, + "pbe": false, + "avx512cd": false, + "decodeassists": false, + "sse4.1": true, + "family": 6, + "avx512f": false, + "msr": true, + "mce": true, + "mca": true, + "xcrypt": false, + "min-level": 13, + "xgetbv1": false, + "cid": false, + "ds": false, + "fxsr": true, + "xsaveopt": true, + "xtpr": false, + "avx512vl": false, + "avx512-vpopcntdq": false, + "phe": false, + "extapic": false, + "3dnowprefetch": false, + "cr8legacy": false, + "xcrypt-en": false, + "pn": false, + "dca": false, + "vendor": "GenuineIntel", + "pku": false, + "smx": false, + "cmp-legacy": false, + "avx512-4fmaps": false, + "vmcb-clean": false, + "hle": false, + "3dnowext": false, + "npt": false, + "clwb": false, + "lbrv": false, + "adx": false, + "ss": true, + "pni": true, + "svm-lock": false, + "smep": true, + "smap": false, + "pfthreshold": false, + "x2apic": true, + "avx512vbmi": false, + "flushbyasid": false, + "f16c": true, + "ace2-en": false, + "pae": true, + "pat": true, + "sse": true, + "phe-en": false, + "kvm-nopiodelay": true, + "tm": false, + "kvmclock-stable-bit": true, + "hypervisor": true, + "pcommit": false, + "syscall": true, + "avx512dq": false, + "svm": false, + "invtsc": true, + "sse2": true, + "est": false, + "avx512ifma": false, + "tm2": false, + "kvm-pv-eoi": true, + "cx8": true, + "kvm-mmu": false, + "sse4.2": true, + "pge": true, + "pdcm": false, + "model": 60, + "movbe": true, + "nrip-save": false, + "ssse3": true, + "sse4a": false, + "invpcid": true, + "pdpe1gb": true, + "tsc-deadline": true, + "fma": true, + "cx16": true, + "de": true, + "stepping": 3, + "xsave": true, + "clflush": true, + "skinit": false, + "tsc": true, + "tce": false, + "fpu": true, + "ds-cpl": false, + "ibs": false, + "fma4": false, + "la57": false, + "osvw": false, + "apic": true, + "pmm": false, + "tsc-adjust": true, + "kvm-steal-time": true, + "kvmclock": true, + "lwp": false, + "xop": false, + "avx": true, + "ospke": false, + "acpi": false, + "avx512bw": false, + "ace2": false, + "fsgsbase": true, + "ht": false, + "nx": true, + "pclmulqdq": true, + "mmxext": false, + "popcnt": true, + "xsaves": false, + "lm": true, + "umip": false, + "pse": true, + "avx2": true, + "sep": true, + "nodeid-msr": false, + "misalignsse": false, + "min-xlevel": 2147483656, + "bmi1": true, + "bmi2": true, + "kvm-pv-unhalt": true, + "tsc-scale": false, + "topoext": false, + "clflushopt": false, + "monitor": false, + "avx512er": false, + "pmm-en": false, + "pcid": true, + "3dnow": false, + "erms": true, + "lahf-lm": true, + "fxsr-opt": false, + "xstore": false, + "rtm": false, + "lmce": true, + "perfctr-nb": false, + "rdrand": true, + "rdseed": false, + "avx512-4vnniw": false, + "vme": true, + "vmx": true, + "dtes64": false, + "mtrr": true, + "rdtscp": true, + "pse36": true, + "tbm": false, + "wdt": false, + "model-id": "Intel(R) Core(TM) i7-4810MQ CPU @ 2.80GHz", + "sha-ni": false, + "abm": true, + "avx512pf": false, + "xstore-en": false + } + } + }, + "id": "libvirt-51" +} + +{ + "return": { + "model": { + "name": "base", + "props": { + "phys-bits": 0, + "core-id": -1, + "xlevel": 2147483656, + "cmov": true, + "ia64": false, + "aes": true, + "mmx": true, + "arat": true, + "rdpid": false, + "pause-filter": false, + "xsavec": false, + "osxsave": false, + "tsc-frequency": 0, + "xd": true, + "hv-vendor-id": "", + "kvm-asyncpf": true, + "kvm_asyncpf": true, + "perfctr_core": false, + "perfctr-core": false, + "mpx": false, + "avx512cd": false, + "decodeassists": false, + "pbe": false, + "sse4_1": true, + "sse4.1": true, + "sse4-1": true, + "family": 6, + "vmware-cpuid-freq": true, + "avx512f": false, + "xcrypt": false, + "hv-runtime": false, + "msr": true, + "mce": true, + "mca": true, + "thread-id": -1, + "min-level": 13, + "xgetbv1": false, + "cid": false, + "hv-relaxed": false, + "fxsr": true, + "ds": false, + "hv-crash": false, + "xsaveopt": true, + "xtpr": false, + "avx512-vpopcntdq": false, + "phe": false, + "avx512vl": false, + "extapic": false, + "3dnowprefetch": false, + "cr8legacy": false, + "cpuid-0xb": true, + "xcrypt-en": false, + "kvm_pv_eoi": true, + "apic-id": 4294967295, + "pn": false, + "dca": false, + "vendor": "GenuineIntel", + "pku": false, + "smx": false, + "cmp-legacy": false, + "cmp_legacy": false, + "node-id": -1, + "avx512-4fmaps": false, + "vmcb-clean": false, + "vmcb_clean": false, + "3dnowext": false, + "hle": false, + "npt": false, + "memory": "/machine/unattached/system[0]", + "clwb": false, + "lbrv": false, + "adx": false, + "ss": true, + "pni": true, + "svm_lock": false, + "svm-lock": false, + "smep": true, + "pfthreshold": false, + "smap": false, + "x2apic": true, + "avx512vbmi": false, + "hv-stimer": false, + "i64": true, + "flushbyasid": false, + "f16c": true, + "ace2-en": false, + "pat": true, + "pae": true, + "sse": true, + "phe-en": false, + "kvm-nopiodelay": true, + "kvm_nopiodelay": true, + "tm": false, + "kvmclock-stable-bit": true, + "hypervisor": true, + "socket-id": -1, + "pcommit": false, + "syscall": true, + "level": 13, + "avx512dq": false, + "svm": false, + "full-cpuid-auto-level": true, + "hv-reset": false, + "invtsc": true, + "sse3": true, + "sse2": true, + "est": false, + "avx512ifma": false, + "tm2": false, + "kvm-pv-eoi": true, + "cx8": true, + "kvm-mmu": false, + "kvm_mmu": false, + "sse4_2": true, + "sse4.2": true, + "sse4-2": true, + "pge": true, + "fill-mtrr-mask": true, + "pdcm": false, + "nodeid_msr": false, + "model": 60, + "movbe": true, + "nrip-save": false, + "nrip_save": false, + "sse4a": false, + "ssse3": true, + "kvm_pv_unhalt": true, + "invpcid": true, + "pdpe1gb": true, + "tsc-deadline": true, + "fma": true, + "cx16": true, + "de": true, + "enforce": false, + "stepping": 3, + "xsave": true, + "clflush": true, + "skinit": false, + "tce": false, + "tsc": true, + "fpu": true, + "ds-cpl": false, + "ds_cpl": false, + "ibs": false, + "host-phys-bits": false, + "fma4": false, + "la57": false, + "osvw": false, + "check": true, + "hv-spinlocks": -1, + "pmm": false, + "apic": true, + "pmu": false, + "min-xlevel2": 0, + "tsc-adjust": true, + "tsc_adjust": true, + "kvm-steal-time": true, + "kvm_steal_time": true, + "kvmclock": true, + "l3-cache": true, + "lwp": false, + "xop": false, + "avx": true, + "ospke": false, + "ace2": false, + "acpi": false, + "avx512bw": false, + "hv-vapic": false, + "fsgsbase": true, + "ht": false, + "nx": true, + "pclmulqdq": true, + "mmxext": false, + "popcnt": true, + "xsaves": false, + "tcg-cpuid": true, + "lm": true, + "umip": false, + "avx2": true, + "pse": true, + "sep": true, + "pclmuldq": true, + "nodeid-msr": false, + "kvm": true, + "misalignsse": false, + "min-xlevel": 2147483656, + "bmi2": true, + "bmi1": true, + "kvm-pv-unhalt": true, + "realized": false, + "tsc_scale": false, + "tsc-scale": false, + "topoext": false, + "hv-vpindex": false, + "xlevel2": 0, + "clflushopt": false, + "kvm-no-smi-migration": false, + "monitor": false, + "avx512er": false, + "pmm-en": false, + "pcid": true, + "3dnow": false, + "erms": true, + "lahf-lm": true, + "lahf_lm": true, + "xstore": false, + "hv-synic": false, + "fxsr-opt": false, + "fxsr_opt": false, + "rtm": false, + "lmce": true, + "hv-time": false, + "perfctr-nb": false, + "perfctr_nb": false, + "ffxsr": false, + "rdrand": true, + "rdseed": false, + "avx512-4vnniw": false, + "vme": true, + "vmx": true, + "dtes64": false, + "mtrr": true, + "rdtscp": true, + "pse36": true, + "tbm": false, + "wdt": false, + "pause_filter": false, + "model-id": "Intel(R) Core(TM) i7-4810MQ CPU @ 2.80GHz", + "sha-ni": false, + "abm": true, + "avx512pf": false, + "xstore-en": false + } + } + }, + "id": "libvirt-52" +} + +{ + "return": { + }, + "id": "libvirt-1" +} + +{ + "return": [ + { + "name": "max", + "typename": "max-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": false + }, + { + "name": "host", + "typename": "host-x86_64-cpu", + "unavailable-features": [ + "kvm" + ], + "static": false, + "migration-safe": false + }, + { + "name": "base", + "typename": "base-x86_64-cpu", + "unavailable-features": [ + ], + "static": true, + "migration-safe": true + }, + { + "name": "qemu64", + "typename": "qemu64-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "qemu32", + "typename": "qemu32-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "phenom", + "typename": "phenom-x86_64-cpu", + "unavailable-features": [ + "fxsr-opt", + "npt" + ], + "static": false, + "migration-safe": true + }, + { + "name": "pentium3", + "typename": "pentium3-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "pentium2", + "typename": "pentium2-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "pentium", + "typename": "pentium-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "n270", + "typename": "n270-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "kvm64", + "typename": "kvm64-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "kvm32", + "typename": "kvm32-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "coreduo", + "typename": "coreduo-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "core2duo", + "typename": "core2duo-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "athlon", + "typename": "athlon-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Westmere", + "typename": "Westmere-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Skylake-Server", + "typename": "Skylake-Server-x86_64-cpu", + "unavailable-features": [ + "fma", + "pcid", + "x2apic", + "tsc-deadline", + "avx", + "f16c", + "rdrand", + "hle", + "avx2", + "invpcid", + "rtm", + "avx512f", + "avx512dq", + "rdseed", + "avx512cd", + "avx512bw", + "avx512vl", + "3dnowprefetch", + "xsavec" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Skylake-Client", + "typename": "Skylake-Client-x86_64-cpu", + "unavailable-features": [ + "fma", + "pcid", + "x2apic", + "tsc-deadline", + "avx", + "f16c", + "rdrand", + "hle", + "avx2", + "invpcid", + "rtm", + "rdseed", + "3dnowprefetch", + "xsavec" + ], + "static": false, + "migration-safe": true + }, + { + "name": "SandyBridge", + "typename": "SandyBridge-x86_64-cpu", + "unavailable-features": [ + "x2apic", + "tsc-deadline", + "avx" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Penryn", + "typename": "Penryn-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G5", + "typename": "Opteron_G5-x86_64-cpu", + "unavailable-features": [ + "fma", + "avx", + "f16c", + "misalignsse", + "3dnowprefetch", + "xop", + "fma4", + "tbm" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G4", + "typename": "Opteron_G4-x86_64-cpu", + "unavailable-features": [ + "avx", + "misalignsse", + "3dnowprefetch", + "xop", + "fma4" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G3", + "typename": "Opteron_G3-x86_64-cpu", + "unavailable-features": [ + "misalignsse" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G2", + "typename": "Opteron_G2-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Opteron_G1", + "typename": "Opteron_G1-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Nehalem", + "typename": "Nehalem-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "IvyBridge", + "typename": "IvyBridge-x86_64-cpu", + "unavailable-features": [ + "x2apic", + "tsc-deadline", + "avx", + "f16c", + "rdrand" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Haswell", + "typename": "Haswell-x86_64-cpu", + "unavailable-features": [ + "fma", + "pcid", + "x2apic", + "tsc-deadline", + "avx", + "f16c", + "rdrand", + "hle", + "avx2", + "invpcid", + "rtm" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Haswell-noTSX", + "typename": "Haswell-noTSX-x86_64-cpu", + "unavailable-features": [ + "fma", + "pcid", + "x2apic", + "tsc-deadline", + "avx", + "f16c", + "rdrand", + "avx2", + "invpcid" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Conroe", + "typename": "Conroe-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + }, + { + "name": "Broadwell", + "typename": "Broadwell-x86_64-cpu", + "unavailable-features": [ + "fma", + "pcid", + "x2apic", + "tsc-deadline", + "avx", + "f16c", + "rdrand", + "hle", + "avx2", + "invpcid", + "rtm", + "rdseed", + "3dnowprefetch" + ], + "static": false, + "migration-safe": true + }, + { + "name": "Broadwell-noTSX", + "typename": "Broadwell-noTSX-x86_64-cpu", + "unavailable-features": [ + "fma", + "pcid", + "x2apic", + "tsc-deadline", + "avx", + "f16c", + "rdrand", + "avx2", + "invpcid", + "rdseed", + "3dnowprefetch" + ], + "static": false, + "migration-safe": true + }, + { + "name": "486", + "typename": "486-x86_64-cpu", + "unavailable-features": [ + ], + "static": false, + "migration-safe": true + } + ], + "id": "libvirt-2" +} + +{ + "return": { + "model": { + "name": "base", + "props": { + "cmov": true, + "ia64": false, + "aes": true, + "mmx": true, + "rdpid": false, + "arat": true, + "pause-filter": false, + "xsavec": false, + "osxsave": false, + "kvm-asyncpf": false, + "perfctr-core": false, + "mpx": true, + "pbe": false, + "avx512cd": false, + "decodeassists": false, + "sse4.1": true, + "family": 6, + "avx512f": false, + "msr": true, + "mce": true, + "mca": true, + "xcrypt": false, + "min-level": 13, + "xgetbv1": true, + "cid": false, + "ds": false, + "fxsr": true, + "xsaveopt": true, + "xtpr": false, + "avx512vl": false, + "avx512-vpopcntdq": false, + "phe": false, + "extapic": false, + "3dnowprefetch": false, + "cr8legacy": true, + "xcrypt-en": false, + "pn": false, + "dca": false, + "vendor": "AuthenticAMD", + "pku": true, + "smx": false, + "cmp-legacy": false, + "avx512-4fmaps": false, + "vmcb-clean": false, + "hle": false, + "3dnowext": true, + "npt": false, + "clwb": true, + "lbrv": false, + "adx": true, + "ss": true, + "pni": true, + "svm-lock": false, + "smep": true, + "smap": true, + "pfthreshold": false, + "x2apic": false, + "avx512vbmi": false, + "flushbyasid": false, + "f16c": false, + "ace2-en": false, + "pae": true, + "pat": true, + "sse": true, + "phe-en": false, + "kvm-nopiodelay": false, + "tm": false, + "kvmclock-stable-bit": false, + "hypervisor": true, + "pcommit": true, + "syscall": true, + "avx512dq": false, + "svm": true, + "invtsc": false, + "sse2": true, + "est": false, + "avx512ifma": false, + "tm2": false, + "kvm-pv-eoi": false, + "cx8": true, + "kvm-mmu": false, + "sse4.2": true, + "pge": true, + "pdcm": false, + "model": 6, + "movbe": true, + "nrip-save": false, + "ssse3": true, + "sse4a": true, + "invpcid": false, + "pdpe1gb": true, + "tsc-deadline": false, + "fma": false, + "cx16": true, + "de": true, + "stepping": 3, + "xsave": true, + "clflush": true, + "skinit": false, + "tsc": true, + "tce": false, + "fpu": true, + "ds-cpl": false, + "ibs": false, + "fma4": false, + "la57": true, + "osvw": false, + "apic": true, + "pmm": false, + "tsc-adjust": false, + "kvm-steal-time": false, + "kvmclock": false, + "lwp": false, + "xop": false, + "avx": false, + "ospke": true, + "acpi": true, + "avx512bw": false, + "ace2": false, + "fsgsbase": true, + "ht": false, + "nx": true, + "pclmulqdq": true, + "mmxext": true, + "popcnt": true, + "xsaves": false, + "lm": true, + "umip": false, + "pse": true, + "avx2": false, + "sep": true, + "nodeid-msr": false, + "misalignsse": false, + "min-xlevel": 2147483658, + "bmi1": true, + "bmi2": true, + "kvm-pv-unhalt": false, + "tsc-scale": false, + "topoext": false, + "clflushopt": true, + "monitor": true, + "avx512er": false, + "pmm-en": false, + "pcid": false, + "3dnow": true, + "erms": true, + "lahf-lm": true, + "fxsr-opt": false, + "xstore": false, + "rtm": false, + "lmce": false, + "perfctr-nb": false, + "rdrand": false, + "rdseed": false, + "avx512-4vnniw": false, + "vme": false, + "vmx": false, + "dtes64": false, + "mtrr": true, + "rdtscp": true, + "pse36": true, + "tbm": false, + "wdt": false, + "model-id": "QEMU TCG CPU version 2.5+", + "sha-ni": false, + "abm": true, + "avx512pf": false, + "xstore-en": false + } + } + }, + "id": "libvirt-3" +} + +{ + "return": { + "model": { + "name": "base", + "props": { + "phys-bits": 0, + "core-id": -1, + "xlevel": 2147483658, + "cmov": true, + "ia64": false, + "aes": true, + "mmx": true, + "arat": true, + "rdpid": false, + "pause-filter": false, + "xsavec": false, + "osxsave": false, + "tsc-frequency": 0, + "xd": true, + "hv-vendor-id": "", + "kvm-asyncpf": false, + "kvm_asyncpf": false, + "perfctr_core": false, + "perfctr-core": false, + "mpx": true, + "avx512cd": false, + "decodeassists": false, + "pbe": false, + "sse4_1": true, + "sse4.1": true, + "sse4-1": true, + "family": 6, + "vmware-cpuid-freq": true, + "avx512f": false, + "xcrypt": false, + "hv-runtime": false, + "msr": true, + "mce": true, + "mca": true, + "thread-id": -1, + "min-level": 13, + "xgetbv1": true, + "cid": false, + "hv-relaxed": false, + "fxsr": true, + "ds": false, + "hv-crash": false, + "xsaveopt": true, + "xtpr": false, + "avx512-vpopcntdq": false, + "phe": false, + "avx512vl": false, + "extapic": false, + "3dnowprefetch": false, + "cr8legacy": true, + "cpuid-0xb": true, + "xcrypt-en": false, + "kvm_pv_eoi": false, + "apic-id": 4294967295, + "pn": false, + "dca": false, + "vendor": "AuthenticAMD", + "pku": true, + "smx": false, + "cmp-legacy": false, + "cmp_legacy": false, + "node-id": -1, + "avx512-4fmaps": false, + "vmcb-clean": false, + "vmcb_clean": false, + "3dnowext": true, + "hle": false, + "npt": false, + "memory": "/machine/unattached/system[0]", + "clwb": true, + "lbrv": false, + "adx": true, + "ss": true, + "pni": true, + "svm_lock": false, + "svm-lock": false, + "smep": true, + "pfthreshold": false, + "smap": true, + "x2apic": false, + "avx512vbmi": false, + "hv-stimer": false, + "i64": true, + "flushbyasid": false, + "f16c": false, + "ace2-en": false, + "pat": true, + "pae": true, + "sse": true, + "phe-en": false, + "kvm-nopiodelay": false, + "kvm_nopiodelay": false, + "tm": false, + "kvmclock-stable-bit": false, + "hypervisor": true, + "socket-id": -1, + "pcommit": true, + "syscall": true, + "level": 13, + "avx512dq": false, + "svm": true, + "full-cpuid-auto-level": true, + "hv-reset": false, + "invtsc": false, + "sse3": true, + "sse2": true, + "est": false, + "avx512ifma": false, + "tm2": false, + "kvm-pv-eoi": false, + "cx8": true, + "kvm-mmu": false, + "kvm_mmu": false, + "sse4_2": true, + "sse4.2": true, + "sse4-2": true, + "pge": true, + "fill-mtrr-mask": true, + "pdcm": false, + "nodeid_msr": false, + "model": 6, + "movbe": true, + "nrip-save": false, + "nrip_save": false, + "sse4a": true, + "ssse3": true, + "kvm_pv_unhalt": false, + "invpcid": false, + "pdpe1gb": true, + "tsc-deadline": false, + "fma": false, + "cx16": true, + "de": true, + "enforce": false, + "stepping": 3, + "xsave": true, + "clflush": true, + "skinit": false, + "tce": false, + "tsc": true, + "fpu": true, + "ds-cpl": false, + "ds_cpl": false, + "ibs": false, + "host-phys-bits": false, + "fma4": false, + "la57": true, + "osvw": false, + "check": true, + "hv-spinlocks": -1, + "pmm": false, + "apic": true, + "pmu": false, + "min-xlevel2": 0, + "tsc-adjust": false, + "tsc_adjust": false, + "kvm-steal-time": false, + "kvm_steal_time": false, + "kvmclock": false, + "l3-cache": true, + "lwp": false, + "xop": false, + "avx": false, + "ospke": true, + "ace2": false, + "acpi": true, + "avx512bw": false, + "hv-vapic": false, + "fsgsbase": true, + "ht": false, + "nx": true, + "pclmulqdq": true, + "mmxext": true, + "popcnt": true, + "xsaves": false, + "tcg-cpuid": true, + "lm": true, + "umip": false, + "avx2": false, + "pse": true, + "sep": true, + "pclmuldq": true, + "nodeid-msr": false, + "kvm": true, + "misalignsse": false, + "min-xlevel": 2147483658, + "bmi2": true, + "bmi1": true, + "kvm-pv-unhalt": false, + "realized": false, + "tsc_scale": false, + "tsc-scale": false, + "topoext": false, + "hv-vpindex": false, + "xlevel2": 0, + "clflushopt": true, + "kvm-no-smi-migration": false, + "monitor": true, + "avx512er": false, + "pmm-en": false, + "pcid": false, + "3dnow": true, + "erms": true, + "lahf-lm": true, + "lahf_lm": true, + "xstore": false, + "hv-synic": false, + "fxsr-opt": false, + "fxsr_opt": false, + "rtm": false, + "lmce": false, + "hv-time": false, + "perfctr-nb": false, + "perfctr_nb": false, + "ffxsr": false, + "rdrand": false, + "rdseed": false, + "avx512-4vnniw": false, + "vme": false, + "vmx": false, + "dtes64": false, + "mtrr": true, + "rdtscp": true, + "pse36": true, + "tbm": false, + "wdt": false, + "pause_filter": false, + "model-id": "QEMU TCG CPU version 2.5+", + "sha-ni": false, + "abm": true, + "avx512pf": false, + "xstore-en": false + } + } + }, + "id": "libvirt-4" +} + +{ + "return": { + "model": { + "name": "base", + "props": { + "cmov": true, + "ia64": false, + "aes": true, + "mmx": true, + "rdpid": false, + "arat": true, + "pause-filter": false, + "xsavec": false, + "osxsave": false, + "kvm-asyncpf": false, + "perfctr-core": false, + "mpx": true, + "pbe": false, + "avx512cd": false, + "decodeassists": false, + "sse4.1": true, + "family": 6, + "avx512f": false, + "msr": true, + "mce": true, + "mca": true, + "xcrypt": false, + "min-level": 13, + "xgetbv1": true, + "cid": false, + "ds": false, + "fxsr": true, + "xsaveopt": true, + "xtpr": false, + "avx512vl": false, + "avx512-vpopcntdq": false, + "phe": false, + "extapic": false, + "3dnowprefetch": false, + "cr8legacy": true, + "xcrypt-en": false, + "pn": false, + "dca": false, + "vendor": "AuthenticAMD", + "pku": true, + "smx": false, + "cmp-legacy": false, + "avx512-4fmaps": false, + "vmcb-clean": false, + "hle": false, + "3dnowext": true, + "npt": false, + "clwb": true, + "lbrv": false, + "adx": true, + "ss": true, + "pni": true, + "svm-lock": false, + "smep": true, + "smap": true, + "pfthreshold": false, + "x2apic": false, + "avx512vbmi": false, + "flushbyasid": false, + "f16c": false, + "ace2-en": false, + "pae": true, + "pat": true, + "sse": true, + "phe-en": false, + "kvm-nopiodelay": false, + "tm": false, + "kvmclock-stable-bit": false, + "hypervisor": true, + "pcommit": true, + "syscall": true, + "avx512dq": false, + "svm": true, + "invtsc": false, + "sse2": true, + "est": false, + "avx512ifma": false, + "tm2": false, + "kvm-pv-eoi": false, + "cx8": true, + "kvm-mmu": false, + "sse4.2": true, + "pge": true, + "pdcm": false, + "model": 6, + "movbe": true, + "nrip-save": false, + "ssse3": true, + "sse4a": true, + "invpcid": false, + "pdpe1gb": true, + "tsc-deadline": false, + "fma": false, + "cx16": true, + "de": true, + "stepping": 3, + "xsave": true, + "clflush": true, + "skinit": false, + "tsc": true, + "tce": false, + "fpu": true, + "ds-cpl": false, + "ibs": false, + "fma4": false, + "la57": true, + "osvw": false, + "apic": true, + "pmm": false, + "tsc-adjust": false, + "kvm-steal-time": false, + "kvmclock": false, + "lwp": false, + "xop": false, + "avx": false, + "ospke": true, + "acpi": true, + "avx512bw": false, + "ace2": false, + "fsgsbase": true, + "ht": false, + "nx": true, + "pclmulqdq": true, + "mmxext": true, + "popcnt": true, + "xsaves": false, + "lm": true, + "umip": false, + "pse": true, + "avx2": false, + "sep": true, + "nodeid-msr": false, + "misalignsse": false, + "min-xlevel": 2147483658, + "bmi1": true, + "bmi2": true, + "kvm-pv-unhalt": false, + "tsc-scale": false, + "topoext": false, + "clflushopt": true, + "monitor": true, + "avx512er": false, + "pmm-en": false, + "pcid": false, + "3dnow": true, + "erms": true, + "lahf-lm": true, + "fxsr-opt": false, + "xstore": false, + "rtm": false, + "lmce": false, + "perfctr-nb": false, + "rdrand": false, + "rdseed": false, + "avx512-4vnniw": false, + "vme": false, + "vmx": false, + "dtes64": false, + "mtrr": true, + "rdtscp": true, + "pse36": true, + "tbm": false, + "wdt": false, + "model-id": "QEMU TCG CPU version 2.5+", + "sha-ni": false, + "abm": true, + "avx512pf": false, + "xstore-en": false + } + } + }, + "id": "libvirt-5" +} + +{ + "return": { + "model": { + "name": "base", + "props": { + "phys-bits": 0, + "core-id": -1, + "xlevel": 2147483658, + "cmov": true, + "ia64": false, + "aes": true, + "mmx": true, + "arat": true, + "rdpid": false, + "pause-filter": false, + "xsavec": false, + "osxsave": false, + "tsc-frequency": 0, + "xd": true, + "hv-vendor-id": "", + "kvm-asyncpf": false, + "kvm_asyncpf": false, + "perfctr_core": false, + "perfctr-core": false, + "mpx": true, + "avx512cd": false, + "decodeassists": false, + "pbe": false, + "sse4_1": true, + "sse4.1": true, + "sse4-1": true, + "family": 6, + "vmware-cpuid-freq": true, + "avx512f": false, + "xcrypt": false, + "hv-runtime": false, + "msr": true, + "mce": true, + "mca": true, + "thread-id": -1, + "min-level": 13, + "xgetbv1": true, + "cid": false, + "hv-relaxed": false, + "fxsr": true, + "ds": false, + "hv-crash": false, + "xsaveopt": true, + "xtpr": false, + "avx512-vpopcntdq": false, + "phe": false, + "avx512vl": false, + "extapic": false, + "3dnowprefetch": false, + "cr8legacy": true, + "cpuid-0xb": true, + "xcrypt-en": false, + "kvm_pv_eoi": false, + "apic-id": 4294967295, + "pn": false, + "dca": false, + "vendor": "AuthenticAMD", + "pku": true, + "smx": false, + "cmp-legacy": false, + "cmp_legacy": false, + "node-id": -1, + "avx512-4fmaps": false, + "vmcb-clean": false, + "vmcb_clean": false, + "3dnowext": true, + "hle": false, + "npt": false, + "memory": "/machine/unattached/system[0]", + "clwb": true, + "lbrv": false, + "adx": true, + "ss": true, + "pni": true, + "svm_lock": false, + "svm-lock": false, + "smep": true, + "pfthreshold": false, + "smap": true, + "x2apic": false, + "avx512vbmi": false, + "hv-stimer": false, + "i64": true, + "flushbyasid": false, + "f16c": false, + "ace2-en": false, + "pat": true, + "pae": true, + "sse": true, + "phe-en": false, + "kvm-nopiodelay": false, + "kvm_nopiodelay": false, + "tm": false, + "kvmclock-stable-bit": false, + "hypervisor": true, + "socket-id": -1, + "pcommit": true, + "syscall": true, + "level": 13, + "avx512dq": false, + "svm": true, + "full-cpuid-auto-level": true, + "hv-reset": false, + "invtsc": false, + "sse3": true, + "sse2": true, + "est": false, + "avx512ifma": false, + "tm2": false, + "kvm-pv-eoi": false, + "cx8": true, + "kvm-mmu": false, + "kvm_mmu": false, + "sse4_2": true, + "sse4.2": true, + "sse4-2": true, + "pge": true, + "fill-mtrr-mask": true, + "pdcm": false, + "nodeid_msr": false, + "model": 6, + "movbe": true, + "nrip-save": false, + "nrip_save": false, + "sse4a": true, + "ssse3": true, + "kvm_pv_unhalt": false, + "invpcid": false, + "pdpe1gb": true, + "tsc-deadline": false, + "fma": false, + "cx16": true, + "de": true, + "enforce": false, + "stepping": 3, + "xsave": true, + "clflush": true, + "skinit": false, + "tce": false, + "tsc": true, + "fpu": true, + "ds-cpl": false, + "ds_cpl": false, + "ibs": false, + "host-phys-bits": false, + "fma4": false, + "la57": true, + "osvw": false, + "check": true, + "hv-spinlocks": -1, + "pmm": false, + "apic": true, + "pmu": false, + "min-xlevel2": 0, + "tsc-adjust": false, + "tsc_adjust": false, + "kvm-steal-time": false, + "kvm_steal_time": false, + "kvmclock": false, + "l3-cache": true, + "lwp": false, + "xop": false, + "avx": false, + "ospke": true, + "ace2": false, + "acpi": true, + "avx512bw": false, + "hv-vapic": false, + "fsgsbase": true, + "ht": false, + "nx": true, + "pclmulqdq": true, + "mmxext": true, + "popcnt": true, + "xsaves": false, + "tcg-cpuid": true, + "lm": true, + "umip": false, + "avx2": false, + "pse": true, + "sep": true, + "pclmuldq": true, + "nodeid-msr": false, + "kvm": true, + "misalignsse": false, + "min-xlevel": 2147483658, + "bmi2": true, + "bmi1": true, + "kvm-pv-unhalt": false, + "realized": false, + "tsc_scale": false, + "tsc-scale": false, + "topoext": false, + "hv-vpindex": false, + "xlevel2": 0, + "clflushopt": true, + "kvm-no-smi-migration": false, + "monitor": true, + "avx512er": false, + "pmm-en": false, + "pcid": false, + "3dnow": true, + "erms": true, + "lahf-lm": true, + "lahf_lm": true, + "xstore": false, + "hv-synic": false, + "fxsr-opt": false, + "fxsr_opt": false, + "rtm": false, + "lmce": false, + "hv-time": false, + "perfctr-nb": false, + "perfctr_nb": false, + "ffxsr": false, + "rdrand": false, + "rdseed": false, + "avx512-4vnniw": false, + "vme": false, + "vmx": false, + "dtes64": false, + "mtrr": true, + "rdtscp": true, + "pse36": true, + "tbm": false, + "wdt": false, + "pause_filter": false, + "model-id": "QEMU TCG CPU version 2.5+", + "sha-ni": false, + "abm": true, + "avx512pf": false, + "xstore-en": false + } + } + }, + "id": "libvirt-6" +} diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml new file mode 100644 index 0000000..6049211 --- /dev/null +++ b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml @@ -0,0 +1,798 @@ +<qemuCaps> + <qemuctime>0</qemuctime> + <selfctime>0</selfctime> + <selfvers>0</selfvers> + <usedQMP/> + <flag name='kvm'/> + <flag name='mem-path'/> + <flag name='drive-serial'/> + <flag name='monitor-json'/> + <flag name='sdl'/> + <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='smbios-type'/> + <flag name='spice'/> + <flag name='vga-none'/> + <flag name='boot-index'/> + <flag name='hda-duplex'/> + <flag name='drive-aio'/> + <flag name='pci-bootindex'/> + <flag name='ccid-emulated'/> + <flag name='ccid-passthru'/> + <flag name='chardev-spicevmc'/> + <flag name='virtio-tx-alg'/> + <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-redir'/> + <flag name='usb-hub'/> + <flag name='no-shutdown'/> + <flag name='cache-unsafe'/> + <flag name='ich9-ahci'/> + <flag name='no-acpi'/> + <flag name='fsdev-readonly'/> + <flag name='virtio-blk-pci.scsi'/> + <flag name='drive-copy-on-read'/> + <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='usb-redir.filter'/> + <flag name='ide-drive.wwn'/> + <flag name='scsi-disk.wwn'/> + <flag name='seccomp-sandbox'/> + <flag name='reboot-timeout'/> + <flag name='dump-guest-core'/> + <flag name='seamless-migration'/> + <flag name='block-commit'/> + <flag name='vnc'/> + <flag name='drive-mirror'/> + <flag name='usb-redir.bootindex'/> + <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='device-video-primary'/> + <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='tpm-passthrough'/> + <flag name='tpm-tis'/> + <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='i440fx-pci-hole64-size'/> + <flag name='q35-pci-hole64-size'/> + <flag name='usb-storage'/> + <flag name='usb-storage.removable'/> + <flag name='virtio-mmio'/> + <flag name='ich9-intel-hda'/> + <flag name='kvm-pit-lost-tick-policy'/> + <flag name='boot-strict'/> + <flag name='pvpanic'/> + <flag name='spice-file-xfer-disable'/> + <flag name='spiceport'/> + <flag name='usb-kbd'/> + <flag name='host-pci-multidomain'/> + <flag name='msg-timestamp'/> + <flag name='active-commit'/> + <flag name='change-backing-file'/> + <flag name='memory-backend-ram'/> + <flag name='numa'/> + <flag name='memory-backend-file'/> + <flag name='usb-audio'/> + <flag name='rtc-reset-reinjection'/> + <flag name='splash-timeout'/> + <flag name='iothread'/> + <flag name='migrate-rdma'/> + <flag name='ivshmem'/> + <flag name='drive-iotune-max'/> + <flag name='VGA.vgamem_mb'/> + <flag name='vmware-svga.vgamem_mb'/> + <flag name='qxl.vgamem_mb'/> + <flag name='pc-dimm'/> + <flag name='machine-vmport-opt'/> + <flag name='aes-key-wrap'/> + <flag name='dea-key-wrap'/> + <flag name='pci-serial'/> + <flag name='vhost-user-multiqueue'/> + <flag name='migration-event'/> + <flag name='ioh3420'/> + <flag name='x3130-upstream'/> + <flag name='xio3130-downstream'/> + <flag name='rtl8139'/> + <flag name='e1000'/> + <flag name='virtio-net'/> + <flag name='gic-version'/> + <flag name='incoming-defer'/> + <flag name='virtio-gpu'/> + <flag name='virtio-gpu.virgl'/> + <flag name='virtio-keyboard'/> + <flag name='virtio-mouse'/> + <flag name='virtio-tablet'/> + <flag name='virtio-input-host'/> + <flag name='chardev-file-append'/> + <flag name='ich9-disable-s3'/> + <flag name='ich9-disable-s4'/> + <flag name='vserport-change-event'/> + <flag name='virtio-balloon-pci.deflate-on-oom'/> + <flag name='mptsas1068'/> + <flag name='spice-gl'/> + <flag name='qxl.vram64_size_mb'/> + <flag name='chardev-logfile'/> + <flag name='debug-threads'/> + <flag name='secret'/> + <flag name='pxb'/> + <flag name='pxb-pcie'/> + <flag name='device-tray-moved-event'/> + <flag name='nec-usb-xhci-ports'/> + <flag name='virtio-scsi-pci.iothread'/> + <flag name='name-guest'/> + <flag name='qxl.max_outputs'/> + <flag name='spice-unix'/> + <flag name='drive-detect-zeroes'/> + <flag name='tls-creds-x509'/> + <flag name='display'/> + <flag name='intel-iommu'/> + <flag name='smm'/> + <flag name='virtio-pci-disable-legacy'/> + <flag name='query-hotpluggable-cpus'/> + <flag name='virtio-net.rx_queue_size'/> + <flag name='virtio-vga'/> + <flag name='drive-iotune-max-length'/> + <flag name='ivshmem-plain'/> + <flag name='ivshmem-doorbell'/> + <flag name='query-qmp-schema'/> + <flag name='gluster.debug_level'/> + <flag name='vhost-scsi'/> + <flag name='drive-iotune-group'/> + <flag name='query-cpu-model-expansion'/> + <flag name='virtio-net.host_mtu'/> + <flag name='spice-rendernode'/> + <flag name='nvdimm'/> + <flag name='pcie-root-port'/> + <flag name='query-cpu-definitions'/> + <flag name='block-write-threshold'/> + <flag name='query-named-block-nodes'/> + <flag name='cpu-cache'/> + <flag name='qemu-xhci'/> + <flag name='kernel-irqchip'/> + <flag name='kernel-irqchip.split'/> + <flag name='intel-iommu.intremap'/> + <flag name='intel-iommu.caching-mode'/> + <flag name='intel-iommu.eim'/> + <flag name='intel-iommu.device-iotlb'/> + <flag name='virtio.iommu_platform'/> + <flag name='virtio.ats'/> + <flag name='loadparm'/> + <flag name='vnc-multi-servers'/> + <flag name='virtio-net.tx_queue_size'/> + <flag name='chardev-reconnect'/> + <flag name='virtio-gpu.max_outputs'/> + <version>2010000</version> + <kvmVersion>0</kvmVersion> + <package> (v2.10.0)</package> + <arch>x86_64</arch> + <hostCPU type='kvm' model='base' migratability='yes'> + <property name='phys-bits' type='number' value='0'/> + <property name='core-id' type='number' value='-1'/> + <property name='xlevel' type='number' value='2147483656'/> + <property name='cmov' type='boolean' value='true' migratable='yes'/> + <property name='ia64' type='boolean' value='false'/> + <property name='aes' type='boolean' value='true' migratable='yes'/> + <property name='mmx' type='boolean' value='true' migratable='yes'/> + <property name='arat' type='boolean' value='true' migratable='yes'/> + <property name='rdpid' type='boolean' value='false'/> + <property name='pause-filter' type='boolean' value='false'/> + <property name='xsavec' type='boolean' value='false'/> + <property name='osxsave' type='boolean' value='false'/> + <property name='tsc-frequency' type='number' value='0'/> + <property name='xd' type='boolean' value='true' migratable='yes'/> + <property name='hv-vendor-id' type='string' value=''/> + <property name='kvm-asyncpf' type='boolean' value='true' migratable='yes'/> + <property name='kvm_asyncpf' type='boolean' value='true' migratable='yes'/> + <property name='perfctr_core' type='boolean' value='false'/> + <property name='perfctr-core' type='boolean' value='false'/> + <property name='mpx' type='boolean' value='false'/> + <property name='avx512cd' type='boolean' value='false'/> + <property name='decodeassists' type='boolean' value='false'/> + <property name='pbe' type='boolean' value='false'/> + <property name='sse4_1' type='boolean' value='true' migratable='yes'/> + <property name='sse4.1' type='boolean' value='true' migratable='yes'/> + <property name='sse4-1' type='boolean' value='true' migratable='yes'/> + <property name='family' type='number' value='6'/> + <property name='vmware-cpuid-freq' type='boolean' value='true' migratable='yes'/> + <property name='avx512f' type='boolean' value='false'/> + <property name='xcrypt' type='boolean' value='false'/> + <property name='hv-runtime' type='boolean' value='false'/> + <property name='msr' type='boolean' value='true' migratable='yes'/> + <property name='mce' type='boolean' value='true' migratable='yes'/> + <property name='mca' type='boolean' value='true' migratable='yes'/> + <property name='thread-id' type='number' value='-1'/> + <property name='min-level' type='number' value='13'/> + <property name='xgetbv1' type='boolean' value='false'/> + <property name='cid' type='boolean' value='false'/> + <property name='hv-relaxed' type='boolean' value='false'/> + <property name='fxsr' type='boolean' value='true' migratable='yes'/> + <property name='ds' type='boolean' value='false'/> + <property name='hv-crash' type='boolean' value='false'/> + <property name='xsaveopt' type='boolean' value='true' migratable='yes'/> + <property name='xtpr' type='boolean' value='false'/> + <property name='avx512-vpopcntdq' type='boolean' value='false'/> + <property name='phe' type='boolean' value='false'/> + <property name='avx512vl' type='boolean' value='false'/> + <property name='extapic' type='boolean' value='false'/> + <property name='3dnowprefetch' type='boolean' value='false'/> + <property name='cr8legacy' type='boolean' value='false'/> + <property name='cpuid-0xb' type='boolean' value='true' migratable='yes'/> + <property name='xcrypt-en' type='boolean' value='false'/> + <property name='kvm_pv_eoi' type='boolean' value='true' migratable='yes'/> + <property name='apic-id' type='number' value='4294967295'/> + <property name='pn' type='boolean' value='false'/> + <property name='dca' type='boolean' value='false'/> + <property name='vendor' type='string' value='GenuineIntel'/> + <property name='pku' type='boolean' value='false'/> + <property name='smx' type='boolean' value='false'/> + <property name='cmp-legacy' type='boolean' value='false'/> + <property name='cmp_legacy' type='boolean' value='false'/> + <property name='node-id' type='number' value='-1'/> + <property name='avx512-4fmaps' type='boolean' value='false'/> + <property name='vmcb-clean' type='boolean' value='false'/> + <property name='vmcb_clean' type='boolean' value='false'/> + <property name='3dnowext' type='boolean' value='false'/> + <property name='hle' type='boolean' value='false'/> + <property name='npt' type='boolean' value='false'/> + <property name='memory' type='string' value='/machine/unattached/system[0]'/> + <property name='clwb' type='boolean' value='false'/> + <property name='lbrv' type='boolean' value='false'/> + <property name='adx' type='boolean' value='false'/> + <property name='ss' type='boolean' value='true' migratable='yes'/> + <property name='pni' type='boolean' value='true' migratable='yes'/> + <property name='svm_lock' type='boolean' value='false'/> + <property name='svm-lock' type='boolean' value='false'/> + <property name='smep' type='boolean' value='true' migratable='yes'/> + <property name='pfthreshold' type='boolean' value='false'/> + <property name='smap' type='boolean' value='false'/> + <property name='x2apic' type='boolean' value='true' migratable='yes'/> + <property name='avx512vbmi' type='boolean' value='false'/> + <property name='hv-stimer' type='boolean' value='false'/> + <property name='i64' type='boolean' value='true' migratable='yes'/> + <property name='flushbyasid' type='boolean' value='false'/> + <property name='f16c' type='boolean' value='true' migratable='yes'/> + <property name='ace2-en' type='boolean' value='false'/> + <property name='pat' type='boolean' value='true' migratable='yes'/> + <property name='pae' type='boolean' value='true' migratable='yes'/> + <property name='sse' type='boolean' value='true' migratable='yes'/> + <property name='phe-en' type='boolean' value='false'/> + <property name='kvm-nopiodelay' type='boolean' value='true' migratable='yes'/> + <property name='kvm_nopiodelay' type='boolean' value='true' migratable='yes'/> + <property name='tm' type='boolean' value='false'/> + <property name='kvmclock-stable-bit' type='boolean' value='true' migratable='yes'/> + <property name='hypervisor' type='boolean' value='true' migratable='yes'/> + <property name='socket-id' type='number' value='-1'/> + <property name='pcommit' type='boolean' value='false'/> + <property name='syscall' type='boolean' value='true' migratable='yes'/> + <property name='level' type='number' value='13'/> + <property name='avx512dq' type='boolean' value='false'/> + <property name='svm' type='boolean' value='false'/> + <property name='full-cpuid-auto-level' type='boolean' value='true' migratable='yes'/> + <property name='hv-reset' type='boolean' value='false'/> + <property name='invtsc' type='boolean' value='true' migratable='no'/> + <property name='sse3' type='boolean' value='true' migratable='yes'/> + <property name='sse2' type='boolean' value='true' migratable='yes'/> + <property name='est' type='boolean' value='false'/> + <property name='avx512ifma' type='boolean' value='false'/> + <property name='tm2' type='boolean' value='false'/> + <property name='kvm-pv-eoi' type='boolean' value='true' migratable='yes'/> + <property name='cx8' type='boolean' value='true' migratable='yes'/> + <property name='kvm-mmu' type='boolean' value='false'/> + <property name='kvm_mmu' type='boolean' value='false'/> + <property name='sse4_2' type='boolean' value='true' migratable='yes'/> + <property name='sse4.2' type='boolean' value='true' migratable='yes'/> + <property name='sse4-2' type='boolean' value='true' migratable='yes'/> + <property name='pge' type='boolean' value='true' migratable='yes'/> + <property name='fill-mtrr-mask' type='boolean' value='true' migratable='yes'/> + <property name='pdcm' type='boolean' value='false'/> + <property name='nodeid_msr' type='boolean' value='false'/> + <property name='model' type='number' value='60'/> + <property name='movbe' type='boolean' value='true' migratable='yes'/> + <property name='nrip-save' type='boolean' value='false'/> + <property name='nrip_save' type='boolean' value='false'/> + <property name='sse4a' type='boolean' value='false'/> + <property name='ssse3' type='boolean' value='true' migratable='yes'/> + <property name='kvm_pv_unhalt' type='boolean' value='true' migratable='yes'/> + <property name='invpcid' type='boolean' value='true' migratable='yes'/> + <property name='pdpe1gb' type='boolean' value='true' migratable='yes'/> + <property name='tsc-deadline' type='boolean' value='true' migratable='yes'/> + <property name='fma' type='boolean' value='true' migratable='yes'/> + <property name='cx16' type='boolean' value='true' migratable='yes'/> + <property name='de' type='boolean' value='true' migratable='yes'/> + <property name='enforce' type='boolean' value='false'/> + <property name='stepping' type='number' value='3'/> + <property name='xsave' type='boolean' value='true' migratable='yes'/> + <property name='clflush' type='boolean' value='true' migratable='yes'/> + <property name='skinit' type='boolean' value='false'/> + <property name='tce' type='boolean' value='false'/> + <property name='tsc' type='boolean' value='true' migratable='yes'/> + <property name='fpu' type='boolean' value='true' migratable='yes'/> + <property name='ds-cpl' type='boolean' value='false'/> + <property name='ds_cpl' type='boolean' value='false'/> + <property name='ibs' type='boolean' value='false'/> + <property name='host-phys-bits' type='boolean' value='false'/> + <property name='fma4' type='boolean' value='false'/> + <property name='la57' type='boolean' value='false'/> + <property name='osvw' type='boolean' value='false'/> + <property name='check' type='boolean' value='true' migratable='yes'/> + <property name='hv-spinlocks' type='number' value='-1'/> + <property name='pmm' type='boolean' value='false'/> + <property name='apic' type='boolean' value='true' migratable='yes'/> + <property name='pmu' type='boolean' value='false'/> + <property name='min-xlevel2' type='number' value='0'/> + <property name='tsc-adjust' type='boolean' value='true' migratable='yes'/> + <property name='tsc_adjust' type='boolean' value='true' migratable='yes'/> + <property name='kvm-steal-time' type='boolean' value='true' migratable='yes'/> + <property name='kvm_steal_time' type='boolean' value='true' migratable='yes'/> + <property name='kvmclock' type='boolean' value='true' migratable='yes'/> + <property name='l3-cache' type='boolean' value='true' migratable='yes'/> + <property name='lwp' type='boolean' value='false'/> + <property name='xop' type='boolean' value='false'/> + <property name='avx' type='boolean' value='true' migratable='yes'/> + <property name='ospke' type='boolean' value='false'/> + <property name='ace2' type='boolean' value='false'/> + <property name='acpi' type='boolean' value='false'/> + <property name='avx512bw' type='boolean' value='false'/> + <property name='hv-vapic' type='boolean' value='false'/> + <property name='fsgsbase' type='boolean' value='true' migratable='yes'/> + <property name='ht' type='boolean' value='false'/> + <property name='nx' type='boolean' value='true' migratable='yes'/> + <property name='pclmulqdq' type='boolean' value='true' migratable='yes'/> + <property name='mmxext' type='boolean' value='false'/> + <property name='popcnt' type='boolean' value='true' migratable='yes'/> + <property name='xsaves' type='boolean' value='false'/> + <property name='tcg-cpuid' type='boolean' value='true' migratable='yes'/> + <property name='lm' type='boolean' value='true' migratable='yes'/> + <property name='umip' type='boolean' value='false'/> + <property name='avx2' type='boolean' value='true' migratable='yes'/> + <property name='pse' type='boolean' value='true' migratable='yes'/> + <property name='sep' type='boolean' value='true' migratable='yes'/> + <property name='pclmuldq' type='boolean' value='true' migratable='yes'/> + <property name='nodeid-msr' type='boolean' value='false'/> + <property name='kvm' type='boolean' value='true' migratable='yes'/> + <property name='misalignsse' type='boolean' value='false'/> + <property name='min-xlevel' type='number' value='2147483656'/> + <property name='bmi2' type='boolean' value='true' migratable='yes'/> + <property name='bmi1' type='boolean' value='true' migratable='yes'/> + <property name='kvm-pv-unhalt' type='boolean' value='true' migratable='yes'/> + <property name='realized' type='boolean' value='false'/> + <property name='tsc_scale' type='boolean' value='false'/> + <property name='tsc-scale' type='boolean' value='false'/> + <property name='topoext' type='boolean' value='false'/> + <property name='hv-vpindex' type='boolean' value='false'/> + <property name='xlevel2' type='number' value='0'/> + <property name='clflushopt' type='boolean' value='false'/> + <property name='kvm-no-smi-migration' type='boolean' value='false'/> + <property name='monitor' type='boolean' value='false'/> + <property name='avx512er' type='boolean' value='false'/> + <property name='pmm-en' type='boolean' value='false'/> + <property name='pcid' type='boolean' value='true' migratable='yes'/> + <property name='3dnow' type='boolean' value='false'/> + <property name='erms' type='boolean' value='true' migratable='yes'/> + <property name='lahf-lm' type='boolean' value='true' migratable='yes'/> + <property name='lahf_lm' type='boolean' value='true' migratable='yes'/> + <property name='xstore' type='boolean' value='false'/> + <property name='hv-synic' type='boolean' value='false'/> + <property name='fxsr-opt' type='boolean' value='false'/> + <property name='fxsr_opt' type='boolean' value='false'/> + <property name='rtm' type='boolean' value='false'/> + <property name='lmce' type='boolean' value='true' migratable='yes'/> + <property name='hv-time' type='boolean' value='false'/> + <property name='perfctr-nb' type='boolean' value='false'/> + <property name='perfctr_nb' type='boolean' value='false'/> + <property name='ffxsr' type='boolean' value='false'/> + <property name='rdrand' type='boolean' value='true' migratable='yes'/> + <property name='rdseed' type='boolean' value='false'/> + <property name='avx512-4vnniw' type='boolean' value='false'/> + <property name='vme' type='boolean' value='true' migratable='yes'/> + <property name='vmx' type='boolean' value='true' migratable='yes'/> + <property name='dtes64' type='boolean' value='false'/> + <property name='mtrr' type='boolean' value='true' migratable='yes'/> + <property name='rdtscp' type='boolean' value='true' migratable='yes'/> + <property name='pse36' type='boolean' value='true' migratable='yes'/> + <property name='tbm' type='boolean' value='false'/> + <property name='wdt' type='boolean' value='false'/> + <property name='pause_filter' type='boolean' value='false'/> + <property name='model-id' type='string' value='Intel(R) Core(TM) i7-4810MQ CPU @ 2.80GHz'/> + <property name='sha-ni' type='boolean' value='false'/> + <property name='abm' type='boolean' value='true' migratable='yes'/> + <property name='avx512pf' type='boolean' value='false'/> + <property name='xstore-en' type='boolean' value='false'/> + </hostCPU> + <hostCPU type='tcg' model='base' migratability='yes'> + <property name='phys-bits' type='number' value='0'/> + <property name='core-id' type='number' value='-1'/> + <property name='xlevel' type='number' value='2147483658'/> + <property name='cmov' type='boolean' value='true' migratable='yes'/> + <property name='ia64' type='boolean' value='false'/> + <property name='aes' type='boolean' value='true' migratable='yes'/> + <property name='mmx' type='boolean' value='true' migratable='yes'/> + <property name='arat' type='boolean' value='true' migratable='yes'/> + <property name='rdpid' type='boolean' value='false'/> + <property name='pause-filter' type='boolean' value='false'/> + <property name='xsavec' type='boolean' value='false'/> + <property name='osxsave' type='boolean' value='false'/> + <property name='tsc-frequency' type='number' value='0'/> + <property name='xd' type='boolean' value='true' migratable='yes'/> + <property name='hv-vendor-id' type='string' value=''/> + <property name='kvm-asyncpf' type='boolean' value='false'/> + <property name='kvm_asyncpf' type='boolean' value='false'/> + <property name='perfctr_core' type='boolean' value='false'/> + <property name='perfctr-core' type='boolean' value='false'/> + <property name='mpx' type='boolean' value='true' migratable='yes'/> + <property name='avx512cd' type='boolean' value='false'/> + <property name='decodeassists' type='boolean' value='false'/> + <property name='pbe' type='boolean' value='false'/> + <property name='sse4_1' type='boolean' value='true' migratable='yes'/> + <property name='sse4.1' type='boolean' value='true' migratable='yes'/> + <property name='sse4-1' type='boolean' value='true' migratable='yes'/> + <property name='family' type='number' value='6'/> + <property name='vmware-cpuid-freq' type='boolean' value='true' migratable='yes'/> + <property name='avx512f' type='boolean' value='false'/> + <property name='xcrypt' type='boolean' value='false'/> + <property name='hv-runtime' type='boolean' value='false'/> + <property name='msr' type='boolean' value='true' migratable='yes'/> + <property name='mce' type='boolean' value='true' migratable='yes'/> + <property name='mca' type='boolean' value='true' migratable='yes'/> + <property name='thread-id' type='number' value='-1'/> + <property name='min-level' type='number' value='13'/> + <property name='xgetbv1' type='boolean' value='true' migratable='yes'/> + <property name='cid' type='boolean' value='false'/> + <property name='hv-relaxed' type='boolean' value='false'/> + <property name='fxsr' type='boolean' value='true' migratable='yes'/> + <property name='ds' type='boolean' value='false'/> + <property name='hv-crash' type='boolean' value='false'/> + <property name='xsaveopt' type='boolean' value='true' migratable='yes'/> + <property name='xtpr' type='boolean' value='false'/> + <property name='avx512-vpopcntdq' type='boolean' value='false'/> + <property name='phe' type='boolean' value='false'/> + <property name='avx512vl' type='boolean' value='false'/> + <property name='extapic' type='boolean' value='false'/> + <property name='3dnowprefetch' type='boolean' value='false'/> + <property name='cr8legacy' type='boolean' value='true' migratable='yes'/> + <property name='cpuid-0xb' type='boolean' value='true' migratable='yes'/> + <property name='xcrypt-en' type='boolean' value='false'/> + <property name='kvm_pv_eoi' type='boolean' value='false'/> + <property name='apic-id' type='number' value='4294967295'/> + <property name='pn' type='boolean' value='false'/> + <property name='dca' type='boolean' value='false'/> + <property name='vendor' type='string' value='AuthenticAMD'/> + <property name='pku' type='boolean' value='true' migratable='yes'/> + <property name='smx' type='boolean' value='false'/> + <property name='cmp-legacy' type='boolean' value='false'/> + <property name='cmp_legacy' type='boolean' value='false'/> + <property name='node-id' type='number' value='-1'/> + <property name='avx512-4fmaps' type='boolean' value='false'/> + <property name='vmcb-clean' type='boolean' value='false'/> + <property name='vmcb_clean' type='boolean' value='false'/> + <property name='3dnowext' type='boolean' value='true' migratable='yes'/> + <property name='hle' type='boolean' value='false'/> + <property name='npt' type='boolean' value='false'/> + <property name='memory' type='string' value='/machine/unattached/system[0]'/> + <property name='clwb' type='boolean' value='true' migratable='yes'/> + <property name='lbrv' type='boolean' value='false'/> + <property name='adx' type='boolean' value='true' migratable='yes'/> + <property name='ss' type='boolean' value='true' migratable='yes'/> + <property name='pni' type='boolean' value='true' migratable='yes'/> + <property name='svm_lock' type='boolean' value='false'/> + <property name='svm-lock' type='boolean' value='false'/> + <property name='smep' type='boolean' value='true' migratable='yes'/> + <property name='pfthreshold' type='boolean' value='false'/> + <property name='smap' type='boolean' value='true' migratable='yes'/> + <property name='x2apic' type='boolean' value='false'/> + <property name='avx512vbmi' type='boolean' value='false'/> + <property name='hv-stimer' type='boolean' value='false'/> + <property name='i64' type='boolean' value='true' migratable='yes'/> + <property name='flushbyasid' type='boolean' value='false'/> + <property name='f16c' type='boolean' value='false'/> + <property name='ace2-en' type='boolean' value='false'/> + <property name='pat' type='boolean' value='true' migratable='yes'/> + <property name='pae' type='boolean' value='true' migratable='yes'/> + <property name='sse' type='boolean' value='true' migratable='yes'/> + <property name='phe-en' type='boolean' value='false'/> + <property name='kvm-nopiodelay' type='boolean' value='false'/> + <property name='kvm_nopiodelay' type='boolean' value='false'/> + <property name='tm' type='boolean' value='false'/> + <property name='kvmclock-stable-bit' type='boolean' value='false'/> + <property name='hypervisor' type='boolean' value='true' migratable='yes'/> + <property name='socket-id' type='number' value='-1'/> + <property name='pcommit' type='boolean' value='true' migratable='yes'/> + <property name='syscall' type='boolean' value='true' migratable='yes'/> + <property name='level' type='number' value='13'/> + <property name='avx512dq' type='boolean' value='false'/> + <property name='svm' type='boolean' value='true' migratable='yes'/> + <property name='full-cpuid-auto-level' type='boolean' value='true' migratable='yes'/> + <property name='hv-reset' type='boolean' value='false'/> + <property name='invtsc' type='boolean' value='false'/> + <property name='sse3' type='boolean' value='true' migratable='yes'/> + <property name='sse2' type='boolean' value='true' migratable='yes'/> + <property name='est' type='boolean' value='false'/> + <property name='avx512ifma' type='boolean' value='false'/> + <property name='tm2' type='boolean' value='false'/> + <property name='kvm-pv-eoi' type='boolean' value='false'/> + <property name='cx8' type='boolean' value='true' migratable='yes'/> + <property name='kvm-mmu' type='boolean' value='false'/> + <property name='kvm_mmu' type='boolean' value='false'/> + <property name='sse4_2' type='boolean' value='true' migratable='yes'/> + <property name='sse4.2' type='boolean' value='true' migratable='yes'/> + <property name='sse4-2' type='boolean' value='true' migratable='yes'/> + <property name='pge' type='boolean' value='true' migratable='yes'/> + <property name='fill-mtrr-mask' type='boolean' value='true' migratable='yes'/> + <property name='pdcm' type='boolean' value='false'/> + <property name='nodeid_msr' type='boolean' value='false'/> + <property name='model' type='number' value='6'/> + <property name='movbe' type='boolean' value='true' migratable='yes'/> + <property name='nrip-save' type='boolean' value='false'/> + <property name='nrip_save' type='boolean' value='false'/> + <property name='sse4a' type='boolean' value='true' migratable='yes'/> + <property name='ssse3' type='boolean' value='true' migratable='yes'/> + <property name='kvm_pv_unhalt' type='boolean' value='false'/> + <property name='invpcid' type='boolean' value='false'/> + <property name='pdpe1gb' type='boolean' value='true' migratable='yes'/> + <property name='tsc-deadline' type='boolean' value='false'/> + <property name='fma' type='boolean' value='false'/> + <property name='cx16' type='boolean' value='true' migratable='yes'/> + <property name='de' type='boolean' value='true' migratable='yes'/> + <property name='enforce' type='boolean' value='false'/> + <property name='stepping' type='number' value='3'/> + <property name='xsave' type='boolean' value='true' migratable='yes'/> + <property name='clflush' type='boolean' value='true' migratable='yes'/> + <property name='skinit' type='boolean' value='false'/> + <property name='tce' type='boolean' value='false'/> + <property name='tsc' type='boolean' value='true' migratable='yes'/> + <property name='fpu' type='boolean' value='true' migratable='yes'/> + <property name='ds-cpl' type='boolean' value='false'/> + <property name='ds_cpl' type='boolean' value='false'/> + <property name='ibs' type='boolean' value='false'/> + <property name='host-phys-bits' type='boolean' value='false'/> + <property name='fma4' type='boolean' value='false'/> + <property name='la57' type='boolean' value='true' migratable='yes'/> + <property name='osvw' type='boolean' value='false'/> + <property name='check' type='boolean' value='true' migratable='yes'/> + <property name='hv-spinlocks' type='number' value='-1'/> + <property name='pmm' type='boolean' value='false'/> + <property name='apic' type='boolean' value='true' migratable='yes'/> + <property name='pmu' type='boolean' value='false'/> + <property name='min-xlevel2' type='number' value='0'/> + <property name='tsc-adjust' type='boolean' value='false'/> + <property name='tsc_adjust' type='boolean' value='false'/> + <property name='kvm-steal-time' type='boolean' value='false'/> + <property name='kvm_steal_time' type='boolean' value='false'/> + <property name='kvmclock' type='boolean' value='false'/> + <property name='l3-cache' type='boolean' value='true' migratable='yes'/> + <property name='lwp' type='boolean' value='false'/> + <property name='xop' type='boolean' value='false'/> + <property name='avx' type='boolean' value='false'/> + <property name='ospke' type='boolean' value='true' migratable='yes'/> + <property name='ace2' type='boolean' value='false'/> + <property name='acpi' type='boolean' value='true' migratable='yes'/> + <property name='avx512bw' type='boolean' value='false'/> + <property name='hv-vapic' type='boolean' value='false'/> + <property name='fsgsbase' type='boolean' value='true' migratable='yes'/> + <property name='ht' type='boolean' value='false'/> + <property name='nx' type='boolean' value='true' migratable='yes'/> + <property name='pclmulqdq' type='boolean' value='true' migratable='yes'/> + <property name='mmxext' type='boolean' value='true' migratable='yes'/> + <property name='popcnt' type='boolean' value='true' migratable='yes'/> + <property name='xsaves' type='boolean' value='false'/> + <property name='tcg-cpuid' type='boolean' value='true' migratable='yes'/> + <property name='lm' type='boolean' value='true' migratable='yes'/> + <property name='umip' type='boolean' value='false'/> + <property name='avx2' type='boolean' value='false'/> + <property name='pse' type='boolean' value='true' migratable='yes'/> + <property name='sep' type='boolean' value='true' migratable='yes'/> + <property name='pclmuldq' type='boolean' value='true' migratable='yes'/> + <property name='nodeid-msr' type='boolean' value='false'/> + <property name='kvm' type='boolean' value='true' migratable='yes'/> + <property name='misalignsse' type='boolean' value='false'/> + <property name='min-xlevel' type='number' value='2147483658'/> + <property name='bmi2' type='boolean' value='true' migratable='yes'/> + <property name='bmi1' type='boolean' value='true' migratable='yes'/> + <property name='kvm-pv-unhalt' type='boolean' value='false'/> + <property name='realized' type='boolean' value='false'/> + <property name='tsc_scale' type='boolean' value='false'/> + <property name='tsc-scale' type='boolean' value='false'/> + <property name='topoext' type='boolean' value='false'/> + <property name='hv-vpindex' type='boolean' value='false'/> + <property name='xlevel2' type='number' value='0'/> + <property name='clflushopt' type='boolean' value='true' migratable='yes'/> + <property name='kvm-no-smi-migration' type='boolean' value='false'/> + <property name='monitor' type='boolean' value='true' migratable='yes'/> + <property name='avx512er' type='boolean' value='false'/> + <property name='pmm-en' type='boolean' value='false'/> + <property name='pcid' type='boolean' value='false'/> + <property name='3dnow' type='boolean' value='true' migratable='yes'/> + <property name='erms' type='boolean' value='true' migratable='yes'/> + <property name='lahf-lm' type='boolean' value='true' migratable='yes'/> + <property name='lahf_lm' type='boolean' value='true' migratable='yes'/> + <property name='xstore' type='boolean' value='false'/> + <property name='hv-synic' type='boolean' value='false'/> + <property name='fxsr-opt' type='boolean' value='false'/> + <property name='fxsr_opt' type='boolean' value='false'/> + <property name='rtm' type='boolean' value='false'/> + <property name='lmce' type='boolean' value='false'/> + <property name='hv-time' type='boolean' value='false'/> + <property name='perfctr-nb' type='boolean' value='false'/> + <property name='perfctr_nb' type='boolean' value='false'/> + <property name='ffxsr' type='boolean' value='false'/> + <property name='rdrand' type='boolean' value='false'/> + <property name='rdseed' type='boolean' value='false'/> + <property name='avx512-4vnniw' type='boolean' value='false'/> + <property name='vme' type='boolean' value='false'/> + <property name='vmx' type='boolean' value='false'/> + <property name='dtes64' type='boolean' value='false'/> + <property name='mtrr' type='boolean' value='true' migratable='yes'/> + <property name='rdtscp' type='boolean' value='true' migratable='yes'/> + <property name='pse36' type='boolean' value='true' migratable='yes'/> + <property name='tbm' type='boolean' value='false'/> + <property name='wdt' type='boolean' value='false'/> + <property name='pause_filter' type='boolean' value='false'/> + <property name='model-id' type='string' value='QEMU TCG CPU version 2.5+'/> + <property name='sha-ni' type='boolean' value='false'/> + <property name='abm' type='boolean' value='true' migratable='yes'/> + <property name='avx512pf' type='boolean' value='false'/> + <property name='xstore-en' type='boolean' value='false'/> + </hostCPU> + <cpu type='kvm' name='max' usable='yes'/> + <cpu type='kvm' name='host' usable='yes'/> + <cpu type='kvm' name='base' usable='yes'/> + <cpu type='kvm' name='qemu64' usable='yes'/> + <cpu type='kvm' name='qemu32' usable='yes'/> + <cpu type='kvm' name='phenom' usable='no'/> + <cpu type='kvm' name='pentium3' usable='yes'/> + <cpu type='kvm' name='pentium2' usable='yes'/> + <cpu type='kvm' name='pentium' usable='yes'/> + <cpu type='kvm' name='n270' usable='yes'/> + <cpu type='kvm' name='kvm64' usable='yes'/> + <cpu type='kvm' name='kvm32' usable='yes'/> + <cpu type='kvm' name='coreduo' usable='yes'/> + <cpu type='kvm' name='core2duo' usable='yes'/> + <cpu type='kvm' name='athlon' usable='no'/> + <cpu type='kvm' name='Westmere' usable='yes'/> + <cpu type='kvm' name='Skylake-Server' usable='no'/> + <cpu type='kvm' name='Skylake-Client' usable='no'/> + <cpu type='kvm' name='SandyBridge' usable='yes'/> + <cpu type='kvm' name='Penryn' usable='yes'/> + <cpu type='kvm' name='Opteron_G5' usable='no'/> + <cpu type='kvm' name='Opteron_G4' usable='no'/> + <cpu type='kvm' name='Opteron_G3' usable='no'/> + <cpu type='kvm' name='Opteron_G2' usable='yes'/> + <cpu type='kvm' name='Opteron_G1' usable='yes'/> + <cpu type='kvm' name='Nehalem' usable='yes'/> + <cpu type='kvm' name='IvyBridge' usable='yes'/> + <cpu type='kvm' name='Haswell' usable='no'/> + <cpu type='kvm' name='Haswell-noTSX' usable='yes'/> + <cpu type='kvm' name='Conroe' usable='yes'/> + <cpu type='kvm' name='Broadwell' usable='no'/> + <cpu type='kvm' name='Broadwell-noTSX' usable='no'/> + <cpu type='kvm' name='486' usable='yes'/> + <cpu type='tcg' name='max' usable='yes'/> + <cpu type='tcg' name='host' usable='no'/> + <cpu type='tcg' name='base' usable='yes'/> + <cpu type='tcg' name='qemu64' usable='yes'/> + <cpu type='tcg' name='qemu32' usable='yes'/> + <cpu type='tcg' name='phenom' usable='no'/> + <cpu type='tcg' name='pentium3' usable='yes'/> + <cpu type='tcg' name='pentium2' usable='yes'/> + <cpu type='tcg' name='pentium' usable='yes'/> + <cpu type='tcg' name='n270' usable='yes'/> + <cpu type='tcg' name='kvm64' usable='yes'/> + <cpu type='tcg' name='kvm32' usable='yes'/> + <cpu type='tcg' name='coreduo' usable='yes'/> + <cpu type='tcg' name='core2duo' usable='yes'/> + <cpu type='tcg' name='athlon' usable='yes'/> + <cpu type='tcg' name='Westmere' usable='yes'/> + <cpu type='tcg' name='Skylake-Server' usable='no'/> + <cpu type='tcg' name='Skylake-Client' usable='no'/> + <cpu type='tcg' name='SandyBridge' usable='no'/> + <cpu type='tcg' name='Penryn' usable='yes'/> + <cpu type='tcg' name='Opteron_G5' usable='no'/> + <cpu type='tcg' name='Opteron_G4' usable='no'/> + <cpu type='tcg' name='Opteron_G3' usable='no'/> + <cpu type='tcg' name='Opteron_G2' usable='yes'/> + <cpu type='tcg' name='Opteron_G1' usable='yes'/> + <cpu type='tcg' name='Nehalem' usable='yes'/> + <cpu type='tcg' name='IvyBridge' usable='no'/> + <cpu type='tcg' name='Haswell' usable='no'/> + <cpu type='tcg' name='Haswell-noTSX' usable='no'/> + <cpu type='tcg' name='Conroe' usable='yes'/> + <cpu type='tcg' name='Broadwell' usable='no'/> + <cpu type='tcg' name='Broadwell-noTSX' usable='no'/> + <cpu type='tcg' name='486' usable='yes'/> + <machine name='pc-i440fx-2.10' alias='pc' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-0.12' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.4' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-1.3' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-q35-2.7' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255'/> + <machine name='xenpv' maxCpus='1'/> + <machine name='pc-i440fx-1.7' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.8' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-1.6' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.7' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-0.11' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.3' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-0.10' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-1.2' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.2' hotplugCpus='yes' maxCpus='255'/> + <machine name='isapc' hotplugCpus='yes' maxCpus='1'/> + <machine name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255'/> + <machine name='xenfv' hotplugCpus='yes' maxCpus='128'/> + <machine name='pc-0.15' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-0.14' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-1.5' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.6' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-1.4' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.5' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-q35-2.9' hotplugCpus='yes' maxCpus='288'/> + <machine name='pc-1.1' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-q35-2.8' hotplugCpus='yes' maxCpus='288'/> + <machine name='pc-1.0' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.0' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-q35-2.4' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-i440fx-2.9' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-0.13' hotplugCpus='yes' maxCpus='255'/> + <machine name='pc-q35-2.10' alias='q35' hotplugCpus='yes' maxCpus='288'/> +</qemuCaps> diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c index 3ae55fc..4115bca 100644 --- a/tests/qemucapabilitiestest.c +++ b/tests/qemucapabilitiestest.c @@ -170,6 +170,7 @@ mymain(void) DO_TEST("x86_64", "caps_2.7.0"); DO_TEST("x86_64", "caps_2.8.0"); DO_TEST("x86_64", "caps_2.9.0"); + DO_TEST("x86_64", "caps_2.10.0"); DO_TEST("aarch64", "caps_2.6.0-gicv2"); DO_TEST("aarch64", "caps_2.6.0-gicv3"); DO_TEST("ppc64le", "caps_2.6.0"); -- 2.9.5

On Fri, Sep 01, 2017 at 01:09:45PM -0400, John Ferlan wrote:
For reference, these were generated by updating a local qemu git repository to the latest upstream, making sure the latest dependencies were met via "dnf builddep qemu" from my sufficiently privileged root account, checking out the v2.10.0 tag, and building in order to generate an "x86_64-softmmu/qemu-system-x86_64" image.
Then using a clean libvirt tree updated to master and built, the image was then provided as input:
tests/qemucapsprobe /path/to/x86_64-softmmu/qemu-system-x86_64 > \ tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies
With the .replies file in place and the DO_TEST line added and build, then running the following commands:
touch tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml VIR_TEST_REGENERATE_OUTPUT=1 ./tests/qemucapabilitiestest
to generate tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml and both were added to the commit.
Signed-off-by: John Ferlan <jferlan@redhat.com> --- .../caps_2.10.0.x86_64.replies | 18144 +++++++++++++++++++ tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 798 + tests/qemucapabilitiestest.c | 1 + 3 files changed, 18943 insertions(+) create mode 100644 tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies create mode 100644 tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
Capabilities generated by me are the same except for CPU features because I have a different CPU. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Using the query-qmp-schema introspection - look for the 'vxhs' blockdevOptions type. NB: This is a "best effort" type situation as there is not a mechanism to determine whether the running QEMU has been built with '--enable-vxhs'. All we can do is check if the option to use vxhs for a blockdev-add exists in the command infrastructure which does not take that into account when building its table of commands and options. Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/qemu/qemu_capabilities.c | 4 ++++ src/qemu/qemu_capabilities.h | 3 +++ tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 1 + 3 files changed, 8 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index e7ea6f4..173bcf3 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -439,6 +439,9 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "virtio-net.tx_queue_size", "chardev-reconnect", "virtio-gpu.max_outputs", + + /* 270 */ + "vxhs", ); @@ -1811,6 +1814,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsIntelIOMMU[] = { static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = { { "blockdev-add/arg-type/options/+gluster/debug-level", QEMU_CAPS_GLUSTER_DEBUG_LEVEL}, { "blockdev-add/arg-type/+gluster/debug", QEMU_CAPS_GLUSTER_DEBUG_LEVEL}, + { "blockdev-add/arg-type/+vxhs", QEMU_CAPS_VXHS}, }; struct virQEMUCapsObjectTypeProps { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index f32687d..f512775 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -426,6 +426,9 @@ typedef enum { QEMU_CAPS_CHARDEV_RECONNECT, /* -chardev reconnect */ QEMU_CAPS_VIRTIO_GPU_MAX_OUTPUTS, /* -device virtio-(vga|gpu-*),max-outputs= */ + /* 270 */ + QEMU_CAPS_VXHS, /* -drive file.driver=vxhs via query-qmp-schema */ + QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml index 6049211..8a31431 100644 --- a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml @@ -222,6 +222,7 @@ <flag name='virtio-net.tx_queue_size'/> <flag name='chardev-reconnect'/> <flag name='virtio-gpu.max_outputs'/> + <flag name='vxhs'/> <version>2010000</version> <kvmVersion>0</kvmVersion> <package> (v2.10.0)</package> -- 2.9.5

From: Ashish Mittal <Ashish.Mittal@veritas.com> Add a new virStorageNetProtocol for Veritas HyperScale (VxHS) disks Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/libxl/libxl_conf.c | 1 + src/qemu/qemu_block.c | 1 + src/qemu/qemu_command.c | 1 + src/qemu/qemu_driver.c | 3 +++ src/qemu/qemu_parse_command.c | 1 + src/util/virstoragefile.c | 5 ++++- src/util/virstoragefile.h | 1 + src/xenconfig/xen_xl.c | 1 + 8 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 4416a09..34233a9 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -666,6 +666,7 @@ libxlMakeNetworkDiskSrcStr(virStorageSourcePtr src, case VIR_STORAGE_NET_PROTOCOL_GLUSTER: case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG: case VIR_STORAGE_NET_PROTOCOL_SSH: + case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_NO_SUPPORT, diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 7fb12ea..d07269f 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -522,6 +522,7 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src) case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: + case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_NONE: case VIR_STORAGE_NET_PROTOCOL_LAST: break; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9a27987..b7a896e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -996,6 +996,7 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, _("'ssh' protocol is not yet supported")); goto cleanup; + case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_INTERNAL_ERROR, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b782451..26e64c1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -13814,6 +13814,7 @@ qemuDomainSnapshotPrepareDiskExternalBackingInactive(virDomainDiskDefPtr disk) case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: + case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("external inactive snapshots are not supported on " @@ -13877,6 +13878,7 @@ qemuDomainSnapshotPrepareDiskExternalOverlayActive(virDomainSnapshotDiskDefPtr d case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: + case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("external active snapshots are not supported on " @@ -14022,6 +14024,7 @@ qemuDomainSnapshotPrepareDiskInternal(virConnectPtr conn, case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: + case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("internal inactive snapshots are not supported on " diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c index 8cb96a2..9190a37 100644 --- a/src/qemu/qemu_parse_command.c +++ b/src/qemu/qemu_parse_command.c @@ -2026,6 +2026,7 @@ qemuParseCommandLine(virCapsPtr caps, case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: + case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: /* ignored for now */ diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index fbc8245..e0ec717 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -85,7 +85,8 @@ VIR_ENUM_IMPL(virStorageNetProtocol, VIR_STORAGE_NET_PROTOCOL_LAST, "ftp", "ftps", "tftp", - "ssh") + "ssh", + "vxhs") VIR_ENUM_IMPL(virStorageNetHostTransport, VIR_STORAGE_NET_HOST_TRANS_LAST, "tcp", @@ -2712,6 +2713,7 @@ virStorageSourceParseBackingColon(virStorageSourcePtr src, case VIR_STORAGE_NET_PROTOCOL_ISCSI: case VIR_STORAGE_NET_PROTOCOL_GLUSTER: case VIR_STORAGE_NET_PROTOCOL_SSH: + case VIR_STORAGE_NET_PROTOCOL_VXHS: virReportError(VIR_ERR_INTERNAL_ERROR, _("malformed backing store path for protocol %s"), protocol); @@ -3992,6 +3994,7 @@ virStorageSourceNetworkDefaultPort(virStorageNetProtocol protocol) /* we don't provide a default for RBD */ return 0; + case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: return 0; diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index 6c388b1..f7e897f 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -134,6 +134,7 @@ typedef enum { VIR_STORAGE_NET_PROTOCOL_FTPS, VIR_STORAGE_NET_PROTOCOL_TFTP, VIR_STORAGE_NET_PROTOCOL_SSH, + VIR_STORAGE_NET_PROTOCOL_VXHS, VIR_STORAGE_NET_PROTOCOL_LAST } virStorageNetProtocol; diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index d168d3f..8acbfe3 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -1024,6 +1024,7 @@ xenFormatXLDiskSrcNet(virStorageSourcePtr src) case VIR_STORAGE_NET_PROTOCOL_GLUSTER: case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG: case VIR_STORAGE_NET_PROTOCOL_SSH: + case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_NO_SUPPORT, -- 2.9.5

From: Ashish Mittal <Ashish.Mittal@veritas.com> Alter the schema to allow a VxHS block device. Sample XML is: <disk type='network' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc251'> <host name='192.168.0.1' port='9999'/> </source> <target dev='vda' bus='virtio'/> <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> Update the html docs to describe the capability for VxHS. Alter the qemuxml2xmltest to validate the formatting. Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- docs/formatdomain.html.in | 15 ++++++++-- docs/schemas/domaincommon.rng | 13 +++++++++ .../qemuxml2argv-disk-drive-network-vxhs.xml | 32 ++++++++++++++++++++ .../qemuxml2xmlout-disk-drive-network-vxhs.xml | 34 ++++++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 5 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-vxhs.xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 8ca7637..446ffff 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2520,9 +2520,9 @@ <dd> The <code>protocol</code> attribute specifies the protocol to access to the requested image. Possible values are "nbd", - "iscsi", "rbd", "sheepdog" or "gluster". If the - <code>protocol</code> attribute is "rbd", "sheepdog" or - "gluster", an additional attribute <code>name</code> is + "iscsi", "rbd", "sheepdog", "gluster" or "vxhs". If the + <code>protocol</code> attribute is "rbd", "sheepdog", "gluster" + or "vxhs", an additional attribute <code>name</code> is mandatory to specify which volume/image will be used. For "nbd", the <code>name</code> attribute is optional. For "iscsi" (<span class="since">since 1.0.4</span>), the <code>name</code> @@ -2530,6 +2530,9 @@ target's name by a slash (e.g., <code>iqn.2013-07.com.example:iscsi-pool/1</code>). If not specified, the default LUN is zero. + For "vxhs" (<span class="since">since 3.8.0</span>), the + <code>name</code> is the UUID of the volume, assigned by the + HyperScale server. <span class="since">Since 0.8.7</span> </dd> <dt><code>volume</code></dt> @@ -2632,6 +2635,12 @@ <td> one or more (<span class="since">Since 2.1.0</span>), just one prior to that </td> <td> 24007 </td> </tr> + <tr> + <td> vxhs </td> + <td> a server running Veritas HyperScale daemon </td> + <td> only one </td> + <td> 9999 </td> + </tr> </table> <p> gluster supports "tcp", "rdma", "unix" as valid values for the diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 06c5a91..7fe4e21 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1642,6 +1642,18 @@ </element> </define> + <define name="diskSourceNetworkProtocolVxHS"> + <element name="source"> + <attribute name="protocol"> + <choice> + <value>vxhs</value> + </choice> + </attribute> + <attribute name="name"/> + <ref name="diskSourceNetworkHost"/> + </element> + </define> + <define name="diskSourceNetwork"> <attribute name="type"> <value>network</value> @@ -1652,6 +1664,7 @@ <ref name="diskSourceNetworkProtocolRBD"/> <ref name="diskSourceNetworkProtocolHTTP"/> <ref name="diskSourceNetworkProtocolSimple"/> + <ref name="diskSourceNetworkProtocolVxHS"/> </choice> </define> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.xml new file mode 100644 index 0000000..4f4df2f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.xml @@ -0,0 +1,32 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc251'> + <host name='192.168.0.1' port='9999'/> + </source> + <target dev='vda' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-vxhs.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-vxhs.xml new file mode 100644 index 0000000..160ed8d --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-vxhs.xml @@ -0,0 +1,34 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc251'> + <host name='192.168.0.1' port='9999'/> + </source> + <target dev='vda' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 311b713..82db8cc 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -474,6 +474,7 @@ mymain(void) DO_TEST("disk-drive-network-rbd-ipv6", NONE); DO_TEST("disk-drive-network-rbd-ceph-env", NONE); DO_TEST("disk-drive-network-sheepdog", NONE); + DO_TEST("disk-drive-network-vxhs", NONE); DO_TEST("disk-scsi-device", QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_LSI); DO_TEST("disk-scsi-vscsi", NONE); -- 2.9.5

From: Ashish Mittal <Ashish.Mittal@veritas.com> Add the backing parse and a test case to verify parsing of VxHS backing storage. Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/util/virstoragefile.c | 37 +++++++++++++++++++++++++++++++++++++ tests/virstoragetest.c | 11 +++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index e0ec717..f3fe529 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -3212,6 +3212,40 @@ virStorageSourceParseBackingJSONRaw(virStorageSourcePtr src, return virStorageSourceParseBackingJSONInternal(src, json); } + +static int +virStorageSourceParseBackingJSONVxHS(virStorageSourcePtr src, + virJSONValuePtr json, + int opaque ATTRIBUTE_UNUSED) +{ + const char *vdisk_id = virJSONValueObjectGetString(json, "vdisk-id"); + virJSONValuePtr server = virJSONValueObjectGetObject(json, "server"); + + if (!vdisk_id || !server) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("missing 'vdisk-id' or 'server' attribute in " + "JSON backing definition for VxHS volume")); + return -1; + } + + src->type = VIR_STORAGE_TYPE_NETWORK; + src->protocol = VIR_STORAGE_NET_PROTOCOL_VXHS; + + if (VIR_STRDUP(src->path, vdisk_id) < 0) + return -1; + + if (VIR_ALLOC_N(src->hosts, 1) < 0) + return -1; + src->nhosts = 1; + + if (virStorageSourceParseBackingJSONInetSocketAddress(src->hosts, + server) < 0) + return -1; + + return 0; +} + + struct virStorageSourceJSONDriverParser { const char *drvname; int (*func)(virStorageSourcePtr src, virJSONValuePtr json, int opaque); @@ -3234,6 +3268,7 @@ static const struct virStorageSourceJSONDriverParser jsonParsers[] = { {"ssh", virStorageSourceParseBackingJSONSSH, 0}, {"rbd", virStorageSourceParseBackingJSONRBD, 0}, {"raw", virStorageSourceParseBackingJSONRaw, 0}, + {"vxhs", virStorageSourceParseBackingJSONVxHS, 0}, }; @@ -3995,6 +4030,8 @@ virStorageSourceNetworkDefaultPort(virStorageNetProtocol protocol) return 0; case VIR_STORAGE_NET_PROTOCOL_VXHS: + return 9999; + case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: return 0; diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c index 60e3164..ffebd4d 100644 --- a/tests/virstoragetest.c +++ b/tests/virstoragetest.c @@ -1592,6 +1592,17 @@ mymain(void) "<source protocol='sheepdog' name='Alice'>\n" " <host name='10.10.10.10' port='7000'/>\n" "</source>\n"); + TEST_BACKING_PARSE("json:{\"file\":{\"driver\":\"vxhs\"," + "\"vdisk-id\":\"c6718f6b-0401-441d-a8c3-1f0064d75ee0\"," + "\"server\": { \"type\":\"tcp\"," + "\"host\":\"example.com\"," + "\"port\":\"9999\"" + "}" + "}" + "}", + "<source protocol='vxhs' name='c6718f6b-0401-441d-a8c3-1f0064d75ee0'>\n" + " <host name='example.com' port='9999'/>\n" + "</source>\n"); #endif /* WITH_YAJL */ cleanup: -- 2.9.5

From: Ashish Mittal <Ashish.Mittal@veritas.com> The VxHS block device will only use the newer formatting options and avoid the legacy URI syntax. An excerpt for a sample QEMU command line is: -drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ file.server.0.type=tcp,file.server.0.host=192.168.0.1,\ file.server.0.port=9999,format=raw,if=none,id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ id=virtio-disk0 Update qemuxml2argvtest with a simple test. Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/qemu/qemu_block.c | 37 +++++++++++++++++++++- src/qemu/qemu_command.c | 10 +++++- src/qemu/qemu_parse_command.c | 16 +++++++++- src/qemu/qemu_process.c | 29 +++++++++++++++++ .../qemuxml2argv-disk-drive-network-vxhs.args | 27 ++++++++++++++++ tests/qemuxml2argvtest.c | 1 + 6 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index d07269f..f5269fb 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -482,6 +482,37 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src) } +static virJSONValuePtr +qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src) +{ + const char *protocol = virStorageNetProtocolTypeToString(src->protocol); + virJSONValuePtr server = NULL; + virJSONValuePtr ret = NULL; + + if (src->nhosts != 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("VxHS protocol accepts only one host")); + return NULL; + } + + if (!(server = qemuBlockStorageSourceBuildHostsJSONSocketAddress(src, true))) + return NULL; + + /* VxHS disk specification example: + * { driver:"vxhs", + * vdisk-id:"eb90327c-8302-4725-4e85ed4dc251", + * server:[{type:"tcp", host:"1.2.3.4", port:9999}]} + */ + if (virJSONValueObjectCreate(&ret, + "s:driver", protocol, + "s:vdisk-id", src->path, + "a:server", server, NULL) < 0) + virJSONValueFree(server); + + return ret; +} + + /** * qemuBlockStorageSourceGetBackendProps: * @src: disk source @@ -512,6 +543,11 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src) goto cleanup; break; + case VIR_STORAGE_NET_PROTOCOL_VXHS: + if (!(fileprops = qemuBlockStorageSourceGetVxHSProps(src))) + goto cleanup; + break; + case VIR_STORAGE_NET_PROTOCOL_NBD: case VIR_STORAGE_NET_PROTOCOL_RBD: case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG: @@ -522,7 +558,6 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src) case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: - case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_NONE: case VIR_STORAGE_NET_PROTOCOL_LAST: break; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b7a896e..b9e2ab3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -991,12 +991,16 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, ret = virBufferContentAndReset(&buf); break; + case VIR_STORAGE_NET_PROTOCOL_VXHS: + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("VxHS protocol does not support URI syntax")); + goto cleanup; + case VIR_STORAGE_NET_PROTOCOL_SSH: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("'ssh' protocol is not yet supported")); goto cleanup; - case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1326,6 +1330,10 @@ qemuDiskSourceNeedsProps(virStorageSourcePtr src) src->nhosts > 1) return true; + if (actualType == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS) + return true; + return false; } diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c index 9190a37..6286c2e 100644 --- a/src/qemu/qemu_parse_command.c +++ b/src/qemu/qemu_parse_command.c @@ -736,6 +736,11 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, if (VIR_STRDUP(def->src->path, vdi) < 0) goto error; } + } else if (STRPREFIX(def->src->path, "vxhs:")) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("VxHS protocol does not support URI syntax '%s'"), + def->src->path); + goto error; } else { def->src->type = VIR_STORAGE_TYPE_FILE; } @@ -1944,6 +1949,10 @@ qemuParseCommandLine(virCapsPtr caps, disk->src->type = VIR_STORAGE_TYPE_NETWORK; disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_SHEEPDOG; val += strlen("sheepdog:"); + } else if (STRPREFIX(val, "vxhs:")) { + disk->src->type = VIR_STORAGE_TYPE_NETWORK; + disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_VXHS; + val += strlen("vxhs:"); } else { disk->src->type = VIR_STORAGE_TYPE_FILE; } @@ -2020,13 +2029,18 @@ qemuParseCommandLine(virCapsPtr caps, goto error; break; + case VIR_STORAGE_NET_PROTOCOL_VXHS: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("VxHS protocol does not support URI " + "syntax '%s'"), disk->src->path); + goto error; + break; case VIR_STORAGE_NET_PROTOCOL_HTTP: case VIR_STORAGE_NET_PROTOCOL_HTTPS: case VIR_STORAGE_NET_PROTOCOL_FTP: case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: - case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: /* ignored for now */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 364c359..0ed5d04 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4582,6 +4582,32 @@ qemuProcessStartValidateShmem(virDomainObjPtr vm) static int +qemuProcessStartValidateDisks(virDomainObjPtr vm, + virQEMUCapsPtr qemuCaps) +{ + size_t i; + + for (i = 0; i < vm->def->ndisks; i++) { + virStorageSourcePtr src = vm->def->disks[i]->src; + + /* This is a best effort check as we can only check if the command + * option exists, but we cannot determine whether the running QEMU + * was build with '--enable-vxhs'. */ + if (src->type == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VXHS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("VxHS protocol is not supported with this " + "QEMU binary")); + return -1; + } + } + + return 0; +} + + +static int qemuProcessStartValidateXML(virQEMUDriverPtr driver, virDomainObjPtr vm, virQEMUCapsPtr qemuCaps, @@ -4663,6 +4689,9 @@ qemuProcessStartValidate(virQEMUDriverPtr driver, if (qemuProcessStartValidateShmem(vm) < 0) return -1; + if (qemuProcessStartValidateDisks(vm, qemuCaps) < 0) + return -1; + VIR_DEBUG("Checking for any possible (non-fatal) issues"); qemuProcessStartWarnShmem(vm); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args new file mode 100644 index 0000000..86da1af --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args @@ -0,0 +1,27 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32 \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ +file.server.0.type=tcp,file.server.0.host=192.168.0.1,file.server.0.port=9999,\ +format=raw,if=none,id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 18f06e5..b92ded8 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -931,6 +931,7 @@ mymain(void) # endif DO_TEST("disk-drive-network-rbd-ipv6", NONE); DO_TEST_FAILURE("disk-drive-network-rbd-no-colon", NONE); + DO_TEST("disk-drive-network-vxhs", QEMU_CAPS_VXHS); DO_TEST("disk-drive-no-boot", QEMU_CAPS_BOOTINDEX); DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid", -- 2.9.5

Hi, Updating the list with some test results of the base VxHS functionality (without TLS), and some changes resulting therefrom - (A) Qemu did not work with the changed file.server.0.host=127.0.0.1 syntax. Threw an error "Parameter 'server.host' is missing". Whereas the old syntax file.server.host=.. works fine. VxHS protocol accepts only one host, therefore during the qemu development, it was decided to drop the redundant index 0. (B) In response to (1), we are reverting the syntax back to the format file.server.host=1.2.3.4. I have tested with this modification and results look good. John has kindly offered to refine those changes and include it in the next patch series. (C) My testing was focussed on making sure that the libvirt changes work with qemu and we are able to read/write to a VxHS disk. Essentially I wanted to check libvirt <=> qemu <=> vxhs functionality on a real guest VM. Here's what I did - 1. On my physical system running FC23 stock qemu and libvirt. 2. Built and installed the latest VxHS libqnio from github repo. 3. Created a test VxHS file /tmp/test_vxhs_disk_1 that qemu can write/read to. 4. Started the test VxHS server. 5. Built and installed the latest qemu after cloning from master repo enabling vxhs support. 6. Ensured that I was able to start one of my existing VM using my custom build qemu. 7. Was able to start the guest VM directly using the qemu command line after adding the vxhs device. This is what I used to check the file.server.host syntax. 8. Built and installed latest libvirt with our patches (including the change to generate file.server.host) 9. Did a virsh edit on my VM and added a VxHS device to the existing XML. 10. Started and logged in to the VM. 11. Created a new label on the disk hosted by /tmp/test_vxhs_disk_1 vxhs server. 12. Created ext2fs on the disk. Mounted it and copied/removed some files from the FS. (D) Tested hot plug/unplug using virsh attach-device/detach-device back-to-back and this works fine. IMO, patches 1-6 with the above adjustments are good to go. Regards, Ashish On Fri, Sep 1, 2017 at 10:09 AM, John Ferlan <jferlan@redhat.com> wrote:
From: Ashish Mittal <Ashish.Mittal@veritas.com>
The VxHS block device will only use the newer formatting options and avoid the legacy URI syntax.
An excerpt for a sample QEMU command line is:
-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b- 4e85ed4dc251,\ file.server.0.type=tcp,file.server.0.host=192.168.0.1,\ file.server.0.port=9999,format=raw,if=none,id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ id=virtio-disk0
Update qemuxml2argvtest with a simple test.
Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/qemu/qemu_block.c | 37 +++++++++++++++++++++- src/qemu/qemu_command.c | 10 +++++- src/qemu/qemu_parse_command.c | 16 +++++++++- src/qemu/qemu_process.c | 29 +++++++++++++++++ .../qemuxml2argv-disk-drive-network-vxhs.args | 27 ++++++++++++++++ tests/qemuxml2argvtest.c | 1 + 6 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-vxhs.args
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index d07269f..f5269fb 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -482,6 +482,37 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src) }
+static virJSONValuePtr +qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src) +{ + const char *protocol = virStorageNetProtocolTypeToStr ing(src->protocol); + virJSONValuePtr server = NULL; + virJSONValuePtr ret = NULL; + + if (src->nhosts != 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("VxHS protocol accepts only one host")); + return NULL; + } + + if (!(server = qemuBlockStorageSourceBuildHostsJSONSocketAddress(src, true))) + return NULL; + + /* VxHS disk specification example: + * { driver:"vxhs", + * vdisk-id:"eb90327c-8302-4725-4e85ed4dc251", + * server:[{type:"tcp", host:"1.2.3.4", port:9999}]} + */ + if (virJSONValueObjectCreate(&ret, + "s:driver", protocol, + "s:vdisk-id", src->path, + "a:server", server, NULL) < 0) + virJSONValueFree(server); + + return ret; +} + + /** * qemuBlockStorageSourceGetBackendProps: * @src: disk source @@ -512,6 +543,11 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src) goto cleanup; break;
+ case VIR_STORAGE_NET_PROTOCOL_VXHS: + if (!(fileprops = qemuBlockStorageSourceGetVxHSProps(src))) + goto cleanup; + break; + case VIR_STORAGE_NET_PROTOCOL_NBD: case VIR_STORAGE_NET_PROTOCOL_RBD: case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG: @@ -522,7 +558,6 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src) case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: - case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_NONE: case VIR_STORAGE_NET_PROTOCOL_LAST: break; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b7a896e..b9e2ab3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -991,12 +991,16 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, ret = virBufferContentAndReset(&buf); break;
+ case VIR_STORAGE_NET_PROTOCOL_VXHS: + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("VxHS protocol does not support URI syntax")); + goto cleanup; + case VIR_STORAGE_NET_PROTOCOL_SSH: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("'ssh' protocol is not yet supported")); goto cleanup;
- case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1326,6 +1330,10 @@ qemuDiskSourceNeedsProps(virStorageSourcePtr src) src->nhosts > 1) return true;
+ if (actualType == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS) + return true; + return false; }
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c index 9190a37..6286c2e 100644 --- a/src/qemu/qemu_parse_command.c +++ b/src/qemu/qemu_parse_command.c @@ -736,6 +736,11 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, if (VIR_STRDUP(def->src->path, vdi) < 0) goto error; } + } else if (STRPREFIX(def->src->path, "vxhs:")) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("VxHS protocol does not support URI syntax '%s'"), + def->src->path); + goto error; } else { def->src->type = VIR_STORAGE_TYPE_FILE; } @@ -1944,6 +1949,10 @@ qemuParseCommandLine(virCapsPtr caps, disk->src->type = VIR_STORAGE_TYPE_NETWORK; disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_SHEEPDOG; val += strlen("sheepdog:"); + } else if (STRPREFIX(val, "vxhs:")) { + disk->src->type = VIR_STORAGE_TYPE_NETWORK; + disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_VXHS; + val += strlen("vxhs:"); } else { disk->src->type = VIR_STORAGE_TYPE_FILE; } @@ -2020,13 +2029,18 @@ qemuParseCommandLine(virCapsPtr caps, goto error;
break; + case VIR_STORAGE_NET_PROTOCOL_VXHS: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("VxHS protocol does not support URI " + "syntax '%s'"), disk->src->path); + goto error; + break; case VIR_STORAGE_NET_PROTOCOL_HTTP: case VIR_STORAGE_NET_PROTOCOL_HTTPS: case VIR_STORAGE_NET_PROTOCOL_FTP: case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: - case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: /* ignored for now */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 364c359..0ed5d04 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4582,6 +4582,32 @@ qemuProcessStartValidateShmem(virDomainObjPtr vm)
static int +qemuProcessStartValidateDisks(virDomainObjPtr vm, + virQEMUCapsPtr qemuCaps) +{ + size_t i; + + for (i = 0; i < vm->def->ndisks; i++) { + virStorageSourcePtr src = vm->def->disks[i]->src; + + /* This is a best effort check as we can only check if the command + * option exists, but we cannot determine whether the running QEMU + * was build with '--enable-vxhs'. */ + if (src->type == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VXHS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("VxHS protocol is not supported with this " + "QEMU binary")); + return -1; + } + } + + return 0; +} + + +static int qemuProcessStartValidateXML(virQEMUDriverPtr driver, virDomainObjPtr vm, virQEMUCapsPtr qemuCaps, @@ -4663,6 +4689,9 @@ qemuProcessStartValidate(virQEMUDriverPtr driver, if (qemuProcessStartValidateShmem(vm) < 0) return -1;
+ if (qemuProcessStartValidateDisks(vm, qemuCaps) < 0) + return -1; + VIR_DEBUG("Checking for any possible (non-fatal) issues");
qemuProcessStartWarnShmem(vm); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args new file mode 100644 index 0000000..86da1af --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args @@ -0,0 +1,27 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32 \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/ monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b- 4e85ed4dc251,\ +file.server.0.type=tcp,file.server.0.host=192.168.0.1, file.server.0.port=9999,\ +format=raw,if=none,id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 18f06e5..b92ded8 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -931,6 +931,7 @@ mymain(void) # endif DO_TEST("disk-drive-network-rbd-ipv6", NONE); DO_TEST_FAILURE("disk-drive-network-rbd-no-colon", NONE); + DO_TEST("disk-drive-network-vxhs", QEMU_CAPS_VXHS); DO_TEST("disk-drive-no-boot", QEMU_CAPS_BOOTINDEX); DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid", -- 2.9.5

On 09/12/2017 01:56 PM, ashish mittal wrote:
Hi,
Updating the list with some test results of the base VxHS functionality (without TLS), and some changes resulting therefrom -
(A) Qemu did not work with the changed file.server.0.host=127.0.0.1 syntax. Threw an error "Parameter 'server.host' is missing". Whereas the old syntax file.server.host=.. works fine. VxHS protocol accepts only one host, therefore during the qemu development, it was decided to drop the redundant index 0.
(B) In response to (1), we are reverting the syntax back to the format file.server.host=1.2.3.4. I have tested with this modification and results look good. John has kindly offered to refine those changes and include it in the next patch series.
(C) My testing was focussed on making sure that the libvirt changes work with qemu and we are able to read/write to a VxHS disk. Essentially I wanted to check libvirt <=> qemu <=> vxhs functionality on a real guest VM.
Here's what I did -
1. On my physical system running FC23 stock qemu and libvirt. 2. Built and installed the latest VxHS libqnio from github repo. 3. Created a test VxHS file /tmp/test_vxhs_disk_1 that qemu can write/read to. 4. Started the test VxHS server. 5. Built and installed the latest qemu after cloning from master repo enabling vxhs support. 6. Ensured that I was able to start one of my existing VM using my custom build qemu. 7. Was able to start the guest VM directly using the qemu command line after adding the vxhs device. This is what I used to check the file.server.host syntax. 8. Built and installed latest libvirt with our patches (including the change to generate file.server.host) 9. Did a virsh edit on my VM and added a VxHS device to the existing XML. 10. Started and logged in to the VM. 11. Created a new label on the disk hosted by /tmp/test_vxhs_disk_1 vxhs server. 12. Created ext2fs on the disk. Mounted it and copied/removed some files from the FS.
(D) Tested hot plug/unplug using virsh attach-device/detach-device back-to-back and this works fine.
IMO, patches 1-6 with the above adjustments are good to go.
Regards, Ashish
Given the results of testing up through this point... Unless there's some sort of objection, I'll plan to push the part of this series upstream some time my tomorrow in the afternoon. That still leaves the TLS testing and reviewing to be done in order to push the remainder of the patches. Once pushed, I'll post a v8 that includes just the TLS work. John
On Fri, Sep 1, 2017 at 10:09 AM, John Ferlan <jferlan@redhat.com <mailto:jferlan@redhat.com>> wrote:
From: Ashish Mittal <Ashish.Mittal@veritas.com <mailto:Ashish.Mittal@veritas.com>>
The VxHS block device will only use the newer formatting options and avoid the legacy URI syntax.
An excerpt for a sample QEMU command line is:
-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ file.server.0.type=tcp,file.server.0.host=192.168.0.1,\ file.server.0.port=9999,format=raw,if=none,id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ id=virtio-disk0
Update qemuxml2argvtest with a simple test.
Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com <mailto:Ashish.Mittal@veritas.com>> Signed-off-by: John Ferlan <jferlan@redhat.com <mailto:jferlan@redhat.com>> --- src/qemu/qemu_block.c | 37 +++++++++++++++++++++- src/qemu/qemu_command.c | 10 +++++- src/qemu/qemu_parse_command.c | 16 +++++++++- src/qemu/qemu_process.c | 29 +++++++++++++++++ .../qemuxml2argv-disk-drive-network-vxhs.args | 27 ++++++++++++++++ tests/qemuxml2argvtest.c | 1 + 6 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index d07269f..f5269fb 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -482,6 +482,37 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src) }
+static virJSONValuePtr +qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src) +{ + const char *protocol = virStorageNetProtocolTypeToString(src->protocol); + virJSONValuePtr server = NULL; + virJSONValuePtr ret = NULL; + + if (src->nhosts != 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("VxHS protocol accepts only one host")); + return NULL; + } + + if (!(server = qemuBlockStorageSourceBuildHostsJSONSocketAddress(src, true))) + return NULL; + + /* VxHS disk specification example: + * { driver:"vxhs", + * vdisk-id:"eb90327c-8302-4725-4e85ed4dc251", + * server:[{type:"tcp", host:"1.2.3.4", port:9999}]} + */ + if (virJSONValueObjectCreate(&ret, + "s:driver", protocol, + "s:vdisk-id", src->path, + "a:server", server, NULL) < 0) + virJSONValueFree(server); + + return ret; +} + + /** * qemuBlockStorageSourceGetBackendProps: * @src: disk source @@ -512,6 +543,11 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src) goto cleanup; break;
+ case VIR_STORAGE_NET_PROTOCOL_VXHS: + if (!(fileprops = qemuBlockStorageSourceGetVxHSProps(src))) + goto cleanup; + break; + case VIR_STORAGE_NET_PROTOCOL_NBD: case VIR_STORAGE_NET_PROTOCOL_RBD: case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG: @@ -522,7 +558,6 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src) case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: - case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_NONE: case VIR_STORAGE_NET_PROTOCOL_LAST: break; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b7a896e..b9e2ab3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -991,12 +991,16 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, ret = virBufferContentAndReset(&buf); break;
+ case VIR_STORAGE_NET_PROTOCOL_VXHS: + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("VxHS protocol does not support URI syntax")); + goto cleanup; + case VIR_STORAGE_NET_PROTOCOL_SSH: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("'ssh' protocol is not yet supported")); goto cleanup;
- case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1326,6 +1330,10 @@ qemuDiskSourceNeedsProps(virStorageSourcePtr src) src->nhosts > 1) return true;
+ if (actualType == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS) + return true; + return false; }
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c index 9190a37..6286c2e 100644 --- a/src/qemu/qemu_parse_command.c +++ b/src/qemu/qemu_parse_command.c @@ -736,6 +736,11 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, if (VIR_STRDUP(def->src->path, vdi) < 0) goto error; } + } else if (STRPREFIX(def->src->path, "vxhs:")) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("VxHS protocol does not support URI syntax '%s'"), + def->src->path); + goto error; } else { def->src->type = VIR_STORAGE_TYPE_FILE; } @@ -1944,6 +1949,10 @@ qemuParseCommandLine(virCapsPtr caps, disk->src->type = VIR_STORAGE_TYPE_NETWORK; disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_SHEEPDOG; val += strlen("sheepdog:"); + } else if (STRPREFIX(val, "vxhs:")) { + disk->src->type = VIR_STORAGE_TYPE_NETWORK; + disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_VXHS; + val += strlen("vxhs:"); } else { disk->src->type = VIR_STORAGE_TYPE_FILE; } @@ -2020,13 +2029,18 @@ qemuParseCommandLine(virCapsPtr caps, goto error;
break; + case VIR_STORAGE_NET_PROTOCOL_VXHS: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("VxHS protocol does not support URI " + "syntax '%s'"), disk->src->path); + goto error; + break; case VIR_STORAGE_NET_PROTOCOL_HTTP: case VIR_STORAGE_NET_PROTOCOL_HTTPS: case VIR_STORAGE_NET_PROTOCOL_FTP: case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: - case VIR_STORAGE_NET_PROTOCOL_VXHS: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: /* ignored for now */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 364c359..0ed5d04 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4582,6 +4582,32 @@ qemuProcessStartValidateShmem(virDomainObjPtr vm)
static int +qemuProcessStartValidateDisks(virDomainObjPtr vm, + virQEMUCapsPtr qemuCaps) +{ + size_t i; + + for (i = 0; i < vm->def->ndisks; i++) { + virStorageSourcePtr src = vm->def->disks[i]->src; + + /* This is a best effort check as we can only check if the command + * option exists, but we cannot determine whether the running QEMU + * was build with '--enable-vxhs'. */ + if (src->type == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VXHS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("VxHS protocol is not supported with this " + "QEMU binary")); + return -1; + } + } + + return 0; +} + + +static int qemuProcessStartValidateXML(virQEMUDriverPtr driver, virDomainObjPtr vm, virQEMUCapsPtr qemuCaps, @@ -4663,6 +4689,9 @@ qemuProcessStartValidate(virQEMUDriverPtr driver, if (qemuProcessStartValidateShmem(vm) < 0) return -1;
+ if (qemuProcessStartValidateDisks(vm, qemuCaps) < 0) + return -1; + VIR_DEBUG("Checking for any possible (non-fatal) issues");
qemuProcessStartWarnShmem(vm); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args new file mode 100644 index 0000000..86da1af --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args @@ -0,0 +1,27 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32 \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ +file.server.0.type=tcp,file.server.0.host=192.168.0.1,file.server.0.port=9999,\ +format=raw,if=none,id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 18f06e5..b92ded8 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -931,6 +931,7 @@ mymain(void) # endif DO_TEST("disk-drive-network-rbd-ipv6", NONE); DO_TEST_FAILURE("disk-drive-network-rbd-no-colon", NONE); + DO_TEST("disk-drive-network-vxhs", QEMU_CAPS_VXHS); DO_TEST("disk-drive-no-boot", QEMU_CAPS_BOOTINDEX); DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid", -- 2.9.5

This patch would be merged with the existing 06/11 patch for the following changes: 1. Use qemuBlockStorageSourceBuildJSONSocketAddress to build a single server address 2. Alter the output file to remove the server index "0." values 3. Alter the commit message appropriately as well. NB: If it's really desired I could resend the series, but I do ask that someone else officially ACK's patch 1 since it's so large. I believe it has to be moderated in... Although I could take Ashish's 1-6 testing as as "good enough". Thanks - John --- src/qemu/qemu_block.c | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index a1867aa8f..ca6e213b4 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -529,7 +529,7 @@ qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src) return NULL; } - if (!(server = qemuBlockStorageSourceBuildHostsJSONSocketAddress(src, true))) + if (!(server = qemuBlockStorageSourceBuildJSONSocketAddress(src->hosts, true))) return NULL; /* VxHS disk specification example: diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args index 86da1af47..b62ace3de 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args @@ -21,7 +21,7 @@ server,nowait \ -boot c \ -usb \ -drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ -file.server.0.type=tcp,file.server.0.host=192.168.0.1,file.server.0.port=9999,\ +file.server.type=tcp,file.server.host=192.168.0.1,file.server.port=9999,\ format=raw,if=none,id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ id=virtio-disk0 -- 2.13.5

On Tue, Sep 12, 2017 at 14:39:58 -0400, John Ferlan wrote:
This patch would be merged with the existing 06/11 patch for the following changes:
1. Use qemuBlockStorageSourceBuildJSONSocketAddress to build a single server address 2. Alter the output file to remove the server index "0." values 3. Alter the commit message appropriately as well.
NB: If it's really desired I could resend the series, but I do ask that someone else officially ACK's patch 1 since it's so large. I believe it has to be moderated in... Although I could take Ashish's 1-6 testing as as "good enough".
With all the squash-ins and .5 patches this got messy. Please repost.

On 09/14/2017 04:13 AM, Peter Krempa wrote:
On Tue, Sep 12, 2017 at 14:39:58 -0400, John Ferlan wrote:
This patch would be merged with the existing 06/11 patch for the following changes:
1. Use qemuBlockStorageSourceBuildJSONSocketAddress to build a single server address 2. Alter the output file to remove the server index "0." values 3. Alter the commit message appropriately as well.
NB: If it's really desired I could resend the series, but I do ask that someone else officially ACK's patch 1 since it's so large. I believe it has to be moderated in... Although I could take Ashish's 1-6 testing as as "good enough".
With all the squash-ins and .5 patches this got messy. Please repost.
Sure, not problem. Any issue w/ me pushing patch 1 first? The 2.10.replies and 2.10.xml? I think it's large enough that it needs moderation... John

On Thu, Sep 14, 2017 at 06:53:10 -0400, John Ferlan wrote:
On 09/14/2017 04:13 AM, Peter Krempa wrote:
On Tue, Sep 12, 2017 at 14:39:58 -0400, John Ferlan wrote:
[...]
With all the squash-ins and .5 patches this got messy. Please repost.
Sure, not problem. Any issue w/ me pushing patch 1 first? The 2.10.replies and 2.10.xml? I think it's large enough that it needs moderation...
I asked Pavel to have a look. It's fine from my point of view

From: Ashish Mittal <Ashish.Mittal@veritas.com> Add a new TLS X.509 certificate type - "vxhs". This will handle the creation of a TLS certificate capability for properly configured VxHS network block device clients. The following describes the behavior of TLS for VxHS block device: (1) Two new options have been added in /etc/libvirt/qemu.conf to control TLS behavior with VxHS block devices "vxhs_tls" and "vxhs_tls_x509_cert_dir". (2) Setting "vxhs_tls=1" in /etc/libvirt/qemu.conf will enable TLS for VxHS block devices. (3) "vxhs_tls_x509_cert_dir" can be set to the full path where the TLS CA certificate and the client certificate and keys are saved. If this value is missing, the "default_tls_x509_cert_dir" will be used instead. If the environment is not configured properly the authentication to the VxHS server will fail. Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/qemu/libvirtd_qemu.aug | 4 ++++ src/qemu/qemu.conf | 34 ++++++++++++++++++++++++++++++++++ src/qemu/qemu_conf.c | 16 ++++++++++++++++ src/qemu/qemu_conf.h | 3 +++ src/qemu/test_libvirtd_qemu.aug.in | 2 ++ 5 files changed, 59 insertions(+) diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug index e1983d1..c19bf3a 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/src/qemu/libvirtd_qemu.aug @@ -115,6 +115,9 @@ module Libvirtd_qemu = let memory_entry = str_entry "memory_backing_dir" + let vxhs_entry = bool_entry "vxhs_tls" + | str_entry "vxhs_tls_x509_cert_dir" + (* Each entry in the config is one of the following ... *) let entry = default_tls_entry | vnc_entry @@ -133,6 +136,7 @@ module Libvirtd_qemu = | nvram_entry | gluster_debug_level_entry | memory_entry + | vxhs_entry let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ] let empty = [ label "#empty" . eol ] diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf index f977e3b..2d20d79 100644 --- a/src/qemu/qemu.conf +++ b/src/qemu/qemu.conf @@ -258,6 +258,40 @@ #chardev_tls_x509_secret_uuid = "00000000-0000-0000-0000-000000000000" +# Enable use of TLS encryption for all VxHS network block devices that +# don't specifically disable. +# +# When the VxHS network block device server is set up appropriately, +# x509 certificates are required for authentication between the clients +# (qemu processes) and the remote VxHS server. +# +# It is necessary to setup CA and issue the client certificate before +# enabling this. +# +#vxhs_tls = 1 + + +# In order to override the default TLS certificate location for VxHS +# device TCP certificates, supply a valid path to the certificate directory. +# This is used to authenticate the VxHS block device clients to the VxHS +# server. +# +# If the provided path does not exist then the default_tls_x509_cert_dir +# path will be used. +# +# VxHS block device clients expect the client certificate and key to be +# present in the certificate directory along with the CA master certificate. +# If using the default environment, default_tls_x509_verify must be configured. +# The server key as well as secret UUID that would decrypt it is not used. +# Thus a VxHS directory must contain the following: +# +# ca-cert.pem - the CA master certificate +# client-cert.pem - the client certificate signed with the ca-cert.pem +# client-key.pem - the client private key +# +#vxhs_tls_x509_cert_dir = "/etc/pki/libvirt-vxhs" + + # In order to override the default TLS certificate location for migration # certificates, supply a valid path to the certificate directory. If the # provided path does not exist then the default_tls_x509_cert_dir path diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index ab5f7cc..bcf798d 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -283,6 +283,7 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged) SET_TLS_X509_CERT_DEFAULT(spice); SET_TLS_X509_CERT_DEFAULT(chardev); SET_TLS_X509_CERT_DEFAULT(migrate); + SET_TLS_X509_CERT_DEFAULT(vxhs); #undef SET_TLS_X509_CERT_DEFAULT @@ -380,6 +381,8 @@ static void virQEMUDriverConfigDispose(void *obj) VIR_FREE(cfg->chardevTLSx509certdir); VIR_FREE(cfg->chardevTLSx509secretUUID); + VIR_FREE(cfg->vxhsTLSx509certdir); + VIR_FREE(cfg->migrateTLSx509certdir); VIR_FREE(cfg->migrateTLSx509secretUUID); @@ -457,6 +460,7 @@ virQEMUDriverConfigTLSDirResetDefaults(virQEMUDriverConfigPtr cfg) CHECK_RESET_CERT_DIR_DEFAULT(spice); CHECK_RESET_CERT_DIR_DEFAULT(chardev); CHECK_RESET_CERT_DIR_DEFAULT(migrate); + CHECK_RESET_CERT_DIR_DEFAULT(vxhs); return 0; } @@ -556,6 +560,10 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg, goto cleanup; if (virConfGetValueBool(conf, "spice_auto_unix_socket", &cfg->spiceAutoUnixSocket) < 0) goto cleanup; + if (virConfGetValueBool(conf, "vxhs_tls", &cfg->vxhsTLS) < 0) + goto cleanup; + if (virConfGetValueString(conf, "vxhs_tls_x509_cert_dir", &cfg->vxhsTLSx509certdir) < 0) + goto cleanup; #define GET_CONFIG_TLS_CERTINFO(val) \ do { \ @@ -976,6 +984,14 @@ virQEMUDriverConfigValidate(virQEMUDriverConfigPtr cfg) return -1; } + if (STRNEQ(cfg->vxhsTLSx509certdir, SYSCONFDIR "/pki/qemu") && + !virFileExists(cfg->vxhsTLSx509certdir)) { + virReportError(VIR_ERR_CONF_SYNTAX, + _("vxhs_tls_x509_cert_dir directory '%s' does not exist"), + cfg->vxhsTLSx509certdir); + return -1; + } + return 0; } diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index d469b50..13b6f81 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -203,6 +203,9 @@ struct _virQEMUDriverConfig { unsigned int glusterDebugLevel; char *memoryBackingDir; + + bool vxhsTLS; + char *vxhsTLSx509certdir; }; /* Main driver state */ diff --git a/src/qemu/test_libvirtd_qemu.aug.in b/src/qemu/test_libvirtd_qemu.aug.in index 676d48c..688e5b9 100644 --- a/src/qemu/test_libvirtd_qemu.aug.in +++ b/src/qemu/test_libvirtd_qemu.aug.in @@ -25,6 +25,8 @@ module Test_libvirtd_qemu = { "chardev_tls_x509_cert_dir" = "/etc/pki/libvirt-chardev" } { "chardev_tls_x509_verify" = "1" } { "chardev_tls_x509_secret_uuid" = "00000000-0000-0000-0000-000000000000" } +{ "vxhs_tls" = "1" } +{ "vxhs_tls_x509_cert_dir" = "/etc/pki/libvirt-vxhs" } { "migrate_tls_x509_cert_dir" = "/etc/pki/libvirt-migrate" } { "migrate_tls_x509_verify" = "1" } { "migrate_tls_x509_secret_uuid" = "00000000-0000-0000-0000-000000000000" } -- 2.9.5

From: Ashish Mittal <Ashish.Mittal@veritas.com> Add an optional virTristateBool haveTLS to virStorageSource to manage whether a storage source will be using TLS. Sample XML for a VxHS disk: <disk type='network' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc251' tls='yes'> <host name='192.168.0.1' port='9999'/> </source> <target dev='vda' bus='virtio'/> </disk> Additionally add a tlsFromConfig boolean to control whether the TLS setting was due to domain configuration or qemu.conf global setting in order to decide whether to Format the haveTLS setting for either a live or saved domain configuration file. Update the qemuxml2xmltest in order to add a test to show the proper parsing. Also update the docs to describe the tls attribute plus clean up the description in the surrounding area to make the information a bit more readable rather than one winding paragraph. Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- docs/formatdomain.html.in | 40 ++++++++++++++++------ docs/schemas/domaincommon.rng | 5 +++ src/conf/domain_conf.c | 28 +++++++++++++-- src/util/virstoragefile.c | 2 ++ src/util/virstoragefile.h | 7 ++++ ...emuxml2argv-disk-drive-network-tlsx509-vxhs.xml | 32 +++++++++++++++++ ...uxml2xmlout-disk-drive-network-tlsx509-vxhs.xml | 34 ++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 8 files changed, 137 insertions(+), 12 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-tlsx509-vxhs.xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 446ffff..26c0067 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2520,19 +2520,39 @@ <dd> The <code>protocol</code> attribute specifies the protocol to access to the requested image. Possible values are "nbd", - "iscsi", "rbd", "sheepdog", "gluster" or "vxhs". If the - <code>protocol</code> attribute is "rbd", "sheepdog", "gluster" - or "vxhs", an additional attribute <code>name</code> is - mandatory to specify which volume/image will be used. For "nbd", - the <code>name</code> attribute is optional. For "iscsi" - (<span class="since">since 1.0.4</span>), the <code>name</code> - attribute may include a logical unit number, separated from the - target's name by a slash (e.g., + "iscsi", "rbd", "sheepdog", "gluster" or "vxhs". + + <p>If the <code>protocol</code> attribute is "rbd", "sheepdog", + "gluster", or "vxhs", an additional attribute <code>name</code> + is mandatory to specify which volume/image will be used. + </p> + + <p>For "nbd", the <code>name</code> attribute is optional. + </p> + + <p>For "iscsi" (<span class="since">since 1.0.4</span>), the + <code>name</code> attribute may include a logical unit number, + separated from the target's name by a slash (e.g., <code>iqn.2013-07.com.example:iscsi-pool/1</code>). If not specified, the default LUN is zero. - For "vxhs" (<span class="since">since 3.8.0</span>), the + </p> + + <p>For "vxhs" (<span class="since">since 3.8.0</span>), the <code>name</code> is the UUID of the volume, assigned by the - HyperScale server. + HyperScale server. Additionally, an optional attribute + <code>tls</code> (QEMU only) can be used to control whether a + VxHS block device would utilize a hypervisor configured TLS + X.509 certificate environment in order to encrypt the data + channel. For the QEMU hypervisor, usage of a TLS environment can + also be globally controlled on the host by the + <code>vxhs_tls</code> and <code>vxhs_tls_x509_cert_dir</code> or + <code>default_tls_x509_cert_dir</code> settings in the file + /etc/libvirt/qemu.conf. If <code>vxhs_tls</code> is enabled, + then unless the domain <code>tls</code> attribute is set to "no", + libvirt will use the host configured TLS environment. If the + <code>tls</code> attribute is set to "yes", then regardless of + the qemu.conf setting, TLS authentication will be attempted. + </p> <span class="since">Since 0.8.7</span> </dd> <dt><code>volume</code></dt> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 7fe4e21..520c235 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1650,6 +1650,11 @@ </choice> </attribute> <attribute name="name"/> + <optional> + <attribute name="tls"> + <ref name="virYesNo"/> + </attribute> + </optional> <ref name="diskSourceNetworkHost"/> </element> </define> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f7574d7..ae4cd01 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8039,6 +8039,7 @@ virDomainDiskSourceParse(xmlNodePtr node, int ret = -1; char *protocol = NULL; xmlNodePtr saveNode = ctxt->node; + char *haveTLS = NULL; ctxt->node = node; @@ -8072,6 +8073,19 @@ virDomainDiskSourceParse(xmlNodePtr node, goto cleanup; } + /* Check tls=yes|no domain setting for the block device + * At present only VxHS. Other block devices may be added later */ + if (src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + (haveTLS = virXMLPropString(node, "tls"))) { + if ((src->haveTLS = + virTristateBoolTypeFromString(haveTLS)) <= 0) { + virReportError(VIR_ERR_XML_ERROR, + _("unknown disk source 'tls' setting '%s'"), + haveTLS); + goto cleanup; + } + } + /* for historical reasons the volume name for gluster volume is stored * as a part of the path. This is hard to work with when dealing with * relative names. Split out the volume into a separate variable */ @@ -8127,6 +8141,7 @@ virDomainDiskSourceParse(xmlNodePtr node, cleanup: VIR_FREE(protocol); + VIR_FREE(haveTLS); ctxt->node = saveNode; return ret; } @@ -21606,7 +21621,8 @@ virDomainSourceDefFormatSeclabel(virBufferPtr buf, static int virDomainDiskSourceFormatNetwork(virBufferPtr buf, - virStorageSourcePtr src) + virStorageSourcePtr src, + unsigned int flags) { size_t n; char *path = NULL; @@ -21623,6 +21639,14 @@ virDomainDiskSourceFormatNetwork(virBufferPtr buf, VIR_FREE(path); + if (src->haveTLS != VIR_TRISTATE_BOOL_ABSENT && + !(flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE && + src->tlsFromConfig)) + virBufferAsprintf(buf, " tls='%s'", + virTristateBoolTypeToString(src->haveTLS)); + if (flags & VIR_DOMAIN_DEF_FORMAT_STATUS) + virBufferAsprintf(buf, " tlsFromConfig='%d'", src->tlsFromConfig); + if (src->nhosts == 0 && !src->snapshot && !src->configFile) { virBufferAddLit(buf, "/>\n"); } else { @@ -21697,7 +21721,7 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf, break; case VIR_STORAGE_TYPE_NETWORK: - if (virDomainDiskSourceFormatNetwork(buf, src) < 0) + if (virDomainDiskSourceFormatNetwork(buf, src, flags) < 0) goto error; break; diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index f3fe529..eb312cd 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -2039,6 +2039,8 @@ virStorageSourceCopy(const virStorageSource *src, ret->physical = src->physical; ret->readonly = src->readonly; ret->shared = src->shared; + ret->haveTLS = src->haveTLS; + ret->tlsFromConfig = src->tlsFromConfig; /* storage driver metadata are not copied */ ret->drv = NULL; diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index f7e897f..4817090 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -281,6 +281,13 @@ struct _virStorageSource { /* metadata that allows identifying given storage source */ char *nodeformat; /* name of the format handler object */ char *nodestorage; /* name of the storage object */ + + /* An optional setting to enable usage of TLS for the storage source */ + int haveTLS; /* enum virTristateBool */ + + /* Indication whether the haveTLS value was altered due to qemu.conf + * setting when haveTLS is missing from the domain config file */ + bool tlsFromConfig; }; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.xml new file mode 100644 index 0000000..61b5e2e --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.xml @@ -0,0 +1,32 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc251' tls='yes'> + <host name='192.168.0.1' port='9999'/> + </source> + <target dev='vda' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-tlsx509-vxhs.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-tlsx509-vxhs.xml new file mode 100644 index 0000000..16f0883 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-tlsx509-vxhs.xml @@ -0,0 +1,34 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc251' tls='yes'> + <host name='192.168.0.1' port='9999'/> + </source> + <target dev='vda' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 82db8cc..4d1c175 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -475,6 +475,7 @@ mymain(void) DO_TEST("disk-drive-network-rbd-ceph-env", NONE); DO_TEST("disk-drive-network-sheepdog", NONE); DO_TEST("disk-drive-network-vxhs", NONE); + DO_TEST("disk-drive-network-tlsx509-vxhs", NONE); DO_TEST("disk-scsi-device", QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_LSI); DO_TEST("disk-scsi-vscsi", NONE); -- 2.9.5

Introduce a function to setup any TLS needs for a disk source. If there's a configuration or other error setting up the disk source for TLS, then cause the domain startup to fail. For VxHS, follow the chardevTLS model where if the src->haveTLS hasn't been configured, then take the system/global cfg->haveTLS setting for the storage source *and* mark that we've done so via the tlsFromConfig setting in storage source. Next, if we are using TLS, then generate an alias into a virStorageSource 'tlsAlias' field that will be used to create the TLS object and added to the disk object in order to link the two together for QEMU. Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/qemu/qemu_domain.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 11 ++++++++ src/qemu/qemu_process.c | 4 +++ src/util/virstoragefile.c | 5 +++- src/util/virstoragefile.h | 6 ++++ 5 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index b98ffff..c955000 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7520,6 +7520,77 @@ qemuDomainPrepareChardevSource(virDomainDefPtr def, } +/* qemuProcessPrepareDiskSourceTLS: + * @source: pointer to host interface data for disk device + * @diskAlias: alias use for the disk device + * @cfg: driver configuration + * + * Updates host interface TLS encryption setting based on qemu.conf + * for disk devices. This will be presented as "tls='yes|no'" in + * live XML of a guest. + * + * Returns 0 on success, -1 on bad config/failure + */ +int +qemuDomainPrepareDiskSourceTLS(virStorageSourcePtr src, + const char *diskAlias, + virQEMUDriverConfigPtr cfg) +{ + + /* VxHS doesn't utilize a password protected server certificate, + * so no need to add a secinfo for a secret UUID. */ + if (src->type == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS) { + + if (src->haveTLS == VIR_TRISTATE_BOOL_ABSENT) { + if (cfg->vxhsTLS) + src->haveTLS = VIR_TRISTATE_BOOL_YES; + else + src->haveTLS = VIR_TRISTATE_BOOL_NO; + src->tlsFromConfig = true; + } + + if (src->haveTLS == VIR_TRISTATE_BOOL_YES) { + if (!diskAlias) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("disk does not have an alias")); + return -1; + } + + if (!(src->tlsAlias = qemuAliasTLSObjFromSrcAlias(diskAlias))) + return -1; + } + } + + return 0; +} + + +/* qemuProcessPrepareDiskSource: + * @def: live domain definition + * @driver: qemu driver + * + * Iterate through all disk devices to setup/check any that would be + * using TLS. + * + * Returns 0 on success, -1 on failure + */ +int +qemuDomainPrepareDiskSource(virDomainDefPtr def, + virQEMUDriverConfigPtr cfg) +{ + size_t i; + + for (i = 0; i < def->ndisks; i++) { + if (qemuDomainPrepareDiskSourceTLS(def->disks[i]->src, + def->disks[i]->info.alias, + cfg) < 0) + return -1; + } + + return 0; +} + int qemuDomainPrepareShmemChardev(virDomainShmemDefPtr shmem) diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index f93b09b..cec9704 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -845,6 +845,17 @@ void qemuDomainPrepareChardevSource(virDomainDefPtr def, virQEMUDriverPtr driver) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +int +qemuDomainPrepareDiskSourceTLS(virStorageSourcePtr src, + const char *diskAlias, + virQEMUDriverConfigPtr cfg) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); + +int +qemuDomainPrepareDiskSource(virDomainDefPtr def, + virQEMUDriverConfigPtr cfg) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + int qemuDomainPrepareShmemChardev(virDomainShmemDefPtr shmem) ATTRIBUTE_NONNULL(1); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0ed5d04..6d6ea16 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5355,6 +5355,10 @@ qemuProcessPrepareDomain(virConnectPtr conn, if (qemuDomainMasterKeyCreate(vm) < 0) goto cleanup; + VIR_DEBUG("Prepare disk source backends for TLS"); + if (qemuDomainPrepareDiskSource(vm->def, cfg) < 0) + goto cleanup; + VIR_DEBUG("Prepare chardev source backends for TLS"); qemuDomainPrepareChardevSource(vm->def, driver); diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index eb312cd..da137f7 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -2054,7 +2054,8 @@ virStorageSourceCopy(const virStorageSource *src, VIR_STRDUP(ret->configFile, src->configFile) < 0 || VIR_STRDUP(ret->nodeformat, src->nodeformat) < 0 || VIR_STRDUP(ret->nodestorage, src->nodestorage) < 0 || - VIR_STRDUP(ret->compat, src->compat) < 0) + VIR_STRDUP(ret->compat, src->compat) < 0 || + VIR_STRDUP(ret->tlsAlias, src->tlsAlias) < 0) goto error; if (src->nhosts) { @@ -2279,6 +2280,8 @@ virStorageSourceClear(virStorageSourcePtr def) virStorageSourceBackingStoreClear(def); + VIR_FREE(def->tlsAlias); + memset(def, 0, sizeof(*def)); } diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index 4817090..eadbcc1 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -288,6 +288,12 @@ struct _virStorageSource { /* Indication whether the haveTLS value was altered due to qemu.conf * setting when haveTLS is missing from the domain config file */ bool tlsFromConfig; + + /* If TLS is used, then mgmt of the TLS credentials occurs via an + * object that is generated using a specific alias. That alias must + * be used when generating the disk object in order to link the + * two together. */ + char *tlsAlias; }; -- 2.9.5

From: Ashish Mittal <Ashish.Mittal@veritas.com> Add a test case to verify TLS arguments are parsed correctly for a VxHS disk. This includes saving off a found tls-creds into the storage source @tlsAlias field since that's what's used to link the TLS object for the authentication credentials and the disk. Test case verifies that XML is generated correctly for a VxHS disk having TLS enabled. Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/util/virstoragefile.c | 9 +++++++++ tests/virstoragetest.c | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index da137f7..078d475 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -3225,6 +3225,7 @@ virStorageSourceParseBackingJSONVxHS(virStorageSourcePtr src, { const char *vdisk_id = virJSONValueObjectGetString(json, "vdisk-id"); virJSONValuePtr server = virJSONValueObjectGetObject(json, "server"); + const char *haveTLS = virJSONValueObjectGetString(json, "tls-creds"); if (!vdisk_id || !server) { virReportError(VIR_ERR_INVALID_ARG, "%s", @@ -3243,6 +3244,14 @@ virStorageSourceParseBackingJSONVxHS(virStorageSourcePtr src, return -1; src->nhosts = 1; + if (haveTLS) { + VIR_FREE(src->tlsAlias); + if (VIR_STRDUP(src->tlsAlias, haveTLS) < 0) + return -1; + + src->haveTLS = VIR_TRISTATE_BOOL_YES; + } + if (virStorageSourceParseBackingJSONInetSocketAddress(src->hosts, server) < 0) return -1; diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c index ffebd4d..75ad633 100644 --- a/tests/virstoragetest.c +++ b/tests/virstoragetest.c @@ -1603,6 +1603,18 @@ mymain(void) "<source protocol='vxhs' name='c6718f6b-0401-441d-a8c3-1f0064d75ee0'>\n" " <host name='example.com' port='9999'/>\n" "</source>\n"); + TEST_BACKING_PARSE("json:{\"file\":{\"driver\":\"vxhs\"," + "\"vdisk-id\":\"c6718f6b-0401-441d-a8c3-1f0064d75ee0\"," + "\"server\": { \"type\":\"tcp\"," + "\"host\":\"example.com\"," + "\"port\":\"9999\"" + "}," + "\"tls-creds\":\"objvirtio-disk0_tls0\"" + "}" + "}", + "<source protocol='vxhs' name='c6718f6b-0401-441d-a8c3-1f0064d75ee0' tls='yes'>\n" + " <host name='example.com' port='9999'/>\n" + "</source>\n"); #endif /* WITH_YAJL */ cleanup: -- 2.9.5

From: Ashish Mittal <Ashish.Mittal@veritas.com> Alter qemu command line generation in order to possibly add TLS for a suitably configured domain. Sample TLS args generated by libvirt - -object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\ endpoint=client,verify-peer=yes \ -drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ file.server.0.type=tcp,file.server.0.host=192.168.0.1,\ file.server.0.port=9999,format=raw,if=none,\ id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ id=virtio-disk0 Update the qemuxml2argvtest with a couple of examples. One for a simple case and the other a bit more complex where multiple VxHS disks are added where at least one uses a VxHS that doesn't require TLS credentials and thus sets the domain disk source attribute "tls = 'no'". Update the hotplug to be able to handle processing the tlsAlias whether it's to add the TLS object when hotplugging a disk or to remove the TLS object when hot unplugging a disk. The hot plug/unplug code is largely generic, but the addition code does make the VXHS specific checks only because it needs to grab the correct config directory and generate the object as the command line would do. Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/qemu/qemu_block.c | 8 +++ src/qemu/qemu_command.c | 29 +++++++++ src/qemu/qemu_hotplug.c | 73 ++++++++++++++++++++++ ...-disk-drive-network-tlsx509-multidisk-vxhs.args | 43 +++++++++++++ ...v-disk-drive-network-tlsx509-multidisk-vxhs.xml | 50 +++++++++++++++ ...muxml2argv-disk-drive-network-tlsx509-vxhs.args | 30 +++++++++ tests/qemuxml2argvtest.c | 7 +++ 7 files changed, 240 insertions(+) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.args diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index f5269fb..be4e8fa 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -495,16 +495,24 @@ qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src) return NULL; } + if (src->haveTLS == VIR_TRISTATE_BOOL_YES && !src->tlsAlias) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("VxHS disk does not have TLS alias set")); + return NULL; + } + if (!(server = qemuBlockStorageSourceBuildHostsJSONSocketAddress(src, true))) return NULL; /* VxHS disk specification example: * { driver:"vxhs", + * [tls-creds:"objvirtio-disk0_tls0",] * vdisk-id:"eb90327c-8302-4725-4e85ed4dc251", * server:[{type:"tcp", host:"1.2.3.4", port:9999}]} */ if (virJSONValueObjectCreate(&ret, "s:driver", protocol, + "S:tls-creds", src->tlsAlias, "s:vdisk-id", src->path, "a:server", server, NULL) < 0) virJSONValueFree(server); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b9e2ab3..d6b04a3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -791,6 +791,32 @@ qemuBuildTLSx509CommandLine(virCommandPtr cmd, } +/* qemuBuildDiskTLSx509CommandLine: + * + * Add TLS object if the disk uses a secure communication channel + * + * Returns 0 on success, -1 w/ error on some sort of failure. + */ +static int +qemuBuildDiskTLSx509CommandLine(virCommandPtr cmd, + virQEMUDriverConfigPtr cfg, + virDomainDiskDefPtr disk, + virQEMUCapsPtr qemuCaps) +{ + virStorageSourcePtr src = disk->src; + + /* other protocols may be added later */ + if (src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + disk->src->haveTLS == VIR_TRISTATE_BOOL_YES) { + return qemuBuildTLSx509CommandLine(cmd, cfg->vxhsTLSx509certdir, + false, true, false, + disk->info.alias, qemuCaps); + } + + return 0; +} + + static char * qemuBuildNetworkDriveURI(virStorageSourcePtr src, qemuDomainSecretInfoPtr secinfo) @@ -2218,6 +2244,9 @@ qemuBuildDiskDriveCommandLine(virCommandPtr cmd, if (qemuBuildDiskSecinfoCommandLine(cmd, encinfo) < 0) return -1; + if (qemuBuildDiskTLSx509CommandLine(cmd, cfg, disk, qemuCaps) < 0) + return -1; + virCommandAddArg(cmd, "-drive"); if (!(optstr = qemuBuildDriveStr(disk, cfg, driveBoot, qemuCaps))) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 9611df5..4c1074d 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -152,6 +152,55 @@ qemuDomainPrepareDisk(virQEMUDriverPtr driver, static int +qemuDomainAddDiskTLSObject(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDiskDefPtr disk, + char **tlsAlias) +{ + int ret = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + qemuDomainObjPrivatePtr priv = vm->privateData; + virStorageSourcePtr src = disk->src; + virJSONValuePtr tlsProps = NULL; + + /* NB: This may alter haveTLS based on cfg */ + qemuDomainPrepareDiskSourceTLS(src, disk->info.alias, cfg); + + if (src->haveTLS != VIR_TRISTATE_BOOL_YES) { + ret = 0; + goto cleanup; + } + + /* Initial implementation doesn't require/use a secret to decrypt + * a server certificate, so there's no need to manage a tlsSecAlias + * and tlsSecProps. See qemuDomainAddChardevTLSObjects for the + * methodology required to add a secret object. */ + + /* For a VxHS environment, create a TLS object for the client to + * connect to the VxHS server. */ + if (src->type == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + qemuDomainGetTLSObjects(priv->qemuCaps, NULL, + cfg->vxhsTLSx509certdir, false, true, + disk->info.alias, &tlsProps, tlsAlias, + NULL, NULL) < 0) + goto cleanup; + + if (qemuDomainAddTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, + NULL, NULL, *tlsAlias, &tlsProps) < 0) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(tlsProps); + virObjectUnref(cfg); + + return ret; +} + + +static int qemuHotplugWaitForTrayEject(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainDiskDefPtr disk, @@ -315,6 +364,7 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, char *devstr = NULL; char *drivestr = NULL; char *drivealias = NULL; + char *tlsAlias = NULL; bool releaseaddr = false; bool driveAdded = false; bool secobjAdded = false; @@ -372,6 +422,9 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, if (encinfo && qemuBuildSecretInfoProps(encinfo, &encobjProps) < 0) goto error; + if (qemuDomainAddDiskTLSObject(driver, vm, disk, &tlsAlias) < 0) + goto error; + if (!(drivestr = qemuBuildDriveStr(disk, cfg, false, priv->qemuCaps))) goto error; @@ -422,6 +475,7 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, ret = 0; cleanup: + VIR_FREE(tlsAlias); virJSONValueFree(secobjProps); virJSONValueFree(encobjProps); qemuDomainSecretDiskDestroy(disk); @@ -453,6 +507,8 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, virDomainAuditDisk(vm, NULL, disk->src, "attach", false); error: + qemuDomainDelTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, NULL, tlsAlias); + if (releaseaddr) qemuDomainReleaseDeviceAddress(vm, &disk->info, src); @@ -611,6 +667,7 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, virErrorPtr orig_err; char *drivestr = NULL; char *devstr = NULL; + char *tlsAlias = NULL; bool driveAdded = false; bool encobjAdded = false; bool secobjAdded = false; @@ -667,6 +724,9 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, if (!(devstr = qemuBuildDriveDevStr(vm->def, disk, 0, priv->qemuCaps))) goto error; + if (qemuDomainAddDiskTLSObject(driver, vm, disk, &tlsAlias) < 0) + goto error; + if (!(drivestr = qemuBuildDriveStr(disk, cfg, false, priv->qemuCaps))) goto error; @@ -712,6 +772,7 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, ret = 0; cleanup: + VIR_FREE(tlsAlias); virJSONValueFree(secobjProps); virJSONValueFree(encobjProps); qemuDomainSecretDiskDestroy(disk); @@ -740,6 +801,8 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, virDomainAuditDisk(vm, NULL, disk->src, "attach", false); error: + qemuDomainDelTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, NULL, tlsAlias); + ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true)); goto cleanup; } @@ -756,6 +819,7 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, char *drivealias = NULL; char *drivestr = NULL; char *devstr = NULL; + char *tlsAlias = NULL; bool driveAdded = false; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); const char *src = virDomainDiskGetSource(disk); @@ -780,6 +844,9 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, if (qemuAssignDeviceDiskAlias(vm->def, disk, priv->qemuCaps) < 0) goto error; + if (qemuDomainAddDiskTLSObject(driver, vm, disk, &tlsAlias) < 0) + goto error; + if (!(drivestr = qemuBuildDriveStr(disk, cfg, false, priv->qemuCaps))) goto error; @@ -810,6 +877,7 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, ret = 0; cleanup: + VIR_FREE(tlsAlias); if (ret < 0 && releaseaddr) virDomainUSBAddressRelease(priv->usbaddrs, &disk->info); VIR_FREE(devstr); @@ -833,6 +901,8 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, virDomainAuditDisk(vm, NULL, disk->src, "attach", false); error: + qemuDomainDelTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, NULL, tlsAlias); + ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true)); goto cleanup; } @@ -3710,6 +3780,9 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver, ignore_value(qemuMonitorDelObject(priv->mon, encAlias)); VIR_FREE(encAlias); + if (disk->src->tlsAlias) + ignore_value(qemuMonitorDelObject(priv->mon, disk->src->tlsAlias)); + if (qemuDomainObjExitMonitor(driver, vm) < 0) return -1; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.args new file mode 100644 index 0000000..dceae52 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.args @@ -0,0 +1,43 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32 \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\ +endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,file.server.0.type=tcp,\ +file.server.0.host=192.168.0.1,file.server.0.port=9999,format=raw,if=none,\ +id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0 \ +-object tls-creds-x509,id=objvirtio-disk1_tls0,dir=/etc/pki/qemu,\ +endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk1_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc252,file.server.0.type=tcp,\ +file.server.0.host=192.168.0.2,file.server.0.port=9999,format=raw,if=none,\ +id=drive-virtio-disk1,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc253,\ +file.server.0.type=tcp,file.server.0.host=192.168.0.3,file.server.0.port=9999,\ +format=raw,if=none,id=drive-virtio-disk2,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x6,drive=drive-virtio-disk2,\ +id=virtio-disk2 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.xml new file mode 100644 index 0000000..a66e81f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.xml @@ -0,0 +1,50 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc251'> + <host name='192.168.0.1' port='9999'/> + </source> + <target dev='vda' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc252'> + <host name='192.168.0.2' port='9999'/> + </source> + <target dev='vdb' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc252</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc253' tls='no'> + <host name='192.168.0.3' port='9999'/> + </source> + <target dev='vdc' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc252</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.args new file mode 100644 index 0000000..5308a16 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.args @@ -0,0 +1,30 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32 \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\ +endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,file.server.0.type=tcp,\ +file.server.0.host=192.168.0.1,file.server.0.port=9999,format=raw,if=none,\ +id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index b92ded8..0366dc3 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -932,6 +932,13 @@ mymain(void) DO_TEST("disk-drive-network-rbd-ipv6", NONE); DO_TEST_FAILURE("disk-drive-network-rbd-no-colon", NONE); DO_TEST("disk-drive-network-vxhs", QEMU_CAPS_VXHS); + driver.config->vxhsTLS = 1; + DO_TEST("disk-drive-network-tlsx509-vxhs", QEMU_CAPS_VXHS, + QEMU_CAPS_OBJECT_TLS_CREDS_X509); + DO_TEST("disk-drive-network-tlsx509-multidisk-vxhs", QEMU_CAPS_VXHS, + QEMU_CAPS_OBJECT_TLS_CREDS_X509); + driver.config->vxhsTLS = 0; + VIR_FREE(driver.config->vxhsTLSx509certdir); DO_TEST("disk-drive-no-boot", QEMU_CAPS_BOOTINDEX); DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid", -- 2.9.5

Hi, I've done some TLS testing with this patch and results look good. The following test statically adds a VxHS disk to a guest in the TLS mode. Boots up the guest and makes sure that we can do read/writes to the VxHS disk from within the guest with TLS enabled. (1) Create a backing store file /tmp/test_vxhs_disk_1 and start the VxHS test server "qnio_server" with TLS enabled. (2) Client side TLS env was setup as follows - [root@audi ~] 2017-09-18 13:56:13# grep -i vxhs /etc/libvirt/qemu.conf | grep -v "^#" vxhs_tls = 1 vxhs_tls_x509_cert_dir = "/etc/pki/libvirt-vxhs" [root@audi ~] 2017-09-18 13:56:22# ll /etc/pki/libvirt-vxhs total 20 -r--r--r--. 1 root root 4062 Sep 17 23:15 ca-cert.pem -rw-r--r--. 1 root root 1866 Sep 17 22:52 client-cert.pem -r--------. 1 root root 1679 Sep 17 22:52 client-key.pem [root@audi ~] 2017-09-18 13:56:35# (3) virsh edit and add a new VxHS device with tls='yes' The XML added to existing domain - <disk type='network' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source protocol='vxhs' name='/tmp/test_vxhs_disk_1' tls='yes'> <host name='127.0.0.1' port='9999'/> </source> <backingStore/> <target dev='vdc' bus='virtio'/> <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial> <alias name='virtio-disk2'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> </disk> (4) Start the domain and check if qemu command is correct [root@audi ~] 2017-09-18 13:29:01# virsh start myfc24 Domain myfc24 started [root@audi ~] 2017-09-18 13:29:20# ps -ef | grep qemu root 9578 1 99 13:29 ? 00:00:20 /usr/bin/qemu-system-x86_64 -machine accel=kvm -name guest=myfc24,debug-threads=on -S -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain-1-myfc24/master-key.aes -machine pc-i440fx-2.6,accel=kvm,usb=off,vmport=off,dump-guest-core=off -cpu Opteron_G3 -m 1024 -realtime mlock=off -smp 2,sockets=2,cores=1,threads=1 -uuid 70454565-8185-4506-b50f-d2cf55d83796 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-1-myfc24/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x6.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x6 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x6.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x6.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/var/lib/libvirt/images/myfc24_rootdisk.qcow2,format=qcow2,if=none,id=drive-ide0-0-0 -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -drive if=none,id=drive-ide0-0-1,readonly=on -device ide-cd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1 -object tls-creds-x509,id=objvirtio-disk2_tls0,dir=/etc/pki/libvirt-vxhs,endpoint=client,verify-peer=yes -drive file.driver=vxhs,file.tls-creds=objvirtio-disk2_tls0,file.vdisk-id=/tmp/test_vxhs_disk_1,file.server.type=tcp,file.server.host=127.0.0.1,file.server.port=9999,format=raw,if=none,id=drive-virtio-disk2,serial=eb90327c-8302-4725-9e1b-4e85ed4dc251,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0xa,drive=drive-virtio-disk2,id=virtio-disk2 -netdev tap,fd=27,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:e4:9e:30,bus=pci.0,addr=0x3 -netdev tap,fd=29,id=hostnet1,vhost=on,vhostfd=30 -device virtio-net-pci,netdev=hostnet1,id=net1,mac=52:54:00:b1:43:c4,bus=pci.0,addr=0x8 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev spicevmc,id=charchannel0,name=vdagent -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=com.redhat.spice.0 -spice port=5900,addr=127.0.0.1,disable-ticketing,image-compression=off,seamless-migration=on -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pci.0,addr=0x2 -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -chardev spicevmc,id=charredir0,name=usbredir -device usb-redir,chardev=charredir0,id=redir0,bus=usb.0,port=1 -chardev spicevmc,id=charredir1,name=usbredir -device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on (5) Log in to the guest domain and make sure we see this VxHS disk [root@camshaft ~] 2017-09-18 13:32:22# fdisk -l ... Disk /dev/vda: 1 MiB, 1048576 bytes, 2048 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/fedora-root: 45.4 GiB, 48704258048 bytes, 95125504 sectors ... (6) Create a disk label and partition. Do mkfs and mount the FS. Copy some files to the disk and check general read/write operations. [root@camshaft ~] 2017-09-18 13:32:35# fdisk /dev/vda .... Created a new partition 1 of type 'Linux' and of size 1023.5 KiB. Command (m for help): p Disk /dev/vda: 1 MiB, 1048576 bytes, 2048 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xcfd93e87 Device Boot Start End Sectors Size Id Type /dev/vda1 1 2047 2047 1023.5K 83 Linux Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. [root@camshaft ~] [root@camshaft ~] 2017-09-18 13:34:29# mkfs.ext3 /dev/vda1 mke2fs 1.42.13 (17-May-2015) Filesystem too small for a journal Creating filesystem with 1020 1k blocks and 128 inodes Allocating group tables: done Writing inode tables: done Writing superblocks and filesystem accounting information: done [root@camshaft ~] 2017-09-18 13:34:46# mount /dev/vda1 /mnt [root@camshaft ~] 2017-09-18 13:34:56# cp /boot/System.map-4.* /mnt cp: error writing '/mnt/System.map-4.5.5-300.fc24.x86_64': No space left on device cp: error writing '/mnt/System.map-4.8.8-200.fc24.x86_64': No space left on device [root@camshaft ~] 2017-09-18 13:35:08# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 485M 0 485M 0% /dev tmpfs 497M 472K 496M 1% /dev/shm tmpfs 497M 1.3M 495M 1% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/mapper/fedora-root 45G 5.1G 38G 12% / tmpfs 497M 84K 497M 1% /tmp /dev/mapper/fedora-home 22G 1.7G 19G 9% /home /dev/sda1 477M 140M 308M 32% /boot tmpfs 100M 28K 100M 1% /run/user/42 tmpfs 100M 20K 100M 1% /run/user/1000 /dev/vda1 999K 999K 0 100% /mnt [root@camshaft ~] 2017-09-18 13:35:13# [root@camshaft ~] 2017-09-18 13:37:07# dd if=/mnt/System.map-4.5.5-300.fc24.x86_64 of=/dev/null 1952+0 records in 1952+0 records out 999424 bytes (999 kB, 976 KiB) copied, 0.001174 s, 851 MB/s [root@camshaft ~] 2017-09-18 13:37:14# Regards, Ashish On Fri, Sep 1, 2017 at 10:09 AM, John Ferlan <jferlan@redhat.com> wrote:
From: Ashish Mittal <Ashish.Mittal@veritas.com>
Alter qemu command line generation in order to possibly add TLS for a suitably configured domain.
Sample TLS args generated by libvirt -
-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\ endpoint=client,verify-peer=yes \ -drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ file.server.0.type=tcp,file.server.0.host=192.168.0.1,\ file.server.0.port=9999,format=raw,if=none,\ id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ id=virtio-disk0
Update the qemuxml2argvtest with a couple of examples. One for a simple case and the other a bit more complex where multiple VxHS disks are added where at least one uses a VxHS that doesn't require TLS credentials and thus sets the domain disk source attribute "tls = 'no'".
Update the hotplug to be able to handle processing the tlsAlias whether it's to add the TLS object when hotplugging a disk or to remove the TLS object when hot unplugging a disk. The hot plug/unplug code is largely generic, but the addition code does make the VXHS specific checks only because it needs to grab the correct config directory and generate the object as the command line would do.
Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/qemu/qemu_block.c | 8 +++ src/qemu/qemu_command.c | 29 +++++++++ src/qemu/qemu_hotplug.c | 73 ++++++++++++++++++++++ ...-disk-drive-network-tlsx509-multidisk-vxhs.args | 43 +++++++++++++ ...v-disk-drive-network-tlsx509-multidisk-vxhs.xml | 50 +++++++++++++++ ...muxml2argv-disk-drive-network-tlsx509-vxhs.args | 30 +++++++++ tests/qemuxml2argvtest.c | 7 +++ 7 files changed, 240 insertions(+) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-vxhs.args
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index f5269fb..be4e8fa 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -495,16 +495,24 @@ qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src) return NULL; }
+ if (src->haveTLS == VIR_TRISTATE_BOOL_YES && !src->tlsAlias) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("VxHS disk does not have TLS alias set")); + return NULL; + } + if (!(server = qemuBlockStorageSourceBuildHostsJSONSocketAddress(src, true))) return NULL;
/* VxHS disk specification example: * { driver:"vxhs", + * [tls-creds:"objvirtio-disk0_tls0",] * vdisk-id:"eb90327c-8302-4725-4e85ed4dc251", * server:[{type:"tcp", host:"1.2.3.4", port:9999}]} */ if (virJSONValueObjectCreate(&ret, "s:driver", protocol, + "S:tls-creds", src->tlsAlias, "s:vdisk-id", src->path, "a:server", server, NULL) < 0) virJSONValueFree(server); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b9e2ab3..d6b04a3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -791,6 +791,32 @@ qemuBuildTLSx509CommandLine(virCommandPtr cmd, }
+/* qemuBuildDiskTLSx509CommandLine: + * + * Add TLS object if the disk uses a secure communication channel + * + * Returns 0 on success, -1 w/ error on some sort of failure. + */ +static int +qemuBuildDiskTLSx509CommandLine(virCommandPtr cmd, + virQEMUDriverConfigPtr cfg, + virDomainDiskDefPtr disk, + virQEMUCapsPtr qemuCaps) +{ + virStorageSourcePtr src = disk->src; + + /* other protocols may be added later */ + if (src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + disk->src->haveTLS == VIR_TRISTATE_BOOL_YES) { + return qemuBuildTLSx509CommandLine(cmd, cfg->vxhsTLSx509certdir, + false, true, false, + disk->info.alias, qemuCaps); + } + + return 0; +} + + static char * qemuBuildNetworkDriveURI(virStorageSourcePtr src, qemuDomainSecretInfoPtr secinfo) @@ -2218,6 +2244,9 @@ qemuBuildDiskDriveCommandLine(virCommandPtr cmd, if (qemuBuildDiskSecinfoCommandLine(cmd, encinfo) < 0) return -1;
+ if (qemuBuildDiskTLSx509CommandLine(cmd, cfg, disk, qemuCaps) < 0) + return -1; + virCommandAddArg(cmd, "-drive");
if (!(optstr = qemuBuildDriveStr(disk, cfg, driveBoot, qemuCaps))) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 9611df5..4c1074d 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -152,6 +152,55 @@ qemuDomainPrepareDisk(virQEMUDriverPtr driver,
static int +qemuDomainAddDiskTLSObject(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDiskDefPtr disk, + char **tlsAlias) +{ + int ret = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + qemuDomainObjPrivatePtr priv = vm->privateData; + virStorageSourcePtr src = disk->src; + virJSONValuePtr tlsProps = NULL; + + /* NB: This may alter haveTLS based on cfg */ + qemuDomainPrepareDiskSourceTLS(src, disk->info.alias, cfg); + + if (src->haveTLS != VIR_TRISTATE_BOOL_YES) { + ret = 0; + goto cleanup; + } + + /* Initial implementation doesn't require/use a secret to decrypt + * a server certificate, so there's no need to manage a tlsSecAlias + * and tlsSecProps. See qemuDomainAddChardevTLSObjects for the + * methodology required to add a secret object. */ + + /* For a VxHS environment, create a TLS object for the client to + * connect to the VxHS server. */ + if (src->type == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + qemuDomainGetTLSObjects(priv->qemuCaps, NULL, + cfg->vxhsTLSx509certdir, false, true, + disk->info.alias, &tlsProps, tlsAlias, + NULL, NULL) < 0) + goto cleanup; + + if (qemuDomainAddTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, + NULL, NULL, *tlsAlias, &tlsProps) < 0) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(tlsProps); + virObjectUnref(cfg); + + return ret; +} + + +static int qemuHotplugWaitForTrayEject(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainDiskDefPtr disk, @@ -315,6 +364,7 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, char *devstr = NULL; char *drivestr = NULL; char *drivealias = NULL; + char *tlsAlias = NULL; bool releaseaddr = false; bool driveAdded = false; bool secobjAdded = false; @@ -372,6 +422,9 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, if (encinfo && qemuBuildSecretInfoProps(encinfo, &encobjProps) < 0) goto error;
+ if (qemuDomainAddDiskTLSObject(driver, vm, disk, &tlsAlias) < 0) + goto error; + if (!(drivestr = qemuBuildDriveStr(disk, cfg, false, priv->qemuCaps))) goto error;
@@ -422,6 +475,7 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, ret = 0;
cleanup: + VIR_FREE(tlsAlias); virJSONValueFree(secobjProps); virJSONValueFree(encobjProps); qemuDomainSecretDiskDestroy(disk); @@ -453,6 +507,8 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, virDomainAuditDisk(vm, NULL, disk->src, "attach", false);
error: + qemuDomainDelTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, NULL, tlsAlias); + if (releaseaddr) qemuDomainReleaseDeviceAddress(vm, &disk->info, src);
@@ -611,6 +667,7 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, virErrorPtr orig_err; char *drivestr = NULL; char *devstr = NULL; + char *tlsAlias = NULL; bool driveAdded = false; bool encobjAdded = false; bool secobjAdded = false; @@ -667,6 +724,9 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, if (!(devstr = qemuBuildDriveDevStr(vm->def, disk, 0, priv->qemuCaps))) goto error;
+ if (qemuDomainAddDiskTLSObject(driver, vm, disk, &tlsAlias) < 0) + goto error; + if (!(drivestr = qemuBuildDriveStr(disk, cfg, false, priv->qemuCaps))) goto error;
@@ -712,6 +772,7 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, ret = 0;
cleanup: + VIR_FREE(tlsAlias); virJSONValueFree(secobjProps); virJSONValueFree(encobjProps); qemuDomainSecretDiskDestroy(disk); @@ -740,6 +801,8 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, virDomainAuditDisk(vm, NULL, disk->src, "attach", false);
error: + qemuDomainDelTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, NULL, tlsAlias); + ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true)); goto cleanup; } @@ -756,6 +819,7 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, char *drivealias = NULL; char *drivestr = NULL; char *devstr = NULL; + char *tlsAlias = NULL; bool driveAdded = false; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); const char *src = virDomainDiskGetSource(disk); @@ -780,6 +844,9 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, if (qemuAssignDeviceDiskAlias(vm->def, disk, priv->qemuCaps) < 0) goto error;
+ if (qemuDomainAddDiskTLSObject(driver, vm, disk, &tlsAlias) < 0) + goto error; + if (!(drivestr = qemuBuildDriveStr(disk, cfg, false, priv->qemuCaps))) goto error;
@@ -810,6 +877,7 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, ret = 0;
cleanup: + VIR_FREE(tlsAlias); if (ret < 0 && releaseaddr) virDomainUSBAddressRelease(priv->usbaddrs, &disk->info); VIR_FREE(devstr); @@ -833,6 +901,8 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, virDomainAuditDisk(vm, NULL, disk->src, "attach", false);
error: + qemuDomainDelTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, NULL, tlsAlias); + ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true)); goto cleanup; } @@ -3710,6 +3780,9 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver, ignore_value(qemuMonitorDelObject(priv->mon, encAlias)); VIR_FREE(encAlias);
+ if (disk->src->tlsAlias) + ignore_value(qemuMonitorDelObject(priv->mon, disk->src->tlsAlias)); + if (qemuDomainObjExitMonitor(driver, vm) < 0) return -1;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.args b/tests/qemuxml2argvdata/ qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.args new file mode 100644 index 0000000..dceae52 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.args @@ -0,0 +1,43 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32 \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/ monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\ +endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,file. server.0.type=tcp,\ +file.server.0.host=192.168.0.1,file.server.0.port=9999, format=raw,if=none,\ +id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0 \ +-object tls-creds-x509,id=objvirtio-disk1_tls0,dir=/etc/pki/qemu,\ +endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk1_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc252,file. server.0.type=tcp,\ +file.server.0.host=192.168.0.2,file.server.0.port=9999, format=raw,if=none,\ +id=drive-virtio-disk1,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b- 4e85ed4dc253,\ +file.server.0.type=tcp,file.server.0.host=192.168.0.3, file.server.0.port=9999,\ +format=raw,if=none,id=drive-virtio-disk2,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x6,drive=drive-virtio-disk2,\ +id=virtio-disk2 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.xml b/tests/qemuxml2argvdata/ qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.xml new file mode 100644 index 0000000..a66e81f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.xml @@ -0,0 +1,50 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b- 4e85ed4dc251'> + <host name='192.168.0.1' port='9999'/> + </source> + <target dev='vda' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b- 4e85ed4dc252'> + <host name='192.168.0.2' port='9999'/> + </source> + <target dev='vdb' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc252</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc253' tls='no'> + <host name='192.168.0.3' port='9999'/> + </source> + <target dev='vdc' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc252</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.args new file mode 100644 index 0000000..5308a16 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-vxhs.args @@ -0,0 +1,30 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32 \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/ monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\ +endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,file. server.0.type=tcp,\ +file.server.0.host=192.168.0.1,file.server.0.port=9999, format=raw,if=none,\ +id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index b92ded8..0366dc3 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -932,6 +932,13 @@ mymain(void) DO_TEST("disk-drive-network-rbd-ipv6", NONE); DO_TEST_FAILURE("disk-drive-network-rbd-no-colon", NONE); DO_TEST("disk-drive-network-vxhs", QEMU_CAPS_VXHS); + driver.config->vxhsTLS = 1; + DO_TEST("disk-drive-network-tlsx509-vxhs", QEMU_CAPS_VXHS, + QEMU_CAPS_OBJECT_TLS_CREDS_X509); + DO_TEST("disk-drive-network-tlsx509-multidisk-vxhs", QEMU_CAPS_VXHS, + QEMU_CAPS_OBJECT_TLS_CREDS_X509); + driver.config->vxhsTLS = 0; + VIR_FREE(driver.config->vxhsTLSx509certdir); DO_TEST("disk-drive-no-boot", QEMU_CAPS_BOOTINDEX); DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid", -- 2.9.5

Hi, Not sure how to reply to the v8 series email thread, or how to add myself to the libvirt email list! Updating the v7 thread instead. I have already updated with the results of TLS testing by statically adding TLS enabled VxHS devices to domain XML, booting up the guest, and making sure devices are properly readable/writable. I did the same test using hot plug. libvirtd crashes when adding TLS device - [root@audi Sources] 2017-09-18 19:54:27# virsh attach-device myfc24 hotplug_disk_2.xml error: Disconnected from qemu:///system due to end of file error: Failed to attach device from hotplug_disk_2.xml error: End of file while reading data: Input/output error gdb reports - Thread 3 "libvirtd" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7f97e6b99700 (LWP 20096)] 0x00007f97c9c42a3d in qemuDomainGetTLSObjects (qemuCaps=0x7f97c00fcca0, secinfo=secinfo@entry=0x0, tlsCertdir=0x7f97c00ff000 "/etc/pki/libvirt-vxhs", tlsListen=tlsListen@entry=false, tlsVerify=tlsVerify@entry=true, srcAlias=0x7f97b8001e00 "virtio-disk0", tlsProps=0x7f97e6b988f0, tlsAlias=0x7f97e6b98998, secProps=0x0, secAlias=0x0) at qemu/qemu_hotplug.c:1736 1736 } Reason for crash seems to be a latent issue with qemuDomainGetTLSObjects(). Both qemuDomainGetTLSObjects() and qemuBuildTLSx509BackendProps() suggest that char **secAlias may be NULL, but qemuDomainGetTLSObjects() dereferences it without checking for NULL. int qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps, qemuDomainSecretInfoPtr secinfo, const char *tlsCertdir, bool tlsListen, bool tlsVerify, const char *srcAlias, virJSONValuePtr *tlsProps, char **tlsAlias, virJSONValuePtr *secProps, char **secAlias) { /* Add a secret object in order to access the TLS environment. * The secinfo will only be created for serial TCP device. */ if (secinfo) { if (qemuBuildSecretInfoProps(secinfo, secProps) < 0) return -1; if (!(*secAlias = qemuDomainGetSecretAESAlias(srcAlias, false))) return -1; } if (qemuBuildTLSx509BackendProps(tlsCertdir, tlsListen, tlsVerify, *secAlias, qemuCaps, tlsProps) < 0) <=== *secAlias is dereferencing char **secAlias, which can be NULL return -1; ... } The following diff takes care of the above issue. [root@audi libvirt] 2017-09-18 23:19:31# git diff diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 4c1074d..1448fe7 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1715,6 +1715,8 @@ qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps, virJSONValuePtr *secProps, char **secAlias) { + char *secretAlias = NULL; + /* Add a secret object in order to access the TLS environment. * The secinfo will only be created for serial TCP device. */ if (secinfo) { @@ -1723,10 +1725,11 @@ qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps, if (!(*secAlias = qemuDomainGetSecretAESAlias(srcAlias, false))) return -1; + secretAlias = *secAlias; } if (qemuBuildTLSx509BackendProps(tlsCertdir, tlsListen, tlsVerify, - *secAlias, qemuCaps, tlsProps) < 0) + secretAlias, qemuCaps, tlsProps) < 0) return -1; if (!(*tlsAlias = qemuAliasTLSObjFromSrcAlias(srcAlias))) I was able to attach and detach two TLS enabled VxHS disks to a running guest multiple times with the above fix in place. Did a attach/detach of these disks back-to-back without any problems. Was able to format these disks and copy files to both these TLS hot plugged disks from within the guest without any problems. Will send detailed test logs in a separate email. Regards, Ashish On Fri, Sep 1, 2017 at 10:09 AM, John Ferlan <jferlan@redhat.com> wrote:
From: Ashish Mittal <Ashish.Mittal@veritas.com>
Alter qemu command line generation in order to possibly add TLS for a suitably configured domain.
Sample TLS args generated by libvirt -
-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\ endpoint=client,verify-peer=yes \ -drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ file.server.0.type=tcp,file.server.0.host=192.168.0.1,\ file.server.0.port=9999,format=raw,if=none,\ id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ id=virtio-disk0
Update the qemuxml2argvtest with a couple of examples. One for a simple case and the other a bit more complex where multiple VxHS disks are added where at least one uses a VxHS that doesn't require TLS credentials and thus sets the domain disk source attribute "tls = 'no'".
Update the hotplug to be able to handle processing the tlsAlias whether it's to add the TLS object when hotplugging a disk or to remove the TLS object when hot unplugging a disk. The hot plug/unplug code is largely generic, but the addition code does make the VXHS specific checks only because it needs to grab the correct config directory and generate the object as the command line would do.
Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/qemu/qemu_block.c | 8 +++ src/qemu/qemu_command.c | 29 +++++++++ src/qemu/qemu_hotplug.c | 73 ++++++++++++++++++++++ ...-disk-drive-network-tlsx509-multidisk-vxhs.args | 43 +++++++++++++ ...v-disk-drive-network-tlsx509-multidisk-vxhs.xml | 50 +++++++++++++++ ...muxml2argv-disk-drive-network-tlsx509-vxhs.args | 30 +++++++++ tests/qemuxml2argvtest.c | 7 +++ 7 files changed, 240 insertions(+) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-vxhs.args
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index f5269fb..be4e8fa 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -495,16 +495,24 @@ qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src) return NULL; }
+ if (src->haveTLS == VIR_TRISTATE_BOOL_YES && !src->tlsAlias) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("VxHS disk does not have TLS alias set")); + return NULL; + } + if (!(server = qemuBlockStorageSourceBuildHostsJSONSocketAddress(src, true))) return NULL;
/* VxHS disk specification example: * { driver:"vxhs", + * [tls-creds:"objvirtio-disk0_tls0",] * vdisk-id:"eb90327c-8302-4725-4e85ed4dc251", * server:[{type:"tcp", host:"1.2.3.4", port:9999}]} */ if (virJSONValueObjectCreate(&ret, "s:driver", protocol, + "S:tls-creds", src->tlsAlias, "s:vdisk-id", src->path, "a:server", server, NULL) < 0) virJSONValueFree(server); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b9e2ab3..d6b04a3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -791,6 +791,32 @@ qemuBuildTLSx509CommandLine(virCommandPtr cmd, }
+/* qemuBuildDiskTLSx509CommandLine: + * + * Add TLS object if the disk uses a secure communication channel + * + * Returns 0 on success, -1 w/ error on some sort of failure. + */ +static int +qemuBuildDiskTLSx509CommandLine(virCommandPtr cmd, + virQEMUDriverConfigPtr cfg, + virDomainDiskDefPtr disk, + virQEMUCapsPtr qemuCaps) +{ + virStorageSourcePtr src = disk->src; + + /* other protocols may be added later */ + if (src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + disk->src->haveTLS == VIR_TRISTATE_BOOL_YES) { + return qemuBuildTLSx509CommandLine(cmd, cfg->vxhsTLSx509certdir, + false, true, false, + disk->info.alias, qemuCaps); + } + + return 0; +} + + static char * qemuBuildNetworkDriveURI(virStorageSourcePtr src, qemuDomainSecretInfoPtr secinfo) @@ -2218,6 +2244,9 @@ qemuBuildDiskDriveCommandLine(virCommandPtr cmd, if (qemuBuildDiskSecinfoCommandLine(cmd, encinfo) < 0) return -1;
+ if (qemuBuildDiskTLSx509CommandLine(cmd, cfg, disk, qemuCaps) < 0) + return -1; + virCommandAddArg(cmd, "-drive");
if (!(optstr = qemuBuildDriveStr(disk, cfg, driveBoot, qemuCaps))) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 9611df5..4c1074d 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -152,6 +152,55 @@ qemuDomainPrepareDisk(virQEMUDriverPtr driver,
static int +qemuDomainAddDiskTLSObject(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDiskDefPtr disk, + char **tlsAlias) +{ + int ret = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + qemuDomainObjPrivatePtr priv = vm->privateData; + virStorageSourcePtr src = disk->src; + virJSONValuePtr tlsProps = NULL; + + /* NB: This may alter haveTLS based on cfg */ + qemuDomainPrepareDiskSourceTLS(src, disk->info.alias, cfg); + + if (src->haveTLS != VIR_TRISTATE_BOOL_YES) { + ret = 0; + goto cleanup; + } + + /* Initial implementation doesn't require/use a secret to decrypt + * a server certificate, so there's no need to manage a tlsSecAlias + * and tlsSecProps. See qemuDomainAddChardevTLSObjects for the + * methodology required to add a secret object. */ + + /* For a VxHS environment, create a TLS object for the client to + * connect to the VxHS server. */ + if (src->type == VIR_STORAGE_TYPE_NETWORK && + src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS && + qemuDomainGetTLSObjects(priv->qemuCaps, NULL, + cfg->vxhsTLSx509certdir, false, true, + disk->info.alias, &tlsProps, tlsAlias, + NULL, NULL) < 0) + goto cleanup; + + if (qemuDomainAddTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, + NULL, NULL, *tlsAlias, &tlsProps) < 0) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(tlsProps); + virObjectUnref(cfg); + + return ret; +} + + +static int qemuHotplugWaitForTrayEject(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainDiskDefPtr disk, @@ -315,6 +364,7 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, char *devstr = NULL; char *drivestr = NULL; char *drivealias = NULL; + char *tlsAlias = NULL; bool releaseaddr = false; bool driveAdded = false; bool secobjAdded = false; @@ -372,6 +422,9 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, if (encinfo && qemuBuildSecretInfoProps(encinfo, &encobjProps) < 0) goto error;
+ if (qemuDomainAddDiskTLSObject(driver, vm, disk, &tlsAlias) < 0) + goto error; + if (!(drivestr = qemuBuildDriveStr(disk, cfg, false, priv->qemuCaps))) goto error;
@@ -422,6 +475,7 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, ret = 0;
cleanup: + VIR_FREE(tlsAlias); virJSONValueFree(secobjProps); virJSONValueFree(encobjProps); qemuDomainSecretDiskDestroy(disk); @@ -453,6 +507,8 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn, virDomainAuditDisk(vm, NULL, disk->src, "attach", false);
error: + qemuDomainDelTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, NULL, tlsAlias); + if (releaseaddr) qemuDomainReleaseDeviceAddress(vm, &disk->info, src);
@@ -611,6 +667,7 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, virErrorPtr orig_err; char *drivestr = NULL; char *devstr = NULL; + char *tlsAlias = NULL; bool driveAdded = false; bool encobjAdded = false; bool secobjAdded = false; @@ -667,6 +724,9 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, if (!(devstr = qemuBuildDriveDevStr(vm->def, disk, 0, priv->qemuCaps))) goto error;
+ if (qemuDomainAddDiskTLSObject(driver, vm, disk, &tlsAlias) < 0) + goto error; + if (!(drivestr = qemuBuildDriveStr(disk, cfg, false, priv->qemuCaps))) goto error;
@@ -712,6 +772,7 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, ret = 0;
cleanup: + VIR_FREE(tlsAlias); virJSONValueFree(secobjProps); virJSONValueFree(encobjProps); qemuDomainSecretDiskDestroy(disk); @@ -740,6 +801,8 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, virDomainAuditDisk(vm, NULL, disk->src, "attach", false);
error: + qemuDomainDelTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, NULL, tlsAlias); + ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true)); goto cleanup; } @@ -756,6 +819,7 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, char *drivealias = NULL; char *drivestr = NULL; char *devstr = NULL; + char *tlsAlias = NULL; bool driveAdded = false; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); const char *src = virDomainDiskGetSource(disk); @@ -780,6 +844,9 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, if (qemuAssignDeviceDiskAlias(vm->def, disk, priv->qemuCaps) < 0) goto error;
+ if (qemuDomainAddDiskTLSObject(driver, vm, disk, &tlsAlias) < 0) + goto error; + if (!(drivestr = qemuBuildDriveStr(disk, cfg, false, priv->qemuCaps))) goto error;
@@ -810,6 +877,7 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, ret = 0;
cleanup: + VIR_FREE(tlsAlias); if (ret < 0 && releaseaddr) virDomainUSBAddressRelease(priv->usbaddrs, &disk->info); VIR_FREE(devstr); @@ -833,6 +901,8 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver, virDomainAuditDisk(vm, NULL, disk->src, "attach", false);
error: + qemuDomainDelTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, NULL, tlsAlias); + ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true)); goto cleanup; } @@ -3710,6 +3780,9 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver, ignore_value(qemuMonitorDelObject(priv->mon, encAlias)); VIR_FREE(encAlias);
+ if (disk->src->tlsAlias) + ignore_value(qemuMonitorDelObject(priv->mon, disk->src->tlsAlias)); + if (qemuDomainObjExitMonitor(driver, vm) < 0) return -1;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.args b/tests/qemuxml2argvdata/ qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.args new file mode 100644 index 0000000..dceae52 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.args @@ -0,0 +1,43 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32 \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/ monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\ +endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,file. server.0.type=tcp,\ +file.server.0.host=192.168.0.1,file.server.0.port=9999, format=raw,if=none,\ +id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0 \ +-object tls-creds-x509,id=objvirtio-disk1_tls0,dir=/etc/pki/qemu,\ +endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk1_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc252,file. server.0.type=tcp,\ +file.server.0.host=192.168.0.2,file.server.0.port=9999, format=raw,if=none,\ +id=drive-virtio-disk1,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,\ +id=virtio-disk1 \ +-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b- 4e85ed4dc253,\ +file.server.0.type=tcp,file.server.0.host=192.168.0.3, file.server.0.port=9999,\ +format=raw,if=none,id=drive-virtio-disk2,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x6,drive=drive-virtio-disk2,\ +id=virtio-disk2 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.xml b/tests/qemuxml2argvdata/ qemuxml2argv-disk-drive-network-tlsx509-multidisk-vxhs.xml new file mode 100644 index 0000000..a66e81f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-multidisk-vxhs.xml @@ -0,0 +1,50 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b- 4e85ed4dc251'> + <host name='192.168.0.1' port='9999'/> + </source> + <target dev='vda' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b- 4e85ed4dc252'> + <host name='192.168.0.2' port='9999'/> + </source> + <target dev='vdb' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc252</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw' cache='none'/> + <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc253' tls='no'> + <host name='192.168.0.3' port='9999'/> + </source> + <target dev='vdc' bus='virtio'/> + <serial>eb90327c-8302-4725-9e1b-4e85ed4dc252</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-tlsx509-vxhs.args new file mode 100644 index 0000000..5308a16 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive- network-tlsx509-vxhs.args @@ -0,0 +1,30 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32 \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/ monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\ +endpoint=client,verify-peer=yes \ +-drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ +file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,file. server.0.type=tcp,\ +file.server.0.host=192.168.0.1,file.server.0.port=9999, format=raw,if=none,\ +id=drive-virtio-disk0,cache=none \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ +id=virtio-disk0 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index b92ded8..0366dc3 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -932,6 +932,13 @@ mymain(void) DO_TEST("disk-drive-network-rbd-ipv6", NONE); DO_TEST_FAILURE("disk-drive-network-rbd-no-colon", NONE); DO_TEST("disk-drive-network-vxhs", QEMU_CAPS_VXHS); + driver.config->vxhsTLS = 1; + DO_TEST("disk-drive-network-tlsx509-vxhs", QEMU_CAPS_VXHS, + QEMU_CAPS_OBJECT_TLS_CREDS_X509); + DO_TEST("disk-drive-network-tlsx509-multidisk-vxhs", QEMU_CAPS_VXHS, + QEMU_CAPS_OBJECT_TLS_CREDS_X509); + driver.config->vxhsTLS = 0; + VIR_FREE(driver.config->vxhsTLSx509certdir); DO_TEST("disk-drive-no-boot", QEMU_CAPS_BOOTINDEX); DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid", -- 2.9.5

On 09/19/2017 02:19 PM, ashish mittal wrote:
Hi,
Not sure how to reply to the v8 series email thread, or how to add myself to the libvirt email list! Updating the v7 thread instead.
There's some magic you can do with the right clients... I'll remember to include you on the next series.
I have already updated with the results of TLS testing by statically adding TLS enabled VxHS devices to domain XML, booting up the guest, and making sure devices are properly readable/writable.
I did the same test using hot plug. libvirtd crashes when adding TLS device -
[root@audi Sources] 2017-09-18 19:54:27# virsh attach-device myfc24 hotplug_disk_2.xml error: Disconnected from qemu:///system due to end of file error: Failed to attach device from hotplug_disk_2.xml error: End of file while reading data: Input/output error
gdb reports -
Thread 3 "libvirtd" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7f97e6b99700 (LWP 20096)] 0x00007f97c9c42a3d in qemuDomainGetTLSObjects (qemuCaps=0x7f97c00fcca0, secinfo=secinfo@entry=0x0, tlsCertdir=0x7f97c00ff000 "/etc/pki/libvirt-vxhs", tlsListen=tlsListen@entry=false, tlsVerify=tlsVerify@entry=true, srcAlias=0x7f97b8001e00 "virtio-disk0", tlsProps=0x7f97e6b988f0, tlsAlias=0x7f97e6b98998, secProps=0x0, secAlias=0x0) at qemu/qemu_hotplug.c:1736 1736 }
Reason for crash seems to be a latent issue with qemuDomainGetTLSObjects(). Both qemuDomainGetTLSObjects() and qemuBuildTLSx509BackendProps() suggest that char **secAlias may be NULL, but qemuDomainGetTLSObjects() dereferences it without checking for NULL.
int qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps, qemuDomainSecretInfoPtr secinfo, const char *tlsCertdir, bool tlsListen, bool tlsVerify, const char *srcAlias, virJSONValuePtr *tlsProps, char **tlsAlias, virJSONValuePtr *secProps, char **secAlias) { /* Add a secret object in order to access the TLS environment. * The secinfo will only be created for serial TCP device. */ if (secinfo) { if (qemuBuildSecretInfoProps(secinfo, secProps) < 0) return -1;
if (!(*secAlias = qemuDomainGetSecretAESAlias(srcAlias, false))) return -1; }
if (qemuBuildTLSx509BackendProps(tlsCertdir, tlsListen, tlsVerify, *secAlias, qemuCaps, tlsProps) < 0) <=== *secAlias is dereferencing char **secAlias, which can be NULL return -1; ... }
Good thing we test before pushing!
The following diff takes care of the above issue.
[root@audi libvirt] 2017-09-18 23:19:31# git diff diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 4c1074d..1448fe7 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1715,6 +1715,8 @@ qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps, virJSONValuePtr *secProps, char **secAlias) { + char *secretAlias = NULL; + /* Add a secret object in order to access the TLS environment. * The secinfo will only be created for serial TCP device. */ if (secinfo) { @@ -1723,10 +1725,11 @@ qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps,
if (!(*secAlias = qemuDomainGetSecretAESAlias(srcAlias, false))) return -1; + secretAlias = *secAlias; }
if (qemuBuildTLSx509BackendProps(tlsCertdir, tlsListen, tlsVerify, - *secAlias, qemuCaps, tlsProps) < 0) + secretAlias, qemuCaps, tlsProps) < 0) return -1;
if (!(*tlsAlias = qemuAliasTLSObjFromSrcAlias(srcAlias)))
But it's not really right... it's OK to have NULL secalias - we just have to handle it better. There's no need to create a local for it. I think if you do something that turns "*secalias," into "secalias ? *secalias : NULL," that'd probably be better. it it works, could you just post a separate patch to fix that issue?
I was able to attach and detach two TLS enabled VxHS disks to a running guest multiple times with the above fix in place. Did a attach/detach of these disks back-to-back without any problems. Was able to format these disks and copy files to both these TLS hot plugged disks from within the guest without any problems. Will send detailed test logs in a separate email.
In the v8 review, Peter would like some adjustments which I'm in the process of making. I'm going to push the first part of the series, but repost the TLS code as a v9. Tks - John [...]

Extract out the "guts" of building a server entry into it's own separately callable/usable function in order to allow building a server entry for a consumer with src->nhosts == 1. Signed-off-by: John Ferlan <jferlan@redhat.com> --- This patch would go after patch 5 and before patch 6 in the order of things. All it does is extract out the "single" server syntax into it's own function so that it can be used by code that supports only 1 host. It's also usable by the multiple hosts support via the array append call. src/qemu/qemu_block.c | 106 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 70 insertions(+), 36 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index d07269f4e..c97b787c5 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -380,6 +380,74 @@ qemuBlockGetNodeData(virJSONValuePtr data) /** + * qemuBlockStorageSourceBuildJSONSocketAddress + * @host: the virStorageNetHostDefPtr definition to build + * @legacy: use 'tcp' instead of 'inet' for compatibility reasons + * + * Formats @hosts into a json object conforming to the 'SocketAddress' type + * in qemu. + * + * This function can be used when only 1 src->nhosts is expected in order + * to build a command without the array indices after "server.". That is + * to see "server.type", "server.host", and "server.port" instead of + * "server.#.type", "server.#.host", and "server.#.port". + * + * Returns a virJSONValuePtr for a single server. + */ +static virJSONValuePtr +qemuBlockStorageSourceBuildJSONSocketAddress(virStorageNetHostDefPtr host, + bool legacy) +{ + virJSONValuePtr server = NULL; + virJSONValuePtr ret = NULL; + const char *transport; + char *port = NULL; + + switch ((virStorageNetHostTransport) host->transport) { + case VIR_STORAGE_NET_HOST_TRANS_TCP: + if (legacy) + transport = "tcp"; + else + transport = "inet"; + + if (virAsprintf(&port, "%u", host->port) < 0) + goto cleanup; + + if (virJSONValueObjectCreate(&server, + "s:type", transport, + "s:host", host->name, + "s:port", port, + NULL) < 0) + goto cleanup; + break; + + case VIR_STORAGE_NET_HOST_TRANS_UNIX: + if (virJSONValueObjectCreate(&server, + "s:type", "unix", + "s:socket", host->socket, + NULL) < 0) + goto cleanup; + break; + + case VIR_STORAGE_NET_HOST_TRANS_RDMA: + case VIR_STORAGE_NET_HOST_TRANS_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("transport protocol '%s' is not yet supported"), + virStorageNetHostTransportTypeToString(host->transport)); + goto cleanup; + } + + VIR_STEAL_PTR(ret, server); + + cleanup: + VIR_FREE(port); + virJSONValueFree(server); + + return ret; +} + + +/** * qemuBlockStorageSourceBuildHostsJSONSocketAddress: * @src: disk storage source * @legacy: use 'tcp' instead of 'inet' for compatibility reasons @@ -395,8 +463,6 @@ qemuBlockStorageSourceBuildHostsJSONSocketAddress(virStorageSourcePtr src, virJSONValuePtr server = NULL; virJSONValuePtr ret = NULL; virStorageNetHostDefPtr host; - const char *transport; - char *port = NULL; size_t i; if (!(servers = virJSONValueNewArray())) @@ -405,39 +471,8 @@ qemuBlockStorageSourceBuildHostsJSONSocketAddress(virStorageSourcePtr src, for (i = 0; i < src->nhosts; i++) { host = src->hosts + i; - switch ((virStorageNetHostTransport) host->transport) { - case VIR_STORAGE_NET_HOST_TRANS_TCP: - if (legacy) - transport = "tcp"; - else - transport = "inet"; - - if (virAsprintf(&port, "%u", host->port) < 0) - goto cleanup; - - if (virJSONValueObjectCreate(&server, - "s:type", transport, - "s:host", host->name, - "s:port", port, - NULL) < 0) - goto cleanup; - break; - - case VIR_STORAGE_NET_HOST_TRANS_UNIX: - if (virJSONValueObjectCreate(&server, - "s:type", "unix", - "s:socket", host->socket, - NULL) < 0) - goto cleanup; - break; - - case VIR_STORAGE_NET_HOST_TRANS_RDMA: - case VIR_STORAGE_NET_HOST_TRANS_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, - _("transport protocol '%s' is not yet supported"), - virStorageNetHostTransportTypeToString(host->transport)); - goto cleanup; - } + if (!(server = qemuBlockStorageSourceBuildJSONSocketAddress(host, legacy))) + goto cleanup; if (virJSONValueArrayAppend(servers, server) < 0) goto cleanup; @@ -450,7 +485,6 @@ qemuBlockStorageSourceBuildHostsJSONSocketAddress(virStorageSourcePtr src, cleanup: virJSONValueFree(servers); virJSONValueFree(server); - VIR_FREE(port); return ret; } -- 2.13.5
participants (4)
-
ashish mittal
-
John Ferlan
-
Pavel Hrdina
-
Peter Krempa