[libvirt] [PATCH 02/30] qemu: add machines & arch to fake test capabilities cache

Daniel P. Berrangé berrange at redhat.com
Wed Dec 4 14:20:45 UTC 2019


Currently the virQEMUCapsPtr objects are just empty. Future patches are
going to expect them to contain real data. Start off by populating the
machine types and arch information.

Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 src/qemu/qemu_capabilities.c |  70 +++--
 src/qemu/qemu_capspriv.h     |  10 +
 tests/qemuxml2argvtest.c     |   9 +-
 tests/testutilsqemu.c        | 594 ++++++++---------------------------
 4 files changed, 190 insertions(+), 493 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index cfc16ba63e..c02ff5b941 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2434,49 +2434,72 @@ static const char *preferredMachines[] =
 verify(G_N_ELEMENTS(preferredMachines) == VIR_ARCH_LAST);
 
 
+void
+virQEMUCapsAddMachine(virQEMUCapsPtr qemuCaps,
+                      virDomainVirtType virtType,
+                      const char *name,
+                      const char *alias,
+                      const char *defaultCPU,
+                      int maxCpus,
+                      bool hotplugCpus,
+                      bool isDefault)
+{
+    virQEMUCapsAccelPtr accel = virQEMUCapsGetAccel(qemuCaps, virtType);
+    virQEMUCapsMachineTypePtr mach;
+
+    accel->machineTypes = g_renew(virQEMUCapsMachineType,
+                                  accel->machineTypes,
+                                  ++accel->nmachineTypes);
+
+    mach = &(accel->machineTypes[accel->nmachineTypes - 1]);
+
+    mach->alias = g_strdup(alias);
+    mach->name = g_strdup(name);
+    mach->defaultCPU = g_strdup(defaultCPU);
+
+    mach->maxCpus = maxCpus;
+    mach->hotplugCpus = hotplugCpus;
+
+    mach->qemuDefault = isDefault;
+}
+
 static int
 virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps,
