[PATCH 0/2] bhyve: implement virDomainGetGuestInfo()
Roman Bogorodskiy (2): qemu: move qemuAgent*InfoFormatParams to hypervisor/qemu_agent.c bhyve: implement virDomainGetGuestInfo() src/bhyve/bhyve_driver.c | 192 ++++++++++++++++++++++++++++++++++++ src/hypervisor/qemu_agent.c | 159 +++++++++++++++++++++++++++++ src/hypervisor/qemu_agent.h | 17 ++++ src/libvirt_private.syms | 3 + src/qemu/qemu_driver.c | 162 +----------------------------- 5 files changed, 372 insertions(+), 161 deletions(-) -- 2.52.0
Move: * qemuAgentDiskInfoFormatParams * qemuAgentFSInfoFormatParams * virDomainInterfaceFormatParams from the qemu driver to hypervisor/qemu_agent.c so they could be reused by the other drivers implementing virDomainGetGuestInfo() using the qemu agent. Also, rename virDomainInterfaceFormatParams() to qemuAgentInterfaceFormatParams() to follow the common naming schema as it's not really used outside of the qemu agent related code. Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com> --- src/hypervisor/qemu_agent.c | 159 +++++++++++++++++++++++++++++++++++ src/hypervisor/qemu_agent.h | 17 ++++ src/libvirt_private.syms | 3 + src/qemu/qemu_driver.c | 162 +----------------------------------- 4 files changed, 180 insertions(+), 161 deletions(-) diff --git a/src/hypervisor/qemu_agent.c b/src/hypervisor/qemu_agent.c index e549947fbf..36134e3cc2 100644 --- a/src/hypervisor/qemu_agent.c +++ b/src/hypervisor/qemu_agent.c @@ -2681,3 +2681,162 @@ qemuAgentFSInfoFormat(qemuAgentFSInfo **agentinfo, } return ret; } + +void +qemuAgentDiskInfoFormatParams(qemuAgentDiskInfo **info, + int ndisks, + virDomainDef *vmdef, + virTypedParamList *list) +{ + size_t i; + + virTypedParamListAddUInt(list, ndisks, VIR_DOMAIN_GUEST_INFO_DISK_COUNT); + + for (i = 0; i < ndisks; i++) { + virTypedParamListAddString(list, info[i]->name, + VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_NAME, i); + virTypedParamListAddBoolean(list, info[i]->partition, + VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_PARTITION, i); + + if (info[i]->dependencies) { + size_t ndeps = g_strv_length(info[i]->dependencies); + size_t j; + + if (ndeps > 0) + virTypedParamListAddUInt(list, ndeps, + VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_COUNT, i); + + for (j = 0; j < ndeps; j++) { + virTypedParamListAddString(list, info[i]->dependencies[j], + VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_SUFFIX_NAME, i, j); + } + } + + if (info[i]->address) { + qemuAgentDiskAddress *address = info[i]->address; + virDomainDiskDef *diskdef = NULL; + + if (address->serial) + virTypedParamListAddString(list, address->serial, + VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_SERIAL, i); + + /* match the disk to the target in the vm definition */ + diskdef = virDomainDiskByAddress(vmdef, + &address->pci_controller, + address->ccw_addr, + address->bus, + address->target, + address->unit); + + if (diskdef && diskdef->dst) + virTypedParamListAddString(list, diskdef->dst, + VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_ALIAS, i); + + if (address->bus_type) + virTypedParamListAddString(list, address->bus_type, + VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_GUEST_BUS, i); + } + + if (info[i]->alias) + virTypedParamListAddString(list, info[i]->alias, + VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_GUEST_ALIAS, i); + } +} + +void +qemuAgentFSInfoFormatParams(qemuAgentFSInfo **fsinfo, + int nfs, + virDomainDef *vmdef, + virTypedParamList *list) +{ + size_t i; + + virTypedParamListAddUInt(list, nfs, VIR_DOMAIN_GUEST_INFO_FS_COUNT); + + for (i = 0; i < nfs; i++) { + size_t j; + + virTypedParamListAddString(list, fsinfo[i]->name, + VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_NAME, i); + virTypedParamListAddString(list, fsinfo[i]->mountpoint, + VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_MOUNTPOINT, i); + virTypedParamListAddString(list, fsinfo[i]->fstype, + VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_FSTYPE, i); + + /* disk usage values are not returned by older guest agents, so + * only add the params if the value is set */ + if (fsinfo[i]->total_bytes != -1) + virTypedParamListAddULLong(list, fsinfo[i]->total_bytes, + VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_TOTAL_BYTES, i); + if (fsinfo[i]->used_bytes != -1) + virTypedParamListAddULLong(list, fsinfo[i]->used_bytes, + VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_USED_BYTES, i); + + virTypedParamListAddUInt(list, fsinfo[i]->ndisks, + VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_COUNT, i); + + for (j = 0; j < fsinfo[i]->ndisks; j++) { + virDomainDiskDef *diskdef = NULL; + qemuAgentDiskAddress *d = fsinfo[i]->disks[j]; + + /* match the disk to the target in the vm definition */ + diskdef = virDomainDiskByAddress(vmdef, + &d->pci_controller, + d->ccw_addr, + d->bus, + d->target, + d->unit); + if (diskdef && diskdef->dst) + virTypedParamListAddString(list, diskdef->dst, + VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_ALIAS, i, j); + + if (d->serial) + virTypedParamListAddString(list, d->serial, + VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_SERIAL, i, j); + + if (d->devnode) + virTypedParamListAddString(list, d->devnode, + VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_DEVICE, i, j); + } + } +} + +void +qemuAgentInterfaceFormatParams(virDomainInterfacePtr *ifaces, + int nifaces, + virTypedParamList *list) +{ + size_t i; + + virTypedParamListAddUInt(list, nifaces, VIR_DOMAIN_GUEST_INFO_IF_COUNT); + + for (i = 0; i < nifaces; i++) { + size_t j; + + virTypedParamListAddString(list, ifaces[i]->name, + VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_NAME, i); + virTypedParamListAddString(list, ifaces[i]->hwaddr, + VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_HWADDR, i); + virTypedParamListAddUInt(list, ifaces[i]->naddrs, + VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_COUNT, i); + + for (j = 0; j < ifaces[i]->naddrs; j++) { + switch (ifaces[i]->addrs[j].type) { + case VIR_IP_ADDR_TYPE_IPV4: + virTypedParamListAddString(list, "ipv4", + VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_TYPE, i, j); + break; + + case VIR_IP_ADDR_TYPE_IPV6: + virTypedParamListAddString(list, "ipv6", + VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_TYPE, i, j); + break; + } + + virTypedParamListAddString(list, ifaces[i]->addrs[j].addr, + VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_ADDR, i, j); + virTypedParamListAddUInt(list, ifaces[i]->addrs[j].prefix, + VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_PREFIX, i, j); + } + } +} diff --git a/src/hypervisor/qemu_agent.h b/src/hypervisor/qemu_agent.h index 3dbc3baec1..def6f983d4 100644 --- a/src/hypervisor/qemu_agent.h +++ b/src/hypervisor/qemu_agent.h @@ -201,3 +201,20 @@ int qemuAgentFSInfoFormat(qemuAgentFSInfo **agentinfo, int nagentinfo, virDomainDef *vmdef, virDomainFSInfoPtr **info); + +void +qemuAgentDiskInfoFormatParams(qemuAgentDiskInfo **info, + int ndisks, + virDomainDef *vmdef, + virTypedParamList *list); + +void +qemuAgentFSInfoFormatParams(qemuAgentFSInfo **fsinfo, + int nfs, + virDomainDef *vmdef, + virTypedParamList *list); + +void +qemuAgentInterfaceFormatParams(virDomainInterfacePtr *ifaces, + int nifaces, + virTypedParamList *list); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index c76e5cb08a..02bd505749 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1716,9 +1716,11 @@ virDomainInterfaceVportRemove; # hypervisor/qemu_agent.h qemuAgentArbitraryCommand; qemuAgentClose; +qemuAgentDiskInfoFormatParams; qemuAgentDiskInfoFree; qemuAgentFSFreeze; qemuAgentFSInfoFormat; +qemuAgentFSInfoFormatParams; qemuAgentFSInfoFree; qemuAgentFSThaw; qemuAgentFSTrim; @@ -1732,6 +1734,7 @@ qemuAgentGetTime; qemuAgentGetTimezone; qemuAgentGetUsers; qemuAgentGetVCPUs; +qemuAgentInterfaceFormatParams; qemuAgentNotifyClose; qemuAgentNotifyEvent; qemuAgentOpen; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index bdc0cff66a..8185a078d5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -19964,166 +19964,6 @@ qemuDomainGetGuestInfoCheckSupport(unsigned int types, } -static void -qemuAgentDiskInfoFormatParams(qemuAgentDiskInfo **info, - int ndisks, - virDomainDef *vmdef, - virTypedParamList *list) -{ - size_t i; - - virTypedParamListAddUInt(list, ndisks, VIR_DOMAIN_GUEST_INFO_DISK_COUNT); - - for (i = 0; i < ndisks; i++) { - virTypedParamListAddString(list, info[i]->name, - VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_NAME, i); - virTypedParamListAddBoolean(list, info[i]->partition, - VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_PARTITION, i); - - if (info[i]->dependencies) { - size_t ndeps = g_strv_length(info[i]->dependencies); - size_t j; - - if (ndeps > 0) - virTypedParamListAddUInt(list, ndeps, - VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_COUNT, i); - - for (j = 0; j < ndeps; j++) { - virTypedParamListAddString(list, info[i]->dependencies[j], - VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_SUFFIX_NAME, i, j); - } - } - - if (info[i]->address) { - qemuAgentDiskAddress *address = info[i]->address; - virDomainDiskDef *diskdef = NULL; - - if (address->serial) - virTypedParamListAddString(list, address->serial, - VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_SERIAL, i); - - /* match the disk to the target in the vm definition */ - diskdef = virDomainDiskByAddress(vmdef, - &address->pci_controller, - address->ccw_addr, - address->bus, - address->target, - address->unit); - - if (diskdef && diskdef->dst) - virTypedParamListAddString(list, diskdef->dst, - VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_ALIAS, i); - - if (address->bus_type) - virTypedParamListAddString(list, address->bus_type, - VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_GUEST_BUS, i); - } - - if (info[i]->alias) - virTypedParamListAddString(list, info[i]->alias, - VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_GUEST_ALIAS, i); - } -} - - -static void -qemuAgentFSInfoFormatParams(qemuAgentFSInfo **fsinfo, - int nfs, - virDomainDef *vmdef, - virTypedParamList *list) -{ - size_t i; - - virTypedParamListAddUInt(list, nfs, VIR_DOMAIN_GUEST_INFO_FS_COUNT); - - for (i = 0; i < nfs; i++) { - size_t j; - - virTypedParamListAddString(list, fsinfo[i]->name, - VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_NAME, i); - virTypedParamListAddString(list, fsinfo[i]->mountpoint, - VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_MOUNTPOINT, i); - virTypedParamListAddString(list, fsinfo[i]->fstype, - VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_FSTYPE, i); - - /* disk usage values are not returned by older guest agents, so - * only add the params if the value is set */ - if (fsinfo[i]->total_bytes != -1) - virTypedParamListAddULLong(list, fsinfo[i]->total_bytes, - VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_TOTAL_BYTES, i); - if (fsinfo[i]->used_bytes != -1) - virTypedParamListAddULLong(list, fsinfo[i]->used_bytes, - VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_USED_BYTES, i); - - virTypedParamListAddUInt(list, fsinfo[i]->ndisks, - VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_COUNT, i); - - for (j = 0; j < fsinfo[i]->ndisks; j++) { - virDomainDiskDef *diskdef = NULL; - qemuAgentDiskAddress *d = fsinfo[i]->disks[j]; - - /* match the disk to the target in the vm definition */ - diskdef = virDomainDiskByAddress(vmdef, - &d->pci_controller, - d->ccw_addr, - d->bus, - d->target, - d->unit); - if (diskdef && diskdef->dst) - virTypedParamListAddString(list, diskdef->dst, - VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_ALIAS, i, j); - - if (d->serial) - virTypedParamListAddString(list, d->serial, - VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_SERIAL, i, j); - - if (d->devnode) - virTypedParamListAddString(list, d->devnode, - VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_DEVICE, i, j); - } - } -} - -static void -virDomainInterfaceFormatParams(virDomainInterfacePtr *ifaces, - int nifaces, - virTypedParamList *list) -{ - size_t i; - - virTypedParamListAddUInt(list, nifaces, VIR_DOMAIN_GUEST_INFO_IF_COUNT); - - for (i = 0; i < nifaces; i++) { - size_t j; - - virTypedParamListAddString(list, ifaces[i]->name, - VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_NAME, i); - virTypedParamListAddString(list, ifaces[i]->hwaddr, - VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_HWADDR, i); - virTypedParamListAddUInt(list, ifaces[i]->naddrs, - VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_COUNT, i); - - for (j = 0; j < ifaces[i]->naddrs; j++) { - switch (ifaces[i]->addrs[j].type) { - case VIR_IP_ADDR_TYPE_IPV4: - virTypedParamListAddString(list, "ipv4", - VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_TYPE, i, j); - break; - - case VIR_IP_ADDR_TYPE_IPV6: - virTypedParamListAddString(list, "ipv6", - VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_TYPE, i, j); - break; - } - - virTypedParamListAddString(list, ifaces[i]->addrs[j].addr, - VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_ADDR, i, j); - virTypedParamListAddUInt(list, ifaces[i]->addrs[j].prefix, - VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_PREFIX, i, j); - } - } -} - static int qemuDomainGetGuestInfo(virDomainPtr dom, unsigned int types, @@ -20250,7 +20090,7 @@ qemuDomainGetGuestInfo(virDomainPtr dom, } if (nifaces > 0) { - virDomainInterfaceFormatParams(ifaces, nifaces, list); + qemuAgentInterfaceFormatParams(ifaces, nifaces, list); } if (format_load) { -- 2.52.0
Implementation is pretty similar to the one found in the qemu driver. Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com> --- src/bhyve/bhyve_driver.c | 192 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index a0d97d3f86..d72b97c7ac 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -2807,6 +2807,197 @@ bhyveDomainRename(virDomainPtr domain, return ret; } +static const unsigned int bhyveDomainGetGuestInfoSupportedTypes = + 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 | + VIR_DOMAIN_GUEST_INFO_DISKS | + VIR_DOMAIN_GUEST_INFO_INTERFACES | + VIR_DOMAIN_GUEST_INFO_LOAD; + +static int +bhyveDomainGetGuestInfoCheckSupport(unsigned int types, + unsigned int *supportedTypes) +{ + if (types == 0) { + *supportedTypes = bhyveDomainGetGuestInfoSupportedTypes; + return 0; + } + + *supportedTypes = types & bhyveDomainGetGuestInfoSupportedTypes; + + if (types != *supportedTypes) { + virReportError(VIR_ERR_INVALID_ARG, + _("unsupported guest information types '0x%1$x'"), + types & ~bhyveDomainGetGuestInfoSupportedTypes); + return -1; + } + + return 0; +} + + +static int +bhyveDomainGetGuestInfo(virDomainPtr domain, + unsigned int types, + virTypedParameterPtr *params, + int *nparams, + unsigned int flags) +{ + virDomainObj *vm = NULL; + qemuAgent *agent = NULL; + int ret = -1; + g_autofree char *hostname = NULL; + unsigned int supportedTypes; + bool report_unsupported = types != 0; + int rc; + size_t nfs = 0; + qemuAgentFSInfo **agentfsinfo = NULL; + size_t ndisks = 0; + qemuAgentDiskInfo **agentdiskinfo = NULL; + virDomainInterfacePtr *ifaces = NULL; + size_t nifaces = 0; + double load1m = 0; + double load5m = 0; + double load15m = 0; + bool format_load = false; + size_t i; + g_autoptr(virTypedParamList) list = virTypedParamListNew(); + + if (bhyveDomainGetGuestInfoCheckSupport(types, &supportedTypes) < 0) + return -1; + + virCheckFlags(0, -1); + + if (!(vm = bhyveDomObjFromDomain(domain))) + goto cleanup; + + if (virDomainGetGuestInfoEnsureACL(domain->conn, vm->def) < 0) + goto cleanup; + + if (virDomainObjBeginAgentJob(vm, VIR_AGENT_JOB_QUERY) < 0) + goto cleanup; + + if (bhyveDomainEnsureAgent(vm, true) < 0) + goto endagentjob; + + agent = bhyveDomainObjEnterAgent(vm); + + if (supportedTypes & VIR_DOMAIN_GUEST_INFO_USERS && + qemuAgentGetUsers(agent, list, report_unsupported) == -1) + goto exitagent; + + if (supportedTypes & VIR_DOMAIN_GUEST_INFO_OS && + qemuAgentGetOSInfo(agent, list, report_unsupported) == -1) + goto exitagent; + + if (supportedTypes & VIR_DOMAIN_GUEST_INFO_TIMEZONE && + qemuAgentGetTimezone(agent, list, report_unsupported) == -1) + goto exitagent; + + if (supportedTypes & VIR_DOMAIN_GUEST_INFO_HOSTNAME && + qemuAgentGetHostname(agent, &hostname, report_unsupported) == -1) + goto exitagent; + + if (hostname) + virTypedParamListAddString(list, hostname, + VIR_DOMAIN_GUEST_INFO_HOSTNAME_HOSTNAME); + + if (supportedTypes & VIR_DOMAIN_GUEST_INFO_FILESYSTEM) { + rc = qemuAgentGetFSInfo(agent, &agentfsinfo, report_unsupported); + if (rc == -1) + goto exitagent; + if (rc >= 0) + nfs = rc; + } + + if (supportedTypes & VIR_DOMAIN_GUEST_INFO_DISKS) { + rc = qemuAgentGetDisks(agent, &agentdiskinfo, report_unsupported); + if (rc == -1) + goto exitagent; + if (rc >= 0) + ndisks = rc; + } + + if (supportedTypes & VIR_DOMAIN_GUEST_INFO_INTERFACES) { + rc = qemuAgentGetInterfaces(agent, &ifaces, report_unsupported); + if (rc == -1) + goto exitagent; + if (rc >= 0) + nifaces = rc; + } + + if (supportedTypes & VIR_DOMAIN_GUEST_INFO_LOAD) { + rc = qemuAgentGetLoadAvg(agent, &load1m, &load5m, &load15m, report_unsupported); + if (rc == -1) + goto exitagent; + if (rc >= 0) + format_load = true; + } + + bhyveDomainObjExitAgent(vm, agent); + virDomainObjEndAgentJob(vm); + + if (nfs > 0 || ndisks > 0) { + if (virDomainObjBeginJob(vm, VIR_JOB_QUERY) < 0) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto endjob; + + /* we need to convert the agent fsinfo struct to parameters and match + * it to the vm disk target */ + if (nfs > 0) + qemuAgentFSInfoFormatParams(agentfsinfo, nfs, vm->def, list); + + if (ndisks > 0) + qemuAgentDiskInfoFormatParams(agentdiskinfo, ndisks, vm->def, list); + + endjob: + virDomainObjEndJob(vm); + } + + if (nifaces > 0) { + qemuAgentInterfaceFormatParams(ifaces, nifaces, list); + } + + if (format_load) { + virTypedParamListAddDouble(list, load1m, VIR_DOMAIN_GUEST_INFO_LOAD_1M); + virTypedParamListAddDouble(list, load5m, VIR_DOMAIN_GUEST_INFO_LOAD_5M); + virTypedParamListAddDouble(list, load15m, VIR_DOMAIN_GUEST_INFO_LOAD_15M); + } + + if (virTypedParamListSteal(list, params, nparams) < 0) + goto cleanup; + + ret = 0; + + cleanup: + for (i = 0; i < nfs; i++) + qemuAgentFSInfoFree(agentfsinfo[i]); + g_free(agentfsinfo); + for (i = 0; i < ndisks; i++) + qemuAgentDiskInfoFree(agentdiskinfo[i]); + g_free(agentdiskinfo); + if (ifaces && nifaces > 0) { + for (i = 0; i < nifaces; i++) + virDomainInterfaceFree(ifaces[i]); + } + g_free(ifaces); + + virDomainObjEndAPI(&vm); + return ret; + + exitagent: + bhyveDomainObjExitAgent(vm, agent); + + endagentjob: + virDomainObjEndAgentJob(vm); + goto cleanup; +} + static virHypervisorDriver bhyveHypervisorDriver = { .name = "bhyve", .connectURIProbe = bhyveConnectURIProbe, @@ -2885,6 +3076,7 @@ static virHypervisorDriver bhyveHypervisorDriver = { .domainAuthorizedSSHKeysGet = bhyveDomainAuthorizedSSHKeysGet, /* 12.6.0 */ .domainAuthorizedSSHKeysSet = bhyveDomainAuthorizedSSHKeysSet, /* 12.6.0 */ .domainRename = bhyveDomainRename, /* 12.6.0 */ + .domainGetGuestInfo = bhyveDomainGetGuestInfo, /* 12.7.0 */ }; -- 2.52.0
participants (1)
-
Roman Bogorodskiy