[libvirt] [PATCH 1/6] Change the internal domain conf representation of localtime/utc

Daniel Veillard veillard at redhat.com
Mon Mar 1 13:52:32 UTC 2010


On Thu, Feb 18, 2010 at 05:54:27PM +0000, Daniel P. Berrange wrote:
> 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   |   19 +++++++++++++++----
>  src/conf/domain_conf.h   |   16 +++++++++++++++-
>  src/libvirt_private.syms |    2 ++
>  src/qemu/qemu_conf.c     |   11 +++++++++--
>  src/vbox/vbox_tmpl.c     |    2 +-
>  src/xen/xend_internal.c  |   16 +++++++++++-----
>  src/xen/xm_internal.c    |   21 ++++++++++++++++++---
>  7 files changed, 71 insertions(+), 16 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 561fa22..f86b4eb 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -229,6 +229,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)
> @@ -3478,9 +3482,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);
> @@ -5389,7 +5400,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)
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 231d8c8..fbbe683 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -609,6 +609,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 */
> @@ -637,7 +650,7 @@ struct _virDomainDef {
>      char *emulator;
>      int features;
>  
> -    int localtime;
> +    virDomainClockDef clock;
>  
>      int ngraphics;
>      virDomainGraphicsDefPtr *graphics;
> @@ -911,6 +924,7 @@ VIR_ENUM_DECL(virDomainGraphics)
>  /* from libvirt.h */
>  VIR_ENUM_DECL(virDomainState)
>  VIR_ENUM_DECL(virDomainSeclabel)
> +VIR_ENUM_DECL(virDomainClockOffset)
>  
>  VIR_ENUM_DECL(virDomainNetdevMacvtap)
>  
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index aa826d6..1af34bd 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -190,6 +190,8 @@ virDomainDefAddDiskControllers;
>  virDomainDefClearPCIAddresses;
>  virDomainDefClearDeviceAliases;
>  virDomainDeviceInfoIterate;
> +virDomainClockOffsetTypeToString;
> +virDomainClockOffsetTypeFromString;
>  
>  
>  # domain_event.h
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index c9fe55b..a207fc7 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -3400,8 +3400,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)
> @@ -5218,6 +5224,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;
> @@ -5397,7 +5404,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)))
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 8a9af52..c414fb8 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -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. */
>              {
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 88923c8..c88ea64 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -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) {
> diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> index 8d48eda..4c20666 100644
> --- a/src/xen/xm_internal.c
> +++ b/src/xen/xm_internal.c
> @@ -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++) {

  Okay, def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_UTC is the old
  equivalent of def->localtime == 0 i.e. the default,

  ACK,

Daniel

-- 
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