[Libvir] PATCH: Specify BIOS clock offset for HVM

Daniel P. Berrange berrange at redhat.com
Fri Jul 13 16:07:03 UTC 2007


The attached patch introduces a new XML element for specifying information
about the guest (BIOS) clock. For Xen HVM, and QEMU / KVM guests this is
used to specifyc whether the guest clock should be in UTC, or localtime.
The latter is useful for Windows which likes the BIOS to be localtime,
while the former is useful for all other operating systems. The former is
of course the default - so no change in existing semantics.

The <clock> element currently takes a single attribute 'offset'. This is
either 'utc' or 'localtime', but if we port to VMWare, it will also allow
an arbitrary numeric offset as well as these special constants.

   <clock offset='utc'/>

Or

   <clock offset='localtime'/>


It may later also be desirable to add a 'sync=[yes|no]'  attribute to 
specify whether the HV tries to keep the clock in sync with the HV while
it is running. VMWare has this concept, and so does Xen paravirt - though
Xen paravirt sets it via /proc/sys/xen/independant_wallclock inside the
guest and AFAICT doesn't (yet) expose it to the guest config in Dom0.

Anyway, my patch implements use of utc/localtime offsets for Xen, and QEMU
drivers. I've tested to verify that -localtime gets passed to the QEMU
process as appropriate.

Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
? foo
? docs/APIchunk5.html
? docs/APIchunk6.html
? docs/apibuild.pyc
? tests/foo
? tests/sexpr2xmldata/sexpr2xml-fv-localtime.sexpr
? tests/sexpr2xmldata/sexpr2xml-fv-localtime.xml
? tests/sexpr2xmldata/sexpr2xml-fv-utc.sexpr
? tests/sexpr2xmldata/sexpr2xml-fv-utc.xml
? tests/xmconfigdata/test-fullvirt-localtime.cfg
? tests/xmconfigdata/test-fullvirt-localtime.xml
? tests/xmconfigdata/test-fullvirt-utc.cfg
? tests/xmconfigdata/test-fullvirt-utc.xml
? tests/xml2sexprdata/xml2sexpr-fv-localtime.sexpr
? tests/xml2sexprdata/xml2sexpr-fv-localtime.xml
? tests/xml2sexprdata/xml2sexpr-fv-utc.sexpr
? tests/xml2sexprdata/xml2sexpr-fv-utc.xml
Index: docs/format.html
===================================================================
RCS file: /data/cvs/libvirt/docs/format.html,v
retrieving revision 1.24
diff -u -p -r1.24 format.html
--- docs/format.html	29 Jun 2007 12:44:58 -0000	1.24
+++ docs/format.html	13 Jul 2007 15:58:49 -0000
@@ -117,6 +117,7 @@ systems:</p><pre><domain type='xen' i
      <acpi/>
      <apic/></span>
   </features>
+  <span style="color: #0000E5; background-color: #FFFFFF"><clock sync="localtime"/></span>
   <devices>
     <span style="color: #0000E5; background-color: #FFFFFF"><emulator>/usr/lib/xen/bin/qemu-dm</emulator></span>
     <interface type='bridge'>
@@ -146,6 +147,11 @@ systems:</p><pre><domain type='xen' i
       <li><code>apic</code> - enable IO APIC</li>
       <li><code>acpi</code> - enable ACPI bios</li>
     </ul></li>
+  <li>the optional <code><clock></code> element is used to specify
+     whether the emulated BIOS clock in the guest is synced to either
+     <code>localtime</code> or <code>utc</code>. In general Windows will
+     want <code>localtime</code> while all other operating systems will
+     want <code>utc</code>. The default is thus <code>utc</code></li>
   <li>the <code><os></code> block description is very different, first
     it indicates that the type is 'hvm' for hardware virtualization, then
     instead of a kernel, boot and command line arguments, it points to an os
@@ -194,6 +200,7 @@ XML description is quite similar, here i
   <os>
     <type>hvm</type>
   </os>
+  <span style="color: #0000E5; background-color: #FFFFFF"><clock sync="localtime"/></span>
   <devices>
     <span style="color: #FF0000; background-color: #FFFFFF"><emulator>/home/user/usr/kvm-devel/bin/qemu-system-x86_64</emulator></span>
     <disk type='file' device='disk'>
@@ -206,6 +213,7 @@ XML description is quite similar, here i
     <graphics type='vnc' port='-1'/>
   </devices>
 </domain></pre><p>The specific points to note if using KVM are:</p><ul><li>the top level domain element carries a type of 'kvm'</li>
+  <li>the <clock> optional is supported as with Xen HVM</li>
   <li>the <devices> emulator points to the special qemu binary required
     for KVM</li>
   <li>networking interface definitions definitions are somewhat different due
Index: docs/libvir.html
===================================================================
RCS file: /data/cvs/libvirt/docs/libvir.html,v
retrieving revision 1.71
diff -u -p -r1.71 libvir.html
--- docs/libvir.html	12 Jul 2007 15:47:19 -0000	1.71
+++ docs/libvir.html	13 Jul 2007 15:58:49 -0000
@@ -738,6 +738,7 @@ systems:</p>
      <acpi/>
      <apic/></span>
   </features>
+  <span style="color: #0000E5; background-color: #FFFFFF"><clock sync="localtime"/></span>
   <devices>
     <span style="color: #0000E5; background-color: #FFFFFF"><emulator>/usr/lib/xen/bin/qemu-dm</emulator></span>
     <interface type='bridge'>
@@ -773,6 +774,11 @@ systems:</p>
       <li><code>acpi</code> - enable ACPI bios</li>
     </ul>
   </li>
+  <li>the optional <code><clock></code> element is used to specify
+     whether the emulated BIOS clock in the guest is synced to either
+     <code>localtime</code> or <code>utc</code>. In general Windows will
+     want <code>localtime</code> while all other operating systems will
+     want <code>utc</code>. The default is thus <code>utc</code></li>
   <li>the <code><os></code> block description is very different, first
     it indicates that the type is 'hvm' for hardware virtualization, then
     instead of a kernel, boot and command line arguments, it points to an os
@@ -832,6 +838,7 @@ XML description is quite similar, here i
   <os>
     <type>hvm</type>
   </os>
+  <span style="color: #0000E5; background-color: #FFFFFF"><clock sync="localtime"/></span>
   <devices>
     <span style="color: #FF0000; background-color: #FFFFFF"><emulator>/home/user/usr/kvm-devel/bin/qemu-system-x86_64</emulator></span>
     <disk type='file' device='disk'>
@@ -848,6 +855,7 @@ XML description is quite similar, here i
 <p>The specific points to note if using KVM are:</p>
 <ul>
   <li>the top level domain element carries a type of 'kvm'</li>
+  <li>the <clock> optional is supported as with Xen HVM</li>
   <li>the <devices> emulator points to the special qemu binary required
     for KVM</li>
   <li>networking interface definitions definitions are somewhat different due
@@ -2231,8 +2239,14 @@ Blank lines and comments beginning with 
 <h3><a name="Remote_IPv6">IPv6 support</a></h3>
 
 <p>
-IPv6 has received some limited testing and should work.  Problems with
-libvirt and IPv6 should be reported as <a href="bugs.html">bugs</a>.
+The libvirtd service and libvirt remote client driver both use the
+<code>getaddrinfo()</code> functions for name resolution and are
+thus fully IPv6 enabled. ie, if a server has IPv6 address configured
+the daemon will listen for incoming connections on both IPv4 and IPv6
+protocols. If a client has an IPv6 address configured and the DNS
+address resolved for a service is reachable over IPv6, then an IPv6
+connection will be made, otherwise IPv4 will be used. In summary it
+should just 'do the right thing(tm)'.
 </p>
 
 <h3><a name="Remote_limitations">Limitations</a></h3>
Index: docs/remote.html
===================================================================
RCS file: /data/cvs/libvirt/docs/remote.html,v
retrieving revision 1.11
diff -u -p -r1.11 remote.html
--- docs/remote.html	12 Jul 2007 15:47:19 -0000	1.11
+++ docs/remote.html	13 Jul 2007 15:58:50 -0000
@@ -548,8 +548,14 @@ Blank lines and comments beginning with 
   </p>
 </td>
 </tr></table><h3><a name="Remote_IPv6" id="Remote_IPv6">IPv6 support</a></h3><p>
