Introduce virConnectCompareHypervisorCPU public API

This new API compares the given CPU description with the CPU the
specified hypervisor is able to provide on the host. It is a more useful
version of virConnectCompareCPU, which compares the CPU definition with
the host CPU without considering any specific hypervisor and its
abilities.

https://bugzilla.redhat.com/show_bug.cgi?id=1559832
https://bugzilla.redhat.com/show_bug.cgi?id=1559835

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Collin Walling <walling@linux.ibm.com>
This commit is contained in:
Jiri Denemark 2018-04-24 21:31:33 +02:00
parent da3bfc9ffc
commit 24a41aa643
4 changed files with 89 additions and 1 deletions

View File

@ -640,6 +640,13 @@ typedef enum {
int virConnectCompareCPU(virConnectPtr conn,
const char *xmlDesc,
unsigned int flags);
int virConnectCompareHypervisorCPU(virConnectPtr conn,
const char *emulator,
const char *arch,
const char *machine,
const char *virttype,
const char *xmlCPU,
unsigned int flags);
int virConnectGetCPUModelNames(virConnectPtr conn,
const char *arch,

View File

@ -678,6 +678,15 @@ typedef int
const char *cpu,
unsigned int flags);
typedef int
(*virDrvConnectCompareHypervisorCPU)(virConnectPtr conn,
const char *emulator,
const char *arch,
const char *machine,
const char *virttype,
const char *xmlCPU,
unsigned int flags);
typedef char *
(*virDrvConnectBaselineCPU)(virConnectPtr conn,
const char **xmlCPUs,
@ -1538,6 +1547,7 @@ struct _virHypervisorDriver {
virDrvDomainSetVcpu domainSetVcpu;
virDrvDomainSetBlockThreshold domainSetBlockThreshold;
virDrvDomainSetLifecycleAction domainSetLifecycleAction;
virDrvConnectCompareHypervisorCPU connectCompareHypervisorCPU;
};

View File

@ -954,7 +954,11 @@ virConnectIsSecure(virConnectPtr conn)
* @xmlDesc: XML describing the CPU to compare with host CPU
* @flags: bitwise-OR of virConnectCompareCPUFlags
*
* Compares the given CPU description with the host CPU
* Compares the given CPU description with the host CPU.
*
* See virConnectCompareHypervisorCPU() if you want to consider hypervisor
* abilities and compare the CPU to the CPU which a hypervisor is able to
* provide on the host.
*
* Returns comparison result according to enum virCPUCompareResult. If
* VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE is used and @xmlDesc CPU is
@ -992,6 +996,72 @@ virConnectCompareCPU(virConnectPtr conn,
}
/**
* virConnectCompareHypervisorCPU:
* @conn: pointer to the hypervisor connection
* @emulator: path to the emulator binary
* @arch: CPU architecture
* @machine: machine type
* @virttype: virtualization type
* @xmlCPU: XML describing the CPU to be compared
* @flags: bitwise-OR of virConnectCompareCPUFlags
*
* Compares the given CPU description with the CPU the specified hypervisor is
* able to provide on the host. Any of @emulator, @arch, @machine, and
* @virttype parameters may be NULL; libvirt will choose sensible defaults
* tailored to the host and its current configuration.
*
* This is different from virConnectCompareCPU() which compares the CPU
* definition with the host CPU without considering any specific hypervisor and
* its abilities.
*
* Returns comparison result according to enum virCPUCompareResult. If
* VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE is used and @xmlCPU is
* incompatible with the CPU the specified hypervisor is able to provide on the
* host, this function will return VIR_CPU_COMPARE_ERROR (instead of
* VIR_CPU_COMPARE_INCOMPATIBLE) and the error will use the
* VIR_ERR_CPU_INCOMPATIBLE code with a message providing more details about
* the incompatibility.
*/
int
virConnectCompareHypervisorCPU(virConnectPtr conn,
const char *emulator,
const char *arch,
const char *machine,
const char *virttype,
const char *xmlCPU,
unsigned int flags)
{
VIR_DEBUG("conn=%p, emulator=%s, arch=%s, machine=%s, "
"virttype=%s, xmlCPU=%s, flags=0x%x",
conn, NULLSTR(emulator), NULLSTR(arch), NULLSTR(machine),
NULLSTR(virttype), NULLSTR(xmlCPU), flags);
virResetLastError();
virCheckConnectReturn(conn, VIR_CPU_COMPARE_ERROR);
virCheckNonNullArgGoto(xmlCPU, error);
if (conn->driver->connectCompareHypervisorCPU) {
int ret;
ret = conn->driver->connectCompareHypervisorCPU(conn, emulator, arch,
machine, virttype,
xmlCPU, flags);
if (ret == VIR_CPU_COMPARE_ERROR)
goto error;
return ret;
}
virReportUnsupportedError();
error:
virDispatchError(conn);
return VIR_CPU_COMPARE_ERROR;
}
/**
* virConnectGetCPUModelNames:
*

View File

@ -788,6 +788,7 @@ LIBVIRT_4.1.0 {
LIBVIRT_4.4.0 {
global:
virDomainDetachDeviceAlias;
virConnectCompareHypervisorCPU;
} LIBVIRT_4.1.0;
# .... define new API here using predicted next version number ....