qemu: Implement virDomainGetGuestInfo()
Iimplements the new guest information API by querying requested information via the guest agent. 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:
parent
a68ed9fc42
commit
02697fdbd1
@ -23201,6 +23201,103 @@ qemuDomainGetLaunchSecurityInfo(virDomainPtr domain,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const unsigned int supportedGuestInfoTypes =
|
||||||
|
VIR_DOMAIN_GUEST_INFO_USERS |
|
||||||
|
VIR_DOMAIN_GUEST_INFO_OS |
|
||||||
|
VIR_DOMAIN_GUEST_INFO_TIMEZONE |
|
||||||
|
VIR_DOMAIN_GUEST_INFO_HOSTNAME |
|
||||||
|
VIR_DOMAIN_GUEST_INFO_FILESYSTEM;
|
||||||
|
|
||||||
|
static void
|
||||||
|
qemuDomainGetGuestInfoCheckSupport(unsigned int *types)
|
||||||
|
{
|
||||||
|
if (*types == 0)
|
||||||
|
*types = supportedGuestInfoTypes;
|
||||||
|
|
||||||
|
*types = *types & supportedGuestInfoTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuDomainGetGuestInfo(virDomainPtr dom,
|
||||||
|
unsigned int types,
|
||||||
|
virTypedParameterPtr *params,
|
||||||
|
int *nparams,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
virQEMUDriverPtr driver = dom->conn->privateData;
|
||||||
|
virDomainObjPtr vm = NULL;
|
||||||
|
qemuAgentPtr agent;
|
||||||
|
int ret = -1;
|
||||||
|
int maxparams = 0;
|
||||||
|
VIR_AUTOFREE(char *) hostname = NULL;
|
||||||
|
unsigned int supportedTypes = types;
|
||||||
|
|
||||||
|
virCheckFlags(0, -1);
|
||||||
|
qemuDomainGetGuestInfoCheckSupport(&supportedTypes);
|
||||||
|
|
||||||
|
if (!(vm = qemuDomObjFromDomain(dom)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virDomainGetGuestInfoEnsureACL(dom->conn, vm->def) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (qemuDomainObjBeginAgentJob(driver, vm, QEMU_AGENT_JOB_QUERY) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!qemuDomainAgentAvailable(vm, true))
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
agent = qemuDomainObjEnterAgent(vm);
|
||||||
|
|
||||||
|
/* Although the libvirt qemu driver supports all of these guest info types,
|
||||||
|
* some guest agents might be too old to support these commands. If these
|
||||||
|
* info categories were explicitly requested (i.e. 'types' is non-zero),
|
||||||
|
* abort and report an error on any failures, otherwise continue and return
|
||||||
|
* as much info as is supported by the guest agent. */
|
||||||
|
if (supportedTypes & VIR_DOMAIN_GUEST_INFO_USERS) {
|
||||||
|
if (qemuAgentGetUsers(agent, params, nparams, &maxparams) < 0 &&
|
||||||
|
types != 0)
|
||||||
|
goto exitagent;
|
||||||
|
}
|
||||||
|
if (supportedTypes & VIR_DOMAIN_GUEST_INFO_OS) {
|
||||||
|
if (qemuAgentGetOSInfo(agent, params, nparams, &maxparams) < 0
|
||||||
|
&& types != 0)
|
||||||
|
goto exitagent;
|
||||||
|
}
|
||||||
|
if (supportedTypes & VIR_DOMAIN_GUEST_INFO_TIMEZONE) {
|
||||||
|
if (qemuAgentGetTimezone(agent, params, nparams, &maxparams) < 0
|
||||||
|
&& types != 0)
|
||||||
|
goto exitagent;
|
||||||
|
}
|
||||||
|
if (supportedTypes & VIR_DOMAIN_GUEST_INFO_HOSTNAME) {
|
||||||
|
if (qemuAgentGetHostname(agent, &hostname) < 0) {
|
||||||
|
if (types != 0)
|
||||||
|
goto exitagent;
|
||||||
|
} else {
|
||||||
|
if (virTypedParamsAddString(params, nparams, &maxparams, "hostname",
|
||||||
|
hostname) < 0)
|
||||||
|
goto exitagent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (supportedTypes & VIR_DOMAIN_GUEST_INFO_FILESYSTEM) {
|
||||||
|
if (qemuAgentGetFSInfoParams(agent, params, nparams, &maxparams, vm->def) < 0 &&
|
||||||
|
types != 0)
|
||||||
|
goto exitagent;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
exitagent:
|
||||||
|
qemuDomainObjExitAgent(vm, agent);
|
||||||
|
|
||||||
|
endjob:
|
||||||
|
qemuDomainObjEndAgentJob(vm);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virDomainObjEndAPI(&vm);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static virHypervisorDriver qemuHypervisorDriver = {
|
static virHypervisorDriver qemuHypervisorDriver = {
|
||||||
.name = QEMU_DRIVER_NAME,
|
.name = QEMU_DRIVER_NAME,
|
||||||
.connectURIProbe = qemuConnectURIProbe,
|
.connectURIProbe = qemuConnectURIProbe,
|
||||||
@ -23436,6 +23533,7 @@ static virHypervisorDriver qemuHypervisorDriver = {
|
|||||||
.domainCheckpointLookupByName = qemuDomainCheckpointLookupByName, /* 5.6.0 */
|
.domainCheckpointLookupByName = qemuDomainCheckpointLookupByName, /* 5.6.0 */
|
||||||
.domainCheckpointGetParent = qemuDomainCheckpointGetParent, /* 5.6.0 */
|
.domainCheckpointGetParent = qemuDomainCheckpointGetParent, /* 5.6.0 */
|
||||||
.domainCheckpointDelete = qemuDomainCheckpointDelete, /* 5.6.0 */
|
.domainCheckpointDelete = qemuDomainCheckpointDelete, /* 5.6.0 */
|
||||||
|
.domainGetGuestInfo = qemuDomainGetGuestInfo, /* 5.7.0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user