[PATCH 0/7] network define: add support for validation against schema

Kristina Hanicova (7): api: add public virNetworkDefineXMLFlags() and remote protocol vbox_network: add flags to vboxNetworkDefineCreateXML() src: add driver support for networkDefineXMLFlags() api: add virNetworkDefineFlags src & network_conf: add validation against schema in define network: allow VIR_NETWORK_DEFINE_VALIDATE flag virsh: add support for '--validate' option in define network docs/manpages/virsh.rst | 4 ++- include/libvirt/libvirt-network.h | 7 ++++++ src/conf/domain_conf.c | 2 +- src/conf/network_conf.c | 15 ++++++----- src/conf/network_conf.h | 3 ++- src/driver-network.h | 6 +++++ src/esx/esx_network_driver.c | 16 ++++++++++-- src/libvirt-network.c | 41 +++++++++++++++++++++++++++++++ src/libvirt_public.syms | 1 + src/network/bridge_driver.c | 22 +++++++++++++---- src/qemu/qemu_process.c | 2 +- src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 19 +++++++++++++- src/remote_protocol-structs | 8 ++++++ src/test/test_driver.c | 20 ++++++++++++--- src/vbox/vbox_network.c | 18 +++++++++++--- tools/virsh-network.c | 13 +++++++++- 17 files changed, 171 insertions(+), 27 deletions(-) -- 2.31.1

