[libvirt] [PATCH v2 4/9] qemu: add helper function for querying OS info

Daniel Henrique Barboza danielhb413 at gmail.com
Thu Aug 22 21:38:51 UTC 2019



On 8/21/19 7:15 PM, Jonathon Jongsma wrote:
> This function queries the guest operating system information and adds
> the returned information to an array of typed parameters with field
> names intended to be returned in virDomainGetGuestInfo().
>
> Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>

Code looks good, but it fails make syntax-check here in my env:

cppi: src/qemu/qemu_agent.c: line 2360: not properly indented
cppi: tests/qemuagenttest.c: line 1127: not properly indented
maint.mk: incorrect preprocessor indentation
make: *** [cfg.mk:699: sc_preprocessor_indentation] Error 1
make: *** Waiting for unfinished jobs.


Thanks,

DHB

> ---
>   src/qemu/qemu_agent.c |  53 ++++++++++++++++++
>   src/qemu/qemu_agent.h |   1 +
>   tests/qemuagenttest.c | 122 ++++++++++++++++++++++++++++++++++++++++++
>   3 files changed, 176 insertions(+)
>
> diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
> index 963a4b9359..cd4105bfb8 100644
> --- a/src/qemu/qemu_agent.c
> +++ b/src/qemu/qemu_agent.c
> @@ -2331,3 +2331,56 @@ qemuAgentGetUsers(qemuAgentPtr mon,
>       virJSONValueFree(reply);
>       return ret;
>   }
> +
> +int
> +qemuAgentGetOSInfo(qemuAgentPtr mon,
> +                   virTypedParameterPtr *params,
> +                   int *nparams,
> +                   int *maxparams)
> +{
> +    int ret = -1;
> +    virJSONValuePtr cmd;
> +    virJSONValuePtr reply = NULL;
> +    virJSONValuePtr data = NULL;
> +    const char *result;
> +
> +    if (!(cmd = qemuAgentMakeCommand("guest-get-osinfo", 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-osinfo reply was missing return data"));
> +        goto cleanup;
> +    }
> +
> +# define OSINFO_ADD_PARAM(agent_string_, param_string_) \
> +    do { \
> +        if ((result = virJSONValueObjectGetString(data, agent_string_))) { \
> +            if (virTypedParamsAddString(params, nparams, maxparams, \
> +                                        param_string_, result) < 0) { \
> +                goto cleanup; \
> +            } \
> +        } \
> +    } while (0)
> +    OSINFO_ADD_PARAM("id", "os.id");
> +    OSINFO_ADD_PARAM("name", "os.name");
> +    OSINFO_ADD_PARAM("pretty-name", "os.pretty-name");
> +    OSINFO_ADD_PARAM("version", "os.version");
> +    OSINFO_ADD_PARAM("version-id", "os.version-id");
> +    OSINFO_ADD_PARAM("machine", "os.machine");
> +    OSINFO_ADD_PARAM("variant", "os.variant");
> +    OSINFO_ADD_PARAM("variant-id", "os.variant-id");
> +    OSINFO_ADD_PARAM("kernel-release", "os.kernel-release");
> +    OSINFO_ADD_PARAM("kernel-version", "os.kernel-version");
> +
> +    ret = 0;
> +
> + cleanup:
> +    virJSONValueFree(cmd);
> +    virJSONValueFree(reply);
> +    return ret;
> +}
> diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h
> index 05621b521a..ee019455e5 100644
> --- a/src/qemu/qemu_agent.h
> +++ b/src/qemu/qemu_agent.h
> @@ -122,3 +122,4 @@ int qemuAgentSetUserPassword(qemuAgentPtr mon,
>                                bool crypted);
>   
>   int qemuAgentGetUsers(qemuAgentPtr mon, virTypedParameterPtr *params, int *nparams, int *maxparams);
> +int qemuAgentGetOSInfo(qemuAgentPtr mon, virTypedParameterPtr *params, int *nparams, int *maxparams);
> diff --git a/tests/qemuagenttest.c b/tests/qemuagenttest.c
> index f2936a59f0..9467c51d54 100644
> --- a/tests/qemuagenttest.c
> +++ b/tests/qemuagenttest.c
> @@ -1068,6 +1068,127 @@ testQemuAgentUsers(const void *data)
>       return ret;
>   }
>   
> +static const char testQemuAgentOSInfoResponse[] =
> +    "{\"return\": "
> +    "   {\"name\":\"CentOS Linux\", "
> +    "   \"kernel-release\":\"3.10.0-862.14.4.el7.x86_64\", "
> +    "   \"version\":\"7 (Core)\", "
> +    "   \"pretty-name\":\"CentOS Linux 7 (Core)\", "
> +    "   \"version-id\":\"7\", "
> +    "   \"kernel-version\":\"#1 SMP Wed Sep 26 15:12:11 UTC 2018\", "
> +    "   \"machine\":\"x86_64\", "
> +    "   \"id\":\"centos\"} "
> +    "}";
> +
> +static const char testQemuAgentOSInfoResponse2[] =
> +    "{\"return\": "
> +    "   {\"name\":\"Microsoft Windows\", "
> +    "   \"kernel-release\":\"7601\", "
> +    "   \"version\":\"Microsoft Windows 77\", "
> +    "   \"variant\":\"client\", "
> +    "   \"pretty-name\":\"Windows 7 Professional\", "
> +    "   \"version-id\":\"\", "
> +    "   \"variant-id\":\"client\", "
> +    "   \"kernel-version\":\"6.1\", "
> +    "   \"machine\":\"x86_64\", "
> +    "   \"id\":\"mswindows\"} "
> +    "}";
> +
> +static int
> +testQemuAgentOSInfo(const void *data)
> +{
> +    virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
> +    qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt);
> +    virTypedParameterPtr params = NULL;
> +    int nparams = 0;
> +    int maxparams = 0;
> +    int ret = -1;
> +
> +    if (!test)
> +        return -1;
> +
> +    if (qemuMonitorTestAddAgentSyncResponse(test) < 0)
> +        goto cleanup;
> +
> +    if (qemuMonitorTestAddItem(test, "guest-get-osinfo",
> +                               testQemuAgentOSInfoResponse) < 0)
> +        goto cleanup;
> +
> +    /* get osinfo */
> +    if (qemuAgentGetOSInfo(qemuMonitorTestGetAgent(test),
> +                           &params, &nparams, &maxparams) < 0)
> +        goto cleanup;
> +
> +    if (nparams != 8) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "Expected 8 params, got %d", nparams);
> +        goto cleanup;
> +    }
> +# define VALIDATE_PARAM(param_name_, expected_) \
> +    do { \
> +        const char *value_ = NULL; \
> +        if (virTypedParamsGetString(params, nparams, param_name_, &value_) < 0 || \
> +            value_ == NULL) { \
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "missing param '%s'", param_name_); \
> +            goto cleanup; \
> +        } \
> +        if (STRNEQ(value_, expected_)) { \
> +            virReportError(VIR_ERR_INTERNAL_ERROR, \
> +                           "Expected name '%s', got '%s'", expected_, value_); \
> +            goto cleanup; \
> +        } \
> +    } while (0)
> +
> +    VALIDATE_PARAM("os.id", "centos");
> +    VALIDATE_PARAM("os.name", "CentOS Linux");
> +    VALIDATE_PARAM("os.version", "7 (Core)");
> +    VALIDATE_PARAM("os.version-id", "7");
> +    VALIDATE_PARAM("os.pretty-name", "CentOS Linux 7 (Core)");
> +    VALIDATE_PARAM("os.kernel-release", "3.10.0-862.14.4.el7.x86_64");
> +    VALIDATE_PARAM("os.kernel-version", "#1 SMP Wed Sep 26 15:12:11 UTC 2018");
> +    VALIDATE_PARAM("os.machine", "x86_64");
> +    virTypedParamsFree(params, nparams);
> +    params = NULL;
> +    nparams = 0;
> +    maxparams = 0;
> +
> +    if (qemuMonitorTestAddAgentSyncResponse(test) < 0)
> +        goto cleanup;
> +
> +    if (qemuMonitorTestAddItem(test, "guest-get-osinfo",
> +                               testQemuAgentOSInfoResponse2) < 0)
> +        goto cleanup;
> +
> +    /* get users with domain */
> +    if (qemuAgentGetOSInfo(qemuMonitorTestGetAgent(test),
> +                           &params, &nparams, &maxparams) < 0)
> +        goto cleanup;
> +
> +    if (nparams != 10) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "Expected 10 params, got %d", nparams);
> +        goto cleanup;
> +    }
> +
> +    VALIDATE_PARAM("os.id", "mswindows");
> +    VALIDATE_PARAM("os.name", "Microsoft Windows");
> +    VALIDATE_PARAM("os.pretty-name", "Windows 7 Professional");
> +    VALIDATE_PARAM("os.version", "Microsoft Windows 77");
> +    VALIDATE_PARAM("os.version-id", "");
> +    VALIDATE_PARAM("os.variant", "client");
> +    VALIDATE_PARAM("os.variant-id", "client");
> +    VALIDATE_PARAM("os.kernel-release", "7601");
> +    VALIDATE_PARAM("os.kernel-version", "6.1");
> +    VALIDATE_PARAM("os.machine", "x86_64");
> +    virTypedParamsFree(params, nparams);
> +
> +    ret = 0;
> +
> + cleanup:
> +    qemuMonitorTestFree(test);
> +    return ret;
> +}
> +
>   
>   static int
>   mymain(void)
> @@ -1099,6 +1220,7 @@ mymain(void)
>       DO_TEST(ArbitraryCommand);
>       DO_TEST(GetInterfaces);
>       DO_TEST(Users);
> +    DO_TEST(OSInfo);
>   
>       DO_TEST(Timeout); /* Timeout should always be called last */
>   




More information about the libvir-list mailing list