]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Make virQEMUCapsNewForBinary usable from tests
authorJiri Denemark <jdenemar@redhat.com>
Tue, 26 Apr 2016 13:03:06 +0000 (15:03 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 5 May 2016 08:01:55 +0000 (10:01 +0200)
virQEMUCapsNewForBinary unconditionally loads data from cache and probes
using both QMP and -help parsing, which is suboptimal when we want to
use it in tests.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_capspriv.h

index 65c3d6989cd82e3b52589501665ea8d774a76680..c2ba69dadea11f4a80bf05a8c7a683376004ecde 100644 (file)
@@ -3713,11 +3713,13 @@ virQEMUCapsLogProbeFailure(const char *binary)
 }
 
 
-virQEMUCapsPtr virQEMUCapsNewForBinary(const char *binary,
-                                       const char *libDir,
-                                       const char *cacheDir,
-                                       uid_t runUid,
-                                       gid_t runGid)
+virQEMUCapsPtr
+virQEMUCapsNewForBinaryInternal(const char *binary,
+                                const char *libDir,
+                                const char *cacheDir,
+                                uid_t runUid,
+                                gid_t runGid,
+                                bool qmpOnly)
 {
     virQEMUCapsPtr qemuCaps;
     struct stat sb;
@@ -3749,7 +3751,9 @@ virQEMUCapsPtr virQEMUCapsNewForBinary(const char *binary,
         goto error;
     }
 
-    if ((rv = virQEMUCapsInitCached(qemuCaps, cacheDir)) < 0)
+    if (!cacheDir)
+        rv = 0;
+    else if ((rv = virQEMUCapsInitCached(qemuCaps, cacheDir)) < 0)
         goto error;
 
     if (rv == 0) {
@@ -3758,13 +3762,22 @@ virQEMUCapsPtr virQEMUCapsNewForBinary(const char *binary,
             goto error;
         }
 
+        if (qmpOnly && !qemuCaps->usedQMP) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("Failed to probe QEMU binary with QMP: %s"),
+                           qmperr ? qmperr : _("unknown error"));
+            virQEMUCapsLogProbeFailure(binary);
+            goto error;
+        }
+
         if (!qemuCaps->usedQMP &&
             virQEMUCapsInitHelp(qemuCaps, runUid, runGid, qmperr) < 0) {
             virQEMUCapsLogProbeFailure(binary);
             goto error;
         }
 
-        if (virQEMUCapsRememberCached(qemuCaps, cacheDir) < 0)
+        if (cacheDir &&
+            virQEMUCapsRememberCached(qemuCaps, cacheDir) < 0)
             goto error;
     }
 
@@ -3778,6 +3791,17 @@ virQEMUCapsPtr virQEMUCapsNewForBinary(const char *binary,
     return NULL;
 }
 
+virQEMUCapsPtr
+virQEMUCapsNewForBinary(const char *binary,
+                        const char *libDir,
+                        const char *cacheDir,
+                        uid_t runUid,
+                        gid_t runGid)
+{
+    return virQEMUCapsNewForBinaryInternal(binary, libDir, cacheDir,
+                                           runUid, runGid, false);
+}
+
 
 bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps)
 {
index e4610bbe617572f83b272751e3a7f343380869bc..2a5d8d15033e131a65e0e221f1e23bee5219c55e 100644 (file)
@@ -37,4 +37,12 @@ struct _virQEMUCapsCache {
     gid_t runGid;
 };
 
+virQEMUCapsPtr
+virQEMUCapsNewForBinaryInternal(const char *binary,
+                                const char *libDir,
+                                const char *cacheDir,
+                                uid_t runUid,
+                                gid_t runGid,
+                                bool qmpOnly);
+
 #endif