[libvirt] [PATCH 09/11] domain: conf: Use CapabilitiesDomainDataLookup for caps validation

Cole Robinson crobinso at redhat.com
Sat Apr 18 01:45:19 UTC 2015


The strange logic here is just to duplicate the previous behavior,
which parts of the test suite are currently relying on.
---
 src/conf/capabilities.c | 68 -------------------------------------------------
 src/conf/capabilities.h | 11 --------
 src/conf/domain_conf.c  | 61 ++++++++++++++------------------------------
 3 files changed, 19 insertions(+), 121 deletions(-)

diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index 8d3d2a3..a2b6451 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -730,74 +730,6 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps,
 }
 
 /**
- * virCapabilitiesSupportsGuestArch:
- * @caps: capabilities to query
- * @arch: Architecture to search for
- *
- * Returns non-zero if the capabilities support the
- * requested architecture
- */
-extern int
-virCapabilitiesSupportsGuestArch(virCapsPtr caps,
-                                 virArch arch)
-{
-    size_t i;
-    for (i = 0; i < caps->nguests; i++) {
-        if (caps->guests[i]->arch.id == arch)
-            return 1;
-    }
-    return 0;
-}
-
-
-/**
- * virCapabilitiesSupportsGuestOSType:
- * @caps: capabilities to query
- * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE
- *
- * Returns non-zero if the capabilities support the
- * requested operating system type
- */
-extern int
-virCapabilitiesSupportsGuestOSType(virCapsPtr caps,
-                                   int ostype)
-{
-    size_t i;
-
-    for (i = 0; i < caps->nguests; i++) {
-        if (caps->guests[i]->ostype == ostype)
-            return 1;
-    }
-    return 0;
-}
-
-
-/**
- * virCapabilitiesSupportsGuestOSTypeArch:
- * @caps: capabilities to query
- * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE
- * @arch: Architecture to search for
- *
- * Returns non-zero if the capabilities support the
- * requested operating system type
- */
-extern int
-virCapabilitiesSupportsGuestOSTypeArch(virCapsPtr caps,
-                                       int ostype,
-                                       virArch arch)
-{
-    size_t i;
-
-    for (i = 0; i < caps->nguests; i++) {
-        if (caps->guests[i]->ostype == ostype &&
-            caps->guests[i]->arch.id == arch)
-            return 1;
-    }
-    return 0;
-}
-
-
-/**
  * virCapabilitiesDefaultGuestArch:
  * @caps: capabilities to query
  * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE
diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
index 87acf39..948a1a5 100644
--- a/src/conf/capabilities.h
+++ b/src/conf/capabilities.h
@@ -280,17 +280,6 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps,
                                 const char *emulator,
                                 const char *machinetype);
 
-extern int
-virCapabilitiesSupportsGuestArch(virCapsPtr caps,
-                                 virArch arch);
-extern int
-virCapabilitiesSupportsGuestOSType(virCapsPtr caps,
-                                   int ostype);
-extern int
-virCapabilitiesSupportsGuestOSTypeArch(virCapsPtr caps,
-                                       int ostype,
-                                       virArch arch);
-
 void
 virCapabilitiesClearHostNUMACellCPUTopology(virCapsHostNUMACellCPUPtr cpu,
                                             size_t ncpus);
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index db0079b..4d9d4b5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13729,51 +13729,28 @@ virDomainDefParseXML(xmlDocPtr xml,
     def->emulator = virXPathString("string(./devices/emulator[1])", ctxt);
 
     if (!(flags & VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS)) {
-        if (!virCapabilitiesSupportsGuestOSType(caps, def->os.type)) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("no support found for os <type> '%s'"),
-                           virDomainOSTypeToString(def->os.type));
-            goto error;
-        }
+        /* If the logic here seems fairly arbitrary, that's because it is :)
+         * This is duplicating how the code worked before
+         * CapabilitiesDomainDataLookup was added. We can simplify this,
+         * but it would take a bit of work because the test suite fails
+         * in numerous minor ways. */
+        bool use_virttype = ((def->os.arch == VIR_ARCH_NONE) ||
+            !def->os.machine);
+        virCapsDomainDataPtr capsdata = NULL;
 
-        if (def->os.arch) {
-            if (!virCapabilitiesSupportsGuestArch(caps, def->os.arch)) {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("No guest options available for arch '%s'"),
-                               virArchToString(def->os.arch));
-                goto error;
-            }
-
-            if (!virCapabilitiesSupportsGuestOSTypeArch(caps,
-                                                        def->os.type,
-                                                        def->os.arch)) {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("No os type '%s' available for arch '%s'"),
-                               virDomainOSTypeToString(def->os.type),
-                               virArchToString(def->os.arch));
-                goto error;
-            }
-        } else {
-            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));
-                goto error;
-            }
-        }
+        if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
+                def->os.arch, use_virttype ? def->virtType : -1,
+                NULL, NULL)))
+            goto error;
 
-        if (!def->os.machine) {
-            const char *defaultMachine = virCapabilitiesDefaultGuestMachine(caps,
-                                                                            def->os.type,
-                                                                            def->os.arch,
-                                                                            def->virtType);
-            if (VIR_STRDUP(def->os.machine, defaultMachine) < 0)
-                goto error;
+        if (!def->os.arch)
+            def->os.arch = capsdata->arch;
+        if ((!def->os.machine &&
+             VIR_STRDUP(def->os.machine, capsdata->machinetype) < 0)) {
+            VIR_FREE(capsdata);
+            goto error;
         }
+        VIR_FREE(capsdata);
     }
 
     /* Extract domain name */
-- 
2.3.5




More information about the libvir-list mailing list