qemu: add helper function for querying OS info

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@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Tested-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
Jonathon Jongsma 2019-08-23 11:31:18 -05:00 committed by Michal Privoznik
parent 1c8113f9c8
commit d5b5a890dd
3 changed files with 174 additions and 0 deletions

View File

@ -2325,3 +2325,50 @@ qemuAgentGetUsers(qemuAgentPtr mon,
return ndata;
}
int
qemuAgentGetOSInfo(qemuAgentPtr mon,
virTypedParameterPtr *params,
int *nparams,
int *maxparams)
{
VIR_AUTOPTR(virJSONValue) cmd = NULL;
VIR_AUTOPTR(virJSONValue) reply = NULL;
virJSONValuePtr data = NULL;
if (!(cmd = qemuAgentMakeCommand("guest-get-osinfo", NULL)))
return -1;
if (qemuAgentCommand(mon, cmd, &reply, true,
VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0)
return -1;
if (!(data = virJSONValueObjectGetObject(reply, "return"))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("guest-get-osinfo reply was missing return data"));
return -1;
}
#define OSINFO_ADD_PARAM(agent_string_, param_string_) \
do { \
const char *result; \
if ((result = virJSONValueObjectGetString(data, agent_string_))) { \
if (virTypedParamsAddString(params, nparams, maxparams, \
param_string_, result) < 0) { \
return -1; \
} \
} \
} 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");
return 0;
}

View File

@ -125,3 +125,8 @@ int qemuAgentGetUsers(qemuAgentPtr mon,
virTypedParameterPtr *params,
int *nparams,
int *maxparams);
int qemuAgentGetOSInfo(qemuAgentPtr mon,
virTypedParameterPtr *params,
int *nparams,
int *maxparams);

View File

@ -1048,6 +1048,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)
@ -1079,6 +1200,7 @@ mymain(void)
DO_TEST(ArbitraryCommand);
DO_TEST(GetInterfaces);
DO_TEST(Users);
DO_TEST(OSInfo);
DO_TEST(Timeout); /* Timeout should always be called last */