-                                virQEMUCapsAccelPtr accel,
+                                virDomainVirtType virtType,
                                 qemuMonitorPtr mon)
 {
     qemuMonitorMachineInfoPtr *machines = NULL;
     int nmachines = 0;
-    int ret = -1;
     size_t i;
     ssize_t defIdx = -1;
     ssize_t preferredIdx = -1;
     const char *preferredMachine = preferredMachines[qemuCaps->arch];
+    virQEMUCapsAccelPtr accel = virQEMUCapsGetAccel(qemuCaps, virtType);
 
     if ((nmachines = qemuMonitorGetMachines(mon, &machines)) < 0)
         return -1;
 
-    if (VIR_ALLOC_N(accel->machineTypes, nmachines) < 0)
-        goto cleanup;
-
     for (i = 0; i < nmachines; i++) {
-        virQEMUCapsMachineTypePtr mach;
         if (STREQ(machines[i]->name, "none"))
             continue;
 
-        mach = &(accel->machineTypes[accel->nmachineTypes++]);
-
-        mach->alias = g_strdup(machines[i]->alias);
-        mach->name = g_strdup(machines[i]->name);
-        mach->defaultCPU = g_strdup(machines[i]->defaultCPU);
-
-        mach->maxCpus = machines[i]->maxCpus;
-        mach->hotplugCpus = machines[i]->hotplugCpus;
+        virQEMUCapsAddMachine(qemuCaps,
+                              virtType,
+                              machines[i]->name,
+                              machines[i]->alias,
+                              machines[i]->defaultCPU,
+                              machines[i]->maxCpus,
+                              machines[i]->hotplugCpus,
+                              machines[i]->isDefault);
 
         if (preferredMachine &&
-            (STREQ_NULLABLE(mach->alias, preferredMachine) ||
-             STREQ(mach->name, preferredMachine))) {
+            (STREQ_NULLABLE(machines[i]->alias, preferredMachine) ||
+             STREQ(machines[i]->name, preferredMachine))) {
             preferredIdx = accel->nmachineTypes - 1;
         }
 
-        if (machines[i]->isDefault) {
-            mach->qemuDefault = true;
+        if (machines[i]->isDefault)
             defIdx = accel->nmachineTypes - 1;
-        }
     }
 
     /*
@@ -2493,13 +2516,10 @@ virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps,
     if (preferredIdx != -1)
         virQEMUCapsSetDefaultMachine(accel, preferredIdx);
 
-    ret = 0;
-
- cleanup:
     for (i = 0; i < nmachines; i++)
         qemuMonitorMachineInfoFree(machines[i]);
     VIR_FREE(machines);
-    return ret;
+    return 0;
 }
 
 
@@ -4745,7 +4765,7 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
         return -1;
     if (virQEMUCapsProbeQMPDevices(qemuCaps, mon) < 0)
         return -1;
-    if (virQEMUCapsProbeQMPMachineTypes(qemuCaps, accel, mon) < 0)
+    if (virQEMUCapsProbeQMPMachineTypes(qemuCaps, type, mon) < 0)
         return -1;
     if (virQEMUCapsProbeQMPMachineProps(qemuCaps, type, mon) < 0)
         return -1;
@@ -4788,7 +4808,7 @@ virQEMUCapsInitQMPMonitorTCG(virQEMUCapsPtr qemuCaps,
     if (virQEMUCapsProbeQMPHostCPU(qemuCaps, accel, mon, VIR_DOMAIN_VIRT_QEMU) < 0)
         return -1;
 
-    if (virQEMUCapsProbeQMPMachineTypes(qemuCaps, accel, mon) < 0)
+    if (virQEMUCapsProbeQMPMachineTypes(qemuCaps, VIR_DOMAIN_VIRT_QEMU, mon) < 0)
         return -1;
 
     return 0;
diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h
index 9fc3f43f32..9059ee3059 100644
--- a/src/qemu/qemu_capspriv.h
+++ b/src/qemu/qemu_capspriv.h
@@ -104,3 +104,13 @@ virQEMUCapsSetMicrocodeVersion(virQEMUCapsPtr qemuCaps,
 
 void
 virQEMUCapsStripMachineAliases(virQEMUCapsPtr qemuCaps);
+
+void
+virQEMUCapsAddMachine(virQEMUCapsPtr qemuCaps,
+                      virDomainVirtType virtType,
+                      const char *name,
+                      const char *alias,
+                      const char *defaultCPU,
+                      int maxCpus,
+                      bool hotplugCpus,
+                      bool isDefault);
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 546cdae245..6890de101b 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -475,9 +475,12 @@ testCompareXMLToArgv(const void *data)
     if (qemuProcessPrepareMonitorChr(&monitor_chr, priv->libDir) < 0)
         goto cleanup;
 
-    if (!(info->flags & FLAG_REAL_CAPS) &&
-        testUpdateQEMUCaps(info, vm, driver.caps) < 0)
-        goto cleanup;
+    if (!(info->flags & FLAG_REAL_CAPS)) {
+        if (testUpdateQEMUCaps(info, vm, driver.caps) < 0)
+            goto cleanup;
+        if (qemuTestCapsCacheInsert(driver.qemuCapsCache, info->qemuCaps) < 0)
+            goto cleanup;
+    }
 
     log = virTestLogContentAndReset();
     VIR_FREE(log);
diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
index 97f63e7d5d..0ca690a1ed 100644
--- a/tests/testutilsqemu.c
+++ b/tests/testutilsqemu.c
@@ -20,149 +20,115 @@ virCPUDefPtr cpuHaswell;
 virCPUDefPtr cpuPower8;
 virCPUDefPtr cpuPower9;
 
-typedef enum {
-    TEST_UTILS_QEMU_BIN_I686,
-    TEST_UTILS_QEMU_BIN_X86_64,
-    TEST_UTILS_QEMU_BIN_AARCH64,
-    TEST_UTILS_QEMU_BIN_ARM,
-    TEST_UTILS_QEMU_BIN_PPC64,
-    TEST_UTILS_QEMU_BIN_PPC,
-    TEST_UTILS_QEMU_BIN_RISCV32,
-    TEST_UTILS_QEMU_BIN_RISCV64,
-    TEST_UTILS_QEMU_BIN_S390X
-} QEMUBinType;
-
-static const char *QEMUBinList[] = {
-    "/usr/bin/qemu-system-i386",
-    "/usr/bin/qemu-system-x86_64",
-    "/usr/bin/qemu-system-aarch64",
-    "/usr/bin/qemu-system-arm",
-    "/usr/bin/qemu-system-ppc64",
-    "/usr/bin/qemu-system-ppc",
-    "/usr/bin/qemu-system-riscv32",
-    "/usr/bin/qemu-system-riscv64",
-    "/usr/bin/qemu-system-s390x"
-};
-
-
-static virCapsGuestMachinePtr *testQemuAllocMachines(int *nmachines)
-{
-    virCapsGuestMachinePtr *machines;
-    static const char *const x86_machines[] = {
-        "pc", "isapc"
-    };
-
-    machines = virCapabilitiesAllocMachines(x86_machines,
-                                            G_N_ELEMENTS(x86_machines));
-    if (machines == NULL)
-        return NULL;
-
-    *nmachines = G_N_ELEMENTS(x86_machines);
 
-    return machines;
-}
-
-/* Newer versions of qemu have versioned machine types to allow
- * compatibility with older releases.
- * The 'pc' machine type is an alias of the newest machine type.
- */
-static virCapsGuestMachinePtr *testQemuAllocNewerMachines(int *nmachines)
-{
-    virCapsGuestMachinePtr *machines;
-    char *canonical;
-    static const char *const x86_machines[] = {
-        "pc-0.11", "pc", "pc-0.10", "isapc"
-    };
-
-    canonical = g_strdup(x86_machines[0]);
-
-    machines = virCapabilitiesAllocMachines(x86_machines,
-                                            G_N_ELEMENTS(x86_machines));
-    if (machines == NULL) {
-        VIR_FREE(canonical);
-        return NULL;
-    }
+static const char *qemu_emulators[VIR_ARCH_LAST] = {
+    [VIR_ARCH_I686] = "/usr/bin/qemu-system-i386",
+    [VIR_ARCH_X86_64] = "/usr/bin/qemu-system-x86_64",
+    [VIR_ARCH_AARCH64] = "/usr/bin/qemu-system-aarch64",
+    [VIR_ARCH_ARMV7L] = "/usr/bin/qemu-system-arm",
+    [VIR_ARCH_PPC64] = "/usr/bin/qemu-system-ppc64",
+    [VIR_ARCH_PPC] = "/usr/bin/qemu-system-ppc",
+    [VIR_ARCH_RISCV32] = "/usr/bin/qemu-system-riscv32",
+    [VIR_ARCH_RISCV64] = "/usr/bin/qemu-system-riscv64",
+    [VIR_ARCH_S390X] = "/usr/bin/qemu-system-s390x"
+};
 
-    machines[1]->canonical = canonical;
+static const virArch arch_alias[VIR_ARCH_LAST] = {
+    [VIR_ARCH_PPC64LE] = VIR_ARCH_PPC64,
+    [VIR_ARCH_ARMV6L] = VIR_ARCH_ARMV7L,
+};
 
-    *nmachines = G_N_ELEMENTS(x86_machines);
+static const char *const i386_machines[] = {
+    "pc", "isapc", NULL
+};
+static const char *const x86_64_machines_kvm[] = {
+    "pc", "isapc", NULL
+};
+static const char *const x86_64_machines_qemu[] = {
+    "pc-0.11", "pc", "pc-0.10", "isapc", NULL
+};
+static const char *const aarch64_machines[] = {
+    "virt", NULL
+};
+static const char *const arm_machines[] = {
+    "vexpress-a9", "vexpress-a15", "versatilepb", NULL
+};
+static const char *const ppc64_machines[] = {
+    "pseries", NULL
+};
+static const char *const ppc_machines[] = {
+    "g3beige", "mac99", "prep", "ppce500", NULL
+};
+static const char *const riscv32_machines[] = {
+    "spike_v1.10", "spike_v1.9.1", "sifive_e", "virt", "sifive_u", NULL
+};
+static const char *const riscv64_machines[] = {
+    "spike_v1.10", "spike_v1.9.1", "sifive_e", "virt", "sifive_u", NULL
+};
+static const char *const s390x_machines[] = {
+    "s390-virtio", "s390-ccw-virtio", NULL
+};
 
-    return machines;
-}
+static const char *const *qemu_machines[VIR_ARCH_LAST] = {
+    [VIR_ARCH_I686] = i386_machines,
+    [VIR_ARCH_X86_64] = x86_64_machines_qemu,
+    [VIR_ARCH_AARCH64] = aarch64_machines,
+    [VIR_ARCH_ARMV7L] = arm_machines,
+    [VIR_ARCH_PPC64] = ppc64_machines,
+    [VIR_ARCH_PPC] = ppc_machines,
+    [VIR_ARCH_RISCV32] = riscv32_machines,
+    [VIR_ARCH_RISCV64] = riscv64_machines,
+    [VIR_ARCH_S390X] = s390x_machines,
+};
 
+static const char *const *kvm_machines[VIR_ARCH_LAST] = {
+    [VIR_ARCH_I686] = i386_machines,
+    [VIR_ARCH_X86_64] = x86_64_machines_kvm,
+    [VIR_ARCH_AARCH64] = aarch64_machines,
+    [VIR_ARCH_ARMV7L] = arm_machines,
+    [VIR_ARCH_PPC64] = ppc64_machines,
+    [VIR_ARCH_PPC] = ppc_machines,
+    [VIR_ARCH_RISCV32] = riscv32_machines,
+    [VIR_ARCH_RISCV64] = riscv64_machines,
+    [VIR_ARCH_S390X] = s390x_machines,
+};
 
 static int
-testQemuAddI686Guest(virCapsPtr caps)
+testQemuAddGuest(virCapsPtr caps,
+                 virArch arch)
 {
-    int nmachines = 0;
+    size_t nmachines;
     virCapsGuestMachinePtr *machines = NULL;
     virCapsGuestPtr guest;
+    virArch emu_arch = arch;
 
-    if (!(machines = testQemuAllocMachines(&nmachines)))
-        goto error;
-
-    if (!(guest = virCapabilitiesAddGuest(caps,
-                                          VIR_DOMAIN_OSTYPE_HVM,
-                                          VIR_ARCH_I686,
-                                          QEMUBinList[TEST_UTILS_QEMU_BIN_I686],
-                                          NULL,
-                                          nmachines,
-                                          machines)))
-        goto error;
-
-    virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_CPUSELECTION);
-
-    machines = NULL;
-
-    if (!virCapabilitiesAddGuestDomain(guest,
-                                       VIR_DOMAIN_VIRT_QEMU,
-                                       NULL,
-                                       NULL,
-                                       0,
-                                       NULL))
-        goto error;
-
-    if (!(machines = testQemuAllocMachines(&nmachines)))
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest,
-                                       VIR_DOMAIN_VIRT_KVM,
-                                       QEMUBinList[TEST_UTILS_QEMU_BIN_I686],
-                                       NULL,
-                                       nmachines,
-                                       machines))
-        goto error;
-
-    return 0;
-
- error:
-    virCapabilitiesFreeMachines(machines, nmachines);
-    return -1;
-}
-
+    if (arch_alias[arch] != VIR_ARCH_NONE)
+        emu_arch = arch_alias[arch];
 
