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 5:
- removed spurious newline addition
- ACKed in v3, v4
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 | 31 +++++++++++++++++++------------
src/openvz/openvz_conf.c | 1 -
src/openvz/openvz_driver.c | 26 +++++++++++++++++++++++++-
4 files changed, 44 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 c34093b..1c41d4c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2480,6 +2480,21 @@ int virDomainDeviceInfoIterate(virDomainDefPtr def,
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(virDomainDeviceDefPtr dev,
virDomainDefPtr def,
virCapsPtr caps,
@@ -2542,6 +2557,10 @@ virDomainDefPostParse(virDomainDefPtr def,
&data)) < 0)
return ret;
+
+ if ((ret = virDomainDefPostParseInternal(def, caps)) < 0)
+ return ret;
+
return 0;
}
@@ -10298,18 +10317,6 @@ virDomainDefParseXML(xmlDocPtr xml,
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 9ec1d24..d04833c 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 0cf9156..52b356f 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 = {
+ .domainPostParseCallback = 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