[libvirt] [PATCH v1 04/51] util: conf: separate virDomainDefParseOsNodeInfo from virDomainDefParseXML

xinhua.Cao caoxinhua at huawei.com
Thu Feb 8 06:46:02 UTC 2018


separate virDomainDefParseOsNodeInfo from virDomainDefParseXML
---
 src/conf/domain_conf.c | 180 +++++++++++++++++++++++++++----------------------
 1 file changed, 100 insertions(+), 80 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index bf2cf7f..0f7069c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -18595,6 +18595,105 @@ virDomainDefParseVirtTypeInfo(virDomainParseTotalParamPtr param)
 }
 
 
+static int
+virDomainDefParseOsNodeInfo(virDomainParseTotalParamPtr param)
+{
+    virDomainDefPtr def = param->def;
+    virCapsPtr caps = param->caps;
+    xmlXPathContextPtr ctxt = param->ctxt;
+    unsigned int flags = param->flags;
+    char *tmp = NULL;
+    int ret = -1;
+
+    def->os.bootloader = virXPathString("string(./bootloader)", ctxt);
+    def->os.bootloaderArgs = virXPathString("string(./bootloader_args)", ctxt);
+
+    tmp = virXPathString("string(./os/type[1])", ctxt);
+    if (!tmp) {
+        if (def->os.bootloader) {
+            def->os.type = VIR_DOMAIN_OSTYPE_XEN;
+        } else {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("an os <type> must be specified"));
+            goto cleanup;
+        }
+    } else {
+        if ((def->os.type = virDomainOSTypeFromString(tmp)) < 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unknown OS type '%s'"), tmp);
+            goto cleanup;
+        }
+        VIR_FREE(tmp);
+    }
+
+    /*
+     * HACK: For xen driver we previously used bogus 'linux' as the
+     * os type for paravirt, whereas capabilities declare it to
+     * be 'xen'. So we accept the former and convert
+     */
+    if (def->os.type == VIR_DOMAIN_OSTYPE_LINUX &&
+        def->virtType == VIR_DOMAIN_VIRT_XEN) {
+        def->os.type = VIR_DOMAIN_OSTYPE_XEN;
+    }
+
+    tmp = virXPathString("string(./os/type[1]/@arch)", ctxt);
+    if (tmp && !(def->os.arch = virArchFromString(tmp))) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("Unknown architecture %s"),
+                       tmp);
+        goto cleanup;
+    }
+    VIR_FREE(tmp);
+
+    def->os.machine = virXPathString("string(./os/type[1]/@machine)", ctxt);
+    def->emulator = virXPathString("string(./devices/emulator[1])", ctxt);
+
+    if (!(flags & VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS)) {
+        /* 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 (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
+                def->os.arch, use_virttype ? def->virtType : VIR_DOMAIN_VIRT_NONE,
+                NULL, NULL)))
+            goto cleanup;
+
+        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 cleanup;
+        }
+        VIR_FREE(capsdata);
+    }
+
+    if ((tmp = virXPathString("string(./os/smbios/@mode)", ctxt))) {
+        int mode;
+
+        if ((mode = virDomainSmbiosModeTypeFromString(tmp)) < 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unknown smbios mode '%s'"), tmp);
+            goto cleanup;
+        }
+        def->os.smbios_mode = mode;
+        VIR_FREE(tmp);
+    }
+
+    ret = 0;
+
+ cleanup:
+     VIR_FREE(tmp);
+     return ret;
+
+}
+
+
 static virDomainDefPtr
 virDomainDefParseXML(xmlDocPtr xml,
                      xmlNodePtr root,
@@ -18637,6 +18736,7 @@ virDomainDefParseXML(xmlDocPtr xml,
     virDomainPreaseInfoFunc parse_funs[] = {
             virDomainDefParseIdInfo,
             virDomainDefParseVirtTypeInfo,
+            virDomainDefParseOsNodeInfo,
             NULL
     };
 
@@ -18664,74 +18764,6 @@ virDomainDefParseXML(xmlDocPtr xml,
         fun_index++;
     }
 
-    def->os.bootloader = virXPathString("string(./bootloader)", ctxt);
-    def->os.bootloaderArgs = virXPathString("string(./bootloader_args)", ctxt);
-
-    tmp = virXPathString("string(./os/type[1])", ctxt);
-    if (!tmp) {
-        if (def->os.bootloader) {
-            def->os.type = VIR_DOMAIN_OSTYPE_XEN;
-        } else {
-            virReportError(VIR_ERR_XML_ERROR, "%s",
-                           _("an os <type> must be specified"));
-            goto error;
-        }
-    } else {
-        if ((def->os.type = virDomainOSTypeFromString(tmp)) < 0) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("unknown OS type '%s'"), tmp);
-            goto error;
-        }
-        VIR_FREE(tmp);
-    }
-
-    /*
-     * HACK: For xen driver we previously used bogus 'linux' as the
-     * os type for paravirt, whereas capabilities declare it to
-     * be 'xen'. So we accept the former and convert
-     */
-    if (def->os.type == VIR_DOMAIN_OSTYPE_LINUX &&
-        def->virtType == VIR_DOMAIN_VIRT_XEN) {
-        def->os.type = VIR_DOMAIN_OSTYPE_XEN;
-    }
-
-    tmp = virXPathString("string(./os/type[1]/@arch)", ctxt);
-    if (tmp && !(def->os.arch = virArchFromString(tmp))) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("Unknown architecture %s"),
-                       tmp);
-        goto error;
-    }
-    VIR_FREE(tmp);
-
-    def->os.machine = virXPathString("string(./os/type[1]/@machine)", ctxt);
-    def->emulator = virXPathString("string(./devices/emulator[1])", ctxt);
-
-    if (!(flags & VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS)) {
-        /* 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 (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
-                def->os.arch, use_virttype ? def->virtType : VIR_DOMAIN_VIRT_NONE,
-                NULL, NULL)))
-            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 */
     if (!(def->name = virXPathString("string(./name[1])", ctxt))) {
         virReportError(VIR_ERR_NO_NAME, NULL);
@@ -20283,18 +20315,6 @@ virDomainDefParseXML(xmlDocPtr xml,
             goto error;
     }
 
-    if ((tmp = virXPathString("string(./os/smbios/@mode)", ctxt))) {
-        int mode;
-
-        if ((mode = virDomainSmbiosModeTypeFromString(tmp)) < 0) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("unknown smbios mode '%s'"), tmp);
-            goto error;
-        }
-        def->os.smbios_mode = mode;
-        VIR_FREE(tmp);
-    }
-
     if (virDomainKeyWrapDefParseXML(def, ctxt) < 0)
         goto error;
 
-- 
2.8.3





More information about the libvir-list mailing list