-static int
-testQemuAddX86_64Guest(virCapsPtr caps)
-{
-    int nmachines = 0;
-    virCapsGuestMachinePtr *machines = NULL;
-    virCapsGuestPtr guest;
+    if (qemu_emulators[emu_arch] == NULL)
+        return 0;
 
-    if (!(machines = testQemuAllocNewerMachines(&nmachines)))
+    nmachines = g_strv_length((gchar **)qemu_machines[emu_arch]);
+    machines = virCapabilitiesAllocMachines(qemu_machines[emu_arch],
+                                            nmachines);
+    if (machines == NULL)
         goto error;
 
     if (!(guest = virCapabilitiesAddGuest(caps,
                                           VIR_DOMAIN_OSTYPE_HVM,
-                                          VIR_ARCH_X86_64,
-                                          QEMUBinList[TEST_UTILS_QEMU_BIN_X86_64],
+                                          arch,
+                                          qemu_emulators[emu_arch],
                                           NULL,
                                           nmachines,
                                           machines)))
         goto error;
 
-    virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_CPUSELECTION);
-
     machines = NULL;
+    nmachines = 0;
+
+    if (arch == VIR_ARCH_I686 ||
+        arch == VIR_ARCH_X86_64)
+        virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_CPUSELECTION);
 
     if (!virCapabilitiesAddGuestDomain(guest,
                                        VIR_DOMAIN_VIRT_QEMU,
@@ -172,27 +138,20 @@ testQemuAddX86_64Guest(virCapsPtr caps)
                                        NULL))
         goto error;
 
