[libvirt] [PATCH 0/6] Add usb controller model="none"

This series adds support for completely disabling USB bus for a host if a user requires this. For this to work a new USB controller model "none" was added that removes the USB bus. The controller is added in patches 2-4. Patch 1 cleans up some nits (and is not necessary) and patches 5 and 6 tweak qemuxml2argvtest and add tests to check the new controller. Peter Krempa (6): maint: Clean up coding style domain_conf: Add USB controler model "none" domain_conf: Add helpers to verify if device configuration is valid qemu: Add support for "none" USB controller tests: Add support for cathing domain XML parsing errors tests: Add tests to check the new USB "none" controller docs/schemas/domaincommon.rng | 1 + src/conf/domain_conf.c | 121 +++++- src/conf/domain_conf.h | 6 + src/libvirt_private.syms | 2 + src/qemu/qemu_command.c | 29 +- src/qemu/qemu_driver.c | 13 +- .../qemuxml2argvdata/qemuxml2argv-usb-none-hub.xml | 19 + .../qemuxml2argv-usb-none-other.xml | 19 + .../qemuxml2argv-usb-none-usbtablet.xml | 21 + tests/qemuxml2argvdata/qemuxml2argv-usb-none.args | 5 + tests/qemuxml2argvdata/qemuxml2argv-usb-none.xml | 16 + tests/qemuxml2argvtest.c | 507 ++++++++++---------- 12 files changed, 491 insertions(+), 268 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none-hub.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none-other.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none-usbtablet.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none.xml -- 1.7.8.6

Style changes split out from next patch. --- src/conf/domain_conf.c | 23 +++++++++++++---------- src/qemu/qemu_command.c | 19 +++++++++++-------- src/qemu/qemu_driver.c | 7 +++---- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 3fb90db..17b0e0e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8602,11 +8602,12 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, } /* analysis of the disk devices */ - if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0) { + if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0) goto error; - } + if (n && VIR_ALLOC_N(def->disks, n) < 0) goto no_memory; + for (i = 0 ; i < n ; i++) { virDomainDiskDefPtr disk = virDomainDiskDefParseXML(caps, nodes[i], @@ -8622,11 +8623,12 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, VIR_FREE(nodes); /* analysis of the controller devices */ - if ((n = virXPathNodeSet("./devices/controller", ctxt, &nodes)) < 0) { + if ((n = virXPathNodeSet("./devices/controller", ctxt, &nodes)) < 0) goto error; - } + if (n && VIR_ALLOC_N(def->controllers, n) < 0) goto no_memory; + for (i = 0 ; i < n ; i++) { virDomainControllerDefPtr controller = virDomainControllerDefParseXML(nodes[i], flags); @@ -8748,9 +8750,9 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, } VIR_FREE(nodes); - if ((n = virXPathNodeSet("./devices/serial", ctxt, &nodes)) < 0) { + if ((n = virXPathNodeSet("./devices/serial", ctxt, &nodes)) < 0) goto error; - } + if (n && VIR_ALLOC_N(def->serials, n) < 0) goto no_memory; @@ -9044,8 +9046,8 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, goto error; } if (n > 1) { - virDomainReportError (VIR_ERR_INTERNAL_ERROR, - "%s", _("only a single watchdog device is supported")); + virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("only a single watchdog device is supported")); goto error; } if (n > 0) { @@ -9064,8 +9066,9 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, goto error; } if (n > 1) { - virDomainReportError (VIR_ERR_INTERNAL_ERROR, - "%s", _("only a single memory balloon device is supported")); + virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("only a single memory balloon device is " + "supported")); goto error; } if (n > 0) { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 94b2919..44c7c8b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4678,25 +4678,28 @@ qemuBuildCommandLine(virConnectPtr conn, /* Only recent QEMU implements a SATA (AHCI) controller */ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) { if (!qemuCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) { - qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, - "%s", _("SATA is not supported with this QEMU binary")); + qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("SATA is not supported with this " + "QEMU binary")); goto error; } else { char *devstr; virCommandAddArg(cmd, "-device"); - if (!(devstr = qemuBuildControllerDevStr(def, cont, qemuCaps, NULL))) + if (!(devstr = qemuBuildControllerDevStr(def, cont, + qemuCaps, NULL))) goto error; virCommandAddArg(cmd, devstr); VIR_FREE(devstr); } - } else if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB && - def->controllers[i]->model == -1 && - !qemuCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) { + } else if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB && + cont->model == -1 && + !qemuCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) { if (usblegacy) { qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Multiple legacy USB controller not supported")); + _("Multiple legacy USB controllers are " + "not supported")); goto error; } usblegacy = true; @@ -4704,7 +4707,7 @@ qemuBuildCommandLine(virConnectPtr conn, virCommandAddArg(cmd, "-device"); char *devstr; - if (!(devstr = qemuBuildControllerDevStr(def, def->controllers[i], qemuCaps, + if (!(devstr = qemuBuildControllerDevStr(def, cont, qemuCaps, &usbcontroller))) goto error; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3410535..3138fb3 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5797,8 +5797,7 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, flags |= VIR_DOMAIN_AFFECT_CONFIG; /* check consistency between flags and the vm state */ if (flags & VIR_DOMAIN_AFFECT_LIVE) { - qemuReportError(VIR_ERR_OPERATION_INVALID, - "%s", + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", _("cannot do live update a device on " "inactive domain")); goto endjob; @@ -5806,8 +5805,8 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, } if ((flags & VIR_DOMAIN_AFFECT_CONFIG) && !vm->persistent) { - qemuReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("cannot modify device on transient domain")); + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot modify device on transient domain")); goto endjob; } -- 1.7.8.6

