Re: [PATCH] virsh: Introduce new hypervisor-cpu-models command

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 3/6/25 2:07 PM, Collin Walling wrote:

Ping and adding Daniel et al on CC :)

> 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]
> +
> +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,
> +     .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 (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);
> +}
> +
> +
>  const vshCmdDef hostAndHypervisorCmds[] = {
>      {.name = "allocpages",
>       .handler = cmdAllocpages,
> @@ -1833,6 +1901,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,


-- 
Regards,
  Collin



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux