Re: [libvirt] [PATCH 3/6] Support variable clock offset mode in QEMU

2010-03-01 Thread Daniel Veillard
On Thu, Feb 18, 2010 at 05:54:29PM +, Daniel P. Berrange wrote:
> This allows QEMU guests to be started with an arbitrary clock
> offset
> 
> The test case can't actually be enabled, since QEMU argv expects
> an absolute timestring, and this will obviously change every
> time the test runs :-( Hopefully QEMU will allow a relative
> time offset in the future.
> 
> * src/qemu/qemu_conf.c, src/qemu/qemu_conf.h: Use the -rtc arg
>   if available to support variable clock offset mode
> * tests/qemuhelptest.c: Add QEMUD_CMD_FLAG_RTC for qemu 0.12.1
> * qemuxml2argvdata/qemuxml2argv-clock-variable.args,
>   qemuxml2argvdata/qemuxml2argv-clock-variable.xml,
>   qemuxml2argvtest.c: Test case, except we can't actually enable
>   it yet.
> ---
>  src/qemu/qemu_conf.c   |   82 
> ++--
>  src/qemu/qemu_conf.h   |1 +
>  tests/qemuhelptest.c   |3 +-
>  .../qemuxml2argv-clock-variable.args   |1 +
>  .../qemuxml2argv-clock-variable.xml|   24 ++
>  tests/qemuxml2argvtest.c   |4 +
>  6 files changed, 107 insertions(+), 8 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-variable.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-variable.xml
> 
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index a207fc7..112a7c2 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -1155,6 +1155,9 @@ static unsigned long long qemudComputeCmdFlags(const 
> char *help,
>  flags |= QEMUD_CMD_FLAG_BALLOON;
>  if (strstr(help, "-device"))
>  flags |= QEMUD_CMD_FLAG_DEVICE;
> +/* The trailing ' ' is important to avoid a bogus match */
> +if (strstr(help, "-rtc "))
> +flags |= QEMUD_CMD_FLAG_RTC;
>  /* Keep disabled till we're actually ready to turn on netdev mode
>   * The plan is todo it in 0.13.0 QEMU, but lets wait & see... */
>  #if 0
> @@ -2969,6 +2972,56 @@ error:
>  }
>  
>  
> +static char *
> +qemuBuildClockArgStr(virDomainClockDefPtr def)
> +{
> +virBuffer buf = VIR_BUFFER_INITIALIZER;
> +
> +switch (def->offset) {
> +case VIR_DOMAIN_CLOCK_OFFSET_UTC:
> +virBufferAddLit(&buf, "base=utc");
> +break;
> +
> +case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME:
> +virBufferAddLit(&buf, "base=localtime");
> +break;
> +
> +case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE: {
> +time_t now = time(NULL);
> +struct tm nowbits;
> +
> +now += def->adjustment;
> +gmtime_r(&now, &nowbits);
> +
> +virBufferVSprintf(&buf, "base=%d-%d-%dT%d:%d:%d",
> +  nowbits.tm_year,
> +  nowbits.tm_mon,
> +  nowbits.tm_mday,
> +  nowbits.tm_hour,
> +  nowbits.tm_min,
> +  nowbits.tm_sec);
> +}   break;
> +
> +default:
> +qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +_("unsupported clock offset '%s'"),
> +virDomainClockOffsetTypeToString(def->offset));
> +goto error;
> +}
> +
> +if (virBufferError(&buf)) {
> +virReportOOMError();
> +goto error;
> +}
> +
> +return virBufferContentAndReset(&buf);
> +
> +error:
> +virBufferFreeAndReset(&buf);
> +return NULL;
> +}
> +
> +
>  static int
>  qemuBuildCpuArgStr(const struct qemud_driver *driver,
> const virDomainDefPtr def,
> @@ -3400,13 +3453,28 @@ int qemudBuildCommandLine(virConnectPtr conn,
>  }
>  }
>  
> -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_RTC) {
> +const char *rtcopt;
> +ADD_ARG_LIT("-rtc");
> +if (!(rtcopt = qemuBuildClockArgStr(&def->clock)))
> +goto error;
> +ADD_ARG(rtcopt);
> +} else {
> +switch (def->clock.offset) {
> +case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME:
> +ADD_ARG_LIT("-localtime");
> +break;
> +
> +case VIR_DOMAIN_CLOCK_OFFSET_UTC:
> +/* Nothing, its the default */
> +break;
> +
> +default:
> +qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +_("unsupported clock offset '%s'"),
> +
> virDomainClockOffsetTypeToString(def->clock.offset));
> +goto error;
> +}
>  }
>  
>  if ((qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT) &&
> diff --git a/src/qemu/qemu_conf.h b/src/qe

[libvirt] [PATCH 3/6] Support variable clock offset mode in QEMU

2010-02-18 Thread Daniel P. Berrange
This allows QEMU guests to be started with an arbitrary clock
offset

The test case can't actually be enabled, since QEMU argv expects
an absolute timestring, and this will obviously change every
time the test runs :-( Hopefully QEMU will allow a relative
time offset in the future.

* src/qemu/qemu_conf.c, src/qemu/qemu_conf.h: Use the -rtc arg
  if available to support variable clock offset mode
* tests/qemuhelptest.c: Add QEMUD_CMD_FLAG_RTC for qemu 0.12.1
* qemuxml2argvdata/qemuxml2argv-clock-variable.args,
  qemuxml2argvdata/qemuxml2argv-clock-variable.xml,
  qemuxml2argvtest.c: Test case, except we can't actually enable
  it yet.
---
 src/qemu/qemu_conf.c   |   82 ++--
 src/qemu/qemu_conf.h   |1 +
 tests/qemuhelptest.c   |3 +-
 .../qemuxml2argv-clock-variable.args   |1 +
 .../qemuxml2argv-clock-variable.xml|   24 ++
 tests/qemuxml2argvtest.c   |4 +
 6 files changed, 107 insertions(+), 8 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-variable.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-variable.xml

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index a207fc7..112a7c2 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1155,6 +1155,9 @@ static unsigned long long qemudComputeCmdFlags(const char 
*help,
 flags |= QEMUD_CMD_FLAG_BALLOON;
 if (strstr(help, "-device"))
 flags |= QEMUD_CMD_FLAG_DEVICE;
+/* The trailing ' ' is important to avoid a bogus match */
+if (strstr(help, "-rtc "))
+flags |= QEMUD_CMD_FLAG_RTC;
 /* Keep disabled till we're actually ready to turn on netdev mode
  * The plan is todo it in 0.13.0 QEMU, but lets wait & see... */
 #if 0
@@ -2969,6 +2972,56 @@ error:
 }
 
 
+static char *
+qemuBuildClockArgStr(virDomainClockDefPtr def)
+{
+virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+switch (def->offset) {
+case VIR_DOMAIN_CLOCK_OFFSET_UTC:
+virBufferAddLit(&buf, "base=utc");
+break;
+
+case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME:
+virBufferAddLit(&buf, "base=localtime");
+break;
+
+case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE: {
+time_t now = time(NULL);
+struct tm nowbits;
+
+now += def->adjustment;
+gmtime_r(&now, &nowbits);
+
+virBufferVSprintf(&buf, "base=%d-%d-%dT%d:%d:%d",
+  nowbits.tm_year,
+  nowbits.tm_mon,
+  nowbits.tm_mday,
+  nowbits.tm_hour,
+  nowbits.tm_min,
+  nowbits.tm_sec);
+}   break;
+
+default:
+qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+_("unsupported clock offset '%s'"),
+virDomainClockOffsetTypeToString(def->offset));
+goto error;
+}
+
+if (virBufferError(&buf)) {
+virReportOOMError();
+goto error;
+}
+
+return virBufferContentAndReset(&buf);
+
+error:
+virBufferFreeAndReset(&buf);
+return NULL;
+}
+
+
 static int
 qemuBuildCpuArgStr(const struct qemud_driver *driver,
const virDomainDefPtr def,
@@ -3400,13 +3453,28 @@ int qemudBuildCommandLine(virConnectPtr conn,
 }
 }
 
-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_RTC) {
+const char *rtcopt;
+ADD_ARG_LIT("-rtc");
+if (!(rtcopt = qemuBuildClockArgStr(&def->clock)))
+goto error;
+ADD_ARG(rtcopt);
+} else {
+switch (def->clock.offset) {
+case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME:
+ADD_ARG_LIT("-localtime");
+break;
+
+case VIR_DOMAIN_CLOCK_OFFSET_UTC:
+/* Nothing, its the default */
+break;
+
+default:
+qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+_("unsupported clock offset '%s'"),
+
virDomainClockOffsetTypeToString(def->clock.offset));
+goto error;
+}
 }
 
 if ((qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT) &&
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 7041489..e32a3d7 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -82,6 +82,7 @@ enum qemud_cmd_flags {
 QEMUD_CMD_FLAG_SDL   = (1 << 27), /* Is the new -sdl arg available 
*/
 QEMUD_CMD_FLAG_SMP_TOPOLOGY  = (1 << 28), /* Is 
sockets=s,cores=c,threads=t available for -smp? */
 QEMUD_CMD

[libvirt] [PATCH 3/6] Support variable clock offset mode in QEMU

2010-02-02 Thread Daniel P. Berrange
This allows QEMU guests to be started with an arbitrary clock
offset

The test case can't actually be enabled, since QEMU argv expects
an absolute timestring, and this will obviously change every
time the test runs :-( Hopefully QEMU will allow a relative
time offset in the future.

* src/qemu/qemu_conf.c, src/qemu/qemu_conf.h: Use the -rtc arg
  if available to support variable clock offset mode
* tests/qemuhelptest.c: Add QEMUD_CMD_FLAG_RTC for qemu 0.12.1
* qemuxml2argvdata/qemuxml2argv-clock-variable.args,
  qemuxml2argvdata/qemuxml2argv-clock-variable.xml,
  qemuxml2argvtest.c: Test case, except we can't actually enable
  it yet.
---
 src/qemu/qemu_conf.c   |   75 ++--
 src/qemu/qemu_conf.h   |1 +
 tests/qemuhelptest.c   |3 +-
 .../qemuxml2argv-clock-variable.args   |1 +
 .../qemuxml2argv-clock-variable.xml|   24 ++
 tests/qemuxml2argvtest.c   |4 +
 6 files changed, 100 insertions(+), 8 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-variable.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-variable.xml

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 8109820..bf77f3c 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1154,6 +1154,9 @@ static unsigned int qemudComputeCmdFlags(const char *help,
 flags |= QEMUD_CMD_FLAG_BALLOON;
 if (strstr(help, "-device"))
 flags |= QEMUD_CMD_FLAG_DEVICE;
+/* The trailing ' ' is important to avoid a bogus match */
+if (strstr(help, "-rtc "))
+flags |= QEMUD_CMD_FLAG_RTC;
 /* Keep disabled till we're actually ready to turn on netdev mode
  * The plan is todo it in 0.13.0 QEMU, but lets wait & see... */
 #if 0
@@ -2882,6 +2885,56 @@ error:
 }
 
 
+static char *
+qemuBuildClockArgStr(virDomainClockDefPtr def)
+{
+virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+switch (def->offset) {
+case VIR_DOMAIN_CLOCK_OFFSET_UTC:
+virBufferAddLit(&buf, "base=utc");
+break;
+
+case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME:
+virBufferAddLit(&buf, "base=localtime");
+break;
+
+case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE: {
+time_t now = time(NULL);
+struct tm nowbits;
+
+now += def->adjustment;
+gmtime_r(&now, &nowbits);
+
+virBufferVSprintf(&buf, "base=%d-%d-%dT%d:%d:%d",
+  nowbits.tm_year,
+  nowbits.tm_mon,
+  nowbits.tm_mday,
+  nowbits.tm_hour,
+  nowbits.tm_min,
+  nowbits.tm_sec);
+}   break;
+
+default:
+qemudReportError(NULL, NULL, NULL, VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unsupported clock offset '%s'"),
+ virDomainClockOffsetTypeToString(def->offset));
+goto error;
+}
+
+if (virBufferError(&buf)) {
+virReportOOMError(NULL);
+goto error;
+}
+
+return virBufferContentAndReset(&buf);
+
+error:
+virBufferFreeAndReset(&buf);
+return NULL;
+}
+
+
 static int
 qemuBuildCpuArgStr(virConnectPtr conn,
const struct qemud_driver *driver,
@@ -3312,13 +3365,21 @@ int qemudBuildCommandLine(virConnectPtr conn,
 }
 }
 
-if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME)
-ADD_ARG_LIT("-localtime");
-else if (def->clock.offset != VIR_DOMAIN_CLOCK_OFFSET_UTC) {
-qemudReportError(conn, NULL, NULL, VIR_ERR_CONFIG_UNSUPPORTED,
- _("unsupported clock offset '%s'"),
- virDomainClockOffsetTypeToString(def->clock.offset));
-goto error;
+if (qemuCmdFlags & QEMUD_CMD_FLAG_RTC) {
+const char *rtcopt;
+ADD_ARG_LIT("-rtc");
+if (!(rtcopt = qemuBuildClockArgStr(&def->clock)))
+goto error;
+ADD_ARG(rtcopt);
+} else {
+if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME)
+ADD_ARG_LIT("-localtime");
+else if (def->clock.offset != VIR_DOMAIN_CLOCK_OFFSET_UTC) {
+qemudReportError(conn, NULL, NULL, VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unsupported clock offset '%s'"),
+ 
virDomainClockOffsetTypeToString(def->clock.offset));
+goto error;
+}
 }
 
 if ((qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT) &&
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 101f187..f67284b 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -82,6 +82,7 @@ enum qemud_cmd_flags {
 QEMUD_CMD_FLAG_SDL   = (1 << 27), /* Is the new -sdl arg available 
*/
 QEMUD_CMD_FLAG_SMP_TOPOLOGY  = (1 << 28), /* Is 
sockets=s,cores=c,threads=t available for -smp? */
 QEMUD_CMD_FLAG_NETDEV= (1 << 29), /* The -net