[libvirt] [PATCHv4 3/9] virCaps: get rid of "defaultInitPath" value in the virCaps struct

Peter Krempa pkrempa at redhat.com
Fri Mar 15 15:26:36 UTC 2013


This gets rid of the parameter in favor of using the new callback
infrastructure to do the same stuff.

This patch implements the domain adjustment callback in the openVZ
driver and moves the check from the parser to a new validation method in
the callback infrastructure.
---

Notes:
    Version 4:
    - tweaked naming do comply with other changes
    - v3 ACKed
    
    Version 3:
    - new in series

 src/conf/capabilities.h    |  1 -
 src/conf/domain_conf.c     | 33 +++++++++++++++++++++------------
 src/openvz/openvz_conf.c   |  1 -
 src/openvz/openvz_driver.c | 26 +++++++++++++++++++++++++-
 4 files changed, 46 insertions(+), 15 deletions(-)

diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
index a70896a..43ace12 100644
--- a/src/conf/capabilities.h
+++ b/src/conf/capabilities.h
@@ -168,7 +168,6 @@ struct _virCaps {
     int defaultDiskDriverType; /* enum virStorageFileFormat */
     int (*defaultConsoleTargetType)(const char *ostype, virArch guestarch);
     bool hasWideScsiBus;
-    const char *defaultInitPath;
 };


diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a1b634b..bd3cd26 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2487,6 +2487,22 @@ int virDomainDeviceInfoIterate(virDomainDefPtr def,
 }


+/* this is a place for global assumption checks */
+static int
+virDomainDefPostParseInternal(virDomainDefPtr def,
+                              virCapsPtr caps ATTRIBUTE_UNUSED)
+{
+    /* verify init path for container based domains */
+    if (STREQ(def->os.type, "exe") && !def->os.init) {
+        virReportError(VIR_ERR_XML_ERROR, "%s",
+                       _("init binary must be specified"));
+        return -1;
+    }
+
+    return 0;
+}
+
+
 static int
 virDomainDeviceDefPostParse(virDomainXMLConfPtr xmlconf,
                             virDomainDeviceDefPtr dev,
@@ -2506,6 +2522,7 @@ virDomainDeviceDefPostParse(virDomainXMLConfPtr xmlconf,
 }


+
 struct virDomainDefPostParseDeviceIteratorData {
     virCapsPtr caps;
     virDomainDefPtr def;
@@ -2550,6 +2567,10 @@ virDomainDefPostParse(virDomainXMLConfPtr xmlconf,
                                           &data)) < 0)
         return ret;

+
+    if ((ret = virDomainDefPostParseInternal(def, caps)) < 0)
+        return ret;
+
     return 0;
 }

@@ -10297,18 +10318,6 @@ virDomainDefParseXML(virCapsPtr caps,

     if (STREQ(def->os.type, "exe")) {
         def->os.init = virXPathString("string(./os/init[1])", ctxt);
-        if (!def->os.init) {
-            if (caps->defaultInitPath) {
-                def->os.init = strdup(caps->defaultInitPath);
-                if (!def->os.init) {
-                    goto no_memory;
-                }
-            } else {
-                virReportError(VIR_ERR_XML_ERROR, "%s",
-                               _("init binary must be specified"));
-                goto error;
-            }
-        }
         def->os.cmdline = virXPathString("string(./os/cmdline[1])", ctxt);

         if ((n = virXPathNodeSet("./os/initarg", ctxt, &nodes)) < 0) {
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index e3e64e5..05c6113 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -206,7 +206,6 @@ virCapsPtr openvzCapsInit(void)
                                       NULL) == NULL)
         goto no_memory;

-    caps->defaultInitPath = "/sbin/init";
     caps->defaultConsoleTargetType = openvzDefaultConsoleType;

     return caps;
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index a6f4c66..de6198c 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -97,6 +97,29 @@ static void cmdExecFree(const char *cmdExec[])
     }
 }

+
+static int
+openvzDomainDefPostParse(virDomainDefPtr def,
+                         virCapsPtr caps ATTRIBUTE_UNUSED,
+                         void *opaque ATTRIBUTE_UNUSED)
+{
+    /* fill the init path */
+    if (STREQ(def->os.type, "exe") && !def->os.init) {
+        if (!(def->os.init = strdup("/sbin/init"))) {
+            virReportOOMError();
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+
+virDomainDefParserConfig openvzDomainDefParserConfig = {
+        .domainConfigCallback = openvzDomainDefPostParse,
+};
+
+
 /* generate arguments to create OpenVZ container
    return -1 - error
            0 - OK
@@ -1453,7 +1476,8 @@ static virDrvOpenStatus openvzOpen(virConnectPtr conn,
     if (!(driver->caps = openvzCapsInit()))
         goto cleanup;

-    if (!(driver->xmlconf = virDomainXMLConfNew(NULL, NULL, NULL)))
+    if (!(driver->xmlconf = virDomainXMLConfNew(&openvzDomainDefParserConfig,
+                                                NULL, NULL)))
         goto cleanup;

     if (openvzLoadDomains(driver) < 0)
-- 
1.8.1.5




More information about the libvir-list mailing list