[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