]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
caps: Use DomainDataLookup to replace GuestDefault*
authorCole Robinson <crobinso@redhat.com>
Sat, 18 Apr 2015 00:15:25 +0000 (20:15 -0400)
committerCole Robinson <crobinso@redhat.com>
Mon, 20 Apr 2015 20:43:13 +0000 (16:43 -0400)
This revealed that GuestDefaultEmulator was a bit buggy, capable
of returning an emulator that didn't match the passed domain type. Fix
up the test suite input to continue to pass.

src/conf/capabilities.c
src/conf/capabilities.h
src/conf/domain_conf.c
src/libvirt_private.syms
src/qemu/qemu_capabilities.c
src/qemu/qemu_command.c
src/xenconfig/xen_common.c
tests/securityselinuxlabeldata/chardev.xml
tests/securityselinuxlabeldata/disks.xml
tests/securityselinuxlabeldata/kernel.xml
tests/securityselinuxlabeldata/nfs.xml

index f817ace986752f078d4423e0f03778b2889a42af..2c674a8a7044b3d9b257df25f1ff22c8b2f8b375 100644 (file)
@@ -729,128 +729,6 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps,
     return ret;
 }
 
-/**
- * virCapabilitiesDefaultGuestArch:
- * @caps: capabilities to query
- * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE
- * @domain: domain type to search for, of enum VIR_DOMAIN_VIRT
- *
- * Returns the first architecture able to run the
- * requested operating system type
- */
-extern virArch
-virCapabilitiesDefaultGuestArch(virCapsPtr caps,
-                                int ostype,
-                                int domain)
-{
-    size_t i, j;
-
-    /* First try to find one matching host arch */
-    for (i = 0; i < caps->nguests; i++) {
-        if (caps->guests[i]->ostype == ostype) {
-            for (j = 0; j < caps->guests[i]->arch.ndomains; j++) {
-                if (caps->guests[i]->arch.domains[j]->type == domain &&
-                    caps->guests[i]->arch.id == caps->host.arch)
-                    return caps->guests[i]->arch.id;
-            }
-        }
-    }
-
-    /* Otherwise find the first match */
-    for (i = 0; i < caps->nguests; i++) {
-        if (caps->guests[i]->ostype == ostype) {
-            for (j = 0; j < caps->guests[i]->arch.ndomains; j++) {
-                if (caps->guests[i]->arch.domains[j]->type == domain)
-                    return caps->guests[i]->arch.id;
-            }
-        }
-    }
-
-    return VIR_ARCH_NONE;
-}
-
-/**
- * virCapabilitiesDefaultGuestMachine:
- * @caps: capabilities to query
- * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE
- * @arch: architecture to search for
- * @domain: domain type to search for, of enum VIR_DOMAIN_VIRT
- *
- * Returns the first machine variant associated with
- * the requested operating system type, architecture
- * and domain type
- */
-extern const char *
-virCapabilitiesDefaultGuestMachine(virCapsPtr caps,
-                                   int ostype,
-                                   virArch arch,
-                                   int domain)
-{
-    size_t i;
-
-    for (i = 0; i < caps->nguests; i++) {
-        virCapsGuestPtr guest = caps->guests[i];
-        size_t j;
-
-        if (guest->ostype != ostype ||
-            guest->arch.id != arch)
-            continue;
-
-        for (j = 0; j < guest->arch.ndomains; j++) {
-            virCapsGuestDomainPtr dom = guest->arch.domains[j];
-
-            if (dom->type != domain)
-                continue;
-
-            if (!dom->info.nmachines)
-                break;
-
-            return dom->info.machines[0]->name;
-        }
-
-        if (guest->arch.defaultInfo.nmachines)
-            return caps->guests[i]->arch.defaultInfo.machines[0]->name;
-    }
-
-    return NULL;
-}
-
-/**
- * virCapabilitiesDefaultGuestEmulator:
- * @caps: capabilities to query
- * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE
- * @arch: architecture to search for
- * @domain: domain type to search for, of enum VIR_DOMAIN_VIRT
- *
- * Returns the first emulator path associated with
- * the requested operating system type, architecture
- * and domain type
- */
-extern const char *
-virCapabilitiesDefaultGuestEmulator(virCapsPtr caps,
-                                    int ostype,
-                                    virArch arch,
-                                    int domain)
-{
-    size_t i, j;
-
-    for (i = 0; i < caps->nguests; i++) {
-        char *emulator;
-        if (caps->guests[i]->ostype == ostype &&
-            caps->guests[i]->arch.id == arch) {
-            emulator = caps->guests[i]->arch.defaultInfo.emulator;
-            for (j = 0; j < caps->guests[i]->arch.ndomains; j++) {
-                if (caps->guests[i]->arch.domains[j]->type == domain) {
-                    if (caps->guests[i]->arch.domains[j]->info.emulator)
-                        emulator = caps->guests[i]->arch.domains[j]->info.emulator;
-                }
-            }
-            return emulator;
-        }
-    }
-    return NULL;
-}
-
 static int
 virCapabilitiesFormatNUMATopology(virBufferPtr buf,
                                   size_t ncells,
index 40221f4c586593edfdfa0544705e60b757d50fd1..c14fcf676548b69913f9c4c9b5ffd565b982d77b 100644 (file)
@@ -284,21 +284,6 @@ void
 virCapabilitiesClearHostNUMACellCPUTopology(virCapsHostNUMACellCPUPtr cpu,
                                             size_t ncpus);
 
-extern virArch
-virCapabilitiesDefaultGuestArch(virCapsPtr caps,
-                                int ostype,
-                                int domain);
-extern const char *
-virCapabilitiesDefaultGuestMachine(virCapsPtr caps,
-                                   int ostype,
-                                   virArch arch,
-                                   int domain);
-extern const char *
-virCapabilitiesDefaultGuestEmulator(virCapsPtr caps,
-                                    int ostype,
-                                    virArch arch,
-                                    int domain);
-
 extern char *
 virCapabilitiesFormatXML(virCapsPtr caps);
 
index 4d9d4b5c4ac07bd2b2d84f7969a0ea19ab126ed7..911cee3e76588d4ede055f9c5af9853e4c721018 100644 (file)
@@ -12959,25 +12959,18 @@ char *
 virDomainDefGetDefaultEmulator(virDomainDefPtr def,
                                virCapsPtr caps)
 {
-    const char *emulator;
     char *retemu;
+    virCapsDomainDataPtr capsdata;
 
-    emulator = virCapabilitiesDefaultGuestEmulator(caps,
-                                                   def->os.type,
-                                                   def->os.arch,
-                                                   def->virtType);
+    if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
+            def->os.arch, def->virtType, NULL, NULL)))
+        return NULL;
 
