conf: domain: gfx: Iterate over graphics devices when doing validation

The QEMU validation code for graphics has been in place for a while, but
because it is only executed from virDomainDeviceInfoIterateInternal, it
was never run, since the iterator expects the device to have boot info
which graphics don't have. The unfortunate side effect of this whole mess
was that a few capabilities were missing from the test suite (as commit
d8266ebe1 demonstrated with graphics-spice-invalid-egl-headless test),
which in turn meant that a few graphics tests which expected a failure
happily accepted any failure the test runtime returned which made them
succeed. The impact of this was that we then allowed to start a domain
with multiple OpenGL-enabled graphics devices.

This patch enables iteration over graphics devices. Unsurprisingly,
a few tests started to fail as a result, so fix those too.

Signed-off-by: Erik Skultety <eskultet@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
Erik Skultety 2018-12-07 14:53:46 +01:00
parent 0d5244cc86
commit dd45c2710f
3 changed files with 23 additions and 9 deletions

View File

@ -3705,6 +3705,7 @@ virDomainSkipBackcompatConsole(virDomainDefPtr def,
enum {
DOMAIN_DEVICE_ITERATE_ALL_CONSOLES = 1 << 0,
DOMAIN_DEVICE_ITERATE_GRAPHICS = 1 << 1
} virDomainDeviceIterateFlags;
/*
@ -3870,6 +3871,17 @@ virDomainDeviceInfoIterateInternal(virDomainDefPtr def,
return rc;
}
/* If the flag below is set, make sure @cb can handle @info being NULL, as
* graphics don't have any boot info */
if (iteratorFlags & DOMAIN_DEVICE_ITERATE_GRAPHICS) {
device.type = VIR_DOMAIN_DEVICE_GRAPHICS;
for (i = 0; i < def->ngraphics; i++) {
device.data.graphics = def->graphics[i];
if ((rc = cb(def, &device, NULL, opaque)) != 0)
return rc;
}
}
/* Coverity is not very happy with this - all dead_error_condition */
#if !STATIC_ANALYSIS
/* This switch statement is here to trigger compiler warning when adding
@ -6348,7 +6360,8 @@ virDomainDefValidate(virDomainDefPtr def,
/* iterate the devices */
if (virDomainDeviceInfoIterateInternal(def,
virDomainDefValidateDeviceIterator,
DOMAIN_DEVICE_ITERATE_ALL_CONSOLES,
(DOMAIN_DEVICE_ITERATE_ALL_CONSOLES |
DOMAIN_DEVICE_ITERATE_GRAPHICS),
&data) < 0)
return -1;

View File

@ -1299,7 +1299,7 @@ mymain(void)
DO_TEST("graphics-sdl",
QEMU_CAPS_DEVICE_VGA);
DO_TEST_FAILURE("graphics-sdl-egl-headless", NONE);
DO_TEST_CAPS_LATEST_PARSE_ERROR("graphics-sdl-egl-headless");
DO_TEST("graphics-sdl-fullscreen",
QEMU_CAPS_DEVICE_CIRRUS_VGA);
DO_TEST("graphics-spice",
@ -1358,10 +1358,7 @@ mymain(void)
QEMU_CAPS_SPICE,
QEMU_CAPS_EGL_HEADLESS,
QEMU_CAPS_DEVICE_QXL);
DO_TEST_FAILURE("graphics-spice-invalid-egl-headless",
QEMU_CAPS_SPICE,
QEMU_CAPS_EGL_HEADLESS,
QEMU_CAPS_DEVICE_QXL);
DO_TEST_CAPS_LATEST_PARSE_ERROR("graphics-spice-invalid-egl-headless");
DO_TEST_CAPS_LATEST("graphics-spice-gl-auto-rendernode");
DO_TEST("input-usbmouse", NONE);

View File

@ -402,7 +402,8 @@ mymain(void)
cfg->vncAutoUnixSocket = false;
DO_TEST("graphics-vnc-socket", NONE);
DO_TEST("graphics-vnc-auto-socket", NONE);
DO_TEST("graphics-vnc-egl-headless", NONE);
DO_TEST("graphics-vnc-egl-headless",
QEMU_CAPS_EGL_HEADLESS);
DO_TEST("graphics-sdl", NONE);
DO_TEST("graphics-sdl-fullscreen", NONE);
@ -414,9 +415,12 @@ mymain(void)
cfg->spiceAutoUnixSocket = true;
DO_TEST("graphics-spice-auto-socket-cfg", NONE);
cfg->spiceAutoUnixSocket = false;
DO_TEST("graphics-spice-egl-headless", NONE);
DO_TEST("graphics-spice-egl-headless",
QEMU_CAPS_EGL_HEADLESS);
DO_TEST("graphics-egl-headless-rendernode", NONE);
DO_TEST("graphics-egl-headless-rendernode",
QEMU_CAPS_EGL_HEADLESS,
QEMU_CAPS_EGL_HEADLESS_RENDERNODE);
DO_TEST("input-usbmouse", NONE);
DO_TEST("input-usbtablet", NONE);