On 05/16/2018 04:39 AM, Jiri Denemark wrote: > The domain capabilities XML contains host CPU model tailored to a > specific hypervisor and since it's enclosed in <mode name='host-model'> > element rather then the required <cpu> it's impossible to directly use > the host CPU model as an input to, e.g., cpu-compare command. To make > this more convenient, vshExtractCPUDefXML now accepts full domain > capabilities XML and automatically transforms the host CPU models into > the form accepted by libvirt APIs. > > Signed-off-by: Jiri Denemark <jdenemar@xxxxxxxxxx> > --- > tools/virsh-host.c | 26 ++++++++++++++++++++++---- > tools/virsh.pod | 8 +++++--- > 2 files changed, 27 insertions(+), 7 deletions(-) > > diff --git a/tools/virsh-host.c b/tools/virsh-host.c > index 51497db385..ea2c411c02 100644 > --- a/tools/virsh-host.c > +++ b/tools/virsh-host.c > @@ -1109,8 +1109,9 @@ cmdURI(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED) > > /* Extracts the CPU definition XML strings from a file which may contain either > * - just the CPU definitions, > - * - domain XMLs, or > - * - capabilities XMLs. > + * - domain XMLs, > + * - capabilities XMLs, or > + * - domain capabilities XMLs. > * > * Returns NULL terminated string list. > */ > @@ -1138,20 +1139,37 @@ vshExtractCPUDefXMLs(vshControl *ctl, > > n = virXPathNodeSet("/container/cpu|" > "/container/domain/cpu|" > - "/container/capabilities/host/cpu", > + "/container/capabilities/host/cpu|" > + "/container/domainCapabilities/cpu/" > + "mode[@name='host-model' and @supported='yes']", > ctxt, &nodes); > if (n < 0) > goto error; > > if (n == 0) { > vshError(ctl, _("File '%s' does not contain any <cpu> element or " > - "valid domain or capabilities XML"), xmlFile); > + "valid domain XML, host capabilities XML, or " > + "domain capabilities XML"), xmlFile); > goto error; > } > > cpus = vshCalloc(ctl, n + 1, sizeof(const char *)); > > for (i = 0; i < n; i++) { > + /* If the user provided domain capabilities XML, we need to replace > + * <mode ...> element with <cpu>. */ > + if (xmlStrEqual(nodes[i]->name, BAD_CAST "mode")) { > + xmlNodeSetName(nodes[i], (const xmlChar *)"cpu"); > + while (nodes[i]->properties) { > + if (xmlRemoveProp(nodes[i]->properties) < 0) { > + vshError(ctl, > + _("Cannot extract CPU definition from domain " > + "capabilities XML")); > + goto error; > + } > + } > + } > + > if (!(cpus[i] = virXMLNodeToString(xml, nodes[i]))) { > vshSaveLibvirtError(); > goto error; > diff --git a/tools/virsh.pod b/tools/virsh.pod > index 5fc8201893..ea10e1ad43 100644 > --- a/tools/virsh.pod > +++ b/tools/virsh.pod > @@ -589,9 +589,11 @@ Compare CPU definition from XML <file> with host CPU. 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 > -definition. In addition to the <cpu> element itself, this command accepts > -full domain or capabilities XML containing the <cpu> element. For more > -information on guest CPU definition see: > +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>. 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 > Reviewed-by: Collin Walling <walling@xxxxxxxxxxxxx> -- Respectfully, - Collin Walling -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list