-IPv6 has received some limited testing and should work.  Problems with
-libvirt and IPv6 should be reported as <a href="bugs.html">bugs</a>.
+The libvirtd service and libvirt remote client driver both use the
+<code>getaddrinfo()</code> functions for name resolution and are
+thus fully IPv6 enabled. ie, if a server has IPv6 address configured
+the daemon will listen for incoming connections on both IPv4 and IPv6
+protocols. If a client has an IPv6 address configured and the DNS
+address resolved for a service is reachable over IPv6, then an IPv6
+connection will be made, otherwise IPv4 will be used. In summary it
+should just 'do the right thing(tm)'.
 </p><h3><a name="Remote_limitations" id="Remote_limitations">Limitations</a></h3><ul><li> Remote storage: To be fully useful, particularly for
 creating new domains, it should be possible to enumerate
 and provision storage on the remote machine.  This is currently
Index: src/qemu_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_conf.c,v
retrieving revision 1.2
diff -u -p -r1.2 qemu_conf.c
--- src/qemu_conf.c	12 Jul 2007 15:09:01 -0000	1.2
+++ src/qemu_conf.c	13 Jul 2007 15:58:50 -0000
@@ -967,6 +967,20 @@ static struct qemud_vm_def *qemudParseXM
     if (obj)
         xmlXPathFreeObject(obj);
 
