This command is a virsh wrapper for virConnectCompareHypervisorCPU.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
tools/virsh-host.c | 113 +++++++++++++++++++++++++++++++++++++++++++++
tools/virsh.pod | 29 +++++++++++-
2 files changed, 141 insertions(+), 1 deletion(-)
diff --git a/tools/virsh-host.c b/tools/virsh-host.c
index ea2c411c02..1e7cfcbd5e 100644
--- a/tools/virsh-host.c
+++ b/tools/virsh-host.c
@@ -1595,6 +1595,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_("domain 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,
@@ -1650,6 +1757,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,
diff --git a/tools/virsh.pod b/tools/virsh.pod
index ea10e1ad43..1a55092efd 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -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
@@ -616,6 +618,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 specified 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 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 definition or the CPU definition created from the host CPU model
+found in domain capabilities XML (printed by 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 host CPU and a
+message providing more details about the incompatibility will be printed out.
+
=back
=head1 DOMAIN COMMANDS
--
2.17.0