]> xenbits.xensource.com Git - libvirt.git/commitdiff
Pull info about serial console TTY and VNC port from xenstore into domain XML
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 8 Aug 2006 20:14:40 +0000 (20:14 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 8 Aug 2006 20:14:40 +0000 (20:14 +0000)
ChangeLog
docs/format.html
docs/libvir.html
src/xend_internal.c
src/xs_internal.c
src/xs_internal.h

index 1863fbd554b888520cd3624184c72a2f7bd764e5..daddac3db094d0fd7372ffd8625799a349c8fcb4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Mon Aug  7 18:33:45 EDT 2006 Daniel Berrange <berrange@redhat.com>
+
+       * src/xend_internal.c: Added details of serial console TTY to XML 
+       representation of domain. Fetch VNC port from xenstore if it is
+       available (only in xen 3.0.3 or later).
+       * src/xs_internal.c, src/xs_internal.h: Added APIs for retrieving
+       the serial console TTY and VNC server port from xenstore.
+       * docs/libvir.html: Document 'port' attribute for VNC graphics,
+       and '<console>' element for serial console.
+       
 Mon Aug  7 21:57:41 CEST 2006 Daniel Veillard <veillard@redhat.com>
 
        * TODO: updated with new items
index c211813845a654484317653c45ef4144542d7c4c..2749deaf95961de2fefcdf7462197ad28f3ccba3 100644 (file)
@@ -28,6 +28,7 @@ the following is an example of the format as returned by the shell command
       &lt;mac address='</span><span style="color: #0000FF; background-color: #FFFFFF"></span><span style="color: #0000FF; background-color: #FFFFFF">aa:00:00:00:00:11'/&gt;
       &lt;script path='/etc/xen/scripts/vif-bridge'/&gt;
     &lt;/interface&gt;</span>
+    <span style="color: #FF8000; background-color: #FFFFFF">&lt;console tty='/dev/pts/5'/&gt;</span>
   &lt;/devices&gt;
 &lt;/domain&gt;</pre><p>The root element must be called <code>domain</code> with no namespace, the
 <code>type</code> attribute indicates the kind of hypervisor used, 'xen' is
@@ -47,10 +48,10 @@ significant:</p><ul><li>name: the domain name, preferably ASCII based</li>
       <li>root: the root filesystem from the guest viewpoint, it may be
         passed as part of the cmdline content too</li>
     </ul></li>
-  <li>devices: a list of <code>disk</code> and <code>interface</code>
-    descriptions in no special order</li>
+  <li>devices: a list of <code>disk</code>, <code>interface</code>
+    and <code>console</code> descriptions in no special order</li>
 </ul><p>The format of the devices and their type may grow over time, but the
-following should be sufficient for basic use:</p><p>A disk device indicates a block device, it can have two values for the
+following should be sufficient for basic use:</p><p>A <code>disk</code> device indicates a block device, it can have two values for the
 type attribute either 'file' or 'block' corresponding to the 2 options
 availble at the Xen layer. It has two mandatory children, and one optional
 one in no specific order:</p><ul><li>source with a file attribute containing the path in Domain 0 to the
@@ -60,14 +61,17 @@ one in no specific order:</p><ul><li>source with a file attribute containing the
     the guest</li>
   <li>readonly an optional empty element indicating the device is
   read-only</li>
-</ul><p>An interface element describes a network device mapped on the guest, it
+</ul><p>An <code>interface</code> element describes a network device mapped on the guest, it
 also has a type whose value is currently 'bridge', it also have a number of
 children in no specific order:</p><ul><li>source: indicating the bridge name</li>
   <li>mac: the optional mac address provided in the address attribute</li>
   <li>ip: the optional IP address provided in the address attribute</li>
   <li>script: the script used to bridge the interfcae in the Domain 0</li>
   <li>target: and optional target indicating the device name.</li>
-</ul><p>Life cycle actions for the domain can also be expressed in the XML format,
+</ul><p>A <code>console</code> element describes a serial console connection to the
+guest. It has no children, and a single attribute <code>tty</code> which provides
+the path to the Pseudo TTY on which the guest console can be accessed
+</p><p>Life cycle actions for the domain can also be expressed in the XML format,
 they drive what should be happening if the domain crashes, is rebooted or is
 poweroff. There is various actions possible when this happen:</p><ul><li>destroy: The domain is cleaned up (that's the default normal processing
     in Xen)</li>
@@ -113,7 +117,7 @@ systems:</p><pre>&lt;domain type='xen' id='3'&gt;
       &lt;source file='/root/fv0'/&gt;
       &lt;target <span style="color: #0000E5; background-color: #FFFFFF">dev='ioemu:hda'</span>/&gt;
     &lt;/disk&gt;
-    <span style="color: #0000E5; background-color: #FFFFFF">&lt;graphics type='vnc'/&gt;</span>
+    <span style="color: #0000E5; background-color: #FFFFFF">&lt;graphics type='vnc' port='5904'/&gt;</span>
   &lt;/devices&gt;
 &lt;/domain&gt;</pre><p>There is a few things to notice specifically for HVM domains:</p><ul><li>the &lt;os&gt; block description is very different, first it indicates
     that the type is 'hvm' for hardware virtualization, then instead of a
index 5b5716697c057805902fc637dea74e23b560ddb7..f2534ff063a230e30306d5da3bc16d6d499282dd 100644 (file)
@@ -320,6 +320,7 @@ the following is an example of the format as returned by the shell command
       &lt;mac address='</span><span style="color: #0000FF; background-color: #FFFFFF"></span><span style="color: #0000FF; background-color: #FFFFFF">aa:00:00:00:00:11'/&gt;
       &lt;script path='/etc/xen/scripts/vif-bridge'/&gt;
     &lt;/interface&gt;</span>
+    <span style="color: #FF8000; background-color: #FFFFFF">&lt;console tty='/dev/pts/5'/&gt;</span>
   &lt;/devices&gt;
 &lt;/domain&gt;</pre>
 
@@ -345,14 +346,14 @@ significant:</p>
         passed as part of the cmdline content too</li>
     </ul>
   </li>
-  <li>devices: a list of <code>disk</code> and <code>interface</code>
-    descriptions in no special order</li>
+  <li>devices: a list of <code>disk</code>, <code>interface</code>
+    and <code>console</code> descriptions in no special order</li>
 </ul>
 
 <p>The format of the devices and their type may grow over time, but the
 following should be sufficient for basic use:</p>
 
-<p>A disk device indicates a block device, it can have two values for the
+<p>A <code>disk</code> device indicates a block device, it can have two values for the
 type attribute either 'file' or 'block' corresponding to the 2 options
 availble at the Xen layer. It has two mandatory children, and one optional
 one in no specific order:</p>
@@ -366,7 +367,7 @@ one in no specific order:</p>
   read-only</li>
 </ul>
 
-<p>An interface element describes a network device mapped on the guest, it
+<p>An <code>interface</code> element describes a network device mapped on the guest, it
 also has a type whose value is currently 'bridge', it also have a number of
 children in no specific order:</p>
 <ul>
@@ -377,6 +378,11 @@ children in no specific order:</p>
   <li>target: and optional target indicating the device name.</li>
 </ul>
 
+<p>A <code>console</code> element describes a serial console connection to the
+guest. It has no children, and a single attribute <code>tty</code> which provides
+the path to the Pseudo TTY on which the guest console can be accessed
+</p>
+
 <p>Life cycle actions for the domain can also be expressed in the XML format,
 they drive what should be happening if the domain crashes, is rebooted or is
 poweroff. There is various actions possible when this happen:</p>
@@ -435,7 +441,7 @@ systems:</p>
       &lt;source file='/root/fv0'/&gt;
       &lt;target <span style="color: #0000E5; background-color: #FFFFFF">dev='ioemu:hda'</span>/&gt;
     &lt;/disk&gt;
-    <span style="color: #0000E5; background-color: #FFFFFF">&lt;graphics type='vnc'/&gt;</span>
+    <span style="color: #0000E5; background-color: #FFFFFF">&lt;graphics type='vnc' port='5904'/&gt;</span>
   &lt;/devices&gt;
 &lt;/domain&gt;</pre>
 
index 64c332139db8078c16b5bc5359341e3c4208c507..ed9f2f3e5baaa38a653fa0a9b0e6075ecb15de61 100644 (file)
@@ -35,6 +35,7 @@
 #include "xml.h"
 #include "xend_internal.h"
 #include "xen_internal.h" /* for DOM0_INTERFACE_VERSION */
+#include "xs_internal.h" /* To extract VNC port & Serial console TTY */
 
 #ifndef PROXY
 static const char * xenDaemonGetType(virConnectPtr conn);
@@ -1434,6 +1435,7 @@ xend_parse_sexp_desc_os(struct sexpr *node, virBufferPtr buf, int hvm)
 
 /**
  * xend_parse_sexp_desc:
+ * @domain: the domain associated with the XML
  * @root: the root of the parsed S-Expression
  *
  * Parse the xend sexp description and turn it into the XML format similar
@@ -1443,11 +1445,12 @@ xend_parse_sexp_desc_os(struct sexpr *node, virBufferPtr buf, int hvm)
  *         the caller must free() the returned value.
  */
 static char *
-xend_parse_sexp_desc(struct sexpr *root)
+xend_parse_sexp_desc(virDomainPtr domain, struct sexpr *root)
 {
     char *ret;
     struct sexpr *cur, *node;
     const char *tmp;
+    char *tty;
     virBuffer buf;
     int hvm = 0;
 
@@ -1599,11 +1602,13 @@ xend_parse_sexp_desc(struct sexpr *root)
     if (hvm) {
         /* Graphics device */
         tmp = sexpr_node(root, "domain/image/hvm/vnc");
-       /* XXX extract VNC port from XenStore if its available */
         if (tmp != NULL) {
-            if (tmp[0] == '1')
-                virBufferVSprintf(&buf, "    <graphics type='vnc' port='%d'/>\n", 
-                                  5900 + sexpr_int(root, "domain/domid"));
+            if (tmp[0] == '1') {
+                int port = xenStoreDomainGetVNCPort(domain);
+                if (port == -1) 
+                    port = 5900 + sexpr_int(root, "domain/domid");
+                virBufferVSprintf(&buf, "    <graphics type='vnc' port='%d'/>\n", port);
+            }
         }
         
         tmp = sexpr_node(root, "domain/image/hvm/sdl");
@@ -1618,6 +1623,12 @@ xend_parse_sexp_desc(struct sexpr *root)
          */
     }
     
+    tty = xenStoreDomainGetConsolePath(domain);
+    if (tty) {
+        virBufferVSprintf(&buf, "    <console tty='%s'/>\n", tty);
+        free(tty);
+    }
+
     virBufferAdd(&buf, "  </devices>\n", 13);
     virBufferAdd(&buf, "</domain>\n", 10);
 
@@ -2145,7 +2156,7 @@ xenDaemonDomainDumpXML(virDomainPtr domain)
     if (root == NULL)
         return (NULL);
 
-    ret = xend_parse_sexp_desc(root);
+    ret = xend_parse_sexp_desc(domain, root);
     sexpr_free(root);
 
     return (ret);
index 1ed72a7a50e2431f30250a2bc18346e4249ea916..f53812a71d1f48c795703110e8ff6c23208fc263 100644 (file)
@@ -627,3 +627,41 @@ xenStoreDomainReboot(virDomainPtr domain, unsigned int flags ATTRIBUTE_UNUSED)
     return(virDomainDoStoreWrite(domain, "control/shutdown", "reboot"));
 }
 
+/**
+ * xenStoreDomainGetVNCPort:
+ * @domain: pointer to the domain block
+ *
+ * Return the port number on which the domain is listening for VNC
+ * connections. 
+ *
+ * Returns the port number, -1 in case of error
+ */
+int             xenStoreDomainGetVNCPort(virDomainPtr domain) {
+    char *tmp;
+    int ret = -1;
+
+    tmp = virDomainDoStoreQuery(domain, "console/vnc-port");
+    if (tmp != NULL) {
+        char *end;
+        ret = strtol(tmp, &end, 10);
+        if (ret == 0 && end == tmp)
+            ret = -1;
+        free(tmp);
+    }
+    return(ret);
+}
+
+/**
+ * xenStoreDomainGetConsolePath:
+ * @domain: pointer to the domain block
+ *
+ * Return the path to the psuedo TTY on which the guest domain's
+ * serial console is attached.
+ *
+ * Returns the path to the serial console. It is the callers
+ * responsibilty to free() the return string. Returns NULL
+ * on error
+ */
+char *          xenStoreDomainGetConsolePath(virDomainPtr domain) {
+    return virDomainDoStoreQuery(domain, "console/tty");
+}
index dcdb4e125c535e2bd966bf688e591f8761d3c0d9..2e4f4a48020851e1389c73f648c1e813ebc2d68f 100644 (file)
@@ -35,6 +35,9 @@ unsigned long         xenStoreDomainGetMaxMemory(virDomainPtr domain);
 int            xenStoreDomainShutdown  (virDomainPtr domain);
 int            xenStoreDomainReboot    (virDomainPtr domain,
                                         unsigned int flags);
+int             xenStoreDomainGetVNCPort(virDomainPtr domain);
+char *          xenStoreDomainGetConsolePath(virDomainPtr domain);
+
 #ifdef __cplusplus
 }
 #endif