[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