[libvirt] [PATCH v4 11/14] spice: add support for listen type socket

Pavel Hrdina phrdina at redhat.com
Thu May 19 11:35:30 UTC 2016


Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1335832

Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
 docs/formatdomain.html.in                          |  2 +-
 src/conf/domain_conf.c                             | 31 ++++++++----
 src/qemu/qemu_command.c                            | 56 ++++++++++++++++------
 src/qemu/qemu_migration.c                          | 47 +++++++++++++-----
 .../qemuxml2argv-graphics-spice-auto-socket.args   | 20 ++++++++
 .../qemuxml2argv-graphics-spice-auto-socket.xml    | 30 ++++++++++++
 .../qemuxml2argv-graphics-spice-socket.args        | 20 ++++++++
 .../qemuxml2argv-graphics-spice-socket.xml         | 30 ++++++++++++
 tests/qemuxml2argvtest.c                           |  6 +++
 .../qemuxml2xmlout-graphics-spice-auto-socket.xml  | 35 ++++++++++++++
 .../qemuxml2xmlout-graphics-spice-socket.xml       | 35 ++++++++++++++
 tests/qemuxml2xmltest.c                            |  2 +
 12 files changed, 277 insertions(+), 37 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-auto-socket.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-auto-socket.xml
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-socket.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-socket.xml
 create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-auto-socket.xml
 create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-socket.xml

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 3b0febc..fa8fac7 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -5349,7 +5349,7 @@ qemu-kvm -net nic,model=? /dev/null
           This listen type tells a graphics server to listen on unix socket.
           Attribute <code>socket</code> contains a path to unix socket. If this
           attribute is omitted libvirt will generate this path for you.
-          Supported by graphics type <code>vnc</code>.
+          Supported by graphics type <code>vnc</code> and <code>spice</code>.
         </p>
         <p>
           For <code>vnc</code> graphics be backward compatible
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c635238..b72cfec 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10707,7 +10707,8 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
     def->type = typeVal;
 
     if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET &&
-        graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
+        graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+        graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("listen type 'socket' is not available for "
                          "graphics type '%s'"), graphicsType);
@@ -21604,18 +21605,28 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
         break;
 
     case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
-        if (def->data.spice.port)
-            virBufferAsprintf(buf, " port='%d'",
-                              def->data.spice.port);
+        switch (glisten->type) {
+        case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
+        case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
+            if (def->data.spice.port)
+                virBufferAsprintf(buf, " port='%d'",
+                                  def->data.spice.port);
 
-        if (def->data.spice.tlsPort)
-            virBufferAsprintf(buf, " tlsPort='%d'",
-                              def->data.spice.tlsPort);
+            if (def->data.spice.tlsPort)
+                virBufferAsprintf(buf, " tlsPort='%d'",
+                                  def->data.spice.tlsPort);
 
-        virBufferAsprintf(buf, " autoport='%s'",
-                          def->data.spice.autoport ? "yes" : "no");
+            virBufferAsprintf(buf, " autoport='%s'",
+                              def->data.spice.autoport ? "yes" : "no");
 
-        virDomainGraphicsAddListenAddr(buf, glisten, flags);
+            virDomainGraphicsAddListenAddr(buf, glisten, flags);
+            break;
+
+        case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+        case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
+        case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
+            break;
+        }
 
         if (def->data.spice.keymap)
             virBufferEscapeString(buf, " keymap='%s'",
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index d41935e..d97b525 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7514,27 +7514,53 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
         goto error;
     }
 
-    glisten = virDomainGraphicsGetListen(graphics, 0);
-
-    if (port > 0) {
-        virBufferAsprintf(&opt, "port=%u,", port);
-        hasInsecure = true;
+    if (!(glisten = virDomainGraphicsGetListen(graphics, 0))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("missing listen element"));
+        goto error;
     }
 
-    if (tlsPort > 0) {
-        if (!cfg->spiceTLS) {
+    switch (glisten->type) {
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
+        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_UNIX)) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("spice TLS port set in XML configuration,"
-                             " but TLS is disabled in qemu.conf"));
+                           _("unix socket for spice graphics are not supported "
+                             "with this QEMU"));
             goto error;
         }
-        virBufferAsprintf(&opt, "tls-port=%u,", tlsPort);
-        hasSecure = true;
-    }
 
