]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsh: use virConnectGetDomainCapabilities with maxvcpus
authorShivaprasad G Bhat <sbhat@linux.vnet.ibm.com>
Wed, 7 Sep 2016 08:55:42 +0000 (14:25 +0530)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 15 Sep 2016 12:24:07 +0000 (14:24 +0200)
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@linux.vnet.ibm.com>
tools/virsh-host.c

index 57f0c0ec077e17a1aaec66043985e232e6b87e9f..2337ce8e6e7b1c166e87abb2e864d76c81ab06da 100644 (file)
@@ -606,18 +606,40 @@ static bool
 cmdMaxvcpus(vshControl *ctl, const vshCmd *cmd)
 {
     const char *type = NULL;
-    int vcpus;
+    int vcpus = -1;
+    char *caps = NULL;
+    xmlDocPtr xml = NULL;
+    xmlXPathContextPtr ctxt = NULL;
     virshControlPtr priv = ctl->privData;
+    bool ret = false;
 
     if (vshCommandOptStringReq(ctl, cmd, "type", &type) < 0)
         return false;
 
-    if ((vcpus = virConnectGetMaxVcpus(priv->conn, type)) < 0)
-        return false;
+    if ((caps = virConnectGetDomainCapabilities(priv->conn, NULL, NULL, NULL,
+                                                type, 0))) {
+        if (!(xml = virXMLParseStringCtxt(caps, _("(domainCapabilities)"), &ctxt)))
+            goto cleanup;
+
+        ignore_value(virXPathInt("string(./vcpu[1]/@max)", ctxt, &vcpus));
+    } else {
+        if (last_error && last_error->code != VIR_ERR_NO_SUPPORT)
+            goto cleanup;
+
+       vshResetLibvirtError();
+    }
+
+    if (vcpus < 0 && (vcpus = virConnectGetMaxVcpus(priv->conn, type)) < 0)
+        goto cleanup;
 
     vshPrint(ctl, "%d\n", vcpus);
+    ret = true;
 
-    return true;
+ cleanup:
+    xmlXPathFreeContext(ctxt);
+    xmlFreeDoc(xml);
+    VIR_FREE(caps);
+    return ret;
 }
 
 /*