[libvirt] [PATCH v3 5/9] qemu: add helper for querying timezone info
Daniel Henrique Barboza
danielhb413 at gmail.com
Fri Aug 23 19:59:49 UTC 2019
On 8/23/19 1: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 at redhat.com>
> ---
I spotted two missing indentations down there, but other than that,
LGTM.
Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
Tested-by: Daniel Henrique Barboza <danielhb413 at gmail.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;
> +
> + 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);
> 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; \
"goto cleanup" should be indented 4 spaces after the preceeding 'if'
> + if (qemuMonitorTestAddItem(test, "guest-get-timezone", \
> + response_) < 0) \
> + goto cleanup; \
"goto cleanup" should be indented 4 spaces after the preceeding 'if'
> + if (qemuAgentGetTimezone(qemuMonitorTestGetAgent(test), \
> + ¶ms_, &nparams_, &maxparams_) < 0) \
> + goto cleanup; \
> + if (nparams_ != 2) { \
> + virReportError(VIR_ERR_INTERNAL_ERROR, \
> + "Expected 2 params, got %d", nparams_); \
> + goto cleanup; \
> + } \
> + if (virTypedParamsGetString(params_, nparams_, \
> + "timezone.name", &name_) < 0) { \
> + virReportError(VIR_ERR_INTERNAL_ERROR, "missing param '%s'", \
> + "tiemzone.name"); \
> + goto cleanup; \
> + } \
> + if (STRNEQ(name_, expected_name_)) { \
> + virReportError(VIR_ERR_INTERNAL_ERROR, \
> + "Expected name '%s', got '%s'", expected_name_, name_); \
> + goto cleanup; \
> + } \
> + if (virTypedParamsGetInt(params_, nparams_, \
> + "timezone.offset", &offset_) < 0) { \
> + virReportError(VIR_ERR_INTERNAL_ERROR, "missing param '%s'", \
> + "tiemzone.offset"); \
> + goto cleanup; \
> + } \
> + if (offset_ != expected_offset_) { \
> + virReportError(VIR_ERR_INTERNAL_ERROR, \
> + "Expected offset '%i', got '%i'", offset_, \
> + expected_offset_); \
> + goto cleanup; \
> + } \
> + virTypedParamsFree(params_, nparams_); \
> + } while (0)
> +
> + VALIDATE_TIMEZONE(testQemuAgentTimezoneResponse1, "IST", 19800);
> + VALIDATE_TIMEZONE(testQemuAgentTimezoneResponse2, "CEST", 7200);
> + VALIDATE_TIMEZONE(testQemuAgentTimezoneResponse3, "NDT", -9000);
> + VALIDATE_TIMEZONE(testQemuAgentTimezoneResponse4, "PDT", -25200);
> +
> + ret = 0;
> +
> + cleanup:
> + qemuMonitorTestFree(test);
> + return ret;
> +}
> static int
> mymain(void)
> {
> @@ -1221,6 +1296,7 @@ mymain(void)
> DO_TEST(GetInterfaces);
> DO_TEST(Users);
> DO_TEST(OSInfo);
> + DO_TEST(Timezone);
>
> DO_TEST(Timeout); /* Timeout should always be called last */
>
More information about the libvir-list
mailing list