-    if (port > 0 || tlsPort > 0) {
-        if (glisten && glisten->address)
-            virBufferAsprintf(&opt, "addr=%s,", glisten->address);
+        virBufferAsprintf(&opt, "unix,addr=%s,", glisten->socket);
+        hasInsecure = true;
+        break;
+
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
+        if (port > 0) {
+            virBufferAsprintf(&opt, "port=%u,", port);
+            hasInsecure = true;
+        }
+
+        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"));
+                goto error;
+            }
+            virBufferAsprintf(&opt, "tls-port=%u,", tlsPort);
+            hasSecure = true;
+        }
+
+        if (port > 0 || tlsPort > 0) {
+            if (glisten->address)
+                virBufferAsprintf(&opt, "addr=%s,", glisten->address);
+        }
+
+        break;
+
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
+        break;
     }
 
     if (cfg->spiceSASL) {
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 25093ac..c63341d 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -315,17 +315,17 @@ qemuDomainExtractTLSSubject(const char *certdir)
 
 static qemuMigrationCookieGraphicsPtr
 qemuMigrationCookieGraphicsSpiceAlloc(virQEMUDriverPtr driver,
-                                      virDomainGraphicsDefPtr def)
+                                      virDomainGraphicsDefPtr def,
+                                      virDomainGraphicsListenDefPtr glisten)
 {
     qemuMigrationCookieGraphicsPtr mig = NULL;
     const char *listenAddr;
-    virDomainGraphicsListenDefPtr glisten = virDomainGraphicsGetListen(def, 0);
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
 
     if (VIR_ALLOC(mig) < 0)
         goto error;
 
-    mig->type = def->type;
+    mig->type = VIR_DOMAIN_GRAPHICS_TYPE_SPICE;
     mig->port = def->data.spice.port;
     if (cfg->spiceTLS)
         mig->tlsPort = def->data.spice.tlsPort;
@@ -452,14 +452,39 @@ qemuMigrationCookieAddGraphics(qemuMigrationCookiePtr mig,
     }
 
     for (i = 0; i < dom->def->ngraphics; i++) {
-       if (dom->def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
-           if (!(mig->graphics =
-                 qemuMigrationCookieGraphicsSpiceAlloc(driver,
-                                                       dom->def->graphics[i])))
-               return -1;
-           mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS;
-           break;
-       }
+        if (dom->def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+            virDomainGraphicsListenDefPtr glisten =
+                virDomainGraphicsGetListen(dom->def->graphics[i], 0);
+
+            if (!glisten) {
+                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                               _("missing listen element"));
+                return -1;
+            }
+
+            switch (glisten->type) {
+            case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
+            case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
+                /* Seamless migration is supported only for listen types
+                 * 'address and 'network'. */
+                if (!(mig->graphics =
+                      qemuMigrationCookieGraphicsSpiceAlloc(driver,
+                                                            dom->def->graphics[i],
+                                                            glisten)))
+                    return -1;
+                mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS;
+                break;
+
+            case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
+            case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+            case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
+                break;
+            }
+
+            /* Seamless migration is supported only for one graphics. */
+            if (mig->graphics)
+                break;
+        }
     }
 
     return 0;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-auto-socket.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-auto-socket.args
new file mode 100644
index 0000000..61335b0
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-auto-socket.args
@@ -0,0 +1,20 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=spice \
+/usr/bin/qemu \
+-name QEMUGuest1 \
+-S \
+-M pc \
+-m 214 \
+-smp 1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-nodefaults \
+-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
+-no-acpi \
+-boot c \
+-usb \
+-spice unix,addr=/tmp/lib/domain--1-QEMUGuest1/spice.sock \
+-vga cirrus
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-auto-socket.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-auto-socket.xml
new file mode 100644
index 0000000..acb325a
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-auto-socket.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</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' index='0'/>
+    <controller type='ide' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <graphics type='spice'>
+      <listen type='socket'/>
+    </graphics>
+    <video>
+      <model type='cirrus' vram='16384' heads='1'/>
+    </video>
+    <memballoon model='none'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-socket.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-socket.args
new file mode 100644
index 0000000..26d0671
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-socket.args
@@ -0,0 +1,20 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=spice \
+/usr/bin/qemu \
+-name QEMUGuest1 \
+-S \
+-M pc \
+-m 214 \
+-smp 1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-nodefaults \
+-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
+-no-acpi \
+-boot c \
+-usb \
+-spice unix,addr=/tmp/spice.sock \
+-vga cirrus
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-socket.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-socket.xml
new file mode 100644
index 0000000..13bbef1
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-socket.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</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' index='0'/>
+    <controller type='ide' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <graphics type='spice'>
+      <listen type='socket' socket='/tmp/spice.sock'/>
+    </graphics>
+    <video>
+      <model type='cirrus' vram='16384' heads='1'/>
+    </video>
+    <memballoon model='none'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index da060d2..f7d01f9 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -968,6 +968,12 @@ mymain(void)
             QEMU_CAPS_DEVICE_QXL_VGA,
             QEMU_CAPS_DEVICE_QXL,
             QEMU_CAPS_SPICE_FILE_XFER_DISABLE);
+    DO_TEST("graphics-spice-socket",
+            QEMU_CAPS_SPICE,
+            QEMU_CAPS_SPICE_UNIX);
+    DO_TEST("graphics-spice-auto-socket",
+            QEMU_CAPS_SPICE,
+            QEMU_CAPS_SPICE_UNIX);
 
     DO_TEST("input-usbmouse", NONE);
     DO_TEST("input-usbtablet", NONE);
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-auto-socket.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-auto-socket.xml
new file mode 100644
index 0000000..931ec0f
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-auto-socket.xml
@@ -0,0 +1,35 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</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' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </controller>
+    <controller type='ide' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+    </controller>
+    <controller type='pci' index='0' model='pci-root'/>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <graphics type='spice'>
+      <listen type='socket'/>
+    </graphics>
+    <video>
+      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+    </video>
+    <memballoon model='none'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-socket.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-socket.xml
new file mode 100644
index 0000000..dd672ed
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-socket.xml
@@ -0,0 +1,35 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</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' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </controller>
+    <controller type='ide' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+    </controller>
+    <controller type='pci' index='0' model='pci-root'/>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <graphics type='spice'>
+      <listen type='socket' socket='/tmp/spice.sock'/>
+    </graphics>
+    <video>
+      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+    </video>
+    <memballoon model='none'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 92372ee..ab5a2da 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -445,6 +445,8 @@ mymain(void)
     DO_TEST("graphics-spice");
     DO_TEST("graphics-spice-compression");
     DO_TEST("graphics-spice-qxl-vga");
+    DO_TEST("graphics-spice-socket");
+    DO_TEST("graphics-spice-auto-socket");
     DO_TEST("nographics-vga");
     DO_TEST("input-usbmouse");
     DO_TEST("input-usbtablet");
-- 
2.8.2




More information about the libvir-list mailing list