On 3/18/25 1:13 PM, Ján Tomko wrote: > On a Thursday in 2025, Collin Walling wrote: >> From: David Judkovics <djudkovi(a)linux.ibm.com> >> >> 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@xxxxxxxxxxxxx> >> Signed-off-by: Boris Fiuczynski <fiuczy@xxxxxxxxxxxxx> >> Signed-off-by: Collin Walling <walling@xxxxxxxxxxxxx> >> --- >> >> This is a continuation of a previous series found here: >> >> https://lists.libvirt.org/archives/list/devel@xxxxxxxxxxxxxxxxx/message/I4YKUBDJDMLFJ6767ZPP2NP6Y4COEMBW/ >> >> --- >> docs/manpages/virsh.rst | 24 +++++++++++++ >> tools/virsh-host.c | 74 +++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 98 insertions(+) >> >> diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst >> index baced15dec..48b667736d 100644 >> --- a/docs/manpages/virsh.rst >> +++ b/docs/manpages/virsh.rst >> @@ -1034,6 +1034,30 @@ 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] [emulator] [arch] [machine] [--all] >> + > > The actualy syntax for this (as reported by virsh hypervisor-cpu-models > --help) is: > > hypervisor-cpu-models [--virttype <string>] [--emulator <string>] [--arch <string>] [--machine <string>] [--all] > > i.e. specifying the option name is mandatory > Okay, I'll change the doc in virsh.rst to: 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 >> =============== >> >> diff --git a/tools/virsh-host.c b/tools/virsh-host.c >> index 9e8f542c96..2884067bbb 100644 >> --- a/tools/virsh-host.c >> +++ b/tools/virsh-host.c >> @@ -1766,6 +1766,74 @@ 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, >> + .unwanted_positional = true, > > The use of this option is discouraged, see: > > commit a67f737ddfc59b0f5b3905bd1c0935ced82de3d0 > Author: Peter Krempa <pkrempa@xxxxxxxxxx> > AuthorDate: 2024-03-14 17:17:19 +0100 > Commit: Peter Krempa <pkrempa@xxxxxxxxxx> > CommitDate: 2024-04-02 14:24:30 +0200 > > virt-admin: Annodate 'unwanted_positional' arguments > > https://gitlab.com/libvirt/libvirt/-/commit/a67f737ddfc59b0f5b3905bd1c0935ced82de3d0 > I'll remove it. >> + .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_all = "//cpu//model[@usable]/text()"; >> + const char *xpath_usable = "//cpu//model[@usable='yes']/text()"; >> + virshControl *priv = ctl->privData; >> + > > if (vshCommandOptBool(cmd, "all")) > xpath = "//cpu//model[@usable]/text()"; > else > xpath = "//cpu//model[@usable='yes']/text()"; > > gets rid of the ternary operator and groups the command line processing > together. > Sure. >> + 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; >> + >> + 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", >> + vshCommandOptBool(cmd, "all") ? xpath_all : xpath_usable, >> + false); >> +} >> + >> + > > Reviewed-by: Ján Tomko <jtomko@xxxxxxxxxx> > > Jano Thanks. I'll post a v2 with the changes. -- Regards, Collin