[libvirt] [2/3] Add a <graphics> type for SPICE protocol

Daniel Veillard veillard at redhat.com
Fri Feb 5 17:12:36 UTC 2010


Author: Daniel P. Berrange <berrange at redhat.com>

    Add a <graphics> type for SPICE protocol
    
    This adds an element
    
     <graphics type='spice' port='5903' tlsPort='5904'
    listen='127.0.0.1'/>
    
    This is the bare minimum that should be exposed in the guest
    config for SPICE. Other parameters are better handled as per
    host level configuration tunables
    
    * docs/schemas/domain.rng: Define the SPICE <graphics> schema
    * src/domain_conf.h, src/domain_conf.c: Add parsing and formatting
      for SPICE graphics config
    * src/qemu_conf.c: Complain about unsupported graphics types

diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index e01843b..227f410 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -821,6 +821,36 @@
         </group>
         <group>
           <attribute name="type">
+            <value>spice</value>
+          </attribute>
+          <optional>
+            <attribute name="port">
+              <ref name="PortNumber"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="tlsPort">
+              <ref name="PortNumber"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="listen">
+              <ref name="addrIP"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="passwd">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="keymap">
+              <text/>
+            </attribute>
+          </optional>
+        </group>
+        <group>
+          <attribute name="type">
             <value>rdp</value>
           </attribute>
           <optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f00bbe7..9ab3f68 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -200,7 +200,8 @@ VIR_ENUM_IMPL(virDomainGraphics, VIR_DOMAIN_GRAPHICS_TYPE_LAST,
               "sdl",
               "vnc",
               "rdp",
-              "desktop")
+              "desktop",
+              "spice")
 
 VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST,
               "subsystem",
@@ -346,6 +347,12 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
     case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
         VIR_FREE(def->data.desktop.display);
         break;
+
+    case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
+        VIR_FREE(def->data.spice.listenAddr);
+        VIR_FREE(def->data.spice.keymap);
+        VIR_FREE(def->data.spice.passwd);
+        break;
     }
 
     VIR_FREE(def);
@@ -2466,6 +2473,38 @@ virDomainGraphicsDefParseXML(virConnectPtr conn,
             def->data.desktop.fullscreen = 0;
 
         def->data.desktop.display = virXMLPropString(node, "display");
+    } else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+        char *port = virXMLPropString(node, "port");
+        char *tlsPort;
+
+        if (port) {
+            if (virStrToLong_i(port, NULL, 10, &def->data.spice.port) < 0) {
+                virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                                     _("cannot parse spice port %s"), port);
+                VIR_FREE(port);
+                goto error;
+            }
+            VIR_FREE(port);
+        } else {
+            def->data.spice.port = 5900;
+        }
+
+        tlsPort = virXMLPropString(node, "tlsPort");
+        if (tlsPort) {
+            if (virStrToLong_i(tlsPort, NULL, 10, &def->data.spice.tlsPort) < 0) {
+                virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                                     _("cannot parse spice tlsPort %s"), tlsPort);
+                VIR_FREE(tlsPort);
+                goto error;
+            }
+            VIR_FREE(tlsPort);
+        } else {
+            def->data.spice.tlsPort = 0;
+        }
+
+        def->data.spice.listenAddr = virXMLPropString(node, "listen");
+        def->data.spice.passwd = virXMLPropString(node, "passwd");
+        def->data.spice.keymap = virXMLPropString(node, "keymap");
     }
 
 cleanup:
@@ -5205,6 +5244,30 @@ virDomainGraphicsDefFormat(virConnectPtr conn,
 
         break;
 
+    case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
+        if (def->data.spice.port)
+            virBufferVSprintf(buf, " port='%d'",
+                              def->data.spice.port);
+
+        if (def->data.spice.tlsPort)
+            virBufferVSprintf(buf, " tlsPort='%d'",
+                              def->data.spice.tlsPort);
+
+        if (def->data.spice.listenAddr)
+            virBufferVSprintf(buf, " listen='%s'",
+                              def->data.spice.listenAddr);
+
+        if (def->data.spice.keymap)
+            virBufferEscapeString(buf, " keymap='%s'",
+                                  def->data.spice.keymap);
+
+        if (def->data.spice.passwd &&
+            (flags & VIR_DOMAIN_XML_SECURE))
+            virBufferEscapeString(buf, " passwd='%s'",
+                                  def->data.spice.passwd);
+
+        break;
+
     }
 
     virBufferAddLit(buf, "/>\n");
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 4ba8eed..b6491bc 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -418,6 +418,7 @@ enum virDomainGraphicsType {
     VIR_DOMAIN_GRAPHICS_TYPE_VNC,
     VIR_DOMAIN_GRAPHICS_TYPE_RDP,
     VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP,
+    VIR_DOMAIN_GRAPHICS_TYPE_SPICE,
 
     VIR_DOMAIN_GRAPHICS_TYPE_LAST,
 };
@@ -450,6 +451,13 @@ struct _virDomainGraphicsDef {
             char *display;
             unsigned int fullscreen :1;
         } desktop;
+        struct {
+            int port;
+            int tlsPort;
+            char *listenAddr;
+            char *keymap;
+            char *passwd;
+        } spice;
     } data;
 };
 
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 0b91d68..4baf218 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -3791,6 +3791,12 @@ int qemudBuildCommandLine(virConnectPtr conn,
         }
     }
 
+    if (def->ngraphics > 1) {
+        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                         "%s", _("only one graphics output is currently supported"));
+        goto error;
+    }
+
     if ((def->ngraphics == 1) &&
         def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
         virBuffer opt = VIR_BUFFER_INITIALIZER;
@@ -3887,6 +3893,9 @@ int qemudBuildCommandLine(virConnectPtr conn,
          * default, since the default changes :-( */
         if (qemuCmdFlags & QEMUD_CMD_FLAG_SDL)
             ADD_ARG_LIT("-sdl");
+    } else if (def->ngraphics) {
+        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                         "%s", _("unsupported graphics output requested"));
     }
 
     if (def->nvideos) {

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list