mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-09 01:04:59 +00:00
conf: Add device def validation callback
Similarly to the domain definition validator add a device validator. The change to the prototype of the domain validator is necessary as virDomainDeviceInfoIterateInternal requires a non-const pointer.
This commit is contained in:
parent
0fc1fde20b
commit
9890a7a183
@ -4531,6 +4531,47 @@ virDomainDefPostParse(virDomainDefPtr def,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev ATTRIBUTE_UNUSED,
|
||||||
|
const virDomainDef *def ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virDomainDeviceDefValidate(const virDomainDeviceDef *dev,
|
||||||
|
const virDomainDef *def,
|
||||||
|
unsigned int parseFlags,
|
||||||
|
virDomainXMLOptionPtr xmlopt)
|
||||||
|
{
|
||||||
|
/* validate configuration only in certain places */
|
||||||
|
if (parseFlags & VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (xmlopt->config.deviceValidateCallback &&
|
||||||
|
xmlopt->config.deviceValidateCallback(dev, def, xmlopt->config.priv))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (virDomainDeviceDefValidateInternal(dev, def) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virDomainDefValidateDeviceIterator(virDomainDefPtr def,
|
||||||
|
virDomainDeviceDefPtr dev,
|
||||||
|
virDomainDeviceInfoPtr info ATTRIBUTE_UNUSED,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
struct virDomainDefPostParseDeviceIteratorData *data = opaque;
|
||||||
|
return virDomainDeviceDefValidate(dev, def,
|
||||||
|
data->parseFlags, data->xmlopt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virDomainDefValidateInternal(const virDomainDef *def ATTRIBUTE_UNUSED)
|
virDomainDefValidateInternal(const virDomainDef *def ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
@ -4554,11 +4595,17 @@ virDomainDefValidateInternal(const virDomainDef *def ATTRIBUTE_UNUSED)
|
|||||||
* appropriate message.
|
* appropriate message.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
virDomainDefValidate(const virDomainDef *def,
|
virDomainDefValidate(virDomainDefPtr def,
|
||||||
virCapsPtr caps,
|
virCapsPtr caps,
|
||||||
unsigned int parseFlags,
|
unsigned int parseFlags,
|
||||||
virDomainXMLOptionPtr xmlopt)
|
virDomainXMLOptionPtr xmlopt)
|
||||||
{
|
{
|
||||||
|
struct virDomainDefPostParseDeviceIteratorData data = {
|
||||||
|
.caps = caps,
|
||||||
|
.xmlopt = xmlopt,
|
||||||
|
.parseFlags = parseFlags,
|
||||||
|
};
|
||||||
|
|
||||||
/* validate configuration only in certain places */
|
/* validate configuration only in certain places */
|
||||||
if (parseFlags & VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)
|
if (parseFlags & VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)
|
||||||
return 0;
|
return 0;
|
||||||
@ -4568,6 +4615,12 @@ virDomainDefValidate(const virDomainDef *def,
|
|||||||
xmlopt->config.domainValidateCallback(def, caps, xmlopt->config.priv) < 0)
|
xmlopt->config.domainValidateCallback(def, caps, xmlopt->config.priv) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/* iterate the devices */
|
||||||
|
if (virDomainDeviceInfoIterateInternal(def,
|
||||||
|
virDomainDefValidateDeviceIterator,
|
||||||
|
true, &data) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (virDomainDefValidateInternal(def) < 0)
|
if (virDomainDefValidateInternal(def) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -13179,6 +13232,10 @@ virDomainDeviceDefParse(const char *xmlStr,
|
|||||||
if (virDomainDeviceDefPostParse(dev, def, caps, flags, xmlopt) < 0)
|
if (virDomainDeviceDefPostParse(dev, def, caps, flags, xmlopt) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
/* validate the configuration */
|
||||||
|
if (virDomainDeviceDefValidate(dev, def, flags, xmlopt) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
xmlXPathFreeContext(ctxt);
|
xmlXPathFreeContext(ctxt);
|
||||||
@ -24234,7 +24291,8 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src,
|
|||||||
|
|
||||||
xmlStr = virBufferContentAndReset(&buf);
|
xmlStr = virBufferContentAndReset(&buf);
|
||||||
ret = virDomainDeviceDefParse(xmlStr, def, caps, xmlopt,
|
ret = virDomainDeviceDefParse(xmlStr, def, caps, xmlopt,
|
||||||
VIR_DOMAIN_DEF_PARSE_INACTIVE);
|
VIR_DOMAIN_DEF_PARSE_INACTIVE |
|
||||||
|
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(xmlStr);
|
VIR_FREE(xmlStr);
|
||||||
|
@ -2368,6 +2368,12 @@ typedef int (*virDomainDefValidateCallback)(const virDomainDef *def,
|
|||||||
virCapsPtr caps,
|
virCapsPtr caps,
|
||||||
void *opaque);
|
void *opaque);
|
||||||
|
|
||||||
|
/* Called once per device, for adjusting per-device settings while
|
||||||
|
* leaving the overall domain otherwise unchanged. */
|
||||||
|
typedef int (*virDomainDeviceDefValidateCallback)(const virDomainDeviceDef *dev,
|
||||||
|
const virDomainDef *def,
|
||||||
|
void *opaque);
|
||||||
|
|
||||||
typedef struct _virDomainDefParserConfig virDomainDefParserConfig;
|
typedef struct _virDomainDefParserConfig virDomainDefParserConfig;
|
||||||
typedef virDomainDefParserConfig *virDomainDefParserConfigPtr;
|
typedef virDomainDefParserConfig *virDomainDefParserConfigPtr;
|
||||||
struct _virDomainDefParserConfig {
|
struct _virDomainDefParserConfig {
|
||||||
@ -2378,6 +2384,7 @@ struct _virDomainDefParserConfig {
|
|||||||
|
|
||||||
/* validation callbacks */
|
/* validation callbacks */
|
||||||
virDomainDefValidateCallback domainValidateCallback;
|
virDomainDefValidateCallback domainValidateCallback;
|
||||||
|
virDomainDeviceDefValidateCallback deviceValidateCallback;
|
||||||
|
|
||||||
/* private data for the callbacks */
|
/* private data for the callbacks */
|
||||||
void *priv;
|
void *priv;
|
||||||
@ -2424,7 +2431,7 @@ virDomainDefPostParse(virDomainDefPtr def,
|
|||||||
unsigned int parseFlags,
|
unsigned int parseFlags,
|
||||||
virDomainXMLOptionPtr xmlopt);
|
virDomainXMLOptionPtr xmlopt);
|
||||||
|
|
||||||
int virDomainDefValidate(const virDomainDef *def,
|
int virDomainDefValidate(virDomainDefPtr def,
|
||||||
virCapsPtr caps,
|
virCapsPtr caps,
|
||||||
unsigned int parseFlags,
|
unsigned int parseFlags,
|
||||||
virDomainXMLOptionPtr xmlopt);
|
virDomainXMLOptionPtr xmlopt);
|
||||||
|
@ -3742,7 +3742,8 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
|
|||||||
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
|
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
|
||||||
if (!(dev = virDomainDeviceDefParse(xml, vm->def,
|
if (!(dev = virDomainDeviceDefParse(xml, vm->def,
|
||||||
cfg->caps, driver->xmlopt,
|
cfg->caps, driver->xmlopt,
|
||||||
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
|
VIR_DOMAIN_DEF_PARSE_INACTIVE |
|
||||||
|
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
/* Make a copy for updated domain. */
|
/* Make a copy for updated domain. */
|
||||||
@ -3759,7 +3760,8 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
|
|||||||
virDomainDeviceDefFree(dev);
|
virDomainDeviceDefFree(dev);
|
||||||
if (!(dev = virDomainDeviceDefParse(xml, vm->def,
|
if (!(dev = virDomainDeviceDefParse(xml, vm->def,
|
||||||
cfg->caps, driver->xmlopt,
|
cfg->caps, driver->xmlopt,
|
||||||
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
|
VIR_DOMAIN_DEF_PARSE_INACTIVE |
|
||||||
|
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
if (libxlDomainDetachDeviceLive(driver, vm, dev) < 0)
|
if (libxlDomainDetachDeviceLive(driver, vm, dev) < 0)
|
||||||
|
@ -5317,7 +5317,8 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom,
|
|||||||
|
|
||||||
dev = dev_copy = virDomainDeviceDefParse(xml, vm->def,
|
dev = dev_copy = virDomainDeviceDefParse(xml, vm->def,
|
||||||
caps, driver->xmlopt,
|
caps, driver->xmlopt,
|
||||||
VIR_DOMAIN_DEF_PARSE_INACTIVE);
|
VIR_DOMAIN_DEF_PARSE_INACTIVE |
|
||||||
|
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE);
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
|
@ -8422,7 +8422,7 @@ qemuDomainDetachDeviceFlags(virDomainPtr dom,
|
|||||||
virDomainDefPtr vmdef = NULL;
|
virDomainDefPtr vmdef = NULL;
|
||||||
virDomainDeviceDefPtr dev = NULL, dev_copy = NULL;
|
virDomainDeviceDefPtr dev = NULL, dev_copy = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
unsigned int parse_flags = 0;
|
unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE;
|
||||||
virQEMUCapsPtr qemuCaps = NULL;
|
virQEMUCapsPtr qemuCaps = NULL;
|
||||||
qemuDomainObjPrivatePtr priv;
|
qemuDomainObjPrivatePtr priv;
|
||||||
virQEMUDriverConfigPtr cfg = NULL;
|
virQEMUDriverConfigPtr cfg = NULL;
|
||||||
|
@ -2365,7 +2365,8 @@ static int umlDomainDetachDevice(virDomainPtr dom, const char *xml)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dev = virDomainDeviceDefParse(xml, vm->def, driver->caps, driver->xmlopt,
|
dev = virDomainDeviceDefParse(xml, vm->def, driver->caps, driver->xmlopt,
|
||||||
VIR_DOMAIN_DEF_PARSE_INACTIVE);
|
VIR_DOMAIN_DEF_PARSE_INACTIVE |
|
||||||
|
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE);
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -4242,7 +4242,8 @@ static int vboxDomainDetachDevice(virDomainPtr dom, const char *xml)
|
|||||||
def->os.type = VIR_DOMAIN_OSTYPE_HVM;
|
def->os.type = VIR_DOMAIN_OSTYPE_HVM;
|
||||||
|
|
||||||
dev = virDomainDeviceDefParse(xml, def, data->caps, data->xmlopt,
|
dev = virDomainDeviceDefParse(xml, def, data->caps, data->xmlopt,
|
||||||
VIR_DOMAIN_DEF_PARSE_INACTIVE);
|
VIR_DOMAIN_DEF_PARSE_INACTIVE |
|
||||||
|
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE);
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -1211,7 +1211,9 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps,
|
dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps,
|
||||||
privconn->driver->xmlopt, VIR_DOMAIN_XML_INACTIVE);
|
privconn->driver->xmlopt,
|
||||||
|
VIR_DOMAIN_XML_INACTIVE |
|
||||||
|
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE);
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -2355,7 +2355,8 @@ xenDaemonDetachDeviceFlags(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(dev = virDomainDeviceDefParse(xml, def, priv->caps, priv->xmlopt,
|
if (!(dev = virDomainDeviceDefParse(xml, def, priv->caps, priv->xmlopt,
|
||||||
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
|
VIR_DOMAIN_DEF_PARSE_INACTIVE |
|
||||||
|
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainXMLDevID(conn, minidef, dev, class, ref, sizeof(ref)))
|
if (virDomainXMLDevID(conn, minidef, dev, class, ref, sizeof(ref)))
|
||||||
|
@ -1343,7 +1343,8 @@ xenXMDomainDetachDeviceFlags(virConnectPtr conn,
|
|||||||
if (!(dev = virDomainDeviceDefParse(xml, entry->def,
|
if (!(dev = virDomainDeviceDefParse(xml, entry->def,
|
||||||
priv->caps,
|
priv->caps,
|
||||||
priv->xmlopt,
|
priv->xmlopt,
|
||||||
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
|
VIR_DOMAIN_DEF_PARSE_INACTIVE |
|
||||||
|
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
switch (dev->type) {
|
switch (dev->type) {
|
||||||
|
Loading…
Reference in New Issue
Block a user