1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-30 18:50:18 +03:00

virsh: Introduce new hypervisor-cpu-models command

Add new virsh command 'hypervisor-cpu-models'.  Command pulls from the
existing domcapabilities XML and uses xpath to parse CPU model strings.
By default, only models reported as usable by the hypervisor on the
host system are printed.  User may specify "--all" to also print
models which are not supported on the host.

Signed-off-by: David Judkovics <djudkovi@linux.ibm.com>
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Signed-off-by: Collin Walling <walling@linux.ibm.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
David Judkovics 2025-03-20 01:28:24 -04:00 committed by Ján Tomko
parent 563d3cfb86
commit 65eeaf12d0
2 changed files with 100 additions and 0 deletions

View File

@ -1034,6 +1034,31 @@ listed in the XML description. If *--migratable* is specified, features that
block migration will not be included in the resulting CPU.
hypervisor-cpu-models
---------------------
**Syntax:**
::
hypervisor-cpu-models [--virttype virttype] [--emulator emulator]
[--arch arch] [--machine machine] [--all]
Print the list of CPU models known by the hypervisor for the specified architecture.
It is not guaranteed that a listed CPU will run on the host. To determine CPU
model compatibility with the host, see ``virsh hypervisor-cpu-baseline`` and
``virsh hypervisor-cpu-compare``.
The *virttype* option specifies the virtualization type (usable in the 'type'
attribute of the <domain> top level element from the domain XML). *emulator*
specifies the path to the emulator, *arch* specifies the CPU architecture, and
*machine* specifies the machine type.
By default, only the models that are claimed to be "usable" by the hypervisor
on the host are reported. The option *--all* will report every CPU model known
to the hypervisor, including ones that are not supported on the hypervisor (e.g.
newer generation models).
DOMAIN COMMANDS
===============

View File

@ -1764,6 +1764,75 @@ cmdHypervisorCPUBaseline(vshControl *ctl,
}
/*
* "hypervisor-cpu-models" command
*/
static const vshCmdInfo info_hypervisor_cpu_models = {
.help = N_("Hypervisor reported CPU models"),
.desc = N_("Get the CPU models reported by the hypervisor."),
};
static const vshCmdOptDef opts_hypervisor_cpu_models[] = {
{.name = "virttype",
.type = VSH_OT_STRING,
.completer = virshDomainVirtTypeCompleter,
.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,
.completer = virshArchCompleter,
.help = N_("CPU architecture (/domain/os/type/@arch)"),
},
{.name = "machine",
.type = VSH_OT_STRING,
.help = N_("machine type (/domain/os/type/@machine)"),
},
{.name = "all",
.type = VSH_OT_BOOL,
.help = N_("include all CPU models known to the hypervisor for the architecture")
},
{.name = NULL}
};
static bool
cmdHypervisorCPUModelNames(vshControl *ctl,
const vshCmd *cmd)
{
g_autofree char *caps_xml = NULL;
const char *virttype = NULL;
const char *emulator = NULL;
const char *arch = NULL;
const char *machine = NULL;
const char *xpath = NULL;
virshControl *priv = ctl->privData;
if (vshCommandOptString(ctl, cmd, "virttype", &virttype) < 0 ||
vshCommandOptString(ctl, cmd, "emulator", &emulator) < 0 ||
vshCommandOptString(ctl, cmd, "arch", &arch) < 0 ||
vshCommandOptString(ctl, cmd, "machine", &machine) < 0)
return false;
if (vshCommandOptBool(cmd, "all"))
xpath = "//cpu//model[@usable]/text()";
else
xpath = "//cpu//model[@usable='yes']/text()";
caps_xml = virConnectGetDomainCapabilities(priv->conn, emulator, arch,
machine, virttype, 0);
if (!caps_xml) {
vshError(ctl, "%s", _("failed to get hypervisor CPU model names"));
return false;
}
return virshDumpXML(ctl, caps_xml, "domcapabilities", xpath, false);
}
const vshCmdDef hostAndHypervisorCmds[] = {
{.name = "allocpages",
.handler = cmdAllocpages,
@ -1831,6 +1900,12 @@ const vshCmdDef hostAndHypervisorCmds[] = {
.info = &info_hypervisor_cpu_compare,
.flags = 0
},
{.name = "hypervisor-cpu-models",
.handler = cmdHypervisorCPUModelNames,
.opts = opts_hypervisor_cpu_models,
.info = &info_hypervisor_cpu_models,
.flags = 0
},
{.name = "maxvcpus",
.handler = cmdMaxvcpus,
.opts = opts_maxvcpus,