[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH v3 5/9] qemu: add helper for querying timezone info



On 8/23/19 6:31 PM, Jonathon Jongsma wrote:
This function queries timezone information within the guest and adds
the information to an array of typed parameters with field names
intended to be returned to virDomainGetGuestInfo()

Signed-off-by: Jonathon Jongsma <jjongsma redhat com>
---
  src/qemu/qemu_agent.c | 46 ++++++++++++++++++++++++++
  src/qemu/qemu_agent.h |  1 +
  tests/qemuagenttest.c | 76 +++++++++++++++++++++++++++++++++++++++++++
  3 files changed, 123 insertions(+)

diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
index 0fcc3fdabd..e986204162 100644
--- a/src/qemu/qemu_agent.c
+++ b/src/qemu/qemu_agent.c
@@ -2384,3 +2384,49 @@ qemuAgentGetOSInfo(qemuAgentPtr mon,
      virJSONValueFree(reply);
      return ret;
  }
+
+int
+qemuAgentGetTimezone(qemuAgentPtr mon,
+                     virTypedParameterPtr *params,
+                     int *nparams,
+                     int *maxparams)
+{
+    int ret = -1;
+    virJSONValuePtr cmd;
+    virJSONValuePtr reply = NULL;
+    virJSONValuePtr data = NULL;
+    const char *name;
+    int offset;
+
+    if (!(cmd = qemuAgentMakeCommand("guest-get-timezone", NULL)))
+        return -1;
+
+    if (qemuAgentCommand(mon, cmd, &reply, true,
+                         VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0)
+        goto cleanup;
+
+    if (!(data = virJSONValueObjectGetObject(reply, "return"))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("guest-get-timezone reply was missing return data"));
+        goto cleanup;
+    }
+
+    if ((name = virJSONValueObjectGetString(data, "zone")) == NULL)
+        goto cleanup;
+    if (virTypedParamsAddString(params, nparams, maxparams,
+                                "timezone.name", name) < 0)
+        goto cleanup;

According to qemu-ga qapi schema (qga/qapi-schema.json) the "zone" is optional (denoted by asterisk before the attribute name).

+
+    if ((virJSONValueObjectGetNumberInt(data, "offset", &offset)) < 0)
+        goto cleanup;
+    if (virTypedParamsAddInt(params, nparams, maxparams,
+                             "timezone.offset", offset) < 0)
+        goto cleanup;
+
+    ret = 0;
+
+ cleanup:
+    virJSONValueFree(cmd);
+    virJSONValueFree(reply);
+    return ret;
+}
diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h
index ee019455e5..69b0176855 100644
--- a/src/qemu/qemu_agent.h
+++ b/src/qemu/qemu_agent.h
@@ -123,3 +123,4 @@ int qemuAgentSetUserPassword(qemuAgentPtr mon,
int qemuAgentGetUsers(qemuAgentPtr mon, virTypedParameterPtr *params, int *nparams, int *maxparams);
  int qemuAgentGetOSInfo(qemuAgentPtr mon, virTypedParameterPtr *params, int *nparams, int *maxparams);
+int qemuAgentGetTimezone(qemuAgentPtr mon, virTypedParameterPtr *params, int *nparams, int *maxparams);

Again, looong line.

diff --git a/tests/qemuagenttest.c b/tests/qemuagenttest.c
index 489b77d403..0912a5f29a 100644
--- a/tests/qemuagenttest.c
+++ b/tests/qemuagenttest.c
@@ -1189,7 +1189,82 @@ testQemuAgentOSInfo(const void *data)
      return ret;
  }
+static const char testQemuAgentTimezoneResponse1[] =
+"{\"return\":{\"zone\":\"IST\",\"offset\":19800}}";
+static const char testQemuAgentTimezoneResponse2[] =
+"{\"return\":{\"zone\":\"CEST\",\"offset\":7200}}";
+static const char testQemuAgentTimezoneResponse3[] =
+"{\"return\":{\"zone\":\"NDT\",\"offset\":-9000}}";
+static const char testQemuAgentTimezoneResponse4[] =
+"{\"return\":{\"zone\":\"PDT\",\"offset\":-25200}}";
+static int
+testQemuAgentTimezone(const void *data)
+{
+    virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
+    qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt);
+    int ret = -1;
+
+    if (!test)
+        return -1;
+
+#define VALIDATE_TIMEZONE(response_, expected_name_, expected_offset_) \
+    do { \
+        virTypedParameterPtr params_ = NULL; \
+        int nparams_ = 0; \
+        int maxparams_ = 0; \
+        const char *name_ = NULL; \
+        int offset_; \
+        if (qemuMonitorTestAddAgentSyncResponse(test) < 0) \
+        goto cleanup; \
+        if (qemuMonitorTestAddItem(test, "guest-get-timezone", \
+                                   response_) < 0) \
+        goto cleanup; \

These gotos look a bit misindented :-)

Michal


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]