On 2012年07月10日 01:29, Peter Krempa wrote:
Style changes split out from next patch. --- src/conf/domain_conf.c | 23 +++++++++++++---------- src/qemu/qemu_command.c | 19 +++++++++++-------- src/qemu/qemu_driver.c | 7 +++---- 3 files changed, 27 insertions(+), 22 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 3fb90db..17b0e0e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8602,11 +8602,12 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, }
/* analysis of the disk devices */ - if ((n = virXPathNodeSet("./devices/disk", ctxt,&nodes))< 0) { + if ((n = virXPathNodeSet("./devices/disk", ctxt,&nodes))< 0) goto error; - } + if (n&& VIR_ALLOC_N(def->disks, n)< 0) goto no_memory; + for (i = 0 ; i< n ; i++) { virDomainDiskDefPtr disk = virDomainDiskDefParseXML(caps, nodes[i], @@ -8622,11 +8623,12 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, VIR_FREE(nodes);
/* analysis of the controller devices */ - if ((n = virXPathNodeSet("./devices/controller", ctxt,&nodes))< 0) { + if ((n = virXPathNodeSet("./devices/controller", ctxt,&nodes))< 0) goto error; - } + if (n&& VIR_ALLOC_N(def->controllers, n)< 0) goto no_memory; + for (i = 0 ; i< n ; i++) { virDomainControllerDefPtr controller = virDomainControllerDefParseXML(nodes[i], flags); @@ -8748,9 +8750,9 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, } VIR_FREE(nodes);
- if ((n = virXPathNodeSet("./devices/serial", ctxt,&nodes))< 0) { + if ((n = virXPathNodeSet("./devices/serial", ctxt,&nodes))< 0) goto error; - } + if (n&& VIR_ALLOC_N(def->serials, n)< 0) goto no_memory;
@@ -9044,8 +9046,8 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, goto error; } if (n> 1) { - virDomainReportError (VIR_ERR_INTERNAL_ERROR, - "%s", _("only a single watchdog device is supported")); + virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("only a single watchdog device is supported")); goto error; } if (n> 0) { @@ -9064,8 +9066,9 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, goto error; } if (n> 1) { - virDomainReportError (VIR_ERR_INTERNAL_ERROR, - "%s", _("only a single memory balloon device is supported")); + virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("only a single memory balloon device is " + "supported")); goto error; } if (n> 0) { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 94b2919..44c7c8b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4678,25 +4678,28 @@ qemuBuildCommandLine(virConnectPtr conn, /* Only recent QEMU implements a SATA (AHCI) controller */ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) { if (!qemuCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) { - qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, - "%s", _("SATA is not supported with this QEMU binary")); + qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("SATA is not supported with this " + "QEMU binary")); goto error; } else { char *devstr;
virCommandAddArg(cmd, "-device"); - if (!(devstr = qemuBuildControllerDevStr(def, cont, qemuCaps, NULL))) + if (!(devstr = qemuBuildControllerDevStr(def, cont, + qemuCaps, NULL))) goto error;
virCommandAddArg(cmd, devstr); VIR_FREE(devstr); } - } else if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB&& - def->controllers[i]->model == -1&& - !qemuCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) { + } else if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB&& + cont->model == -1&& + !qemuCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) {
Oh, not only about the coding style. But it's the right fix. ACK. Osier

Libvirt adds a USB controller to the guest even if the user does not specify any in the XML. This is due to back-compat reasons. To allow disabling USB for a guest this patch adds a new USB controller type "none" that disables USB support for the guest. --- docs/schemas/domaincommon.rng | 1 + src/conf/domain_conf.c | 55 ++++++++++++++++++++++++++++++++++++++++- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 3 +- 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 3d205b0..937c2e8 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1202,6 +1202,7 @@ <value>vt82c686b-uhci</value> <value>pci-ohci</value> <value>nec-xhci</value> + <value>none</value> </choice> </attribute> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 17b0e0e..9afae87 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -257,7 +257,8 @@ VIR_ENUM_IMPL(virDomainControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST, "ich9-uhci3", "vt82c686b-uhci", "pci-ohci", - "nec-xhci") + "nec-xhci", + "none") VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST, "mount", @@ -7910,6 +7911,8 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, virBitmapPtr bootMap = NULL; unsigned long bootMapSize = 0; xmlNodePtr cur; + bool usb_none = false; + bool usb_other = false; if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -8635,6 +8638,27 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!controller) goto error; + /* sanitize handling of "none" usb controller */ + if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) { + if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) { + if (usb_other || usb_none) { + virDomainReportError(VIR_ERR_XML_DETAIL, "%s", + _("Can't add another USB controller: " + "USB is disabled for this domain")); + goto error; + } + usb_none = true; + } else { + if (usb_none) { + virDomainReportError(VIR_ERR_XML_DETAIL, "%s", + _("Can't add another USB controller: " + "USB is disabled for this domain")); + goto error; + } + usb_other = true; + } + } + virDomainControllerInsertPreAlloced(def, controller); } VIR_FREE(nodes); @@ -8909,6 +8933,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!input) goto error; + /* Check if USB bus is required */ + if (input->bus == VIR_DOMAIN_INPUT_BUS_USB && usb_none) { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Can't add USB input device. " + "USB bus is disabled")); + goto error; + } /* With QEMU / KVM / Xen graphics, mouse + PS/2 is implicit * with graphics, so don't store it. @@ -9036,6 +9067,14 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!hostdev) goto error; + if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB && + usb_none) { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Can't add USB device passthrough: " + "USB is disabled in this host")); + goto error; + } + def->hostdevs[def->nhostdevs++] = hostdev; } VIR_FREE(nodes); @@ -9105,6 +9144,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!hub) goto error; + if (hub->type == VIR_DOMAIN_HUB_TYPE_USB && usb_none) { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Can't add USB hub: " + "USB is disabled for this domain")); + goto error; + } + def->hubs[def->nhubs++] = hub; } VIR_FREE(nodes); @@ -9121,6 +9167,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!redirdev) goto error; + if (redirdev->bus == VIR_DOMAIN_REDIRDEV_BUS_USB && usb_none) { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Can't add USB redir device: " + "USB is disabled for this domain")); + goto error; + } + def->redirdevs[def->nredirdevs++] = redirdev; } VIR_FREE(nodes); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 7d5d60b..5c06f88 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -632,6 +632,7 @@ enum virDomainControllerModelUSB { VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI, VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI, VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI, + VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 44c7c8b..5db72e8 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -107,7 +107,8 @@ VIR_ENUM_IMPL(qemuControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST, "ich9-usb-uhci3", "vt82c686b-usb-uhci", "pci-ohci", - "nec-usb-xhci"); + "nec-usb-xhci", + "none"); VIR_ENUM_DECL(qemuDomainFSDriver) VIR_ENUM_IMPL(qemuDomainFSDriver, VIR_DOMAIN_FS_DRIVER_TYPE_LAST, -- 1.7.8.6

On 2012年07月10日 01:29, Peter Krempa wrote:
Libvirt adds a USB controller to the guest even if the user does not specify any in the XML. This is due to back-compat reasons.
It's not for back-compat reasons as far as I known, 42043afcd adds the implicit USB controller for virt-manager's use, and it causes the regression bug of migration, as the old libvirt doesn't have a default USB controller as a force. Jirka fixed it by commit 409b5f549.
To allow disabling USB for a guest this patch adds a new USB controller type "none" that disables USB support for the guest. --- docs/schemas/domaincommon.rng | 1 + src/conf/domain_conf.c | 55 ++++++++++++++++++++++++++++++++++++++++- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 3 +- 4 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 3d205b0..937c2e8 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1202,6 +1202,7 @@ <value>vt82c686b-uhci</value> <value>pci-ohci</value> <value>nec-xhci</value> +<value>none</value> </choice> </attribute> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 17b0e0e..9afae87 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -257,7 +257,8 @@ VIR_ENUM_IMPL(virDomainControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST, "ich9-uhci3", "vt82c686b-uhci", "pci-ohci", - "nec-xhci") + "nec-xhci", + "none")
VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST, "mount", @@ -7910,6 +7911,8 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, virBitmapPtr bootMap = NULL; unsigned long bootMapSize = 0; xmlNodePtr cur; + bool usb_none = false; + bool usb_other = false;
if (VIR_ALLOC(def)< 0) { virReportOOMError(); @@ -8635,6 +8638,27 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!controller) goto error;
+ /* sanitize handling of "none" usb controller */ + if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) { + if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) { + if (usb_other || usb_none) { + virDomainReportError(VIR_ERR_XML_DETAIL, "%s", + _("Can't add another USB controller: " + "USB is disabled for this domain")); + goto error; + } + usb_none = true; + } else { + if (usb_none) { + virDomainReportError(VIR_ERR_XML_DETAIL, "%s", + _("Can't add another USB controller: " + "USB is disabled for this domain")); + goto error; + } + usb_other = true; + } + } + virDomainControllerInsertPreAlloced(def, controller); } VIR_FREE(nodes); @@ -8909,6 +8933,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!input) goto error;
+ /* Check if USB bus is required */ + if (input->bus == VIR_DOMAIN_INPUT_BUS_USB&& usb_none) { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Can't add USB input device. " + "USB bus is disabled")); + goto error; + }
/* With QEMU / KVM / Xen graphics, mouse + PS/2 is implicit * with graphics, so don't store it. @@ -9036,6 +9067,14 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!hostdev) goto error;
+ if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB&& + usb_none) { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Can't add USB device passthrough: " + "USB is disabled in this host")); + goto error; + } + def->hostdevs[def->nhostdevs++] = hostdev; } VIR_FREE(nodes); @@ -9105,6 +9144,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!hub) goto error;
+ if (hub->type == VIR_DOMAIN_HUB_TYPE_USB&& usb_none) { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Can't add USB hub: " + "USB is disabled for this domain")); + goto error; + } + def->hubs[def->nhubs++] = hub; } VIR_FREE(nodes); @@ -9121,6 +9167,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (!redirdev) goto error;
+ if (redirdev->bus == VIR_DOMAIN_REDIRDEV_BUS_USB&& usb_none) { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Can't add USB redir device: " + "USB is disabled for this domain")); + goto error; + } + def->redirdevs[def->nredirdevs++] = redirdev;
This is not that nice from a user's point of view, one could see a bunch of errors if he doesn't quite understand the configs. E.g when he removes the USB input device, he may see error for host USB device, when he removes the host USB device, he may see error for USB hub...... The more device uses USB bus we introduce, the more error. Is it a hard requirement of specify the 'none' USB controller model? if not, we may want to add the controller implicitly only necessary, instead of add it as a force. We won't fall into another regression, as Jirka's patch emits the USB controller anyway. Regards, Osier

On 07/10/2012 01:01 AM, Osier Yang wrote:
On 2012年07月10日 01:29, Peter Krempa wrote:
Libvirt adds a USB controller to the guest even if the user does not specify any in the XML. This is due to back-compat reasons.
It's not for back-compat reasons as far as I known, 42043afcd adds the implicit USB controller for virt-manager's use, and it causes the regression bug of migration, as the old libvirt doesn't have a default USB controller as a force. Jirka fixed it by commit 409b5f549.
It IS for back-compat reasons. We have been outputting '-usb' in the qemu command line for ages prior to 42043afcd, and need a way to explicitly omit the '-usb' in the command line. Older libvirt had no way to represent the implicit device, and the fix of 409b5f549 was more of a hack that said when migrating back to an older libvirt, the existing usb controller of the sending libvirt would be implicitly recreated by the receiving libvirt. If a user explicitly requests the 'none' controller, then we must ensure that migration to an older host fails up front; the 'none' element must be explicit because the absence of an element implies the default usb controller.
Is it a hard requirement of specify the 'none' USB controller model?
Yes, just like it is a hard requirement that a user explicitly specifies the 'none' memoryballoon controller. That's the back-compat issue we have to face any time we make the XML explicit for something that older libvirt provided implicitly. This patch looks correct to me. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

This patch adds helpers that validate domain's device configuration. This will be needed later on to verify devices being hot-plugged to guests. If the guest has no USB bus, then it's not valid to plug a USB device to that guest. --- src/conf/domain_conf.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 5 +++++ src/libvirt_private.syms | 2 ++ 3 files changed, 50 insertions(+), 0 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9afae87..6c7242e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13258,6 +13258,49 @@ error: return NULL; } +bool +virDomainDefHasUSB(virDomainDefPtr def) +{ + int i; + + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB && + def->controllers[i]->model != VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) + return true; + } + + return false; +} + +int +virDomainDefCompatibleDevice(virDomainDefPtr def, + virDomainDeviceDefPtr dev) +{ + int t = dev->type; + if (!virDomainDefHasUSB(def) && + ((t == VIR_DOMAIN_DEVICE_DISK && + dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_USB) || + (t == VIR_DOMAIN_DEVICE_CONTROLLER && + dev->data.controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) || + (t == VIR_DOMAIN_DEVICE_INPUT && + dev->data.input->type == VIR_DOMAIN_INPUT_BUS_USB) || + (t == VIR_DOMAIN_DEVICE_HOSTDEV && + dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && + dev->data.hostdev->source.subsys.type == + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) || + (t == VIR_DOMAIN_DEVICE_HUB && + dev->data.hub->type == VIR_DOMAIN_HUB_TYPE_USB) || + (t == VIR_DOMAIN_DEVICE_REDIRDEV && + dev->data.redirdev->bus == VIR_DOMAIN_REDIRDEV_BUS_USB))) { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Device configuration is not compatible: " + "Domain has no USB bus support")); + return -1; + } + + return 0; +} + int virDomainSaveXML(const char *configDir, virDomainDefPtr def, const char *xml) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 5c06f88..36b2220 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1970,6 +1970,11 @@ int virDomainDefFormatInternal(virDomainDefPtr def, unsigned int flags, virBufferPtr buf); +bool virDomainDefHasUSB(virDomainDefPtr def); + +int virDomainDefCompatibleDevice(virDomainDefPtr def, + virDomainDeviceDefPtr dev); + int virDomainCpuSetParse(const char *str, char sep, char *cpuset, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 6625fc6..2bd9116 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -278,9 +278,11 @@ virDomainDefAddImplicitControllers; virDomainDefCheckABIStability; virDomainDefClearDeviceAliases; virDomainDefClearPCIAddresses; +virDomainDefCompatibleDevice; virDomainDefFormat; virDomainDefFormatInternal; virDomainDefFree; +virDomainDefHasUSB; virDomainDefParseFile; virDomainDefParseNode; virDomainDefParseString; -- 1.7.8.6

This patch enables the "none" USB controller for qemu guests and adds valdiation on hot-plugged devices if the guest has USB disabled. --- src/qemu/qemu_command.c | 7 +++++++ src/qemu/qemu_driver.c | 6 ++++++ 2 files changed, 13 insertions(+), 0 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 5db72e8..232808c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4676,6 +4676,13 @@ qemuBuildCommandLine(virConnectPtr conn, cont->type == VIR_DOMAIN_CONTROLLER_TYPE_FDC) continue; + /* Also, skip USB controllers with type none.*/ + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB && + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) { + usbcontroller = -1; /* mark we don't want a controller */ + continue; + } + /* Only recent QEMU implements a SATA (AHCI) controller */ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) { if (!qemuCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) { diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3138fb3..cbe4857 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5827,6 +5827,9 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, } if (flags & VIR_DOMAIN_AFFECT_CONFIG) { + if (virDomainDefCompatibleDevice(vmdef, dev) < 0) + goto endjob; + /* Make a copy for updated domain. */ vmdef = virDomainObjCopyPersistentDef(driver->caps, vm); if (!vmdef) @@ -5852,6 +5855,9 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, } if (flags & VIR_DOMAIN_AFFECT_LIVE) { + if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0) + goto endjob; + switch (action) { case QEMU_DEVICE_ATTACH: ret = qemuDomainAttachDeviceLive(vm, dev_copy, dom); -- 1.7.8.6

This patch enhances qemuxml2argvtest to deal with sematicaly incorrect domain XMLs, that generate errors while parsing. This patch cleans up macros that invoke the tests and changes boolean flags to a bit array flag variable. --- tests/qemuxml2argvtest.c | 497 +++++++++++++++++++++++----------------------- 1 files changed, 253 insertions(+), 244 deletions(-) diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 7b00ea2..33c55ed 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -80,14 +80,19 @@ static virSecretDriver fakeSecretDriver = { .undefine = NULL, }; +typedef enum { + FLAG_EXPECT_ERROR = 1, + FLAG_EXPECT_FAILURE = 1<<1, + FLAG_EXPECT_PARSE_ERROR = 1<<2, + FLAG_JSON = 1<<3, +} virQemuXML2ArgvTestFlags; + static int testCompareXMLToArgvFiles(const char *xml, const char *cmdline, virBitmapPtr extraFlags, const char *migrateFrom, int migrateFd, - bool json, - bool expectError, - bool expectFailure) + virQemuXML2ArgvTestFlags flags) { char *expectargv = NULL; int len; @@ -106,8 +111,11 @@ static int testCompareXMLToArgvFiles(const char *xml, if (!(vmdef = virDomainDefParseFile(driver.caps, xml, QEMU_EXPECTED_VIRT_TYPES, - VIR_DOMAIN_XML_INACTIVE))) + VIR_DOMAIN_XML_INACTIVE))) { + if (flags & FLAG_EXPECT_PARSE_ERROR) + goto ok; goto out; + } /* * For test purposes, we may want to fake emulator's output by providing @@ -152,7 +160,7 @@ static int testCompareXMLToArgvFiles(const char *xml, qemuDomainPCIAddressSetPtr pciaddrs; if (qemuDomainAssignSpaprVIOAddresses(vmdef)) { - if (expectError) + if (flags & FLAG_EXPECT_ERROR) goto ok; goto out; } @@ -182,22 +190,22 @@ static int testCompareXMLToArgvFiles(const char *xml, if (qemuAssignDeviceAliases(vmdef, extraFlags) < 0) goto out; - if (!(cmd = qemuBuildCommandLine(conn, &driver, - vmdef, &monitor_chr, json, extraFlags, + if (!(cmd = qemuBuildCommandLine(conn, &driver, vmdef, &monitor_chr, + (flags & FLAG_JSON), extraFlags, migrateFrom, migrateFd, NULL, VIR_NETDEV_VPORT_PROFILE_OP_NO_OP))) { - if (expectFailure) { + if (flags & FLAG_EXPECT_FAILURE) { ret = 0; virResetLastError(); } goto out; - } else if (expectFailure) { + } else if (flags & FLAG_EXPECT_FAILURE) { if (virTestGetDebug()) fprintf(stderr, "qemuBuildCommandLine should have failed\n"); goto out; } - if (!!virGetLastError() != expectError) { + if (!!virGetLastError() != !!(flags & FLAG_EXPECT_ERROR)) { if (virTestGetDebug() && (log = virtTestLogContentAndReset())) fprintf(stderr, "\n%s", log); goto out; @@ -227,7 +235,7 @@ static int testCompareXMLToArgvFiles(const char *xml, } ok: - if (expectError) { + if (flags & FLAG_EXPECT_ERROR) { /* need to suppress the errors */ virResetLastError(); } @@ -251,8 +259,7 @@ struct testInfo { virBitmapPtr extraFlags; const char *migrateFrom; int migrateFd; - bool expectError; - bool expectFailure; + unsigned int flags; }; static int @@ -262,6 +269,7 @@ testCompareXMLToArgvHelper(const void *data) const struct testInfo *info = data; char *xml = NULL; char *args = NULL; + unsigned int flags = info->flags; if (virAsprintf(&xml, "%s/qemuxml2argvdata/qemuxml2argv-%s.xml", abs_srcdir, info->name) < 0 || @@ -269,12 +277,12 @@ testCompareXMLToArgvHelper(const void *data) abs_srcdir, info->name) < 0) goto cleanup; + if (qemuCapsGet(info->extraFlags, QEMU_CAPS_MONITOR_JSON)) + flags |= FLAG_JSON; + result = testCompareXMLToArgvFiles(xml, args, info->extraFlags, info->migrateFrom, info->migrateFd, - qemuCapsGet(info->extraFlags, - QEMU_CAPS_MONITOR_JSON), - info->expectError, - info->expectFailure); + flags); cleanup: VIR_FREE(xml); @@ -313,12 +321,10 @@ mymain(void) return EXIT_FAILURE; } -# define DO_TEST_FULL(name, migrateFrom, migrateFd, \ - expectError, expectFailure, ...) \ +# define DO_TEST_FULL(name, migrateFrom, migrateFd, flags, ...) \ do { \ static struct testInfo info = { \ - name, NULL, migrateFrom, migrateFd, \ - expectError, expectFailure \ + name, NULL, migrateFrom, migrateFd, (flags) \ }; \ if (!(info.extraFlags = qemuCapsNew())) \ return EXIT_FAILURE; \ @@ -329,11 +335,19 @@ mymain(void) qemuCapsFree(info.extraFlags); \ } while (0) -# define DO_TEST(name, expectError, ...) \ - DO_TEST_FULL(name, NULL, -1, expectError, false, __VA_ARGS__) +# define DO_TEST(name, ...) \ + DO_TEST_FULL(name, NULL, -1, 0, __VA_ARGS__) + +# define DO_TEST_ERROR(name, ...) \ + DO_TEST_FULL(name, NULL, -1, FLAG_EXPECT_ERROR, __VA_ARGS__) # define DO_TEST_FAILURE(name, ...) \ - DO_TEST_FULL(name, NULL, -1, false, true, __VA_ARGS__) + DO_TEST_FULL(name, NULL, -1, FLAG_EXPECT_FAILURE, __VA_ARGS__) + +# define DO_TEST_PARSE_ERROR(name, ...) \ + DO_TEST_FULL(name, NULL, -1, \ + FLAG_EXPECT_PARSE_ERROR | FLAG_EXPECT_ERROR, \ + __VA_ARGS__) # define NONE QEMU_CAPS_LAST @@ -350,431 +364,426 @@ mymain(void) unsetenv("QEMU_AUDIO_DRV"); unsetenv("SDL_AUDIODRIVER"); - DO_TEST("minimal", false, QEMU_CAPS_NAME); - DO_TEST("machine-aliases1", false, NONE); - DO_TEST("machine-aliases2", true, NONE); - DO_TEST("boot-cdrom", false, NONE); - DO_TEST("boot-network", false, NONE); - DO_TEST("boot-floppy", false, NONE); - DO_TEST("boot-multi", false, QEMU_CAPS_BOOT_MENU); - DO_TEST("boot-menu-enable", false, + DO_TEST("minimal", QEMU_CAPS_NAME); + DO_TEST("machine-aliases1", NONE); + DO_TEST_ERROR("machine-aliases2", NONE); + DO_TEST("boot-cdrom", NONE); + DO_TEST("boot-network", NONE); + DO_TEST("boot-floppy", NONE); + DO_TEST("boot-multi", QEMU_CAPS_BOOT_MENU); + DO_TEST("boot-menu-enable", QEMU_CAPS_BOOT_MENU, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE); - DO_TEST("boot-menu-enable", false, + DO_TEST("boot-menu-enable", QEMU_CAPS_BOOT_MENU, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE, QEMU_CAPS_BOOTINDEX); - DO_TEST("boot-menu-disable", false, QEMU_CAPS_BOOT_MENU); - DO_TEST("boot-menu-disable-drive", false, + DO_TEST("boot-menu-disable", QEMU_CAPS_BOOT_MENU); + DO_TEST("boot-menu-disable-drive", QEMU_CAPS_BOOT_MENU, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE); - DO_TEST("boot-menu-disable-drive-bootindex", false, + DO_TEST("boot-menu-disable-drive-bootindex", QEMU_CAPS_BOOT_MENU, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE, QEMU_CAPS_BOOTINDEX); - DO_TEST("boot-order", false, + DO_TEST("boot-order", QEMU_CAPS_BOOTINDEX, QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO); - DO_TEST("boot-complex", false, + DO_TEST("boot-complex", QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO); - DO_TEST("boot-complex-bootindex", false, + DO_TEST("boot-complex-bootindex", QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_BOOTINDEX, QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO); - DO_TEST("bootloader", true, QEMU_CAPS_DOMID); - DO_TEST("bios", false, QEMU_CAPS_DEVICE, QEMU_CAPS_SGA); - DO_TEST("clock-utc", false, NONE); - DO_TEST("clock-localtime", false, NONE); + DO_TEST_ERROR("bootloader", QEMU_CAPS_DOMID); + DO_TEST("bios", QEMU_CAPS_DEVICE, QEMU_CAPS_SGA); + DO_TEST("clock-utc", NONE); + DO_TEST("clock-localtime", NONE); /* * Can't be enabled since the absolute timestamp changes every time - DO_TEST("clock-variable", false, QEMU_CAPS_RTC); + DO_TEST("clock-variable", QEMU_CAPS_RTC); */ - DO_TEST("clock-france", false, QEMU_CAPS_RTC); - DO_TEST("cpu-kvmclock", false, QEMU_CAPS_ENABLE_KVM); - DO_TEST("cpu-host-kvmclock", false, QEMU_CAPS_ENABLE_KVM, QEMU_CAPS_CPU_HOST); - DO_TEST("kvmclock", false, QEMU_CAPS_KVM); - - DO_TEST("hugepages", false, QEMU_CAPS_MEM_PATH); - DO_TEST("disk-cdrom", false, NONE); - DO_TEST("disk-cdrom-empty", false, QEMU_CAPS_DRIVE); - DO_TEST("disk-cdrom-tray", false, + DO_TEST("clock-france", QEMU_CAPS_RTC); + DO_TEST("cpu-kvmclock", QEMU_CAPS_ENABLE_KVM); + DO_TEST("cpu-host-kvmclock", QEMU_CAPS_ENABLE_KVM, QEMU_CAPS_CPU_HOST); + DO_TEST("kvmclock", QEMU_CAPS_KVM); + + DO_TEST("hugepages", QEMU_CAPS_MEM_PATH); + DO_TEST("disk-cdrom", NONE); + DO_TEST("disk-cdrom-empty", QEMU_CAPS_DRIVE); + DO_TEST("disk-cdrom-tray", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_TX_ALG); - DO_TEST("disk-cdrom-tray-no-device-cap", false, NONE); - DO_TEST("disk-floppy", false, NONE); - DO_TEST("disk-floppy-tray-no-device-cap", false, NONE); - DO_TEST("disk-floppy-tray", false, + DO_TEST("disk-cdrom-tray-no-device-cap", NONE); + DO_TEST("disk-floppy", NONE); + DO_TEST("disk-floppy-tray-no-device-cap", NONE); + DO_TEST("disk-floppy-tray", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE); - DO_TEST("disk-many", false, NONE); - DO_TEST("disk-virtio", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT); - DO_TEST("disk-order", false, + DO_TEST("disk-many", NONE); + DO_TEST("disk-virtio", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT); + DO_TEST("disk-order", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO); - DO_TEST("disk-xenvbd", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT); - DO_TEST("disk-drive-boot-disk", false, + DO_TEST("disk-xenvbd", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT); + DO_TEST("disk-drive-boot-disk", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT); - DO_TEST("disk-drive-boot-cdrom", false, + DO_TEST("disk-drive-boot-cdrom", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT); - DO_TEST("floppy-drive-fat", false, + DO_TEST("floppy-drive-fat", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-fat", false, + DO_TEST("disk-drive-fat", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-readonly-disk", false, + DO_TEST("disk-drive-readonly-disk", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_READONLY, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("disk-drive-readonly-no-device", false, + DO_TEST("disk-drive-readonly-no-device", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_READONLY, QEMU_CAPS_NODEFCONFIG); - DO_TEST("disk-drive-fmt-qcow", false, + DO_TEST("disk-drive-fmt-qcow", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-shared", false, + DO_TEST("disk-drive-shared", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT, QEMU_CAPS_DRIVE_SERIAL); - DO_TEST("disk-drive-cache-v1-wt", false, + DO_TEST("disk-drive-cache-v1-wt", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-cache-v1-wb", false, + DO_TEST("disk-drive-cache-v1-wb", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-cache-v1-none", false, + DO_TEST("disk-drive-cache-v1-none", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-error-policy-stop", false, + DO_TEST("disk-drive-error-policy-stop", QEMU_CAPS_DRIVE, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-error-policy-enospace", false, + DO_TEST("disk-drive-error-policy-enospace", QEMU_CAPS_DRIVE, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-error-policy-wreport-rignore", false, + DO_TEST("disk-drive-error-policy-wreport-rignore", QEMU_CAPS_DRIVE, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-cache-v2-wt", false, + DO_TEST("disk-drive-cache-v2-wt", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-cache-v2-wb", false, + DO_TEST("disk-drive-cache-v2-wb", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-cache-v2-none", false, + DO_TEST("disk-drive-cache-v2-none", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-cache-directsync", false, + DO_TEST("disk-drive-cache-directsync", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-cache-unsafe", false, + DO_TEST("disk-drive-cache-unsafe", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_CACHE_UNSAFE, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-network-nbd", false, + DO_TEST("disk-drive-network-nbd", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-network-rbd", false, + DO_TEST("disk-drive-network-rbd", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-network-sheepdog", false, + DO_TEST("disk-drive-network-sheepdog", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-network-rbd-auth", false, + DO_TEST("disk-drive-network-rbd-auth", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-drive-no-boot", false, + DO_TEST("disk-drive-no-boot", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_BOOTINDEX); - DO_TEST("disk-usb", false, NONE); - DO_TEST("disk-usb-device", false, + DO_TEST("disk-usb", NONE); + DO_TEST("disk-usb-device", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("disk-scsi-device", false, + DO_TEST("disk-scsi-device", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("disk-scsi-device-auto", false, + DO_TEST("disk-scsi-device-auto", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("disk-scsi-disk-split", false, + DO_TEST("disk-scsi-disk-split", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_CD); - DO_TEST("disk-scsi-vscsi", false, + DO_TEST("disk-scsi-vscsi", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("disk-scsi-virtio-scsi", false, + DO_TEST("disk-scsi-virtio-scsi", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("disk-sata-device", false, + DO_TEST("disk-sata-device", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_ICH9_AHCI); - DO_TEST("disk-aio", false, + DO_TEST("disk-aio", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_AIO, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("disk-ioeventfd", false, + DO_TEST("disk-ioeventfd", QEMU_CAPS_DRIVE, QEMU_CAPS_VIRTIO_IOEVENTFD, QEMU_CAPS_VIRTIO_TX_ALG, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO); - DO_TEST("disk-copy_on_read", false, + DO_TEST("disk-copy_on_read", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_COPY_ON_READ, QEMU_CAPS_VIRTIO_TX_ALG, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO); - DO_TEST("disk-snapshot", false, + DO_TEST("disk-snapshot", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT); - DO_TEST("event_idx", false, + DO_TEST("event_idx", QEMU_CAPS_DRIVE, QEMU_CAPS_VIRTIO_BLK_EVENT_IDX, QEMU_CAPS_VIRTIO_NET_EVENT_IDX, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO); - DO_TEST("virtio-lun", false, + DO_TEST("virtio-lun", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO); - DO_TEST("disk-scsi-lun-passthrough", false, + DO_TEST("disk-scsi-lun-passthrough", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_SCSI_BLOCK, QEMU_CAPS_VIRTIO_BLK_SG_IO); - DO_TEST("graphics-vnc", false, NONE); - DO_TEST("graphics-vnc-socket", false, NONE); + DO_TEST("graphics-vnc", NONE); + DO_TEST("graphics-vnc-socket", NONE); driver.vncSASL = 1; driver.vncSASLdir = strdup("/root/.sasl2"); - DO_TEST("graphics-vnc-sasl", false, QEMU_CAPS_VGA); + DO_TEST("graphics-vnc-sasl", QEMU_CAPS_VGA); driver.vncTLS = 1; driver.vncTLSx509verify = 1; driver.vncTLSx509certdir = strdup("/etc/pki/tls/qemu"); - DO_TEST("graphics-vnc-tls", false, NONE); + DO_TEST("graphics-vnc-tls", NONE); driver.vncSASL = driver.vncTLSx509verify = driver.vncTLS = 0; VIR_FREE(driver.vncSASLdir); VIR_FREE(driver.vncTLSx509certdir); driver.vncSASLdir = driver.vncTLSx509certdir = NULL; - DO_TEST("graphics-sdl", false, NONE); - DO_TEST("graphics-sdl-fullscreen", false, NONE); - DO_TEST("nographics", false, QEMU_CAPS_VGA); - DO_TEST("nographics-vga", false, + DO_TEST("graphics-sdl", NONE); + DO_TEST("graphics-sdl-fullscreen", NONE); + DO_TEST("nographics", QEMU_CAPS_VGA); + DO_TEST("nographics-vga", QEMU_CAPS_VGA, QEMU_CAPS_VGA_NONE); - DO_TEST("graphics-spice", false, + DO_TEST("graphics-spice", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE); - DO_TEST("graphics-spice-agentmouse", false, + DO_TEST("graphics-spice-agentmouse", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC, QEMU_CAPS_NODEFCONFIG); - DO_TEST("graphics-spice-compression", false, + DO_TEST("graphics-spice-compression", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE); - DO_TEST("graphics-spice-timeout", false, + DO_TEST("graphics-spice-timeout", QEMU_CAPS_DRIVE, QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, QEMU_CAPS_DEVICE_QXL_VGA); - DO_TEST("graphics-spice-qxl-vga", false, + DO_TEST("graphics-spice-qxl-vga", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, QEMU_CAPS_DEVICE_QXL_VGA); - DO_TEST("graphics-spice-usb-redir", false, + DO_TEST("graphics-spice-usb-redir", QEMU_CAPS_VGA, QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_USB_HUB, QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_USB_REDIR, QEMU_CAPS_CHARDEV_SPICEVMC); - DO_TEST("input-usbmouse", false, NONE); - DO_TEST("input-usbtablet", false, NONE); - DO_TEST("input-xen", true, QEMU_CAPS_DOMID); - DO_TEST("misc-acpi", false, NONE); - DO_TEST("misc-no-reboot", false, NONE); - DO_TEST("misc-uuid", false, QEMU_CAPS_NAME, QEMU_CAPS_UUID); - DO_TEST("net-user", false, NONE); - DO_TEST("net-virtio", false, NONE); - DO_TEST("net-virtio-device", false, + DO_TEST("input-usbmouse", NONE); + DO_TEST("input-usbtablet", NONE); + DO_TEST_ERROR("input-xen", QEMU_CAPS_DOMID); + DO_TEST("misc-acpi", NONE); + DO_TEST("misc-no-reboot", NONE); + DO_TEST("misc-uuid", QEMU_CAPS_NAME, QEMU_CAPS_UUID); + DO_TEST("net-user", NONE); + DO_TEST("net-virtio", NONE); + DO_TEST("net-virtio-device", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_TX_ALG); - DO_TEST("net-virtio-netdev", false, + DO_TEST("net-virtio-netdev", QEMU_CAPS_DEVICE, QEMU_CAPS_NETDEV, QEMU_CAPS_NODEFCONFIG); - DO_TEST("net-eth", false, NONE); - DO_TEST("net-eth-ifname", false, NONE); - DO_TEST("net-eth-names", false, QEMU_CAPS_NET_NAME); - DO_TEST("net-client", false, NONE); - DO_TEST("net-server", false, NONE); - DO_TEST("net-mcast", false, NONE); - DO_TEST("net-hostdev", false, + DO_TEST("net-eth", NONE); + DO_TEST("net-eth-ifname", NONE); + DO_TEST("net-eth-names", QEMU_CAPS_NET_NAME); + DO_TEST("net-client", NONE); + DO_TEST("net-server", NONE); + DO_TEST("net-mcast", NONE); + DO_TEST("net-hostdev", QEMU_CAPS_PCIDEVICE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("serial-vc", false, NONE); - DO_TEST("serial-pty", false, NONE); - DO_TEST("serial-dev", false, NONE); - DO_TEST("serial-file", false, NONE); - DO_TEST("serial-unix", false, NONE); - DO_TEST("serial-tcp", false, NONE); - DO_TEST("serial-udp", false, NONE); - DO_TEST("serial-tcp-telnet", false, NONE); - DO_TEST("serial-many", false, NONE); - DO_TEST("parallel-tcp", false, NONE); - DO_TEST("console-compat", false, NONE); - DO_TEST("console-compat-auto", false, NONE); - - DO_TEST("serial-vc-chardev", false, + DO_TEST("serial-vc", NONE); + DO_TEST("serial-pty", NONE); + DO_TEST("serial-dev", NONE); + DO_TEST("serial-file", NONE); + DO_TEST("serial-unix", NONE); + DO_TEST("serial-tcp", NONE); + DO_TEST("serial-udp", NONE); + DO_TEST("serial-tcp-telnet", NONE); + DO_TEST("serial-many", NONE); + DO_TEST("parallel-tcp", NONE); + DO_TEST("console-compat", NONE); + DO_TEST("console-compat-auto", NONE); + + DO_TEST("serial-vc-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("serial-pty-chardev", false, + DO_TEST("serial-pty-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("serial-dev-chardev", false, + DO_TEST("serial-dev-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("serial-file-chardev", false, + DO_TEST("serial-file-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("serial-unix-chardev", false, + DO_TEST("serial-unix-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("serial-tcp-chardev", false, + DO_TEST("serial-tcp-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("serial-udp-chardev", false, + DO_TEST("serial-udp-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("serial-tcp-telnet-chardev", false, + DO_TEST("serial-tcp-telnet-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("serial-many-chardev", false, + DO_TEST("serial-many-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("parallel-tcp-chardev", false, + DO_TEST("parallel-tcp-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("parallel-parport-chardev", false, + DO_TEST("parallel-parport-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("console-compat-chardev", false, + DO_TEST("console-compat-chardev", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("channel-guestfwd", false, + DO_TEST("channel-guestfwd", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("channel-virtio", false, + DO_TEST("channel-virtio", QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG); - DO_TEST("channel-virtio-auto", false, + DO_TEST("channel-virtio-auto", QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG); - DO_TEST("console-virtio", false, + DO_TEST("console-virtio", QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG); - DO_TEST("console-virtio-many", false, + DO_TEST("console-virtio-many", QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG); - DO_TEST("channel-spicevmc", false, + DO_TEST("channel-spicevmc", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC); - DO_TEST("channel-spicevmc-old", false, + DO_TEST("channel-spicevmc-old", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SPICE, QEMU_CAPS_DEVICE_SPICEVMC); - DO_TEST("smartcard-host", false, + DO_TEST("smartcard-host", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_EMULATED); - DO_TEST("smartcard-host-certificates", false, + DO_TEST("smartcard-host-certificates", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_EMULATED); - DO_TEST("smartcard-passthrough-tcp", false, + DO_TEST("smartcard-passthrough-tcp", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_PASSTHRU); - DO_TEST("smartcard-passthrough-spicevmc", false, + DO_TEST("smartcard-passthrough-spicevmc", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_PASSTHRU, QEMU_CAPS_CHARDEV_SPICEVMC); - DO_TEST("smartcard-controller", false, + DO_TEST("smartcard-controller", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_EMULATED); - DO_TEST("usb-controller", false, + DO_TEST("usb-controller", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("usb-piix3-controller", false, + DO_TEST("usb-piix3-controller", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_PIIX3_USB_UHCI, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_NODEFCONFIG); - DO_TEST("usb-ich9-ehci-addr", false, + DO_TEST("usb-ich9-ehci-addr", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_ICH9_USB_EHCI1); - DO_TEST("input-usbmouse-addr", false, + DO_TEST("input-usbmouse-addr", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("usb-ich9-companion", false, + DO_TEST("usb-ich9-companion", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_ICH9_USB_EHCI1); - DO_TEST("usb-hub", false, + DO_TEST("usb-hub", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_USB_HUB, QEMU_CAPS_NODEFCONFIG); - DO_TEST("usb-ports", false, + DO_TEST("usb-ports", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_USB_HUB, QEMU_CAPS_NODEFCONFIG); - DO_TEST("usb-redir", false, + DO_TEST("usb-redir", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_USB_HUB, QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_USB_REDIR, QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC); - DO_TEST("usb1-usb2", false, + DO_TEST("usb1-usb2", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_PIIX3_USB_UHCI, QEMU_CAPS_USB_HUB, QEMU_CAPS_ICH9_USB_EHCI1); - DO_TEST("smbios", false, QEMU_CAPS_SMBIOS_TYPE); + DO_TEST("smbios", QEMU_CAPS_SMBIOS_TYPE); - DO_TEST("watchdog", false, NONE); - DO_TEST("watchdog-device", false, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("watchdog-dump", false, NONE); - DO_TEST("balloon-device", false, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("balloon-device-auto", false, + DO_TEST("watchdog", NONE); + DO_TEST("watchdog-device", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); + DO_TEST("watchdog-dump", NONE); + DO_TEST("balloon-device", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); + DO_TEST("balloon-device-auto", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("sound", false, NONE); - DO_TEST("sound-device", false, + DO_TEST("sound", NONE); + DO_TEST("sound-device", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_HDA_DUPLEX, QEMU_CAPS_HDA_MICRO); - DO_TEST("fs9p", false, + DO_TEST("fs9p", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_FSDEV, QEMU_CAPS_FSDEV_WRITEOUT); - DO_TEST("hostdev-usb-address", false, NONE); - DO_TEST("hostdev-usb-address-device", false, + DO_TEST("hostdev-usb-address", NONE); + DO_TEST("hostdev-usb-address-device", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("hostdev-pci-address", false, QEMU_CAPS_PCIDEVICE); - DO_TEST("hostdev-pci-address-device", false, + DO_TEST("hostdev-pci-address", QEMU_CAPS_PCIDEVICE); + DO_TEST("hostdev-pci-address-device", QEMU_CAPS_PCIDEVICE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("pci-rom", false, + DO_TEST("pci-rom", QEMU_CAPS_PCIDEVICE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_PCI_ROMBAR); - DO_TEST_FULL("restore-v1", "stdio", 7, false, false, - QEMU_CAPS_MIGRATE_KVM_STDIO); - DO_TEST_FULL("restore-v2", "stdio", 7, false, false, - QEMU_CAPS_MIGRATE_QEMU_EXEC); - DO_TEST_FULL("restore-v2", "exec:cat", 7, false, false, - QEMU_CAPS_MIGRATE_QEMU_EXEC); - DO_TEST_FULL("restore-v2-fd", "stdio", 7, false, false, - QEMU_CAPS_MIGRATE_QEMU_FD); - DO_TEST_FULL("restore-v2-fd", "fd:7", 7, false, false, - QEMU_CAPS_MIGRATE_QEMU_FD); - DO_TEST_FULL("migrate", "tcp:10.0.0.1:5000", -1, false, false, + DO_TEST_FULL("restore-v1", "stdio", 7, 0, QEMU_CAPS_MIGRATE_KVM_STDIO); + DO_TEST_FULL("restore-v2", "stdio", 7, 0, QEMU_CAPS_MIGRATE_QEMU_EXEC); + DO_TEST_FULL("restore-v2", "exec:cat", 7, 0, QEMU_CAPS_MIGRATE_QEMU_EXEC); + DO_TEST_FULL("restore-v2-fd", "stdio", 7, 0, QEMU_CAPS_MIGRATE_QEMU_FD); + DO_TEST_FULL("restore-v2-fd", "fd:7", 7, 0, QEMU_CAPS_MIGRATE_QEMU_FD); + DO_TEST_FULL("migrate", "tcp:10.0.0.1:5000", -1, 0, QEMU_CAPS_MIGRATE_QEMU_TCP); - DO_TEST("qemu-ns", false, NONE); + DO_TEST("qemu-ns", NONE); - DO_TEST("smp", false, QEMU_CAPS_SMP_TOPOLOGY); + DO_TEST("smp", QEMU_CAPS_SMP_TOPOLOGY); - DO_TEST("cpu-topology1", false, QEMU_CAPS_SMP_TOPOLOGY); - DO_TEST("cpu-topology2", false, QEMU_CAPS_SMP_TOPOLOGY); - DO_TEST("cpu-topology3", false, NONE); - DO_TEST("cpu-minimum1", false, NONE); - DO_TEST("cpu-minimum2", false, NONE); - DO_TEST("cpu-exact1", false, NONE); - DO_TEST("cpu-exact2", false, NONE); - DO_TEST("cpu-exact2-nofallback", false, NONE); - DO_TEST("cpu-fallback", false, NONE); + DO_TEST("cpu-topology1", QEMU_CAPS_SMP_TOPOLOGY); + DO_TEST("cpu-topology2", QEMU_CAPS_SMP_TOPOLOGY); + DO_TEST("cpu-topology3", NONE); + DO_TEST("cpu-minimum1", NONE); + DO_TEST("cpu-minimum2", NONE); + DO_TEST("cpu-exact1", NONE); + DO_TEST("cpu-exact2", NONE); + DO_TEST("cpu-exact2-nofallback", NONE); + DO_TEST("cpu-fallback", NONE); DO_TEST_FAILURE("cpu-nofallback", NONE); - DO_TEST("cpu-strict1", false, NONE); - DO_TEST("cpu-numa1", false, NONE); - DO_TEST("cpu-numa2", false, QEMU_CAPS_SMP_TOPOLOGY); - DO_TEST("cpu-host-model", false, NONE); - DO_TEST("cpu-host-model-fallback", false, NONE); + DO_TEST("cpu-strict1", NONE); + DO_TEST("cpu-numa1", NONE); + DO_TEST("cpu-numa2", QEMU_CAPS_SMP_TOPOLOGY); + DO_TEST("cpu-host-model", NONE); + DO_TEST("cpu-host-model-fallback", NONE); DO_TEST_FAILURE("cpu-host-model-nofallback", NONE); - DO_TEST("cpu-host-passthrough", false, QEMU_CAPS_KVM, QEMU_CAPS_CPU_HOST); + DO_TEST("cpu-host-passthrough", QEMU_CAPS_KVM, QEMU_CAPS_CPU_HOST); DO_TEST_FAILURE("cpu-host-passthrough", NONE); DO_TEST_FAILURE("cpu-qemu-host-passthrough", QEMU_CAPS_KVM, QEMU_CAPS_CPU_HOST); - DO_TEST("memtune", false, QEMU_CAPS_NAME); - DO_TEST("blkiotune", false, QEMU_CAPS_NAME); - DO_TEST("blkiotune-device", false, QEMU_CAPS_NAME); - DO_TEST("cputune", false, QEMU_CAPS_NAME); - DO_TEST("numatune-memory", false, NONE); - DO_TEST("numad", false, NONE); - DO_TEST("numad-auto-vcpu-static-numatune", false, NONE); - DO_TEST("numad-auto-memory-vcpu-cpuset", false, NONE); - DO_TEST("numad-auto-memory-vcpu-no-cpuset-and-placement", false, NONE); - DO_TEST("numad-static-memory-auto-vcpu", false, NONE); - DO_TEST("blkdeviotune", false, QEMU_CAPS_NAME, QEMU_CAPS_DEVICE, + DO_TEST("memtune", QEMU_CAPS_NAME); + DO_TEST("blkiotune", QEMU_CAPS_NAME); + DO_TEST("blkiotune-device", QEMU_CAPS_NAME); + DO_TEST("cputune", QEMU_CAPS_NAME); + DO_TEST("numatune-memory", NONE); + DO_TEST("numad", NONE); + DO_TEST("numad-auto-vcpu-static-numatune", NONE); + DO_TEST("numad-auto-memory-vcpu-cpuset", NONE); + DO_TEST("numad-auto-memory-vcpu-no-cpuset-and-placement", NONE); + DO_TEST("numad-static-memory-auto-vcpu", NONE); + DO_TEST("blkdeviotune", QEMU_CAPS_NAME, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_IOTUNE); - DO_TEST("multifunction-pci-device", false, + DO_TEST("multifunction-pci-device", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_PCI_MULTIFUNCTION); - DO_TEST("monitor-json", false, QEMU_CAPS_DEVICE, + DO_TEST("monitor-json", QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_NODEFCONFIG); - DO_TEST("no-shutdown", false, QEMU_CAPS_DEVICE, + DO_TEST("no-shutdown", QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_NO_SHUTDOWN); - DO_TEST("seclabel-dynamic", false, QEMU_CAPS_NAME); - DO_TEST("seclabel-dynamic-baselabel", false, QEMU_CAPS_NAME); - DO_TEST("seclabel-dynamic-override", false, QEMU_CAPS_NAME); - DO_TEST("seclabel-static", false, QEMU_CAPS_NAME); - DO_TEST("seclabel-static-relabel", false, QEMU_CAPS_NAME); - DO_TEST("seclabel-none", false, QEMU_CAPS_NAME); + DO_TEST("seclabel-dynamic", QEMU_CAPS_NAME); + DO_TEST("seclabel-dynamic-baselabel", QEMU_CAPS_NAME); + DO_TEST("seclabel-dynamic-override", QEMU_CAPS_NAME); + DO_TEST("seclabel-static", QEMU_CAPS_NAME); + DO_TEST("seclabel-static-relabel", QEMU_CAPS_NAME); + DO_TEST("seclabel-none", QEMU_CAPS_NAME); - DO_TEST("pseries-basic", false, + DO_TEST("pseries-basic", QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("pseries-vio", false, QEMU_CAPS_DRIVE, + DO_TEST("pseries-vio", QEMU_CAPS_DRIVE, QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("pseries-vio-user-assigned", false, QEMU_CAPS_DRIVE, + DO_TEST("pseries-vio-user-assigned", QEMU_CAPS_DRIVE, QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("pseries-vio-address-clash", true, QEMU_CAPS_DRIVE, + DO_TEST_ERROR("pseries-vio-address-clash", QEMU_CAPS_DRIVE, QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); - DO_TEST("disk-ide-drive-split", false, + DO_TEST("disk-ide-drive-split", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_IDE_CD); -- 1.7.8.6