This new API allows to define network with given flags. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- include/libvirt/libvirt-network.h | 3 +++ src/driver-network.h | 6 +++++ src/libvirt-network.c | 41 +++++++++++++++++++++++++++++++ src/libvirt_public.syms | 1 + src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 19 +++++++++++++- src/remote_protocol-structs | 8 ++++++ 7 files changed, 78 insertions(+), 1 deletion(-) diff --git a/include/libvirt/libvirt-network.h b/include/libvirt/libvirt-network.h index c9ff0a49ed..be9d6eb2cb 100644 --- a/include/libvirt/libvirt-network.h +++ b/include/libvirt/libvirt-network.h @@ -124,6 +124,9 @@ virNetworkPtr virNetworkCreateXML (virConnectPtr conn, */ virNetworkPtr virNetworkDefineXML (virConnectPtr conn, const char *xmlDesc); +virNetworkPtr virNetworkDefineXMLFlags(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags); /* * Delete persistent network diff --git a/src/driver-network.h b/src/driver-network.h index 040ef383b3..d31d7c667d 100644 --- a/src/driver-network.h +++ b/src/driver-network.h @@ -73,6 +73,11 @@ typedef virNetworkPtr (*virDrvNetworkDefineXML)(virConnectPtr conn, const char *xml); +typedef virNetworkPtr +(*virDrvNetworkDefineXMLFlags)(virConnectPtr conn, + const char *xml, + unsigned int flags); + typedef int (*virDrvNetworkUndefine)(virNetworkPtr network); @@ -172,6 +177,7 @@ struct _virNetworkDriver { virDrvNetworkLookupByName networkLookupByName; virDrvNetworkCreateXML networkCreateXML; virDrvNetworkDefineXML networkDefineXML; + virDrvNetworkDefineXMLFlags networkDefineXMLFlags; virDrvNetworkUndefine networkUndefine; virDrvNetworkUpdate networkUpdate; virDrvNetworkCreate networkCreate; diff --git a/src/libvirt-network.c b/src/libvirt-network.c index 145487d599..b633f49ca9 100644 --- a/src/libvirt-network.c +++ b/src/libvirt-network.c @@ -465,6 +465,47 @@ virNetworkDefineXML(virConnectPtr conn, const char *xml) } +/** + * virNetworkDefineXMLFlags: + * @conn: pointer to the hypervisor connection + * @xml: the XML description for the network, preferably in UTF-8 + * @flags: extra flags; not used yet, so callers should always pass 0 + * + * Define an inactive persistent virtual network or modify an existing + * persistent one from the XML description. + * + * virNetworkFree should be used to free the resources after the + * network object is no longer needed. + * + * Returns NULL in case of error, a pointer to the network otherwise + */ +virNetworkPtr +virNetworkDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) +{ + VIR_DEBUG("conn=%p, xml=%s, flags=0x%x", conn, NULLSTR(xml), flags); + + virResetLastError(); + + virCheckConnectReturn(conn, NULL); + virCheckReadOnlyGoto(conn->flags, error); + virCheckNonNullArgGoto(xml, error); + + if (conn->networkDriver && conn->networkDriver->networkDefineXMLFlags) { + virNetworkPtr ret; + ret = conn->networkDriver->networkDefineXMLFlags(conn, xml, flags); + if (!ret) + goto error; + return ret; + } + + virReportUnsupportedError(); + + error: + virDispatchError(conn); + return NULL; +} + + /** * virNetworkUndefine: * @network: pointer to a defined network diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 68f5e9c900..3a5fa7cb09 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -899,6 +899,7 @@ LIBVIRT_7.3.0 { LIBVIRT_7.7.0 { global: virNWFilterDefineXMLFlags; + virNetworkDefineXMLFlags; } LIBVIRT_7.3.0; # .... define new API here using predicted next version number .... diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 9ee22e7e15..b64a86af63 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -8553,6 +8553,7 @@ static virNetworkDriver network_driver = { .networkLookupByName = remoteNetworkLookupByName, /* 0.3.0 */ .networkCreateXML = remoteNetworkCreateXML, /* 0.3.0 */ .networkDefineXML = remoteNetworkDefineXML, /* 0.3.0 */ + .networkDefineXMLFlags = remoteNetworkDefineXMLFlags, /* 7.7.0 */ .networkUndefine = remoteNetworkUndefine, /* 0.3.0 */ .networkUpdate = remoteNetworkUpdate, /* 0.10.2 */ .networkCreate = remoteNetworkCreate, /* 0.3.0 */ diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 56f610839e..df1b126b0c 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -1538,6 +1538,15 @@ struct remote_network_define_xml_ret { remote_nonnull_network net; }; +struct remote_network_define_xml_flags_args { + remote_nonnull_string xml; + unsigned int flags; +}; + +struct remote_network_define_xml_flags_ret { + remote_nonnull_network net; +}; + struct remote_network_undefine_args { remote_nonnull_network net; }; @@ -6801,5 +6810,13 @@ enum remote_procedure { * @acl: nwfilter:write * @acl: nwfilter:save */ - REMOTE_PROC_NWFILTER_DEFINE_XML_FLAGS = 431 + REMOTE_PROC_NWFILTER_DEFINE_XML_FLAGS = 431, + + /** + * @generate: both + * @priority: high + * @acl: network:write + * @acl: network:save + */ + REMOTE_PROC_NETWORK_DEFINE_XML_FLAGS = 432 }; diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index d51f12f781..dad83361fa 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -1104,6 +1104,13 @@ struct remote_network_define_xml_args { struct remote_network_define_xml_ret { remote_nonnull_network net; }; +struct remote_network_define_xml_flags_args { + remote_nonnull_string xml; + u_int flags; +}; +struct remote_network_define_xml_flags_ret { + remote_nonnull_network net; +}; struct remote_network_undefine_args { remote_nonnull_network net; }; @@ -3631,4 +3638,5 @@ enum remote_procedure { REMOTE_PROC_NODE_DEVICE_UNDEFINE = 429, REMOTE_PROC_NODE_DEVICE_CREATE = 430, REMOTE_PROC_NWFILTER_DEFINE_XML_FLAGS = 431, + REMOTE_PROC_NETWORK_DEFINE_XML_FLAGS = 432, }; -- 2.31.1

I need to propagate flags for the next commit. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/vbox/vbox_network.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index d97f571d1b..39da643f14 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -367,7 +367,8 @@ vboxSocketFormatAddrUtf16(struct _vboxDriver *data, virSocketAddr *addr) } static virNetworkPtr -vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start) +vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start, + unsigned int flags) { struct _vboxDriver *data = conn->privateData; PRUnichar *networkInterfaceNameUtf16 = NULL; @@ -385,6 +386,8 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start) virNetworkPtr ret = NULL; nsresult rc; + virCheckFlags(0, NULL); + if (!data->vboxObj) return ret; @@ -554,12 +557,12 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start) static virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml) { - return vboxNetworkDefineCreateXML(conn, xml, true); + return vboxNetworkDefineCreateXML(conn, xml, true, 0); } static virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) { - return vboxNetworkDefineCreateXML(conn, xml, false); + return vboxNetworkDefineCreateXML(conn, xml, false, 0); } static int -- 2.31.1

