[libvirt] [PATCH 06/22] vshExtractCPUDefXML: Accept domain capabilities XML

Jiri Denemark posted 22 patches 6 years, 12 months ago
[libvirt] [PATCH 06/22] vshExtractCPUDefXML: Accept domain capabilities XML
Posted by Jiri Denemark 6 years, 12 months ago
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@redhat.com>
---
 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
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 06/22] vshExtractCPUDefXML: Accept domain capabilities XML
Posted by Collin Walling 6 years, 11 months ago
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@redhat.com>
> ---
>  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@linux.ibm.com>

-- 
Respectfully,
- Collin Walling

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 06/22] vshExtractCPUDefXML: Accept domain capabilities XML
Posted by Ján Tomko 6 years, 11 months ago
On Wed, May 16, 2018 at 10:39:25AM +0200, 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@redhat.com>
>---
> tools/virsh-host.c | 26 ++++++++++++++++++++++----
> tools/virsh.pod    |  8 +++++---
> 2 files changed, 27 insertions(+), 7 deletions(-)
>

Reviewed-by: Ján Tomko <jtomko@redhat.com>

Jano
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list