-    if (!emulator) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("no emulator for domain %s os type %s "
-                         "on architecture %s"),
-                       virDomainVirtTypeToString(def->virtType),
-                       virDomainOSTypeToString(def->os.type),
-                       virArchToString(def->os.arch));
+    if (VIR_STRDUP(retemu, capsdata->emulator) < 0) {
+        VIR_FREE(capsdata);
         return NULL;
     }
-
-    ignore_value(VIR_STRDUP(retemu, emulator));
+    VIR_FREE(capsdata);
     return retemu;
 }
 
index 58430613f1bb0d10a7373211cb177b36272b9f3f..48785d1ddfe94b67aa08c5812a4b14d76ae6c298 100644 (file)
@@ -51,9 +51,6 @@ virCapabilitiesAddHostMigrateTransport;
 virCapabilitiesAddHostNUMACell;
 virCapabilitiesAllocMachines;
 virCapabilitiesClearHostNUMACellCPUTopology;
-virCapabilitiesDefaultGuestArch;
-virCapabilitiesDefaultGuestEmulator;
-virCapabilitiesDefaultGuestMachine;
 virCapabilitiesDomainDataLookup;
 virCapabilitiesFormatXML;
 virCapabilitiesFreeMachines;
index ad50360b308a934215a6a4099db971fd319d201d..01ed1e275ff55e0068212eba32a83c3e12462213 100644 (file)
@@ -1888,25 +1888,26 @@ int virQEMUCapsGetDefaultVersion(virCapsPtr caps,
                                  virQEMUCapsCachePtr capsCache,
                                  unsigned int *version)
 {
-    const char *binary;
     virQEMUCapsPtr qemucaps;
     virArch hostarch;
+    virCapsDomainDataPtr capsdata;
 
     if (*version > 0)
         return 0;
 
     hostarch = virArchFromHost();
-    if ((binary = virCapabilitiesDefaultGuestEmulator(caps,
-                                                      VIR_DOMAIN_OSTYPE_HVM,
-                                                      hostarch,
-                                                      VIR_DOMAIN_VIRT_QEMU)) == NULL) {
+    if (!(capsdata = virCapabilitiesDomainDataLookup(caps,
+            VIR_DOMAIN_OSTYPE_HVM, hostarch, VIR_DOMAIN_VIRT_QEMU,
+            NULL, NULL))) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Cannot find suitable emulator for %s"),
                        virArchToString(hostarch));
         return -1;
     }
 
-    if (!(qemucaps = virQEMUCapsCacheLookup(capsCache, binary)))
+    qemucaps = virQEMUCapsCacheLookup(capsCache, capsdata->emulator);
+    VIR_FREE(capsdata);
+    if (!qemucaps)
         return -1;
 
     *version = virQEMUCapsGetVersion(qemucaps);