This patch adds a set of tests to check parsing of domain XMLs that use the "none" controller and some forbidden situations concerning it. --- .../qemuxml2argvdata/qemuxml2argv-usb-none-hub.xml | 19 ++++++++++++++++++ .../qemuxml2argv-usb-none-other.xml | 19 ++++++++++++++++++ .../qemuxml2argv-usb-none-usbtablet.xml | 21 ++++++++++++++++++++ tests/qemuxml2argvdata/qemuxml2argv-usb-none.args | 5 ++++ tests/qemuxml2argvdata/qemuxml2argv-usb-none.xml | 16 +++++++++++++++ tests/qemuxml2argvtest.c | 10 +++++++++ 6 files changed, 90 insertions(+), 0 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none-hub.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none-other.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none-usbtablet.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-none.xml diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-none-hub.xml b/tests/qemuxml2argvdata/qemuxml2argv-usb-none-hub.xml new file mode 100644 index 0000000..9eeb953 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-none-hub.xml @@ -0,0 +1,19 @@ +<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> + <devices> + <emulator>/usr/bin/qemu</emulator> + <controller type='usb' model='none' index='0'/> + <memballoon model='virtio'/> + <hub type='usb'> + <address type='usb' bus='0' port='1'/> + </hub> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-none-other.xml b/tests/qemuxml2argvdata/qemuxml2argv-usb-none-other.xml new file mode 100644 index 0000000..64bbba6 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-none-other.xml @@ -0,0 +1,19 @@ +<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> + <devices> + <emulator>/usr/bin/qemu</emulator> + <controller type='usb' index='0' model='none'/> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-none-usbtablet.xml b/tests/qemuxml2argvdata/qemuxml2argv-usb-none-usbtablet.xml new file mode 100644 index 0000000..9d53cc0 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-none-usbtablet.xml @@ -0,0 +1,21 @@ +<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</emulator> + <controller type='usb' model='none' index='0'/> + <input type='tablet' bus='usb'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-none.args b/tests/qemuxml2argvdata/qemuxml2argv-usb-none.args new file mode 100644 index 0000000..085b66f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-none.args @@ -0,0 +1,5 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S \ +-M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-usb-none.xml new file mode 100644 index 0000000..69ace41 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-none.xml @@ -0,0 +1,16 @@ +<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> + <devices> + <emulator>/usr/bin/qemu</emulator> + <controller type='usb' index='0' model='none'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 33c55ed..654331d 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -685,6 +685,16 @@ mymain(void) QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_PIIX3_USB_UHCI, QEMU_CAPS_USB_HUB, QEMU_CAPS_ICH9_USB_EHCI1); + DO_TEST("usb-none", + QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); + DO_TEST_PARSE_ERROR("usb-none-other", + QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); + DO_TEST_PARSE_ERROR("usb-none-hub", + QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, + QEMU_CAPS_USB_HUB); + DO_TEST_PARSE_ERROR("usb-none-usbtablet", + QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); + DO_TEST("smbios", QEMU_CAPS_SMBIOS_TYPE); -- 1.7.8.6

On 07/09/12 19:29, Peter Krempa wrote:
This series adds support for completely disabling USB bus for a host if a user requires this. For this to work a new USB controller model "none" was added that removes the USB bus.
The controller is added in patches 2-4. Patch 1 cleans up some nits (and is not necessary) and patches 5 and 6 tweak qemuxml2argvtest and add tests to check the new controller.
Peter Krempa (6): maint: Clean up coding style domain_conf: Add USB controler model "none" domain_conf: Add helpers to verify if device configuration is valid qemu: Add support for "none" USB controller tests: Add support for cathing domain XML parsing errors tests: Add tests to check the new USB "none" controller
This series no longer applies cleanly. I'm resending a rebased v2. Peter
participants (3)
-
Eric Blake
-
Osier Yang
-
Peter Krempa