[libvirt] [PATCH 4/5] Add a qemuMonitorGetVersion() method for query-version command

Eric Blake eblake at redhat.com
Mon Aug 20 16:29:39 UTC 2012


On 08/20/2012 07:49 AM, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> Add a new qemuMonitorGetVersion() method to support invocation
> of the 'query-version' JSON monitor command. No HMP equivalent
> is provided, since this will only be used for QEMU >= 1.2
> ---
>  src/qemu/qemu_monitor.c      |  24 ++++++++++
>  src/qemu/qemu_monitor.h      |   7 +++
>  src/qemu/qemu_monitor_json.c |  78 +++++++++++++++++++++++++++++++++
>  src/qemu/qemu_monitor_json.h |   7 +++
>  tests/qemumonitorjsontest.c  | 102 +++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 218 insertions(+)
> 

> +    if (!mon) {
> +        virReportError(VIR_ERR_INVALID_ARG, "%s",
> +                       _("monitor must not be NULL"));
> +        return -1;

Given this error,

> +++ b/src/qemu/qemu_monitor.h
> @@ -574,6 +574,13 @@ int qemuMonitorGetBlockIoThrottle(qemuMonitorPtr mon,
>  
>  int qemuMonitorSystemWakeup(qemuMonitorPtr mon);
>  
> +int qemuMonitorGetVersion(qemuMonitorPtr mon,
> +                          int *major,
> +                          int *minor,
> +                          int *micro,
> +                          char **package)
> +    ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);

why not ATTRIBUTE_NONNULL(1) as well?

> +    if (virJSONValueObjectGetNumberInt(qemu, "micro", micro) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("query-version reply was missing 'micro' version"));
> +        goto cleanup;
> +    }

query-version has existed since 0.14.0, so we are safe using it if we
assume JSON.

Hmm, weren't there versions, like 1.1, which lacked micro?
/me researches...
That's true for the 'qemu -help' output, but it appears that the QMP
command has always provided micro, even when it is 0.  So this should be
safe.

> +    if (package) {
> +        const char *tmp;
> +        if (!(tmp = virJSONValueObjectGetString(data, "package"))) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("query-version reply was missing 'package' version"));
> +            goto cleanup;
> +        }

Why is it an error if package is non-NULL but package data was not
present?  Can't we just leave *package=NULL in that case, rather than
erroring out?  After all, when package is NULL, we don't care whether
package data was present.

> +
> +    if (qemuMonitorTestAddItem(test, "query-version",
> +                               "{ "
> +                               "  \"return\":{ "
> +                               "     \"qemu\":{ "
> +                               "        \"major\":0, "
> +                               "        \"minor\":11, "
> +                               "        \"micro\":6 "
> +                               "      },"
> +                               "     \"package\":\"2.283.el6\""
> +                               "  }"
> +                               "}") < 0)

Shouldn't we test typical values in use by actual qemu?  For example,
with RHEL, I see something like "package":"(qemu-kvm-0.12.1.2)".

Overall, I like the idea.  But do we have any code that uses the new
monitor command, besides the testsuite?

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120820/1b5e480b/attachment-0001.sig>


More information about the libvir-list mailing list