]> xenbits.xensource.com Git - libvirt.git/commitdiff
virQEMUCapsCacheLookupCopy: Filter qemuCaps based on machineType
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 12 Feb 2015 13:50:31 +0000 (14:50 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 20 Feb 2015 12:28:04 +0000 (13:28 +0100)
Not all machine types support all devices, device properties, backends,
etc. So until we create a matrix of [machineType, qemuCaps], lets just
filter out some capabilities before we return them to the consumer
(which is going to make decisions based on them straight away).
Currently, as qemu is unable to tell which capabilities are (not)
enabled for given machine types, it's us who has to hardcode the matrix.
One day maybe the hardcoding will go away and we can create the matrix
dynamically on the fly based on a few monitor calls.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
tests/qemuxml2argvtest.c

index 100338ea1cae86f4e38792e99684f2efb3e515a1..3ccc2dcb6e41cded316dc880be2bcf8c2e9a5bd0 100644 (file)
@@ -3516,6 +3516,42 @@ bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps)
 }
 
 
+struct virQEMUCapsMachineTypeFilter {
+    const char *machineType;
+    virQEMUCapsFlags *flags;
+    size_t nflags;
+};
+
+static const struct virQEMUCapsMachineTypeFilter virQEMUCapsMachineFilter[] = {
+    /* { "blah", virQEMUCapsMachineBLAHFilter,
+         ARRAY_CARDINALITY(virQEMUCapsMachineBLAHFilter) }, */
+    { "", NULL, 0 },
+};
+
+
+void
+virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
+                               const char *machineType)
+{
+    size_t i;
+
+    if (!machineType)
+        return;
+
+    for (i = 0; i < ARRAY_CARDINALITY(virQEMUCapsMachineFilter); i++) {
+        const struct virQEMUCapsMachineTypeFilter *filter = &virQEMUCapsMachineFilter[i];
+        size_t j;
+
+        if (STRNEQ(filter->machineType, machineType))
+            continue;
+
+        for (j = 0; j < filter->nflags; j++)
+            virQEMUCapsClear(qemuCaps, filter->flags[j]);
+    }
+
+}
+
+
 virQEMUCapsCachePtr
 virQEMUCapsCacheNew(const char *libDir,
                     const char *cacheDir,
@@ -3590,7 +3626,7 @@ virQEMUCapsCacheLookup(virQEMUCapsCachePtr cache, const char *binary)
 virQEMUCapsPtr
 virQEMUCapsCacheLookupCopy(virQEMUCapsCachePtr cache,
                            const char *binary,
-                           const char *machineType ATTRIBUTE_UNUSED)
+                           const char *machineType)
 {
     virQEMUCapsPtr qemuCaps = virQEMUCapsCacheLookup(cache, binary);
     virQEMUCapsPtr ret;
@@ -3600,6 +3636,7 @@ virQEMUCapsCacheLookupCopy(virQEMUCapsCachePtr cache,
 
     ret = virQEMUCapsNewCopy(qemuCaps);
     virObjectUnref(qemuCaps);
+    virQEMUCapsFilterByMachineType(ret, machineType);
     return ret;
 }
 
index 242a33d6cc926c8417eff47e7c2d08cc92f13fdb..5d87c1885f7172369c0427dcd170da9bdf7fe626 100644 (file)
@@ -284,6 +284,8 @@ int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
 
 bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps);
 
+void virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
+                                    const char *machineType);
 
 virQEMUCapsCachePtr virQEMUCapsCacheNew(const char *libDir,
                                         const char *cacheDir,
index 39ed66b2e48edadc74f29f884bf0d94af0ca941f..16f325e2bd1c10bd23a15892b1f42766ab921286 100644 (file)
@@ -312,6 +312,8 @@ static int testCompareXMLToArgvFiles(const char *xml,
             goto out;
     }
 
+    virQEMUCapsFilterByMachineType(extraFlags, vmdef->os.machine);
+
     if (virQEMUCapsGet(extraFlags, QEMU_CAPS_DEVICE)) {
         if (qemuDomainAssignAddresses(vmdef, extraFlags, NULL)) {
             if (flags & FLAG_EXPECT_ERROR)