index 8e7b689cc2a57837ac43fe30b09a1b873d5d7c60..29b876ee183ef37f18234e7ac004ff1a41e15b23 100644 (file)
@@ -13145,14 +13145,17 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
     }
 
     if (!def->os.machine) {
-        const char *defaultMachine =
-                        virCapabilitiesDefaultGuestMachine(qemuCaps,
-                                                           def->os.type,
-                                                           def->os.arch,
-                                                           def->virtType);
-        if (defaultMachine != NULL)
-            if (VIR_STRDUP(def->os.machine, defaultMachine) < 0)
-                goto error;
+        virCapsDomainDataPtr capsdata;
+
+        if (!(capsdata = virCapabilitiesDomainDataLookup(qemuCaps, def->os.type,
+                def->os.arch, def->virtType, NULL, NULL)))
+            goto error;
+
+        if (VIR_STRDUP(def->os.machine, capsdata->machinetype) < 0) {
+            VIR_FREE(capsdata);
+            goto error;
+        }
+        VIR_FREE(capsdata);
     }
 
     if (!nographics && def->ngraphics == 0) {
index 728b91011dec764978f599f7a517bbbb4a54ce6b..0dfe60e8999ecdce696643f6e696642063fb8c39 100644 (file)
@@ -983,15 +983,15 @@ xenParseEmulatedDevices(virConfPtr conf, virDomainDefPtr def)
 static int
 xenParseGeneralMeta(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps)
 {
-    const char *defaultMachine;
+    virCapsDomainDataPtr capsdata = NULL;
     const char *str;
-    int hvm = 0;
+    int hvm = 0, ret = -1;
 
     if (xenConfigCopyString(conf, "name", &def->name) < 0)
-        return -1;
+        goto out;
 
     if (xenConfigGetUUID(conf, "uuid", def->uuid) < 0)
-        return -1;
+        goto out;
 
     if ((xenConfigGetString(conf, "builder", &str, "linux") == 0) &&
         STREQ(str, "hvm"))
@@ -999,27 +999,18 @@ xenParseGeneralMeta(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps)
 
     def->os.type = (hvm ? VIR_DOMAIN_OSTYPE_HVM : VIR_DOMAIN_OSTYPE_XEN);
 
-    def->os.arch =
-        virCapabilitiesDefaultGuestArch(caps,
-                                        def->os.type,
-                                        def->virtType);
-    if (!def->os.arch) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("no supported architecture for os type '%s'"),
-                       virDomainOSTypeToString(def->os.type));
-        return -1;
-    }
+    if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
+            VIR_ARCH_NONE, def->virtType, NULL, NULL)))
+        goto out;
 
-    defaultMachine = virCapabilitiesDefaultGuestMachine(caps,
-                                                        def->os.type,
-                                                        def->os.arch,
-                                                        def->virtType);
-    if (defaultMachine != NULL) {
-        if (VIR_STRDUP(def->os.machine, defaultMachine) < 0)
-            return -1;
-    }
+    def->os.arch = capsdata->arch;
+    if (VIR_STRDUP(def->os.machine, capsdata->machinetype) < 0)
+        goto out;
 
-    return 0;
+    ret = 0;
+ out:
+    VIR_FREE(capsdata);
+    return ret;
 }
 
 
index 64b6b5f068df699058281c8a8d9edbb185f13b6e..33002e4a8efe12dc69917eda1cef756bf6f224dc 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7b3edbd-edaf-9455-926a-d65c16db1800</uuid>
   <memory unit='KiB'>219200</memory>
   <os>
-    <type arch='i686' machine='pc-1.0'>hvm</type>
+    <type arch='x86_64' machine='pc-1.0'>hvm</type>
     <boot dev='cdrom'/>
   </os>
   <devices>
index 33e8763bfb8e8ba215302b9db14de57f6d8f545b..08f05876be691495fd7c884dfd54c0e761f46cbc 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7b3edbd-edaf-9455-926a-d65c16db1800</uuid>
   <memory unit='KiB'>219200</memory>
   <os>
-    <type arch='i686' machine='pc-1.0'>hvm</type>
+    <type arch='x86_64' machine='pc-1.0'>hvm</type>
     <boot dev='cdrom'/>
   </os>
   <devices>
index 0fd551da49c88b51e759deed2b60a131c06303a9..1e0cd1537f33ff6a4ce21841403ef3f09a6ec2dc 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7b3edbd-edaf-9455-926a-d65c16db1800</uuid>
   <memory unit='KiB'>219200</memory>
   <os>
-    <type arch='i686' machine='pc-1.0'>hvm</type>
+    <type arch='x86_64' machine='pc-1.0'>hvm</type>
     <kernel>/vmlinuz.raw</kernel>
     <initrd>/initrd.raw</initrd>
   </os>
index 46a14402e025e1ff3b746877d319ea759769a59d..cac12ddb86e96bf513b80e1c3646a73563be42d5 100644 (file)
@@ -3,7 +3,7 @@
   <uuid>c7b3edbd-edaf-9455-926a-d65c16db1800</uuid>
   <memory unit='KiB'>219200</memory>
   <os>
-    <type arch='i686' machine='pc-1.0'>hvm</type>
+    <type arch='x86_64' machine='pc-1.0'>hvm</type>
     <boot dev='cdrom'/>
   </os>
   <devices>