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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list