-    if (!(machines = testQemuAllocMachines(&nmachines)))
+    nmachines = g_strv_length((char **)kvm_machines[emu_arch]);
+    machines = virCapabilitiesAllocMachines(kvm_machines[emu_arch],
+                                            nmachines);
+    if (machines == NULL)
         goto error;
 
     if (!virCapabilitiesAddGuestDomain(guest,
                                        VIR_DOMAIN_VIRT_KVM,
-                                       QEMUBinList[TEST_UTILS_QEMU_BIN_X86_64],
+                                       qemu_emulators[emu_arch],
                                        NULL,
                                        nmachines,
                                        machines))
         goto error;
 
-    machines = NULL;
-
-    if (!virCapabilitiesAddGuestDomain(guest,
-                                       VIR_DOMAIN_VIRT_KVM,
-                                       QEMUBinList[TEST_UTILS_QEMU_BIN_X86_64],
-                                       NULL,
-                                       0,
-                                       NULL))
-        goto error;
-
     return 0;
 
  error:
@@ -201,295 +160,10 @@ testQemuAddX86_64Guest(virCapsPtr caps)
 }
 
 
-static int testQemuAddPPC64Guest(virCapsPtr caps)
-{
-    static const char *machine[] = { "pseries" };
-    virCapsGuestMachinePtr *machines = NULL;
-    virCapsGuestPtr guest;
-
-    machines = virCapabilitiesAllocMachines(machine, 1);
-    if (!machines)
-        goto error;
-
-    guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_PPC64,
-                                    QEMUBinList[TEST_UTILS_QEMU_BIN_PPC64],
-                                    NULL, 1, machines);
-    if (!guest)
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_QEMU, NULL, NULL, 0, NULL))
-        goto error;
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_KVM,
-                                       NULL, NULL, 0, NULL))
-        goto error;
-
-    return 0;
-
- error:
-    /* No way to free a guest? */
-    virCapabilitiesFreeMachines(machines, 1);
-    return -1;
-}
-
-static int testQemuAddPPC64LEGuest(virCapsPtr caps)
-{
-    static const char *machine[] = { "pseries" };
-    virCapsGuestMachinePtr *machines = NULL;
-    virCapsGuestPtr guest;
-
-    machines = virCapabilitiesAllocMachines(machine, 1);
-    if (!machines)
-        goto error;
-
-    guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_PPC64LE,
-                                    QEMUBinList[TEST_UTILS_QEMU_BIN_PPC64],
-                                    NULL, 1, machines);
-    if (!guest)
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_QEMU, NULL, NULL, 0, NULL))
-        goto error;
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_KVM,
-                                       NULL, NULL, 0, NULL))
-        goto error;
-
-    return 0;
-
- error:
-    /* No way to free a guest? */
-    virCapabilitiesFreeMachines(machines, 1);
-    return -1;
-}
-
-static int testQemuAddPPCGuest(virCapsPtr caps)
-{
-    static const char *machine[] = { "g3beige",
-                                     "mac99",
-                                     "prep",
-                                     "ppce500" };
-    virCapsGuestMachinePtr *machines = NULL;
-    virCapsGuestPtr guest;
-
-    machines = virCapabilitiesAllocMachines(machine, 1);
-    if (!machines)
-        goto error;
-
-    guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_PPC,
-                                    QEMUBinList[TEST_UTILS_QEMU_BIN_PPC],
-                                    NULL, 1, machines);
-    if (!guest)
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_QEMU, NULL, NULL, 0, NULL))
-        goto error;
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_KVM,
-                                       NULL, NULL, 0, NULL))
-        goto error;
-
-    return 0;
-
- error:
-    /* No way to free a guest? */
-    virCapabilitiesFreeMachines(machines, 1);
-    return -1;
-}
-
-static int testQemuAddRISCV32Guest(virCapsPtr caps)
-{
-    static const char *names[] = { "spike_v1.10",
-                                   "spike_v1.9.1",
-                                   "sifive_e",
-                                   "virt",
-                                   "sifive_u" };
-    static const int nmachines = G_N_ELEMENTS(names);
-    virCapsGuestMachinePtr *machines = NULL;
-    virCapsGuestPtr guest;
-
-    machines = virCapabilitiesAllocMachines(names, nmachines);
-    if (!machines)
-        goto error;
-
-    guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_RISCV32,
-                                    QEMUBinList[TEST_UTILS_QEMU_BIN_RISCV32],
-                                    NULL, nmachines, machines);
-    if (!guest)
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_QEMU, NULL, NULL, 0, NULL))
-        goto error;
-
-    return 0;
-
- error:
-    virCapabilitiesFreeMachines(machines, nmachines);
-    return -1;
-}
-
-static int testQemuAddRISCV64Guest(virCapsPtr caps)
-{
-    static const char *names[] = { "spike_v1.10",
-                                   "spike_v1.9.1",
-                                   "sifive_e",
-                                   "virt",
-                                   "sifive_u" };
-    static const int nmachines = G_N_ELEMENTS(names);
-    virCapsGuestMachinePtr *machines = NULL;
-    virCapsGuestPtr guest;
-
-    machines = virCapabilitiesAllocMachines(names, nmachines);
-    if (!machines)
-        goto error;
-
-    guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_RISCV64,
-                                    QEMUBinList[TEST_UTILS_QEMU_BIN_RISCV64],
-                                    NULL, nmachines, machines);
-    if (!guest)
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_QEMU, NULL, NULL, 0, NULL))
-        goto error;
-
-    return 0;
-
- error:
-    virCapabilitiesFreeMachines(machines, nmachines);
-    return -1;
-}
-
-static int testQemuAddS390Guest(virCapsPtr caps)
-{
-    static const char *s390_machines[] = { "s390-virtio",
-                                           "s390-ccw-virtio" };
-    virCapsGuestMachinePtr *machines = NULL;
-    virCapsGuestPtr guest;
-
-    machines = virCapabilitiesAllocMachines(s390_machines,
-                                            G_N_ELEMENTS(s390_machines));
-    if (!machines)
-        goto error;
-
-    guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_S390X,
-                                    QEMUBinList[TEST_UTILS_QEMU_BIN_S390X],
-                                    NULL,
-                                    G_N_ELEMENTS(s390_machines),
-                                    machines);
-    if (!guest)
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_QEMU, NULL, NULL, 0, NULL))
-        goto error;
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_KVM,
-                                       NULL, NULL, 0, NULL))
-        goto error;
-
-    return 0;
-
- error:
-    virCapabilitiesFreeMachines(machines, G_N_ELEMENTS(s390_machines));
-    return -1;
-}
-
-static int testQemuAddArm6Guest(virCapsPtr caps)
-{
-    static const char *machines[] = { "versatilepb" };
-    virCapsGuestMachinePtr *capsmachines = NULL;
-    virCapsGuestPtr guest;
-
-    capsmachines = virCapabilitiesAllocMachines(machines,
-                                                G_N_ELEMENTS(machines));
-    if (!capsmachines)
-        goto error;
-
-    guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_ARMV6L,
-                                    QEMUBinList[TEST_UTILS_QEMU_BIN_ARM],
-                                    NULL,
-                                    G_N_ELEMENTS(machines),
-                                    capsmachines);
-    if (!guest)
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_QEMU, NULL, NULL, 0, NULL))
-        goto error;
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_KVM,
-                                       NULL, NULL, 0, NULL))
-        goto error;
-
-    return 0;
-
- error:
-    virCapabilitiesFreeMachines(capsmachines, G_N_ELEMENTS(machines));
-    return -1;
-}
-
-static int testQemuAddArm7Guest(virCapsPtr caps)
-{
-    static const char *machines[] = { "vexpress-a9",
-                                      "vexpress-a15",
-                                      "versatilepb" };
-    virCapsGuestMachinePtr *capsmachines = NULL;
-    virCapsGuestPtr guest;
-
-    capsmachines = virCapabilitiesAllocMachines(machines,
-                                                G_N_ELEMENTS(machines));
-    if (!capsmachines)
-        goto error;
-
-    guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_ARMV7L,
-                                    QEMUBinList[TEST_UTILS_QEMU_BIN_ARM],
-                                    NULL,
-                                    G_N_ELEMENTS(machines),
-                                    capsmachines);
-    if (!guest)
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_QEMU, NULL, NULL, 0, NULL))
-        goto error;
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_KVM,
-                                       NULL, NULL, 0, NULL))
-        goto error;
-
-    return 0;
-
- error:
-    virCapabilitiesFreeMachines(capsmachines, G_N_ELEMENTS(machines));
-    return -1;
-}
-
-static int testQemuAddAARCH64Guest(virCapsPtr caps)
-{
-    static const char *machines[] = { "virt"};
-    virCapsGuestMachinePtr *capsmachines = NULL;
-    virCapsGuestPtr guest;
-
-    capsmachines = virCapabilitiesAllocMachines(machines,
-                                                G_N_ELEMENTS(machines));
-    if (!capsmachines)
-        goto error;
-
-    guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_AARCH64,
-                                    QEMUBinList[TEST_UTILS_QEMU_BIN_AARCH64],
-                                    NULL,
-                                    G_N_ELEMENTS(machines),
-                                    capsmachines);
-    if (!guest)
-        goto error;
-
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_QEMU, NULL, NULL, 0, NULL))
-        goto error;
-    if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_KVM,
-                                       NULL, NULL, 0, NULL))
-        goto error;
-
-    return 0;
-
- error:
-    virCapabilitiesFreeMachines(capsmachines, G_N_ELEMENTS(machines));
-    return -1;
-}
-
 virCapsPtr testQemuCapsInit(void)
 {
     virCapsPtr caps;
+    size_t i;
 
     if (!(caps = virCapabilitiesNew(VIR_ARCH_X86_64, false, false)))
         return NULL;
@@ -518,38 +192,10 @@ virCapsPtr testQemuCapsInit(void)
     if (virTestCapsBuildNUMATopology(caps, 3) < 0)
         goto cleanup;
 
-    if (testQemuAddI686Guest(caps) < 0)
-        goto cleanup;
-
-    if (testQemuAddX86_64Guest(caps) < 0)
-        goto cleanup;
-
-    if (testQemuAddPPC64Guest(caps))
-        goto cleanup;
-
-    if (testQemuAddPPC64LEGuest(caps))
-        goto cleanup;
-
-    if (testQemuAddPPCGuest(caps))
-        goto cleanup;
-
-    if (testQemuAddRISCV32Guest(caps) < 0)
-        goto cleanup;
-
-    if (testQemuAddRISCV64Guest(caps) < 0)
-        goto cleanup;
-
-    if (testQemuAddS390Guest(caps))
-        goto cleanup;
-
-    if (testQemuAddArm6Guest(caps))
-        goto cleanup;
-
-    if (testQemuAddArm7Guest(caps))
-        goto cleanup;
-
-    if (testQemuAddAARCH64Guest(caps))
-        goto cleanup;
+    for (i = 0; i < VIR_ARCH_LAST; i++) {
+        if (testQemuAddGuest(caps, i) < 0)
+            goto cleanup;
+    }
 
     if (virTestGetDebug()) {
         char *caps_str;
@@ -658,27 +304,45 @@ void qemuTestDriverFree(virQEMUDriver *driver)
 int qemuTestCapsCacheInsert(virFileCachePtr cache,
                             virQEMUCapsPtr caps)
 {
-    size_t i;
-    virQEMUCapsPtr tmpCaps;
+    size_t i, j;
 
-    if (caps) {
-        tmpCaps = caps;
-    } else {
-        if (!(tmpCaps = virQEMUCapsNew()))
-            return -ENOMEM;
-    }
-
-    for (i = 0; i < G_N_ELEMENTS(QEMUBinList); i++) {
-        virObjectRef(tmpCaps);
-        if (virFileCacheInsertData(cache, QEMUBinList[i], tmpCaps) < 0) {
+    for (i = 0; i < G_N_ELEMENTS(qemu_emulators); i++) {
+        virQEMUCapsPtr tmpCaps;
+        if (qemu_emulators[i] == NULL)
+            continue;
+        if (caps) {
+            tmpCaps = virQEMUCapsNewCopy(caps);
+        } else {
+            tmpCaps = virQEMUCapsNew();
+        }
+        virQEMUCapsSetArch(tmpCaps, i);
+        for (j = 0; qemu_machines[i][j] != NULL; j++) {
+            virQEMUCapsAddMachine(tmpCaps,
+                                  VIR_DOMAIN_VIRT_QEMU,
+                                  qemu_machines[i][j],
+                                  NULL,
+                                  NULL,
+                                  0,
+                                  false,
+                                  false);
+        }
+        for (j = 0; kvm_machines[i][j] != NULL; j++) {
+            virQEMUCapsAddMachine(tmpCaps,
+                                  VIR_DOMAIN_VIRT_KVM,
+                                  kvm_machines[i][j],
+                                  NULL,
+                                  NULL,
+                                  0,
+                                  false,
+                                  false);
+            virQEMUCapsSet(tmpCaps, QEMU_CAPS_KVM);
+        }
+        if (virFileCacheInsertData(cache, qemu_emulators[i], tmpCaps) < 0) {
             virObjectUnref(tmpCaps);
             return -1;
         }
     }
 
-    if (!caps)
-        virObjectUnref(tmpCaps);
-
     return 0;
 }
 
-- 
2.23.0




More information about the libvir-list mailing list