]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Change the internal domain conf representation of localtime/utc
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 2 Feb 2010 17:22:03 +0000 (17:22 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 1 Mar 2010 17:00:30 +0000 (17:00 +0000)
The XML will soon be extended to allow more than just a simple
localtime/utc boolean flag. This change replaces the plain
'int localtime' with a separate struct to prepare for future
extension

* src/conf/domain_conf.c, src/conf/domain_conf.h: Add a new
  virDomainClockDef structure
* src/libvirt_private.syms: Export virDomainClockOffsetTypeToString
  and virDomainClockOffsetTypeFromString
* src/qemu/qemu_conf.c, src/vbox/vbox_tmpl.c, src/xen/xend_internal.c,
  src/xen/xm_internal.c: Updated to use new structure for localtime

src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_conf.c
src/vbox/vbox_tmpl.c
src/xen/xend_internal.c
src/xen/xm_internal.c

index c1aa921d52ae3886e73ab15d207d60ec52e4d2e4..8a36fd8e37c4685e7c1866862acddb209cd3fdba 100644 (file)
@@ -232,6 +232,10 @@ VIR_ENUM_IMPL(virDomainNetdevMacvtap, VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST,
               "private",
               "bridge")
 
+VIR_ENUM_IMPL(virDomainClockOffset, VIR_DOMAIN_CLOCK_OFFSET_LAST,
+              "utc",
+              "localtime");
+
 #define virDomainReportError(code, fmt...)                           \
     virReportErrorHelper(NULL, VIR_FROM_DOMAIN, code, __FILE__,      \
                          __FUNCTION__, __LINE__, fmt)
@@ -3566,9 +3570,16 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
 
 
     tmp = virXPathString("string(./clock/@offset)", ctxt);
-    if (tmp && STREQ(tmp, "localtime"))
-        def->localtime = 1;
-    VIR_FREE(tmp);
+    if (tmp) {
+        if ((def->clock.offset = virDomainClockOffsetTypeFromString(tmp)) < 0) {
+            virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+                                 _("unknown clock offset '%s'"), tmp);
+            goto error;
+        }
+        VIR_FREE(tmp);
+    } else {
+        def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
+    }
 
     def->os.bootloader = virXPathString("string(./bootloader)", ctxt);
     def->os.bootloaderArgs = virXPathString("string(./bootloader_args)", ctxt);
@@ -5525,7 +5536,7 @@ char *virDomainDefFormat(virDomainDefPtr def,
         goto cleanup;
 
     virBufferVSprintf(&buf, "  <clock offset='%s'/>\n",
-                      def->localtime ? "localtime" : "utc");
+                      virDomainClockOffsetTypeToString(def->clock.offset));
 
     if (virDomainLifecycleDefFormat(&buf, def->onPoweroff,
                                     "on_poweroff") < 0)
index 5cc59e346e336db669f5a6ec29715f63f561607c..7ef99d6f0a10c1815da0c87bc506764c3722396f 100644 (file)
@@ -631,6 +631,19 @@ struct _virSecurityLabelDef {
     int type;
 };
 
+enum virDomainClockOffsetType {
+    VIR_DOMAIN_CLOCK_OFFSET_UTC = 0,
+    VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME = 1,
+
+    VIR_DOMAIN_CLOCK_OFFSET_LAST,
+};
+
+typedef struct _virDomainClockDef virDomainClockDef;
+typedef virDomainClockDef *virDomainClockDefPtr;
+struct _virDomainClockDef {
+    int offset;
+};
+
 #define VIR_DOMAIN_CPUMASK_LEN 1024
 
 /* Guest VM main configuration */
@@ -659,7 +672,7 @@ struct _virDomainDef {
     char *emulator;
     int features;
 
-    int localtime;
+    virDomainClockDef clock;
 
     int ngraphics;
     virDomainGraphicsDefPtr *graphics;
@@ -927,6 +940,7 @@ VIR_ENUM_DECL(virDomainGraphics)
 /* from libvirt.h */
 VIR_ENUM_DECL(virDomainState)
 VIR_ENUM_DECL(virDomainSeclabel)
+VIR_ENUM_DECL(virDomainClockOffset)
 
 VIR_ENUM_DECL(virDomainNetdevMacvtap)
 
index 185eb64662390d5dc8d87bc896bfc56daf69e2bd..5b3fc71d840eb8f5aaba28e24bcf86eb99fb6d04 100644 (file)
@@ -189,6 +189,8 @@ virDomainDefAddImplicitControllers;
 virDomainDefClearPCIAddresses;
 virDomainDefClearDeviceAliases;
 virDomainDeviceInfoIterate;
+virDomainClockOffsetTypeToString;
+virDomainClockOffsetTypeFromString;
 
 
 # domain_event.h
index eee6222b769f2344071e5e2d5ab3b652f21cf015..8d5960e3e8b5268d0f5c1301bb0e31a17762c122 100644 (file)
@@ -3488,8 +3488,14 @@ int qemudBuildCommandLine(virConnectPtr conn,
         }
     }
 
-    if (def->localtime)
+    if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME)
         ADD_ARG_LIT("-localtime");
+    else if (def->clock.offset != VIR_DOMAIN_CLOCK_OFFSET_UTC) {
+        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                        _("unsupported clock offset '%s'"),
+                        virDomainClockOffsetTypeToString(def->clock.offset));
+        goto error;
+    }
 
     if ((qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT) &&
         def->onReboot != VIR_DOMAIN_LIFECYCLE_RESTART)
