[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH v2 12/12] spice: introduce listen type none



This new listen type is currently supported only by spice graphics.
It's introduced to make it easier and clearer specify to not listen
anywhere in order to start a guest with OpenGL support.

The old way to do this was set spice graphics autoport='no' and don't
specify any ports.  The new way is to use <listen type='none'/>.  In
order to be able to migrate to old libvirt the migratable XML will be
generated without the listen element and with autoport='no'.

Signed-off-by: Pavel Hrdina <phrdina redhat com>
---
 docs/formatdomain.html.in                          | 11 ++++
 docs/schemas/domaincommon.rng                      |  5 ++
 src/conf/domain_conf.c                             | 62 +++++++++++++++++-----
 src/qemu/qemu_command.c                            | 11 ++--
 .../qemuxml2argv-video-virtio-gpu-spice-gl.args    |  2 +-
 .../qemuxml2xmlout-video-virtio-gpu-spice-gl.xml   |  4 +-
 6 files changed, 72 insertions(+), 23 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 8f3e17f..35bbf3f 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -5375,6 +5375,17 @@ qemu-kvm -net nic,model=? /dev/null
           attribute all <code>listen</code> elements are ignored.
         </p>
       </dd>
+      <dt><code>none</code> <span class="since">since 1.3.5</span></dt>
+      <dd>
+        <p>
+          This listen type doesn't have any other attribute. Libvirt supports
+          passing a file descriptor through our APIs virDomainOpenGraphics() and
+          virDomainOpenGraphicsFD(). No other listen types are allowed if this
+          one is used and the graphics device doesn't listen anywhere. You need
+          to use one of the two APIs to pass a FD to QEMU in order to connect to
+          this graphics device. Supported only by <code>spice</code>.
+        </p>
+      </dd>
     </dl>
 
     <h4><a name="elementsVideo">Video devices</a></h4>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index e3dbcc6..c1a26a8 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3024,6 +3024,11 @@
               </attribute>
             </optional>
           </group>
+          <group>
+            <attribute name="type">
+              <value>none</value>
+            </attribute>
+          </group>
         </choice>
       </element>
     </zeroOrMore>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 86b211c..99712ff 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10809,13 +10809,28 @@ 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_SPICE) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("listen type 'socket' is not available for "
-                         "graphics type '%s'"), graphicsType);
-        goto error;
+    switch (def->type) {
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
+        if (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);
+            goto error;
+        }
+        break;
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+        if (graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("listen type 'none' is not available for "
+                             "graphics type '%s'"), graphicsType);
+            goto error;
+        }
+        break;
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
+    case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
+        break;
     }
 
     if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) {
@@ -10900,6 +10915,7 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
     xmlNodePtr *listenNodes = NULL;
     xmlNodePtr save = ctxt->node;
     virDomainGraphicsListenDef newListen = {0};
+    virDomainGraphicsListenDefPtr glisten = NULL;
     char *socketPath = NULL;
     int nListens;
     int ret = -1;
@@ -10953,6 +10969,19 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
             goto error;
     }
 
+    /* If spice graphics is configured without ports and with autoport='no' then
+     * we start qemu with Spice to not listen anywhere.  Let's convert this
+     * configuration to the new listen type='none' which does the same. */
+    if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+        glisten = &def->listens[0];
+
+        if (glisten->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS &&
+            glisten->port == 0 && glisten->tlsPort == 0 && !glisten->autoport) {
+            VIR_FREE(glisten->address);
+            glisten->type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE;
+        }
+    }
+
     ret = 0;
  error:
     if (ret < 0)
@@ -21429,10 +21458,8 @@ virDomainGraphicsListenDefFormat(virBufferPtr buf,
         return;
 
     virBufferAddLit(buf, "<listen");
-    if (def->type) {
-        virBufferAsprintf(buf, " type='%s'",
-                          virDomainGraphicsListenTypeToString(def->type));
-    }
+    virBufferAsprintf(buf, " type='%s'",
+                      virDomainGraphicsListenTypeToString(def->type));
 
     if (def->address &&
         (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS ||
@@ -21609,6 +21636,10 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
             break;
 
         case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+            if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE)
+                virBufferAddStr(buf, " autoport='no'");
+            break;
+
         case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
         case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
             break;
@@ -21630,8 +21661,6 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
     }
 
     for (i = 0; i < def->nListens; i++) {
-        if (def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE)
-            continue;
         if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE) {
             if (def->listens[i].fromConfig)
                 continue;
@@ -21644,6 +21673,13 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
                 def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET &&
                 !def->listens[i].autogenerated)
                 continue;
+
+            /* The new listen type none is in the migratable XML represented as
+             * port=0 and autoport=no because old libvirt support this
+             * configuration for spice. */
+            if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE &&
+                def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE)
+                continue;
         }
         if (!children) {
             virBufferAddLit(buf, ">\n");
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index b911076..64b383d 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7635,6 +7635,9 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
         break;
 
     case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+        /* QEMU requires either port or tls-port to be specified */
+        virBufferAddLit(&opt, "port=0,");
+        break;
     case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
         break;
     }
@@ -7755,13 +7758,7 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
     virBufferTrim(&opt, ",", -1);
 
     virCommandAddArg(cmd, "-spice");
-    /* If we did not add any SPICE arguments, add a dummy 'port=0' one
-     * as -spice alone is not allowed on QEMU command line
-     */
-    if (virBufferUse(&opt) == 0)
-        virCommandAddArg(cmd, "port=0");
-    else
-        virCommandAddArgBuffer(cmd, &opt);
+    virCommandAddArgBuffer(cmd, &opt);
     if (graphics->data.spice.keymap)
         virCommandAddArgList(cmd, "-k",
                              graphics->data.spice.keymap, NULL);
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args
index b80ad16..edecca1 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args
@@ -19,6 +19,6 @@ QEMU_AUDIO_DRV=spice \
 -drive file=/var/lib/libvirt/images/QEMUGuest1,format=qcow2,if=none,\
 id=drive-ide0-0-0,cache=none \
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
--spice gl=on \
+-spice port=0,gl=on \
 -device virtio-vga,id=video0,virgl=on,bus=pci.0,addr=0x2 \
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-video-virtio-gpu-spice-gl.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-video-virtio-gpu-spice-gl.xml
index fd260ea..9fb533a 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-video-virtio-gpu-spice-gl.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-video-virtio-gpu-spice-gl.xml
@@ -29,8 +29,8 @@
     <controller type='pci' index='0' model='pci-root'/>
     <input type='mouse' bus='ps2'/>
     <input type='keyboard' bus='ps2'/>
-    <graphics type='spice' autoport='no'>
-      <listen type='address' autoport='no'/>
+    <graphics type='spice'>
+      <listen type='none'/>
       <gl enable='yes'/>
     </graphics>
     <video>
-- 
2.8.2


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]