[PATCH v4] virsh: use virConnectGetDomainCapabilities with maxvcpus

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

 



virsh maxvcpus --type kvm output is useless on PPC. Also, in
commit e6806d79 we documented not rely on virConnectGetMaxVcpus
output. Fix the  maxvcpus to use virConnectGetDomainCapabilities
now to make it useful. The call is made to use the default emulator
binary and to check for the host machine and arch which is what the
command intends to show anyway.

Signed-off-by: Shivaprasad G Bhat <sbhat@xxxxxxxxxxxxxxxxxx>
---
 tools/virsh-host.c |   34 +++++++++++++++++++++++++++++++---
 1 file changed, 31 insertions(+), 3 deletions(-)

diff --git a/tools/virsh-host.c b/tools/virsh-host.c
index 57f0c0e..dbdf23d 100644
--- a/tools/virsh-host.c
+++ b/tools/virsh-host.c
@@ -606,18 +606,46 @@ static bool
 cmdMaxvcpus(vshControl *ctl, const vshCmd *cmd)
 {
     const char *type = NULL;
-    int vcpus;
+    int vcpus = -1;
+    char *caps = NULL;
+    const unsigned int flags = 0; /* No flags so far */
+    xmlDocPtr xml = NULL;
+    xmlXPathContextPtr ctxt = NULL;
     virshControlPtr priv = ctl->privData;
 
     if (vshCommandOptStringReq(ctl, cmd, "type", &type) < 0)
         return false;
 
-    if ((vcpus = virConnectGetMaxVcpus(priv->conn, type)) < 0)
+    caps = virConnectGetDomainCapabilities(priv->conn, NULL, NULL, NULL, type, flags);
+    if (!caps) {
+        if (last_error && last_error->code != VIR_ERR_NO_SUPPORT)
+            return false;
+
+        vshResetLibvirtError();
+        goto fallback;
+    }
+
+    xml = virXMLParseStringCtxt(caps, _("(domainCapabilities)"), &ctxt);
+    if (!xml) {
+        VIR_FREE(caps);
         return false;
+    }
 
-    vshPrint(ctl, "%d\n", vcpus);
+    virXPathInt("string(./vcpu[1]/@max)", ctxt, &vcpus);
+    xmlXPathFreeContext(ctxt);
+    xmlFreeDoc(xml);
+    VIR_FREE(caps);
 
+    if (vcpus < 0)
+        goto fallback;
+
+ exit:
+    vshPrint(ctl, "%d\n", vcpus);
     return true;
+ fallback:
+    if ((vcpus = virConnectGetMaxVcpus(priv->conn, type)) < 0)
+        return false;
+    goto exit;
 }
 
 /*

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



[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]