1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-22 17:34:18 +03:00

virsh: Introduce new hypervisor-cpu-compare command

This command is a virsh wrapper for virConnectCompareHypervisorCPU.

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-30 14:48:03 +02:00
parent bbe1ad5b6c
commit 8c4ccf9d2e
2 changed files with 141 additions and 1 deletions

View File

@ -1600,6 +1600,113 @@ cmdNodeMemoryTune(vshControl *ctl, const vshCmd *cmd)
goto cleanup;
}
/*
* "hypervisor-cpu-compare" command
*/
static const vshCmdInfo info_hypervisor_cpu_compare[] = {
{.name = "help",
.data = N_("compare a CPU with the CPU created by a hypervisor on the host")
},
{.name = "desc",
.data = N_("compare CPU with hypervisor CPU")
},
{.name = NULL}
};
static const vshCmdOptDef opts_hypervisor_cpu_compare[] = {
VIRSH_COMMON_OPT_FILE(N_("file containing an XML CPU description")),
{.name = "virttype",
.type = VSH_OT_STRING,
.help = N_("virtualization type (/domain/@type)"),
},
{.name = "emulator",
.type = VSH_OT_STRING,
.help = N_("path to emulator binary (/domain/devices/emulator)"),
},
{.name = "arch",
.type = VSH_OT_STRING,
.help = N_("CPU architecture (/domain/os/type/@arch)"),
},
{.name = "machine",
.type = VSH_OT_STRING,
.help = N_("machine type (/domain/os/type/@machine)"),
},
{.name = "error",
.type = VSH_OT_BOOL,
.help = N_("report error if CPUs are incompatible")
},
{.name = NULL}
};
static bool
cmdHypervisorCPUCompare(vshControl *ctl,
const vshCmd *cmd)
{
const char *from = NULL;
const char *virttype = NULL;
const char *emulator = NULL;
const char *arch = NULL;
const char *machine = NULL;
bool ret = false;
int result;
char **cpus = NULL;
unsigned int flags = 0;
virshControlPtr priv = ctl->privData;
if (vshCommandOptBool(cmd, "error"))
flags |= VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE;
if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0 ||
vshCommandOptStringReq(ctl, cmd, "virttype", &virttype) < 0 ||
vshCommandOptStringReq(ctl, cmd, "emulator", &emulator) < 0 ||
vshCommandOptStringReq(ctl, cmd, "arch", &arch) < 0 ||
vshCommandOptStringReq(ctl, cmd, "machine", &machine) < 0)
return false;
if (!(cpus = vshExtractCPUDefXMLs(ctl, from)))
return false;
result = virConnectCompareHypervisorCPU(priv->conn, emulator, arch,
machine, virttype, cpus[0], flags);
switch (result) {
case VIR_CPU_COMPARE_INCOMPATIBLE:
vshPrint(ctl,
_("CPU described in %s is incompatible with the CPU provided "
"by hypervisor on the host\n"),
from);
goto cleanup;
break;
case VIR_CPU_COMPARE_IDENTICAL:
vshPrint(ctl,
_("CPU described in %s is identical to the CPU provided by "
"hypervisor on the host\n"),
from);
break;
case VIR_CPU_COMPARE_SUPERSET:
vshPrint(ctl,
_("The CPU provided by hypervisor on the host is a superset "
"of CPU described in %s\n"),
from);
break;
case VIR_CPU_COMPARE_ERROR:
default:
vshError(ctl, _("Failed to compare hypervisor CPU with %s"), from);
goto cleanup;
}
ret = true;
cleanup:
virStringListFree(cpus);
return ret;
}
const vshCmdDef hostAndHypervisorCmds[] = {
{.name = "allocpages",
.handler = cmdAllocpages,
@ -1655,6 +1762,12 @@ const vshCmdDef hostAndHypervisorCmds[] = {
.info = info_hostname,
.flags = 0
},
{.name = "hypervisor-cpu-compare",
.handler = cmdHypervisorCPUCompare,
.opts = opts_hypervisor_cpu_compare,
.info = info_hypervisor_cpu_compare,
.flags = 0
},
{.name = "maxvcpus",
.handler = cmdMaxvcpus,
.opts = opts_maxvcpus,

View File

@ -585,7 +585,9 @@ features that block migration will not be included in the resulting CPU.
=item B<cpu-compare> I<FILE> [I<--error>]
Compare CPU definition from XML <file> with host CPU. The XML <file> may
Compare CPU definition from XML <file> with host CPU. (See
B<hypervisor-cpu-compare> command for comparing the CPU definition with the CPU
which a specific hypervisor is able to provide on the host.) The XML <file> may
contain either host or guest CPU definition. The host CPU definition is the
<cpu> element and its contents as printed by B<capabilities> command. The
guest CPU definition is the <cpu> element and its contents from domain XML
@ -617,6 +619,31 @@ specified, then the output will be single-quoted where needed, so that
it is suitable for reuse in a shell context. If I<--xml> is
specified, then the output will be escaped for use in XML.
=item B<hypervisor-cpu-compare> I<FILE> [I<virttype>] [I<emulator>] [I<arch>]
[I<machine>] [I<--error>]
Compare CPU definition from XML <file> with the CPU the hypervisor is able to
provide on the host. (This is different from B<cpu-compare> which compares the
CPU definition with the host CPU without considering any specific hypervisor
and its abilities.)
The XML I<FILE> may contain either a host or guest CPU definition. The host CPU
definition is the <cpu> element and its contents as printed by the
B<capabilities> command. The guest CPU definition is the <cpu> element and its
contents from the domain XML definition or the CPU definition created from the
host CPU model found in the domain capabilities XML (printed by the
B<domcapabilities> command). In addition to the <cpu> element itself, this
command accepts full domain XML, capabilities XML, or domain capabilities XML
containing the CPU definition. For more information on guest CPU definition
see: L<https://libvirt.org/formatdomain.html#elementsCPU>.
The I<virttype> option specifies the virtualization type (usable in the 'type'
attribute of the <domain> top level element from the domain XML). I<emulator>
specifies the path to the emulator, I<arch> specifies the CPU architecture, and
I<machine> specifies the machine type. If I<--error> is specified, the command
will return an error when the given CPU is incompatible with the host CPU and a
message providing more details about the incompatibility will be printed out.
=back
=head1 DOMAIN COMMANDS