[libvirt] [PATCH v3 5/9] qemu: add helper for querying timezone info
Michal Privoznik
mprivozn at redhat.com
Mon Aug 26 15:29:30 UTC 2019
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 at 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
More information about the libvir-list
mailing list