[libvirt] [PATCH 4/7] qemu_agent: add helper function for querying OS info

Jonathon Jongsma jjongsma at redhat.com
Thu Aug 1 13:37:07 UTC 2019


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>
---
 src/qemu/qemu_agent.c |  52 ++++++++++++++++++
 src/qemu/qemu_agent.h |   1 +
 tests/qemuagenttest.c | 122 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 175 insertions(+)

diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
index de31f33dba..7418749459 100644
--- a/src/qemu/qemu_agent.c
+++ b/src/qemu/qemu_agent.c
@@ -2332,3 +2332,55 @@ qemuAgentGetUsers(qemuAgentPtr mon,
     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 1477c0539c..cb5a2f65e8 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 */
 
-- 
2.21.0




More information about the libvir-list mailing list