+    /* See if we set clock to localtime */
+    obj = xmlXPathEval(BAD_CAST "string(/domain/clock/@offset)", ctxt);
+    if ((obj == NULL) || (obj->type != XPATH_STRING) ||
+        (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
+        def->localtime = 0;
+    } else {
+        if (!strcmp((char*)obj->stringval, "localtime"))
+            def->localtime = 1;
+        else
+            def->localtime = 0;
+    }
+    if (obj)
+        xmlXPathFreeObject(obj);
+
 
     /* Extract OS type info */
     obj = xmlXPathEval(BAD_CAST "string(/domain/os/type[1])", ctxt);
@@ -1338,6 +1352,7 @@ int qemudBuildCommandLine(virConnectPtr 
         2 + /* cpus */
         2 + /* boot device */
         2 + /* monitor */
+        (vm->def->localtime ? 1 : 0) + /* localtime */
         (driver->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
          vm->def->noReboot ? 1 : 0) + /* no-reboot */
         (vm->def->features & QEMUD_FEATURE_ACPI ? 0 : 1) + /* acpi */
@@ -1376,6 +1391,11 @@ int qemudBuildCommandLine(virConnectPtr 
     if (!((*argv)[++n] = strdup("pty")))
         goto no_memory;
 
+    if (vm->def->localtime) {
+        if (!((*argv)[++n] = strdup("-localtime")))
+            goto no_memory;
+    }
+
     if (driver->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
         vm->def->noReboot) {
         if (!((*argv)[++n] = strdup("-no-reboot")))
@@ -2623,6 +2643,8 @@ char *qemudGenerateXML(virConnectPtr con
             goto no_memory;
     }
 
+    virBufferVSprintf(buf, "  <clock offset='%s'/>\n", def->localtime ? "localtime" : "utc");
+
     if (virBufferAdd(buf, "  <on_poweroff>destroy</on_poweroff>\n", -1) < 0)
         goto no_memory;
     if (def->noReboot) {
Index: src/qemu_conf.h
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_conf.h,v
retrieving revision 1.2
diff -u -p -r1.2 qemu_conf.h
--- src/qemu_conf.h	12 Jul 2007 15:09:01 -0000	1.2
+++ src/qemu_conf.h	13 Jul 2007 15:58:50 -0000
@@ -164,6 +164,7 @@ struct qemud_vm_def {
 
     struct qemud_vm_os_def os;
 
+    int localtime;
     int features;
     int graphicsType;
     int vncPort;
Index: src/remote_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/remote_internal.c,v
retrieving revision 1.15
diff -u -p -r1.15 remote_internal.c
--- src/remote_internal.c	12 Jul 2007 15:17:08 -0000	1.15
+++ src/remote_internal.c	13 Jul 2007 15:58:50 -0000
@@ -551,7 +551,7 @@ doRemoteOpen (virConnectPtr conn, struct
 
     case trans_ssh: {
         int j, nr_args = username ? 10 : 8;
-
+        nr_args += 2;
         command = command ? : strdup ("ssh");
 
         // Generate the final command argv[] array.
@@ -559,6 +559,8 @@ doRemoteOpen (virConnectPtr conn, struct
         cmd_argv = malloc (nr_args * sizeof (char *));
         j = 0;
         cmd_argv[j++] = strdup (command);
+        cmd_argv[j++] = strdup ("-o");
+        cmd_argv[j++] = strdup ("ControlMaster=yes,ControlPath=/home/berrange/ssh");
         cmd_argv[j++] = strdup ("-p");
         cmd_argv[j++] = strdup (port);
         if (username) {
Index: src/xend_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.c,v
retrieving revision 1.129
diff -u -p -r1.129 xend_internal.c
--- src/xend_internal.c	9 Jul 2007 11:24:52 -0000	1.129
+++ src/xend_internal.c	13 Jul 2007 15:58:50 -0000
@@ -1442,6 +1442,8 @@ xend_parse_sexp_desc(virConnectPtr conn,
         virBufferVSprintf(&buf, "  <on_crash>%s</on_crash>\n", tmp);
 
     if (hvm) {
+        int clockLocal;
+
         virBufferAdd(&buf, "  <features>\n", 13);
         if (sexpr_int(root, "domain/image/hvm/acpi"))
             virBufferAdd(&buf, "    <acpi/>\n", 12);
@@ -1450,6 +1452,9 @@ xend_parse_sexp_desc(virConnectPtr conn,
         if (sexpr_int(root, "domain/image/hvm/pae"))
             virBufferAdd(&buf, "    <pae/>\n", 11);
         virBufferAdd(&buf, "  </features>\n", 14);
+
+        clockLocal = sexpr_int(root, "domain/image/hvm/localtime");
+        virBufferVSprintf(&buf, "  <clock offset='%s'/>\n", clockLocal ? "localtime" : "utc");
     }
 
     virBufferAdd(&buf, "  <devices>\n", 12);
Index: src/xm_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xm_internal.c,v
retrieving revision 1.36
diff -u -p -r1.36 xm_internal.c
--- src/xm_internal.c	9 Jul 2007 11:24:52 -0000	1.36
+++ src/xm_internal.c	13 Jul 2007 15:58:50 -0000
@@ -708,6 +708,10 @@ char *xenXMDomainFormatXML(virConnectPtr
             val)
             virBufferAdd(buf, "    <apic/>\n", -1);
         virBufferAdd(buf, "  </features>\n", -1);
+
+        if (xenXMConfigGetInt(conf, "localtime", &val) < 0)
+            val = 0;
+        virBufferVSprintf(buf, "  <clock offset='%s'/>\n", val ? "localtime" : "utc");
     }
 
     virBufferAdd(buf, "  <devices>\n", -1);
@@ -1812,6 +1816,7 @@ virConfPtr xenXMParseXMLToConfig(virConn
 
     if (hvm) {
         const char *boot = "c";
+        int clockLocal = 0;
         if (xenXMConfigSetString(conf, "builder", "hvm") < 0)
             goto error;
 
@@ -1845,6 +1850,16 @@ virConfPtr xenXMParseXMLToConfig(virConn
                                        "cannot set the apic parameter") < 0)
             goto error;
 
+        obj = xmlXPathEval(BAD_CAST "string(/domain/clock/@offset)", ctxt);
+        if ((obj != NULL) && (obj->type == XPATH_STRING) &&
+            (obj->stringval != NULL)) {
+            if (!strcmp((const char*)obj->stringval, "localtime"))
+                clockLocal = 1;
+        }
+        xmlXPathFreeObject(obj);
+        if (xenXMConfigSetInt(conf, "localtime", clockLocal) < 0)
+            goto error;
+
         if (priv->xendConfigVersion == 1) {
             if (xenXMConfigSetStringFromXPath(conn, conf, ctxt, "cdrom", "string(/domain/devices/disk[@device='cdrom']/source/@file)", 1,
                                               "cannot set the cdrom parameter") < 0)
Index: src/xml.c
===================================================================
RCS file: /data/cvs/libvirt/src/xml.c,v
retrieving revision 1.81
diff -u -p -r1.81 xml.c
--- src/xml.c	11 Jul 2007 08:41:11 -0000	1.81
+++ src/xml.c	13 Jul 2007 15:58:50 -0000
@@ -562,6 +562,11 @@ virDomainParseXMLOSDescHVM(virConnectPtr
         }
     }
 
+    str = virXPathString("string(/domain/clock/@offset)", ctxt);
+    if (str != NULL && !strcmp(str, "localtime")) {
+        virBufferAdd(buf, "(localtime 1)", 13);
+    }
+
     virBufferAdd(buf, "))", 2);
 
     return (0);
Index: tests/sexpr2xmltest.c
===================================================================
RCS file: /data/cvs/libvirt/tests/sexpr2xmltest.c,v
retrieving revision 1.13
diff -u -p -r1.13 sexpr2xmltest.c
--- tests/sexpr2xmltest.c	7 Jun 2007 13:50:18 -0000	1.13
+++ tests/sexpr2xmltest.c	13 Jul 2007 15:58:50 -0000
@@ -28,12 +28,13 @@ static int testCompareFiles(const char *
   if (!(gotxml = xend_parse_domain_sexp(NULL, sexprData, xendConfigVersion)))
     goto fail;
 
-  if (getenv("DEBUG_TESTS")) {
-      printf("Expect %d '%s'\n", (int)strlen(xmlData), xmlData);
-      printf("Actual %d '%s'\n", (int)strlen(gotxml), gotxml);
-  }
-  if (strcmp(xmlData, gotxml))
+  if (strcmp(xmlData, gotxml)) {
+    if (getenv("DEBUG_TESTS")) {
+        printf("Expect %d '%s'\n", (int)strlen(xmlData), xmlData);
+        printf("Actual %d '%s'\n", (int)strlen(gotxml), gotxml);
+    }
     goto fail;
+  }
 
   ret = 0;
 
@@ -136,6 +137,19 @@ static int testCompareNoSourceCDRom(void
 			  1);
 }
 
+static int testCompareFVclockUTC(void *data ATTRIBUTE_UNUSED) {
+  return testCompareFiles("sexpr2xmldata/sexpr2xml-fv-utc.xml",
+			  "sexpr2xmldata/sexpr2xml-fv-utc.sexpr",
+			  1);
+}
+
+static int testCompareFVclockLocaltime(void *data ATTRIBUTE_UNUSED) {
+  return testCompareFiles("sexpr2xmldata/sexpr2xml-fv-localtime.xml",
+			  "sexpr2xmldata/sexpr2xml-fv-localtime.sexpr",
+			  1);
+}
+
+
 
 int
 main(int argc, char **argv)
@@ -209,6 +223,14 @@ main(int argc, char **argv)
 		    1, testCompareNoSourceCDRom, NULL) != 0)
 	ret = -1;
 
+    if (virtTestRun("SEXPR-2-XML clock UTC",
+		    1, testCompareFVclockUTC, NULL) != 0)
+	ret = -1;
+
+    if (virtTestRun("SEXPR-2-XML clock Localtime",
+		    1, testCompareFVclockLocaltime, NULL) != 0)
+	ret = -1;
+
     exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
 }
 #else /* WITHOUT_XEN */
Index: tests/xmconfigtest.c
===================================================================
RCS file: /data/cvs/libvirt/tests/xmconfigtest.c,v
retrieving revision 1.4
diff -u -p -r1.4 xmconfigtest.c
--- tests/xmconfigtest.c	4 Apr 2007 14:19:49 -0000	1.4
+++ tests/xmconfigtest.c	13 Jul 2007 15:58:50 -0000
@@ -49,7 +49,7 @@ static int testCompareParseXML(const cha
     void *old_priv;
     struct _xenUnifiedPrivate priv;
 
-    conn = virConnectOpen("test:///default");
+    conn = virConnectOpenReadOnly("test:///default");
     if (!conn) goto fail;
     old_priv = conn->privateData;
 
@@ -70,12 +70,13 @@ static int testCompareParseXML(const cha
         goto fail;
     gotxmcfgPtr[wrote] = '\0';
 
-    if (getenv("DEBUG_TESTS")) {
-        printf("Expect %d '%s'\n", (int)strlen(xmcfgData), xmcfgData);
-        printf("Actual %d '%s'\n", (int)strlen(gotxmcfgData), gotxmcfgData);
-    }
-    if (strcmp(xmcfgData, gotxmcfgData))
+    if (strcmp(xmcfgData, gotxmcfgData)) {
+        if (getenv("DEBUG_TESTS")) {
+            printf("Expect %d '%s'\n", (int)strlen(xmcfgData), xmcfgData);
+            printf("Actual %d '%s'\n", (int)strlen(gotxmcfgData), gotxmcfgData);
+        }
         goto fail;
+    }
 
     ret = 0;
 
@@ -103,7 +104,7 @@ static int testCompareFormatXML(const ch
     void *old_priv;
     struct _xenUnifiedPrivate priv;
 
-    conn = virConnectOpen("test:///default");
+    conn = virConnectOpenReadOnly("test:///default");
     if (!conn) goto fail;
     old_priv = conn->privateData;
 
@@ -123,12 +124,13 @@ static int testCompareFormatXML(const ch
     if (!(gotxml = xenXMDomainFormatXML(conn, conf)))
         goto fail;
 
-    if (getenv("DEBUG_TESTS")) {
-        printf("Expect %d '%s'\n", (int)strlen(xmlData), xmlData);
-        printf("Actual %d '%s'\n", (int)strlen(gotxml), gotxml);
-    }
-    if (strcmp(xmlData, gotxml))
+    if (strcmp(xmlData, gotxml)) {
+        if (getenv("DEBUG_TESTS")) {
+            printf("Expect %d '%s'\n", (int)strlen(xmlData), xmlData);
+            printf("Actual %d '%s'\n", (int)strlen(gotxml), gotxml);
+        }
         goto fail;
+    }
 
     ret = 0;
 
@@ -190,6 +192,29 @@ static int testCompareFullvirtNewCDROMPa
                                2);
 }
 
+static int testCompareFullvirtClockUTCFormat(void *data ATTRIBUTE_UNUSED) {
+    return testCompareFormatXML("xmconfigdata/test-fullvirt-utc.cfg",
+                                "xmconfigdata/test-fullvirt-utc.xml",
+                                2);
+}
+
+static int testCompareFullvirtClockUTCParse(void *data ATTRIBUTE_UNUSED) {
+    return testCompareParseXML("xmconfigdata/test-fullvirt-utc.cfg",
+                               "xmconfigdata/test-fullvirt-utc.xml",
+                               2);
+}
+
+static int testCompareFullvirtClockLocaltimeFormat(void *data ATTRIBUTE_UNUSED) {
+    return testCompareFormatXML("xmconfigdata/test-fullvirt-localtime.cfg",
+                                "xmconfigdata/test-fullvirt-localtime.xml",
+                                2);
+}
+static int testCompareFullvirtClockLocaltimeParse(void *data ATTRIBUTE_UNUSED) {
+    return testCompareParseXML("xmconfigdata/test-fullvirt-localtime.cfg",
+                               "xmconfigdata/test-fullvirt-localtime.xml",
+                               2);
+}
+
 
 int
 main(int argc, char **argv)
@@ -203,22 +228,27 @@ main(int argc, char **argv)
         exit(EXIT_FAILURE);
     }
 
+    /* Config -> XML */
     if (virtTestRun("Paravirt old PVFB (Format)",
                     1, testCompareParavirtOldPVFBFormat, NULL) != 0)
         ret = -1;
-
     if (virtTestRun("Paravirt new PVFB (Format)",
                     1, testCompareParavirtNewPVFBFormat, NULL) != 0)
         ret = -1;
-
     if (virtTestRun("Fullvirt old PVFB (Format)",
                     1, testCompareFullvirtOldCDROMFormat, NULL) != 0)
         ret = -1;
-
     if (virtTestRun("Fullvirt new PVFB (Format)",
                     1, testCompareFullvirtNewCDROMFormat, NULL) != 0)
         ret = -1;
+    if (virtTestRun("Fullvirt clock Localtime (Format)",
+                    1, testCompareFullvirtClockLocaltimeFormat, NULL) != 0)
+        ret = -1;
+    if (virtTestRun("Fullvirt clock UTC (Format)",
+                    1, testCompareFullvirtClockUTCFormat, NULL) != 0)
+        ret = -1;
 
+    /* XML -> Config */
     if (virtTestRun("Paravirt old PVFB (Parse)",
                     1, testCompareParavirtOldPVFBParse, NULL) != 0)
         ret = -1;
@@ -231,6 +261,12 @@ main(int argc, char **argv)
     if (virtTestRun("Fullvirt new PVFB (Parse)",
                     1, testCompareFullvirtNewCDROMParse, NULL) != 0)
         ret = -1;
+    if (virtTestRun("Fullvirt clock Localtime (Parse)",
+                    1, testCompareFullvirtClockLocaltimeParse, NULL) != 0)
+        ret = -1;
+    if (virtTestRun("Fullvirt clock UTC (Parse)",
+                    1, testCompareFullvirtClockUTCParse, NULL) != 0)
+        ret = -1;
 
     exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
 }
Index: tests/xml2sexprtest.c
===================================================================
RCS file: /data/cvs/libvirt/tests/xml2sexprtest.c,v
retrieving revision 1.12
diff -u -p -r1.12 xml2sexprtest.c
--- tests/xml2sexprtest.c	7 Jun 2007 13:50:18 -0000	1.12
+++ tests/xml2sexprtest.c	13 Jul 2007 15:58:50 -0000
@@ -187,6 +187,20 @@ static int testCompareNoSourceCDRom(void
 			  2);
 }
 
+static int testCompareFVclockUTC(void *data ATTRIBUTE_UNUSED) {
+  return testCompareFiles("xml2sexprdata/xml2sexpr-fv-utc.xml",
+			  "xml2sexprdata/xml2sexpr-fv-utc.sexpr",
+			  "fvtest",
+			  1);
+}
+
+static int testCompareFVclockLocaltime(void *data ATTRIBUTE_UNUSED) {
+  return testCompareFiles("xml2sexprdata/xml2sexpr-fv-localtime.xml",
+			  "xml2sexprdata/xml2sexpr-fv-localtime.sexpr",
+			  "fvtest",
+			  1);
+}
+
 
 int
 main(int argc, char **argv)
@@ -276,5 +290,13 @@ main(int argc, char **argv)
 		    1, testCompareNoSourceCDRom, NULL) != 0)
 	ret = -1;
 
+    if (virtTestRun("XML-2-SEXPR clock UTC",
+		    1, testCompareFVclockUTC, NULL) != 0)
+	ret = -1;
+
+    if (virtTestRun("XML-2-SEXPR clock Localtime",
+		    1, testCompareFVclockLocaltime, NULL) != 0)
+	ret = -1;
+
     exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
 }
Index: tests/sexpr2xmldata/sexpr2xml-fv-v2.xml
===================================================================
RCS file: /data/cvs/libvirt/tests/sexpr2xmldata/sexpr2xml-fv-v2.xml,v
retrieving revision 1.3
diff -u -p -r1.3 sexpr2xml-fv-v2.xml
--- tests/sexpr2xmldata/sexpr2xml-fv-v2.xml	6 Mar 2007 20:00:17 -0000	1.3
+++ tests/sexpr2xmldata/sexpr2xml-fv-v2.xml	13 Jul 2007 15:58:50 -0000
@@ -14,6 +14,7 @@
   <features>
     <acpi/>
   </features>
+  <clock offset='utc'/>
   <devices>
     <emulator>/usr/lib64/xen/bin/qemu-dm</emulator>
     <disk type='file' device='cdrom'>
Index: tests/sexpr2xmldata/sexpr2xml-fv.xml
===================================================================
RCS file: /data/cvs/libvirt/tests/sexpr2xmldata/sexpr2xml-fv.xml,v
retrieving revision 1.3
diff -u -p -r1.3 sexpr2xml-fv.xml
--- tests/sexpr2xmldata/sexpr2xml-fv.xml	6 Mar 2007 20:00:17 -0000	1.3
+++ tests/sexpr2xmldata/sexpr2xml-fv.xml	13 Jul 2007 15:58:50 -0000
@@ -14,6 +14,7 @@
   <features>
     <acpi/>
   </features>
+  <clock offset='utc'/>
   <devices>
     <emulator>/usr/lib64/xen/bin/qemu-dm</emulator>
     <disk type='file' device='disk'>
Index: tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml
===================================================================
RCS file: /data/cvs/libvirt/tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml,v
retrieving revision 1.2
diff -u -p -r1.2 sexpr2xml-no-source-cdrom.xml
--- tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml	13 Apr 2007 00:43:57 -0000	1.2
+++ tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml	13 Jul 2007 15:58:50 -0000
@@ -17,6 +17,7 @@
     <apic/>
     <pae/>
   </features>
+  <clock offset='utc'/>
   <devices>
     <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
     <interface type='bridge'>
Index: tests/xmconfigdata/test-fullvirt-new-cdrom.cfg
===================================================================
RCS file: /data/cvs/libvirt/tests/xmconfigdata/test-fullvirt-new-cdrom.cfg,v
retrieving revision 1.2
diff -u -p -r1.2 test-fullvirt-new-cdrom.cfg
--- tests/xmconfigdata/test-fullvirt-new-cdrom.cfg	7 Jun 2007 18:21:58 -0000	1.2
+++ tests/xmconfigdata/test-fullvirt-new-cdrom.cfg	13 Jul 2007 15:58:51 -0000
@@ -9,6 +9,7 @@ boot = "d"
 pae = 1
 acpi = 1
 apic = 1
+localtime = 0
 on_poweroff = "destroy"
 on_reboot = "restart"
 on_crash = "restart"
Index: tests/xmconfigdata/test-fullvirt-new-cdrom.xml
===================================================================
RCS file: /data/cvs/libvirt/tests/xmconfigdata/test-fullvirt-new-cdrom.xml,v
retrieving revision 1.3
diff -u -p -r1.3 test-fullvirt-new-cdrom.xml
--- tests/xmconfigdata/test-fullvirt-new-cdrom.xml	7 Jun 2007 18:21:58 -0000	1.3
+++ tests/xmconfigdata/test-fullvirt-new-cdrom.xml	13 Jul 2007 15:58:51 -0000
@@ -17,6 +17,7 @@
     <acpi/>
     <apic/>
   </features>
+  <clock offset='utc'/>
   <devices>
     <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
     <disk type='block' device='disk'>
Index: tests/xmconfigdata/test-fullvirt-old-cdrom.cfg
===================================================================
RCS file: /data/cvs/libvirt/tests/xmconfigdata/test-fullvirt-old-cdrom.cfg,v
retrieving revision 1.2
diff -u -p -r1.2 test-fullvirt-old-cdrom.cfg
--- tests/xmconfigdata/test-fullvirt-old-cdrom.cfg	7 Jun 2007 18:21:58 -0000	1.2
+++ tests/xmconfigdata/test-fullvirt-old-cdrom.cfg	13 Jul 2007 15:58:51 -0000
@@ -9,6 +9,7 @@ boot = "d"
 pae = 1
 acpi = 1
 apic = 1
+localtime = 0
 cdrom = "/root/boot.iso"
 on_poweroff = "destroy"
 on_reboot = "restart"
Index: tests/xmconfigdata/test-fullvirt-old-cdrom.xml
===================================================================
RCS file: /data/cvs/libvirt/tests/xmconfigdata/test-fullvirt-old-cdrom.xml,v
retrieving revision 1.3
diff -u -p -r1.3 test-fullvirt-old-cdrom.xml
--- tests/xmconfigdata/test-fullvirt-old-cdrom.xml	7 Jun 2007 18:21:58 -0000	1.3
+++ tests/xmconfigdata/test-fullvirt-old-cdrom.xml	13 Jul 2007 15:58:51 -0000
@@ -17,6 +17,7 @@
     <acpi/>
     <apic/>
   </features>
+  <clock offset='utc'/>
   <devices>
     <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
     <disk type='block' device='disk'>


More information about the libvir-list mailing list