static int
qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
virCommandPtr cmd,
- virQEMUCapsPtr qemuCaps,
virDomainGraphicsDefPtr graphics)
{
g_auto(virBuffer) opt = VIR_BUFFER_INITIALIZER;
bool hasSecure = false;
bool hasInsecure = false;
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("spice graphics are not supported with this QEMU"));
- return -1;
- }
-
if (!(glisten = virDomainGraphicsGetListen(graphics, 0))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing listen element"));
switch (glisten->type) {
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_UNIX)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("unix socket for spice graphics are not supported "
- "with this QEMU"));
- return -1;
- }
-
virBufferAddLit(&opt, "unix,addr=");
virQEMUBuildBufferEscapeComma(&opt, glisten->socket);
virBufferAddLit(&opt, ",");
}
if (tlsPort > 0) {
- if (!cfg->spiceTLS) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("spice TLS port set in XML configuration, "
- "but TLS is disabled in qemu.conf"));
- return -1;
- }
virBufferAsprintf(&opt, "tls-port=%u,", tlsPort);
hasSecure = true;
}
if (graphics->data.spice.copypaste == VIR_TRISTATE_BOOL_NO)
virBufferAddLit(&opt, "disable-copy-paste,");
- if (graphics->data.spice.filetransfer == VIR_TRISTATE_BOOL_NO) {
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("This QEMU can't disable file transfers through spice"));
- return -1;
- } else {
- virBufferAddLit(&opt, "disable-agent-file-xfer,");
- }
- }
+ if (graphics->data.spice.filetransfer == VIR_TRISTATE_BOOL_NO)
+ virBufferAddLit(&opt, "disable-agent-file-xfer,");
if (graphics->data.spice.gl == VIR_TRISTATE_BOOL_YES) {
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_GL)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("This QEMU doesn't support spice OpenGL"));
- return -1;
- }
-
/* spice.gl is a TristateBool, but qemu expects on/off: use
* TristateSwitch helper */
virBufferAsprintf(&opt, "gl=%s,",
virTristateSwitchTypeToString(graphics->data.spice.gl));
if (graphics->data.spice.rendernode) {
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_RENDERNODE)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("This QEMU doesn't support spice OpenGL rendernode"));
- return -1;
- }
-
virBufferAddLit(&opt, "rendernode=");
virQEMUBuildBufferEscapeComma(&opt, graphics->data.spice.rendernode);
virBufferAddLit(&opt, ",");
break;
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
if (qemuBuildGraphicsSPICECommandLine(cfg, cmd,
- qemuCaps, graphics) < 0)
+ graphics) < 0)
return -1;
break;
}
+static int
+qemuDomainDeviceDefValidateSPICEGraphics(const virDomainGraphicsDef *graphics,
+ virQEMUDriverPtr driver,
+ virQEMUCapsPtr qemuCaps)
+{
+ g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+ virDomainGraphicsListenDefPtr glisten = NULL;
+ int tlsPort = graphics->data.spice.tlsPort;
+
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("spice graphics are not supported with this QEMU"));
+ return -1;
+ }
+
+ glisten = virDomainGraphicsGetListen((virDomainGraphicsDefPtr)graphics, 0);
+ if (!glisten) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing listen element"));
+ return -1;
+ }
+
+ switch (glisten->type) {
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_UNIX)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("unix socket for spice graphics are not supported "
+ "with this QEMU"));
+ return -1;
+ }
+ break;
+
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
+ if (tlsPort > 0 && !cfg->spiceTLS) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("spice TLS port set in XML configuration, "
+ "but TLS is disabled in qemu.conf"));
+ return -1;
+ }
+ break;
+
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+ break;
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
+ break;
+ }
+
+ if (graphics->data.spice.filetransfer == VIR_TRISTATE_BOOL_NO &&
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("This QEMU can't disable file transfers through spice"));
+ return -1;
+ }
+
+ if (graphics->data.spice.gl == VIR_TRISTATE_BOOL_YES) {
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_GL)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("This QEMU doesn't support spice OpenGL"));
+ return -1;
+ }
+
+ if (graphics->data.spice.rendernode &&
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_RENDERNODE)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("This QEMU doesn't support spice OpenGL rendernode"));
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
static int
qemuDomainDeviceDefValidateGraphics(const virDomainGraphicsDef *graphics,
const virDomainDef *def,
+ virQEMUDriverPtr driver,
virQEMUCapsPtr qemuCaps)
{
bool have_egl_headless = false;
break;
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
+ if (qemuDomainDeviceDefValidateSPICEGraphics(graphics, driver,
+ qemuCaps) < 0)
+ return -1;
+
+ break;
+
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
break;
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_DEVICE_GRAPHICS:
ret = qemuDomainDeviceDefValidateGraphics(dev->data.graphics, def,
- qemuCaps);
+ driver, qemuCaps);
break;
case VIR_DOMAIN_DEVICE_INPUT:
virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_PIIX_DISABLE_S3);
virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_PIIX_DISABLE_S4);
virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_VNC);
+ virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_SPICE);
+ virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE);
if (qemuTestCapsCacheInsert(driver.qemuCapsCache, priv->qemuCaps) < 0)
return -1;
struct qemuHotplugTestData data = {0};
struct testQemuHotplugCpuParams cpudata;
g_autofree char *fakerootdir = NULL;
+ g_autoptr(virQEMUDriverConfig) cfg = NULL;
fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE);
if (qemuTestDriverInit(&driver) < 0)
return EXIT_FAILURE;
+ cfg = virQEMUDriverGetConfig(&driver);
+
virEventRegisterDefaultImpl();
VIR_FREE(driver.config->spiceListen);
" }" \
"}\r\n"
+ cfg->spiceTLS = true;
DO_TEST_UPDATE("graphics-spice", "graphics-spice-nochange", false, false, NULL);
DO_TEST_UPDATE("graphics-spice-timeout", "graphics-spice-timeout-nochange", false, false,
"set_password", QMP_OK, "expire_password", QMP_OK);
DO_TEST_UPDATE("graphics-spice", "graphics-spice-listen", true, false, NULL);
DO_TEST_UPDATE("graphics-spice-listen-network", "graphics-spice-listen-network-password", false, false,
"set_password", QMP_OK, "expire_password", QMP_OK);
+ cfg->spiceTLS = false;
/* Strange huh? Currently, only graphics can be updated :-P */
DO_TEST_UPDATE("disk-cdrom", "disk-cdrom-nochange", true, false, NULL);
<emulator>/usr/bin/qemu-system-aarch64</emulator>
<controller type='usb' index='0' model='none'/>
<memballoon model='none'/>
- <graphics type='spice'/>
+ <graphics type='vnc'/>
</devices>
</domain>
<emulator>/usr/bin/qemu-system-ppc64</emulator>
<controller type='usb' index='0' model='none'/>
<memballoon model='none'/>
- <graphics type='spice'/>
+ <graphics type='vnc'/>
</devices>
</domain>
<emulator>/usr/bin/qemu-system-s390x</emulator>
<controller type='usb' index='0' model='none'/>
<memballoon model='none'/>
- <graphics type='spice'/>
+ <graphics type='vnc'/>
</devices>
</domain>
<target chassis='2' port='0x9'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
- <graphics type='spice'>
- <listen type='none'/>
+ <graphics type='vnc' port='-1' autoport='yes'>
+ <listen type='address'/>
</graphics>
<video>
<model type='virtio' heads='1' primary='yes'/>
<controller type='pci' index='0' model='pci-root'/>
<input type='keyboard' bus='usb'/>
<input type='mouse' bus='usb'/>
- <graphics type='spice'>
- <listen type='none'/>
+ <graphics type='vnc' port='-1' autoport='yes'>
+ <listen type='address'/>
</graphics>
<video>
<model type='vga' vram='16384' heads='1' primary='yes'/>
<emulator>/usr/bin/qemu-system-s390x</emulator>
<controller type='usb' index='0' model='none'/>
<controller type='pci' index='0' model='pci-root'/>
- <graphics type='spice'>
- <listen type='none'/>
+ <graphics type='vnc' port='-1' autoport='yes'>
+ <listen type='address'/>
</graphics>
<video>
<model type='virtio' heads='1' primary='yes'/>
DO_TEST_CAPS_ARCH_LATEST("default-video-type-ppc64", "ppc64");
DO_TEST_CAPS_ARCH_LATEST("default-video-type-riscv64", "riscv64");
DO_TEST_CAPS_ARCH_LATEST("default-video-type-s390x", "s390x");
- DO_TEST("default-video-type-x86_64-caps-test-0", QEMU_CAPS_DEVICE_VGA);
- DO_TEST("default-video-type-x86_64-caps-test-1", QEMU_CAPS_DEVICE_CIRRUS_VGA);
+ DO_TEST("default-video-type-x86_64-caps-test-0",
+ QEMU_CAPS_DEVICE_VGA,
+ QEMU_CAPS_SPICE);
+ DO_TEST("default-video-type-x86_64-caps-test-1",
+ QEMU_CAPS_DEVICE_CIRRUS_VGA,
+ QEMU_CAPS_SPICE);
DO_TEST("graphics-sdl", QEMU_CAPS_DEVICE_VGA);
DO_TEST("graphics-sdl-fullscreen", QEMU_CAPS_DEVICE_CIRRUS_VGA);
- DO_TEST("graphics-spice", QEMU_CAPS_DEVICE_QXL);
- DO_TEST("graphics-spice-compression", QEMU_CAPS_DEVICE_QXL);
- DO_TEST("graphics-spice-qxl-vga", QEMU_CAPS_DEVICE_QXL);
- DO_TEST("graphics-spice-socket", QEMU_CAPS_DEVICE_CIRRUS_VGA);
- DO_TEST("graphics-spice-auto-socket", QEMU_CAPS_DEVICE_CIRRUS_VGA);
+
+ cfg->spiceTLS = true;
+ DO_TEST("graphics-spice",
+ QEMU_CAPS_DEVICE_QXL,
+ QEMU_CAPS_SPICE,
+ QEMU_CAPS_SPICE_FILE_XFER_DISABLE);
+ DO_TEST("graphics-spice-compression",
+ QEMU_CAPS_DEVICE_QXL,
+ QEMU_CAPS_SPICE);
+ DO_TEST("graphics-spice-qxl-vga",
+ QEMU_CAPS_DEVICE_QXL,
+ QEMU_CAPS_SPICE);
+ DO_TEST("graphics-spice-socket",
+ QEMU_CAPS_DEVICE_CIRRUS_VGA,
+ QEMU_CAPS_SPICE,
+ QEMU_CAPS_SPICE_UNIX);
+ DO_TEST("graphics-spice-auto-socket",
+ QEMU_CAPS_DEVICE_CIRRUS_VGA,
+ QEMU_CAPS_SPICE,
+ QEMU_CAPS_SPICE_UNIX);
cfg->spiceAutoUnixSocket = true;
- DO_TEST("graphics-spice-auto-socket-cfg", QEMU_CAPS_DEVICE_CIRRUS_VGA);
+ DO_TEST("graphics-spice-auto-socket-cfg",
+ QEMU_CAPS_DEVICE_CIRRUS_VGA,
+ QEMU_CAPS_SPICE);
cfg->spiceAutoUnixSocket = false;
+ cfg->spiceTLS = false;
DO_TEST("graphics-spice-egl-headless",
QEMU_CAPS_DEVICE_QXL,
- QEMU_CAPS_EGL_HEADLESS);
+ QEMU_CAPS_EGL_HEADLESS,
+ QEMU_CAPS_SPICE);
DO_TEST("graphics-egl-headless-rendernode",
QEMU_CAPS_DEVICE_CIRRUS_VGA,
DO_TEST("serial-tcp-tlsx509-chardev", NONE);
DO_TEST("serial-tcp-tlsx509-chardev-notls", NONE);
- DO_TEST("serial-spiceport", QEMU_CAPS_DEVICE_QXL);
+
+ cfg->spiceTLS = true;
+ DO_TEST("serial-spiceport",
+ QEMU_CAPS_DEVICE_QXL,
+ QEMU_CAPS_SPICE);
+ cfg->spiceTLS = false;
+
DO_TEST("serial-spiceport-nospice", NONE);
DO_TEST("console-compat", NONE);
DO_TEST("console-compat2", NONE);
DO_TEST("seclabel-device-multiple", NONE);
DO_TEST_FULL("seclabel-dynamic-none-relabel", WHEN_INACTIVE,
ARG_QEMU_CAPS, QEMU_CAPS_DEVICE_CIRRUS_VGA,
- QEMU_CAPS_OBJECT_MEMORY_FILE, NONE);
+ QEMU_CAPS_OBJECT_MEMORY_FILE,
+ QEMU_CAPS_SPICE, NONE);
DO_TEST("numad-static-vcpu-no-numatune", NONE);
DO_TEST("disk-scsi-lun-passthrough-sgio",
DO_TEST("graphics-listen-network2",
QEMU_CAPS_DEVICE_CIRRUS_VGA,
QEMU_CAPS_VNC);
- DO_TEST("graphics-spice-timeout", QEMU_CAPS_DEVICE_VGA);
+ DO_TEST("graphics-spice-timeout",
+ QEMU_CAPS_DEVICE_VGA,
+ QEMU_CAPS_SPICE);
DO_TEST("numad-auto-vcpu-no-numatune", NONE);
DO_TEST("numad-auto-memory-vcpu-no-cpuset-and-placement", NONE);
DO_TEST("numad-auto-memory-vcpu-cpuset", NONE);
QEMU_CAPS_VIRTIO_GPU_VIRGL);
DO_TEST("video-virtio-gpu-spice-gl",
QEMU_CAPS_DEVICE_VIRTIO_GPU,
- QEMU_CAPS_VIRTIO_GPU_VIRGL);
+ QEMU_CAPS_VIRTIO_GPU_VIRGL,
+ QEMU_CAPS_SPICE,
+ QEMU_CAPS_SPICE_FILE_XFER_DISABLE,
+ QEMU_CAPS_SPICE_GL,
+ QEMU_CAPS_SPICE_RENDERNODE);
DO_TEST("video-virtio-gpu-sdl-gl",
QEMU_CAPS_DEVICE_VIRTIO_GPU,
QEMU_CAPS_VIRTIO_GPU_VIRGL,