I have added new driver functions which define network with given flags. I have also replaced definitions of the functions without flags with function calls to the new ones. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/esx/esx_network_driver.c | 14 +++++++++++++- src/network/bridge_driver.c | 18 +++++++++++++++--- src/test/test_driver.c | 16 ++++++++++++++-- src/vbox/vbox_network.c | 7 +++++++ 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/esx/esx_network_driver.c b/src/esx/esx_network_driver.c index a87ec6a377..72b5a4f235 100644 --- a/src/esx/esx_network_driver.c +++ b/src/esx/esx_network_driver.c @@ -274,7 +274,8 @@ esxBandwidthToShapingPolicy(virNetDevBandwidth *bandwidth, static virNetworkPtr -esxNetworkDefineXML(virConnectPtr conn, const char *xml) +esxNetworkDefineXMLFlags(virConnectPtr conn, const char *xml, + unsigned int flags) { virNetworkPtr network = NULL; esxPrivate *priv = conn->privateData; @@ -291,6 +292,8 @@ esxNetworkDefineXML(virConnectPtr conn, const char *xml) unsigned char md5[VIR_CRYPTO_HASH_SIZE_MD5]; /* VIR_CRYPTO_HASH_SIZE_MD5 = VIR_UUID_BUFLEN = 16 */ + virCheckFlags(0, NULL); + if (esxVI_EnsureSession(priv->primary) < 0) return NULL; @@ -494,6 +497,14 @@ esxNetworkDefineXML(virConnectPtr conn, const char *xml) +static virNetworkPtr +esxNetworkDefineXML(virConnectPtr conn, const char *xml) +{ + return esxNetworkDefineXMLFlags(conn, xml, 0); +} + + + static int esxNetworkUndefine(virNetworkPtr network) { @@ -933,6 +944,7 @@ virNetworkDriver esxNetworkDriver = { .networkLookupByUUID = esxNetworkLookupByUUID, /* 0.10.0 */ .networkLookupByName = esxNetworkLookupByName, /* 0.10.0 */ .networkDefineXML = esxNetworkDefineXML, /* 0.10.0 */ + .networkDefineXMLFlags = esxNetworkDefineXMLFlags, /* 7.7.0 */ .networkUndefine = esxNetworkUndefine, /* 0.10.0 */ .networkGetXMLDesc = esxNetworkGetXMLDesc, /* 0.10.0 */ .networkGetAutostart = esxNetworkGetAutostart, /* 0.10.0 */ diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index acbc6be965..0f27b1d180 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -3516,8 +3516,9 @@ networkCreateXML(virConnectPtr conn, static virNetworkPtr -networkDefineXML(virConnectPtr conn, - const char *xml) +networkDefineXMLFlags(virConnectPtr conn, + const char *xml, + unsigned int flags) { virNetworkDriverState *driver = networkGetDriver(); virNetworkDef *def = NULL; @@ -3526,10 +3527,12 @@ networkDefineXML(virConnectPtr conn, virNetworkPtr net = NULL; virObjectEvent *event = NULL; + virCheckFlags(0, NULL); + if (!(def = virNetworkDefParseString(xml, network_driver->xmlopt))) goto cleanup; - if (virNetworkDefineXMLEnsureACL(conn, def) < 0) + if (virNetworkDefineXMLFlagsEnsureACL(conn, def) < 0) goto cleanup; if (networkValidate(driver, def) < 0) @@ -3571,6 +3574,14 @@ networkDefineXML(virConnectPtr conn, } +static virNetworkPtr +networkDefineXML(virConnectPtr conn, + const char *xml) +{ + return networkDefineXMLFlags(conn, xml, 0); +} + + static int networkUndefine(virNetworkPtr net) { @@ -5618,6 +5629,7 @@ static virNetworkDriver networkDriver = { .networkLookupByName = networkLookupByName, /* 0.2.0 */ .networkCreateXML = networkCreateXML, /* 0.2.0 */ .networkDefineXML = networkDefineXML, /* 0.2.0 */ + .networkDefineXMLFlags = networkDefineXMLFlags, /* 7.7.0 */ .networkUndefine = networkUndefine, /* 0.2.0 */ .networkUpdate = networkUpdate, /* 0.10.2 */ .networkCreate = networkCreate, /* 0.2.0 */ diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 67db02b25d..d9203c9568 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -5607,8 +5607,9 @@ testNetworkCreateXML(virConnectPtr conn, const char *xml) static virNetworkPtr -testNetworkDefineXML(virConnectPtr conn, - const char *xml) +testNetworkDefineXMLFlags(virConnectPtr conn, + const char *xml, + unsigned int flags) { testDriver *privconn = conn->privateData; virNetworkDef *newDef; @@ -5617,6 +5618,8 @@ testNetworkDefineXML(virConnectPtr conn, virNetworkPtr net = NULL; virObjectEvent *event = NULL; + virCheckFlags(0, NULL); + if ((newDef = virNetworkDefParseString(xml, NULL)) == NULL) goto cleanup; @@ -5639,6 +5642,14 @@ testNetworkDefineXML(virConnectPtr conn, } +static virNetworkPtr +testNetworkDefineXML(virConnectPtr conn, + const char *xml) +{ + return testNetworkDefineXMLFlags(conn, xml, 0); +} + + static int testNetworkUndefine(virNetworkPtr net) { @@ -9712,6 +9723,7 @@ static virNetworkDriver testNetworkDriver = { .networkLookupByName = testNetworkLookupByName, /* 0.3.2 */ .networkCreateXML = testNetworkCreateXML, /* 0.3.2 */ .networkDefineXML = testNetworkDefineXML, /* 0.3.2 */ + .networkDefineXMLFlags = testNetworkDefineXMLFlags, /* 7.7.0 */ .networkUndefine = testNetworkUndefine, /* 0.3.2 */ .networkUpdate = testNetworkUpdate, /* 0.10.2 */ .networkCreate = testNetworkCreate, /* 0.3.2 */ diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 39da643f14..cce43ee5af 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -565,6 +565,12 @@ static virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) return vboxNetworkDefineCreateXML(conn, xml, false, 0); } +static virNetworkPtr vboxNetworkDefineXMLFlags(virConnectPtr conn, const char *xml, + unsigned int flags) +{ + return vboxNetworkDefineCreateXML(conn, xml, false, flags); +} + static int vboxNetworkUndefineDestroy(virNetworkPtr network, bool removeinterface) { @@ -924,6 +930,7 @@ virNetworkDriver vboxNetworkDriver = { .networkLookupByName = vboxNetworkLookupByName, /* 0.6.4 */ .networkCreateXML = vboxNetworkCreateXML, /* 0.6.4 */ .networkDefineXML = vboxNetworkDefineXML, /* 0.6.4 */ + .networkDefineXMLFlags = vboxNetworkDefineXMLFlags, /* 7.7.0 */ .networkUndefine = vboxNetworkUndefine, /* 0.6.4 */ .networkCreate = vboxNetworkCreate, /* 0.6.4 */ .networkDestroy = vboxNetworkDestroy, /* 0.6.4 */ -- 2.31.1

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- include/libvirt/libvirt-network.h | 4 ++++ src/libvirt-network.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/libvirt/libvirt-network.h b/include/libvirt/libvirt-network.h index be9d6eb2cb..0a49c1888e 100644 --- a/include/libvirt/libvirt-network.h +++ b/include/libvirt/libvirt-network.h @@ -119,6 +119,10 @@ virNetworkPtr virNetworkLookupByUUIDString (virConnectPtr conn, virNetworkPtr virNetworkCreateXML (virConnectPtr conn, const char *xmlDesc); +typedef enum { + VIR_NETWORK_DEFINE_VALIDATE = 1 << 0, /* Validate the XML document against schema */ +} virNetworkDefineFlags; + /* * Define inactive persistent network */ diff --git a/src/libvirt-network.c b/src/libvirt-network.c index b633f49ca9..c9d0e9d25b 100644 --- a/src/libvirt-network.c +++ b/src/libvirt-network.c @@ -469,7 +469,7 @@ virNetworkDefineXML(virConnectPtr conn, const char *xml) * virNetworkDefineXMLFlags: * @conn: pointer to the hypervisor connection * @xml: the XML description for the network, preferably in UTF-8 - * @flags: extra flags; not used yet, so callers should always pass 0 + * @flags: bitwise-OR of virNetworkDefineFlags * * Define an inactive persistent virtual network or modify an existing * persistent one from the XML description. -- 2.31.1

This patch also includes propagation of flags into the virNetworkDefParse(). Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/conf/domain_conf.c | 2 +- src/conf/network_conf.c | 15 +++++++++------ src/conf/network_conf.h | 3 ++- src/esx/esx_network_driver.c | 2 +- src/network/bridge_driver.c | 4 ++-- src/qemu/qemu_process.c | 2 +- src/test/test_driver.c | 4 ++-- src/vbox/vbox_network.c | 2 +- 8 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 10effdce69..0328447f87 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -30522,7 +30522,7 @@ virDomainNetResolveActualType(virDomainNetDef *iface) if (!(xml = virNetworkGetXMLDesc(net, 0))) goto cleanup; - if (!(def = virNetworkDefParseString(xml, NULL))) + if (!(def = virNetworkDefParseString(xml, NULL, 0))) goto cleanup; switch ((virNetworkForwardType) def->forward.type) { diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index fbd939a1f1..f23599abac 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -318,7 +318,7 @@ virNetworkDefCopy(virNetworkDef *def, if (!(xml = virNetworkDefFormat(def, xmlopt, flags))) return NULL; - return virNetworkDefParseString(xml, xmlopt); + return virNetworkDefParseString(xml, xmlopt, 0); } @@ -2085,13 +2085,15 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt, static virNetworkDef * virNetworkDefParse(const char *xmlStr, const char *filename, - virNetworkXMLOption *xmlopt) + virNetworkXMLOption *xmlopt, + unsigned int flags) { g_autoptr(xmlDoc) xml = NULL; virNetworkDef *def = NULL; int keepBlanksDefault = xmlKeepBlanksDefault(0); - if ((xml = virXMLParse(filename, xmlStr, _("(network_definition)"), NULL, false))) + if ((xml = virXMLParse(filename, xmlStr, _("(network_definition)"), + "network.rng", flags & VIR_NETWORK_DEFINE_VALIDATE))) def = virNetworkDefParseNode(xml, xmlDocGetRootElement(xml), xmlopt); xmlKeepBlanksDefault(keepBlanksDefault); @@ -2101,9 +2103,10 @@ virNetworkDefParse(const char *xmlStr, virNetworkDef * virNetworkDefParseString(const char *xmlStr, - virNetworkXMLOption *xmlopt) + virNetworkXMLOption *xmlopt, + unsigned int flags) { - return virNetworkDefParse(xmlStr, NULL, xmlopt); + return virNetworkDefParse(xmlStr, NULL, xmlopt, flags); } @@ -2111,7 +2114,7 @@ virNetworkDef * virNetworkDefParseFile(const char *filename, virNetworkXMLOption *xmlopt) { - return virNetworkDefParse(NULL, filename, xmlopt); + return virNetworkDefParse(NULL, filename, xmlopt, 0); } diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 6199f3f588..34007e1969 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -327,7 +327,8 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt, virNetworkDef * virNetworkDefParseString(const char *xmlStr, - virNetworkXMLOption *xmlopt); + virNetworkXMLOption *xmlopt, + unsigned int flags); virNetworkDef * virNetworkDefParseFile(const char *filename, diff --git a/src/esx/esx_network_driver.c b/src/esx/esx_network_driver.c index 72b5a4f235..8a0cfa3729 100644 --- a/src/esx/esx_network_driver.c +++ b/src/esx/esx_network_driver.c @@ -298,7 +298,7 @@ esxNetworkDefineXMLFlags(virConnectPtr conn, const char *xml, return NULL; /* Parse network XML */ - def = virNetworkDefParseString(xml, NULL); + def = virNetworkDefParseString(xml, NULL, 0); if (!def) return NULL; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 0f27b1d180..207163cde2 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -3474,7 +3474,7 @@ networkCreateXML(virConnectPtr conn, virNetworkPtr net = NULL; virObjectEvent *event = NULL; - if (!(newDef = virNetworkDefParseString(xml, network_driver->xmlopt))) + if (!(newDef = virNetworkDefParseString(xml, network_driver->xmlopt, 0))) goto cleanup; if (virNetworkCreateXMLEnsureACL(conn, newDef) < 0) @@ -3529,7 +3529,7 @@ networkDefineXMLFlags(virConnectPtr conn, virCheckFlags(0, NULL); - if (!(def = virNetworkDefParseString(xml, network_driver->xmlopt))) + if (!(def = virNetworkDefParseString(xml, network_driver->xmlopt, 0))) goto cleanup; if (virNetworkDefineXMLFlagsEnsureACL(conn, def) < 0) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 77da9992f4..df3bd66c0c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4784,7 +4784,7 @@ qemuProcessGetNetworkAddress(const char *netname, if (!xml) goto cleanup; - netdef = virNetworkDefParseString(xml, NULL); + netdef = virNetworkDefParseString(xml, NULL, 0); if (!netdef) goto cleanup; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index d9203c9568..117d1e6ba9 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -5581,7 +5581,7 @@ testNetworkCreateXML(virConnectPtr conn, const char *xml) virNetworkPtr net = NULL; virObjectEvent *event = NULL; - if ((newDef = virNetworkDefParseString(xml, NULL)) == NULL) + if ((newDef = virNetworkDefParseString(xml, NULL, 0)) == NULL) goto cleanup; if (!(obj = virNetworkObjAssignDef(privconn->networks, newDef, @@ -5620,7 +5620,7 @@ testNetworkDefineXMLFlags(virConnectPtr conn, virCheckFlags(0, NULL); - if ((newDef = virNetworkDefParseString(xml, NULL)) == NULL) + if ((newDef = virNetworkDefParseString(xml, NULL, 0)) == NULL) goto cleanup; if (!(obj = virNetworkObjAssignDef(privconn->networks, newDef, 0))) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index cce43ee5af..804f9f0b01 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -397,7 +397,7 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start, VBOX_IID_INITIALIZE(&vboxnetiid); - if (!(def = virNetworkDefParseString(xml, NULL)) || + if (!(def = virNetworkDefParseString(xml, NULL, 0)) || (def->forward.type != VIR_NETWORK_FORWARD_NONE) || (def->nips == 0 || !def->ips)) goto cleanup; -- 2.31.1

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/esx/esx_network_driver.c | 4 ++-- src/network/bridge_driver.c | 4 ++-- src/test/test_driver.c | 4 ++-- src/vbox/vbox_network.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/esx/esx_network_driver.c b/src/esx/esx_network_driver.c index 8a0cfa3729..673ed5421f 100644 --- a/src/esx/esx_network_driver.c +++ b/src/esx/esx_network_driver.c @@ -292,13 +292,13 @@ esxNetworkDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned char md5[VIR_CRYPTO_HASH_SIZE_MD5]; /* VIR_CRYPTO_HASH_SIZE_MD5 = VIR_UUID_BUFLEN = 16 */ - virCheckFlags(0, NULL); + virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE, NULL); if (esxVI_EnsureSession(priv->primary) < 0) return NULL; /* Parse network XML */ - def = virNetworkDefParseString(xml, NULL, 0); + def = virNetworkDefParseString(xml, NULL, flags); if (!def) return NULL; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 207163cde2..e8b9ffa1fc 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -3527,9 +3527,9 @@ networkDefineXMLFlags(virConnectPtr conn, virNetworkPtr net = NULL; virObjectEvent *event = NULL; - virCheckFlags(0, NULL); + virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE, NULL); - if (!(def = virNetworkDefParseString(xml, network_driver->xmlopt, 0))) + if (!(def = virNetworkDefParseString(xml, network_driver->xmlopt, flags))) goto cleanup; if (virNetworkDefineXMLFlagsEnsureACL(conn, def) < 0) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 117d1e6ba9..f60ea870db 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -5618,9 +5618,9 @@ testNetworkDefineXMLFlags(virConnectPtr conn, virNetworkPtr net = NULL; virObjectEvent *event = NULL; - virCheckFlags(0, NULL); + virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE, NULL); - if ((newDef = virNetworkDefParseString(xml, NULL, 0)) == NULL) + if ((newDef = virNetworkDefParseString(xml, NULL, flags)) == NULL) goto cleanup; if (!(obj = virNetworkObjAssignDef(privconn->networks, newDef, 0))) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 804f9f0b01..c554b052c9 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -386,7 +386,7 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start, virNetworkPtr ret = NULL; nsresult rc; - virCheckFlags(0, NULL); + virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE, NULL); if (!data->vboxObj) return ret; @@ -397,7 +397,7 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start, VBOX_IID_INITIALIZE(&vboxnetiid); - if (!(def = virNetworkDefParseString(xml, NULL, 0)) || + if (!(def = virNetworkDefParseString(xml, NULL, flags)) || (def->forward.type != VIR_NETWORK_FORWARD_NONE) || (def->nips == 0 || !def->ips)) goto cleanup; -- 2.31.1

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- docs/manpages/virsh.rst | 4 +++- tools/virsh-network.c | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index e0cdabf3aa..850a862fd9 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -5177,10 +5177,12 @@ net-define :: - net-define file + net-define file [--validate] Define an inactive persistent virtual network or modify an existing persistent one from the XML *file*. +Optionally, the format of the input XML file can be validated against an +internal RNG schema with *--validate*. net-destroy diff --git a/tools/virsh-network.c b/tools/virsh-network.c index 0d61e20093..badbcd0a92 100644 --- a/tools/virsh-network.c +++ b/tools/virsh-network.c @@ -244,6 +244,10 @@ static const vshCmdInfo info_network_define[] = { static const vshCmdOptDef opts_network_define[] = { VIRSH_COMMON_OPT_FILE(N_("file containing an XML network description")), + {.name = "validate", + .type = VSH_OT_BOOL, + .help = N_("validate the XML against the schema") + }, {.name = NULL} }; @@ -254,15 +258,22 @@ cmdNetworkDefine(vshControl *ctl, const vshCmd *cmd) const char *from = NULL; bool ret = true; g_autofree char *buffer = NULL; + unsigned int flags = 0; virshControl *priv = ctl->privData; if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0) return false; + if (vshCommandOptBool(cmd, "validate")) + flags |= VIR_NETWORK_DEFINE_VALIDATE; + if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0) return false; - network = virNetworkDefineXML(priv->conn, buffer); + if (flags) + network = virNetworkDefineXMLFlags(priv->conn, buffer, flags); + else + network = virNetworkDefineXML(priv->conn, buffer); if (network != NULL) { vshPrintExtra(ctl, _("Network %s defined from %s\n"), -- 2.31.1

On 8/23/21 6:50 PM, Kristina Hanicova wrote:
Kristina Hanicova (7): api: add public virNetworkDefineXMLFlags() and remote protocol vbox_network: add flags to vboxNetworkDefineCreateXML() src: add driver support for networkDefineXMLFlags() api: add virNetworkDefineFlags src & network_conf: add validation against schema in define network: allow VIR_NETWORK_DEFINE_VALIDATE flag virsh: add support for '--validate' option in define network
docs/manpages/virsh.rst | 4 ++- include/libvirt/libvirt-network.h | 7 ++++++ src/conf/domain_conf.c | 2 +- src/conf/network_conf.c | 15 ++++++----- src/conf/network_conf.h | 3 ++- src/driver-network.h | 6 +++++ src/esx/esx_network_driver.c | 16 ++++++++++-- src/libvirt-network.c | 41 +++++++++++++++++++++++++++++++ src/libvirt_public.syms | 1 + src/network/bridge_driver.c | 22 +++++++++++++---- src/qemu/qemu_process.c | 2 +- src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 19 +++++++++++++- src/remote_protocol-structs | 8 ++++++ src/test/test_driver.c | 20 ++++++++++++--- src/vbox/vbox_network.c | 18 +++++++++++--- tools/virsh-network.c | 13 +++++++++- 17 files changed, 171 insertions(+), 27 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Kristina Hanicova
-
Michal Prívozník