@@ -5326,6 +5332,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
     def->id = -1;
     def->memory = def->maxmem = 64 * 1024;
     def->vcpus = 1;
+    def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
     def->features = (1 << VIR_DOMAIN_FEATURE_ACPI)
         /*| (1 << VIR_DOMAIN_FEATURE_APIC)*/;
     def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART;
@@ -5505,7 +5512,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
         } else if (STREQ(arg, "-full-screen")) {
             fullscreen = 1;
         } else if (STREQ(arg, "-localtime")) {
-            def->localtime = 1;
+            def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME;
         } else if (STREQ(arg, "-kernel")) {
             WANT_VALUE();
             if (!(def->os.kernel = strdup(val)))
index 8a9af523309235f23fa3df347ed847db50d8dac8..c414fb812abfdf0af19a0b3fd202e11d671bfcf0 100644 (file)
@@ -2051,7 +2051,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
 
             /* Currently VirtualBox always uses locatime
              * so locatime is always true here */
-            def->localtime = 1;
+            def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME;
 
             /* dump video options vram/2d/3d/directx/etc. */
             {
index 9d952914b60133766638594e43033dc101c98152..860cd6a7e6e7cf8296ea34c8ec36cc72af50c74e 100644 (file)
@@ -2451,7 +2451,7 @@ xenDaemonParseSxpr(virConnectPtr conn,
     } else
         def->onCrash = VIR_DOMAIN_LIFECYCLE_DESTROY;
 
-
+    def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
     if (hvm) {
         if (sexpr_int(root, "domain/image/hvm/acpi"))
             def->features |= (1 << VIR_DOMAIN_FEATURE_ACPI);
@@ -2462,12 +2462,12 @@ xenDaemonParseSxpr(virConnectPtr conn,
 
         /* Old XenD only allows localtime here for HVM */
         if (sexpr_int(root, "domain/image/hvm/localtime"))
-            def->localtime = 1;
+            def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME;
     }
 
     /* Current XenD allows localtime here, for PV and HVM */
     if (sexpr_int(root, "domain/localtime"))
-        def->localtime = 1;
+        def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME;
 
     if (sexpr_node_copy(root, hvm ?
                         "domain/image/hvm/device_model" :
@@ -5846,8 +5846,14 @@ xenDaemonFormatSxpr(virConnectPtr conn,
     virBufferVSprintf(&buf, "(on_crash '%s')", tmp);
 
     /* Set localtime here for current XenD (both PV & HVM) */
-    if (def->localtime)
+    if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME)
         virBufferAddLit(&buf, "(localtime 1)");
+    else if (def->clock.offset != VIR_DOMAIN_CLOCK_OFFSET_UTC) {
+        virXendError(conn, VIR_ERR_CONFIG_UNSUPPORTED,
+                     _("unsupported clock offset '%s'"),
+                     virDomainClockOffsetTypeToString(def->clock.offset));
+        goto error;
+    }
 
     if (!def->os.bootloader) {
         if (STREQ(def->os.type, "hvm"))
@@ -5965,7 +5971,7 @@ xenDaemonFormatSxpr(virConnectPtr conn,
             }
 
             /* Set localtime here to keep old XenD happy for HVM */
-            if (def->localtime)
+            if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME)
                 virBufferAddLit(&buf, "(localtime 1)");
 
             if (def->sounds) {
index 8d48eda87544fc485a4754eeaef1edcb629f3c98..4c2066698d5dc51a90fa84b7e474230e35576ad4 100644 (file)
@@ -683,6 +683,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
     virDomainHostdevDefPtr hostdev = NULL;
     int i;
     const char *defaultArch, *defaultMachine;
+    int vmlocaltime = 0;
 
     if (VIR_ALLOC(def) < 0) {
         virReportOOMError();
@@ -830,9 +831,13 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
         else if (val)
             def->features |= (1 << VIR_DOMAIN_FEATURE_APIC);
     }
-    if (xenXMConfigGetBool(conn, conf, "localtime", &def->localtime, 0) < 0)
+    if (xenXMConfigGetBool(conn, conf, "localtime", &vmlocaltime, 0) < 0)
         goto cleanup;
 
+    def->clock.offset = vmlocaltime ?
+        VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME :
+        VIR_DOMAIN_CLOCK_OFFSET_UTC;
+
     if (xenXMConfigCopyStringOpt(conn, conf, "device_model", &def->emulator) < 0)
         goto cleanup;
 
@@ -2323,8 +2328,18 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
             goto no_memory;
 
 
-        if (xenXMConfigSetInt(conf, "localtime", def->localtime ? 1 : 0) < 0)
-            goto no_memory;
+        if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME ||
+            def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_UTC) {
+            if (xenXMConfigSetInt(conf, "localtime",
+                                  def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME ?
+                                  1 : 0) < 0)
+                goto no_memory;
+        } else {
+            xenXMError(conn, VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("unsupported clock offset '%s'"),
+                       virDomainClockOffsetTypeToString(def->clock.offset));
+            goto cleanup;
+        }
 
         if (priv->xendConfigVersion == 1) {
             for (i = 0 ; i < def->ndisks ; i++) {