From 4750c848e95f221e92c7065380ecbd52ffbd54d4 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 6 Mar 2013 15:48:06 +0100 Subject: [PATCH] virCaps: get rid of "defaultInitPath" value in the virCaps struct 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. --- 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 8abe88a9bf..064da80632 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 03c6c7c4c3..c21c687278 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2479,6 +2479,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, @@ -2542,6 +2557,10 @@ virDomainDefPostParse(virDomainDefPtr def, &data)) < 0) return ret; + + if ((ret = virDomainDefPostParseInternal(def, caps)) < 0) + return ret; + return 0; } @@ -10333,18 +10352,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 3b0731bb58..439e457cdc 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 9b1919a148..583a4157c5 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->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL))) + if (!(driver->xmlopt = virDomainXMLOptionNew(&openvzDomainDefParserConfig, + NULL, NULL))) goto cleanup; if (openvzLoadDomains(driver) < 0)