[PATCH 0/6] network create: add support for validation against schema

Kristina Hanicova (6): api: add public virNetworkCreateXMLFlags() and remote protocol src: add driver support for networkCreateXMLFlags() api: add virNetworkCreateFlags network_conf: add validation against schema in create network: allow VIR_NETWORK_CREATE_VALIDATE flag virsh: add support for '--validate' option in create network docs/manpages/virsh.rst | 4 ++- include/libvirt/libvirt-network.h | 7 ++++++ src/conf/network_conf.c | 3 ++- src/driver-network.h | 6 +++++ src/libvirt-network.c | 41 +++++++++++++++++++++++++++++++ src/libvirt_public.syms | 5 ++++ src/network/bridge_driver.c | 20 ++++++++++++--- src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 18 +++++++++++++- src/remote_protocol-structs | 8 ++++++ src/test/test_driver.c | 15 +++++++++-- src/vbox/vbox_network.c | 10 +++++++- tools/virsh-network.c | 13 +++++++++- 13 files changed, 140 insertions(+), 11 deletions(-) -- 2.31.1

This new API creates 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 | 5 ++++ src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 18 +++++++++++++- src/remote_protocol-structs | 8 ++++++ 7 files changed, 81 insertions(+), 1 deletion(-) diff --git a/include/libvirt/libvirt-network.h b/include/libvirt/libvirt-network.h index 0a49c1888e..0be4d64b75 100644 --- a/include/libvirt/libvirt-network.h +++ b/include/libvirt/libvirt-network.h @@ -118,6 +118,9 @@ virNetworkPtr virNetworkLookupByUUIDString (virConnectPtr conn, */ virNetworkPtr virNetworkCreateXML (virConnectPtr conn, const char *xmlDesc); +virNetworkPtr virNetworkCreateXMLFlags(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags); typedef enum { VIR_NETWORK_DEFINE_VALIDATE = 1 << 0, /* Validate the XML document against schema */ diff --git a/src/driver-network.h b/src/driver-network.h index d31d7c667d..99efd4c8aa 100644 --- a/src/driver-network.h +++ b/src/driver-network.h @@ -69,6 +69,11 @@ typedef virNetworkPtr (*virDrvNetworkCreateXML)(virConnectPtr conn, const char *xmlDesc); +typedef virNetworkPtr +(*virDrvNetworkCreateXMLFlags)(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags); + typedef virNetworkPtr (*virDrvNetworkDefineXML)(virConnectPtr conn, const char *xml); @@ -176,6 +181,7 @@ struct _virNetworkDriver { virDrvNetworkLookupByUUID networkLookupByUUID; virDrvNetworkLookupByName networkLookupByName; virDrvNetworkCreateXML networkCreateXML; + virDrvNetworkCreateXMLFlags networkCreateXMLFlags; virDrvNetworkDefineXML networkDefineXML; virDrvNetworkDefineXMLFlags networkDefineXMLFlags; virDrvNetworkUndefine networkUndefine; diff --git a/src/libvirt-network.c b/src/libvirt-network.c index 5829996301..32ade1a2aa 100644 --- a/src/libvirt-network.c +++ b/src/libvirt-network.c @@ -427,6 +427,47 @@ virNetworkCreateXML(virConnectPtr conn, const char *xmlDesc) } +/** + * virNetworkCreateXMLFlags: + * @conn: pointer to the hypervisor connection + * @xmlDesc: an XML description of the network + * @flags: extra flags; not used yet, so callers should always pass 0 + * + * Create and start a new virtual network, based on an XML description + * similar to the one returned by virNetworkGetXMLDesc() + * + * virNetworkFree should be used to free the resources after the + * network object is no longer needed. + * + * Returns a new network object or NULL in case of failure + */ +virNetworkPtr +virNetworkCreateXMLFlags(virConnectPtr conn, const char *xmlDesc, unsigned int flags) +{ + VIR_DEBUG("conn=%p, xmlDesc=%s, flags=0x%x", conn, NULLSTR(xmlDesc), flags); + + virResetLastError(); + + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgGoto(xmlDesc, error); + virCheckReadOnlyGoto(conn->flags, error); + + if (conn->networkDriver && conn->networkDriver->networkCreateXMLFlags) { + virNetworkPtr ret; + ret = conn->networkDriver->networkCreateXMLFlags(conn, xmlDesc, flags); + if (!ret) + goto error; + return ret; + } + + virReportUnsupportedError(); + + error: + virDispatchError(conn); + return NULL; +} + + /** * virNetworkDefineXML: * @conn: pointer to the hypervisor connection diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 3a5fa7cb09..a5fd889ccc 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -902,4 +902,9 @@ LIBVIRT_7.7.0 { virNetworkDefineXMLFlags; } LIBVIRT_7.3.0; +LIBVIRT_7.8.0 { + global: + virNetworkCreateXMLFlags; +} LIBVIRT_7.7.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 b64a86af63..9bb796db01 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -8552,6 +8552,7 @@ static virNetworkDriver network_driver = { .networkLookupByUUID = remoteNetworkLookupByUUID, /* 0.3.0 */ .networkLookupByName = remoteNetworkLookupByName, /* 0.3.0 */ .networkCreateXML = remoteNetworkCreateXML, /* 0.3.0 */ + .networkCreateXMLFlags = remoteNetworkCreateXMLFlags, /* 7.8.0 */ .networkDefineXML = remoteNetworkDefineXML, /* 0.3.0 */ .networkDefineXMLFlags = remoteNetworkDefineXMLFlags, /* 7.7.0 */ .networkUndefine = remoteNetworkUndefine, /* 0.3.0 */ diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index df1b126b0c..42a1714afb 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -1530,6 +1530,15 @@ struct remote_network_create_xml_ret { remote_nonnull_network net; }; +struct remote_network_create_xml_flags_args { + remote_nonnull_string xml; + unsigned int flags; +}; + +struct remote_network_create_xml_flags_ret { + remote_nonnull_network net; +}; + struct remote_network_define_xml_args { remote_nonnull_string xml; }; @@ -6818,5 +6827,12 @@ enum remote_procedure { * @acl: network:write * @acl: network:save */ - REMOTE_PROC_NETWORK_DEFINE_XML_FLAGS = 432 + REMOTE_PROC_NETWORK_DEFINE_XML_FLAGS = 432, + + /** + * @generate: both + * @acl: network:write + * @acl: network:start + */ + REMOTE_PROC_NETWORK_CREATE_XML_FLAGS = 433 }; diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index dad83361fa..100cdbc6b7 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -1098,6 +1098,13 @@ struct remote_network_create_xml_args { struct remote_network_create_xml_ret { remote_nonnull_network net; }; +struct remote_network_create_xml_flags_args { + remote_nonnull_string xml; + u_int flags; +}; +struct remote_network_create_xml_flags_ret { + remote_nonnull_network net; +}; struct remote_network_define_xml_args { remote_nonnull_string xml; }; @@ -3639,4 +3646,5 @@ enum remote_procedure { REMOTE_PROC_NODE_DEVICE_CREATE = 430, REMOTE_PROC_NWFILTER_DEFINE_XML_FLAGS = 431, REMOTE_PROC_NETWORK_DEFINE_XML_FLAGS = 432, + REMOTE_PROC_NETWORK_CREATE_XML_FLAGS = 433, }; -- 2.31.1

On a Thursday in 2021, Kristina Hanicova wrote:
This new API creates 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 | 5 ++++ src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 18 +++++++++++++- src/remote_protocol-structs | 8 ++++++ 7 files changed, 81 insertions(+), 1 deletion(-)
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index dad83361fa..100cdbc6b7 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -1098,6 +1098,13 @@ struct remote_network_create_xml_args { struct remote_network_create_xml_ret { remote_nonnull_network net; }; +struct remote_network_create_xml_flags_args { + remote_nonnull_string xml; + u_int flags;
The indentation is off here. Rest of the file (mostly) aligns the identifiers to the left. Jano

I added new driver functions to handle creating network with given flags. I also replaced definitions of the functions without flags with function calls to the new ones. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/network/bridge_driver.c | 18 +++++++++++++++--- src/test/test_driver.c | 13 ++++++++++++- src/vbox/vbox_network.c | 7 +++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index e8b9ffa1fc..32b37de030 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -3464,8 +3464,9 @@ networkValidate(virNetworkDriverState *driver, static virNetworkPtr -networkCreateXML(virConnectPtr conn, - const char *xml) +networkCreateXMLFlags(virConnectPtr conn, + const char *xml, + unsigned int flags) { virNetworkDriverState *driver = networkGetDriver(); virNetworkDef *newDef; @@ -3474,10 +3475,12 @@ networkCreateXML(virConnectPtr conn, virNetworkPtr net = NULL; virObjectEvent *event = NULL; + virCheckFlags(0, NULL); + if (!(newDef = virNetworkDefParseString(xml, network_driver->xmlopt, 0))) goto cleanup; - if (virNetworkCreateXMLEnsureACL(conn, newDef) < 0) + if (virNetworkCreateXMLFlagsEnsureACL(conn, newDef) < 0) goto cleanup; if (networkValidate(driver, newDef) < 0) @@ -3515,6 +3518,14 @@ networkCreateXML(virConnectPtr conn, } +static virNetworkPtr +networkCreateXML(virConnectPtr conn, + const char *xml) +{ + return networkCreateXMLFlags(conn, xml, 0); +} + + static virNetworkPtr networkDefineXMLFlags(virConnectPtr conn, const char *xml, @@ -5628,6 +5639,7 @@ static virNetworkDriver networkDriver = { .networkLookupByUUID = networkLookupByUUID, /* 0.2.0 */ .networkLookupByName = networkLookupByName, /* 0.2.0 */ .networkCreateXML = networkCreateXML, /* 0.2.0 */ + .networkCreateXMLFlags = networkCreateXMLFlags, /* 7.8.0 */ .networkDefineXML = networkDefineXML, /* 0.2.0 */ .networkDefineXMLFlags = networkDefineXMLFlags, /* 7.7.0 */ .networkUndefine = networkUndefine, /* 0.2.0 */ diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 2f19b7c520..4ab03019e1 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -5572,7 +5572,8 @@ testNetworkIsPersistent(virNetworkPtr net) static virNetworkPtr -testNetworkCreateXML(virConnectPtr conn, const char *xml) +testNetworkCreateXMLFlags(virConnectPtr conn, const char *xml, + unsigned int flags) { testDriver *privconn = conn->privateData; virNetworkDef *newDef; @@ -5581,6 +5582,8 @@ testNetworkCreateXML(virConnectPtr conn, const char *xml) virNetworkPtr net = NULL; virObjectEvent *event = NULL; + virCheckFlags(0, NULL); + if ((newDef = virNetworkDefParseString(xml, NULL, 0)) == NULL) goto cleanup; @@ -5606,6 +5609,13 @@ testNetworkCreateXML(virConnectPtr conn, const char *xml) } +static virNetworkPtr +testNetworkCreateXML(virConnectPtr conn, const char *xml) +{ + return testNetworkCreateXMLFlags(conn, xml, 0); +} + + static virNetworkPtr testNetworkDefineXMLFlags(virConnectPtr conn, const char *xml, @@ -9722,6 +9732,7 @@ static virNetworkDriver testNetworkDriver = { .networkLookupByUUID = testNetworkLookupByUUID, /* 0.3.2 */ .networkLookupByName = testNetworkLookupByName, /* 0.3.2 */ .networkCreateXML = testNetworkCreateXML, /* 0.3.2 */ + .networkCreateXMLFlags = testNetworkCreateXMLFlags, /* 7.8.0 */ .networkDefineXML = testNetworkDefineXML, /* 0.3.2 */ .networkDefineXMLFlags = testNetworkDefineXMLFlags, /* 7.7.0 */ .networkUndefine = testNetworkUndefine, /* 0.3.2 */ diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index c554b052c9..2826937f81 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -560,6 +560,12 @@ static virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml) return vboxNetworkDefineCreateXML(conn, xml, true, 0); } +static virNetworkPtr vboxNetworkCreateXMLFlags(virConnectPtr conn, const char *xml, + unsigned int flags) +{ + return vboxNetworkDefineCreateXML(conn, xml, true, flags); +} + static virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) { return vboxNetworkDefineCreateXML(conn, xml, false, 0); @@ -929,6 +935,7 @@ virNetworkDriver vboxNetworkDriver = { .networkLookupByUUID = vboxNetworkLookupByUUID, /* 0.6.4 */ .networkLookupByName = vboxNetworkLookupByName, /* 0.6.4 */ .networkCreateXML = vboxNetworkCreateXML, /* 0.6.4 */ + .networkCreateXMLFlags = vboxNetworkCreateXMLFlags, /* 7.8.0 */ .networkDefineXML = vboxNetworkDefineXML, /* 0.6.4 */ .networkDefineXMLFlags = vboxNetworkDefineXMLFlags, /* 7.7.0 */ .networkUndefine = vboxNetworkUndefine, /* 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 0be4d64b75..d8eaf83d93 100644 --- a/include/libvirt/libvirt-network.h +++ b/include/libvirt/libvirt-network.h @@ -113,6 +113,10 @@ virNetworkPtr virNetworkLookupByUUID (virConnectPtr conn, virNetworkPtr virNetworkLookupByUUIDString (virConnectPtr conn, const char *uuid); +typedef enum { + VIR_NETWORK_CREATE_VALIDATE = 1 << 0, /* Validate the XML document against schema */ +} virNetworkCreateFlags; + /* * Create active transient network */ diff --git a/src/libvirt-network.c b/src/libvirt-network.c index 32ade1a2aa..33bb547a3c 100644 --- a/src/libvirt-network.c +++ b/src/libvirt-network.c @@ -431,7 +431,7 @@ virNetworkCreateXML(virConnectPtr conn, const char *xmlDesc) * virNetworkCreateXMLFlags: * @conn: pointer to the hypervisor connection * @xmlDesc: an XML description of the network - * @flags: extra flags; not used yet, so callers should always pass 0 + * @flags: bitwise-OR of virNetworkCreateFlags * * Create and start a new virtual network, based on an XML description * similar to the one returned by virNetworkGetXMLDesc() -- 2.31.1

On a Thursday in 2021, Kristina Hanicova wrote:
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 0be4d64b75..d8eaf83d93 100644 --- a/include/libvirt/libvirt-network.h +++ b/include/libvirt/libvirt-network.h @@ -113,6 +113,10 @@ virNetworkPtr virNetworkLookupByUUID (virConnectPtr conn, virNetworkPtr virNetworkLookupByUUIDString (virConnectPtr conn, const char *uuid);
+typedef enum { + VIR_NETWORK_CREATE_VALIDATE = 1 << 0, /* Validate the XML document against schema */
I'd write this as: VIR_NETWORK_CREATE_VALIDATE = VIR_NETWORK_DEFINE_VALIDATE, to make it obvious we use them interchangeably. Jano
+} virNetworkCreateFlags; + /* * Create active transient network */

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/conf/network_conf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index f23599abac..5e24880f1f 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2093,7 +2093,8 @@ virNetworkDefParse(const char *xmlStr, int keepBlanksDefault = xmlKeepBlanksDefault(0); if ((xml = virXMLParse(filename, xmlStr, _("(network_definition)"), - "network.rng", flags & VIR_NETWORK_DEFINE_VALIDATE))) + "network.rng", flags & (VIR_NETWORK_DEFINE_VALIDATE | + VIR_NETWORK_CREATE_VALIDATE)))) def = virNetworkDefParseNode(xml, xmlDocGetRootElement(xml), xmlopt); xmlKeepBlanksDefault(keepBlanksDefault); -- 2.31.1

On a Thursday in 2021, Kristina Hanicova wrote:
Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/conf/network_conf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index f23599abac..5e24880f1f 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2093,7 +2093,8 @@ virNetworkDefParse(const char *xmlStr, int keepBlanksDefault = xmlKeepBlanksDefault(0);
if ((xml = virXMLParse(filename, xmlStr, _("(network_definition)"), - "network.rng", flags & VIR_NETWORK_DEFINE_VALIDATE))) + "network.rng", flags & (VIR_NETWORK_DEFINE_VALIDATE | + VIR_NETWORK_CREATE_VALIDATE)))) def = virNetworkDefParseNode(xml, xmlDocGetRootElement(xml), xmlopt);
This has no functional effect, since 1 | 1 == 1. I think leaving only one symbolic representation of 1 here is less confusing. Jano
xmlKeepBlanksDefault(keepBlanksDefault); -- 2.31.1

On Thu, Sep 02, 2021 at 05:11:03PM +0200, Ján Tomko wrote:
On a Thursday in 2021, Kristina Hanicova wrote:
Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/conf/network_conf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index f23599abac..5e24880f1f 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2093,7 +2093,8 @@ virNetworkDefParse(const char *xmlStr, int keepBlanksDefault = xmlKeepBlanksDefault(0);
if ((xml = virXMLParse(filename, xmlStr, _("(network_definition)"), - "network.rng", flags & VIR_NETWORK_DEFINE_VALIDATE))) + "network.rng", flags & (VIR_NETWORK_DEFINE_VALIDATE | + VIR_NETWORK_CREATE_VALIDATE)))) def = virNetworkDefParseNode(xml, xmlDocGetRootElement(xml), xmlopt);
This has no functional effect, since 1 | 1 == 1.
I think leaving only one symbolic representation of 1 here is less confusing.
Clearly the problem is that we are passing in the "flags" param from 2 different public APIs into the same internal method and just blindly assuming all flags are equivalent. This is only working by luck. It is probably saner if the internal method has a "bool validate" parameter and didn't use the public flags ? Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/network/bridge_driver.c | 4 ++-- src/test/test_driver.c | 4 ++-- src/vbox/vbox_network.c | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 32b37de030..57f4ce21b7 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -3475,9 +3475,9 @@ networkCreateXMLFlags(virConnectPtr conn, virNetworkPtr net = NULL; virObjectEvent *event = NULL; - virCheckFlags(0, NULL); + virCheckFlags(VIR_NETWORK_CREATE_VALIDATE, NULL); - if (!(newDef = virNetworkDefParseString(xml, network_driver->xmlopt, 0))) + if (!(newDef = virNetworkDefParseString(xml, network_driver->xmlopt, flags))) goto cleanup; if (virNetworkCreateXMLFlagsEnsureACL(conn, newDef) < 0) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 4ab03019e1..b5ed2555d8 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -5582,9 +5582,9 @@ testNetworkCreateXMLFlags(virConnectPtr conn, const char *xml, virNetworkPtr net = NULL; virObjectEvent *event = NULL; - virCheckFlags(0, NULL); + virCheckFlags(VIR_NETWORK_CREATE_VALIDATE, NULL); - if ((newDef = virNetworkDefParseString(xml, NULL, 0)) == NULL) + if ((newDef = virNetworkDefParseString(xml, NULL, flags)) == NULL) goto cleanup; if (!(obj = virNetworkObjAssignDef(privconn->networks, newDef, diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 2826937f81..d9402eff42 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -386,7 +386,8 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start, virNetworkPtr ret = NULL; nsresult rc; - virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE, NULL); + virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE | + VIR_NETWORK_CREATE_VALIDATE, NULL); if (!data->vboxObj) return ret; -- 2.31.1

On a Thursday in 2021, Kristina Hanicova wrote:
Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/network/bridge_driver.c | 4 ++-- src/test/test_driver.c | 4 ++-- src/vbox/vbox_network.c | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 2826937f81..d9402eff42 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -386,7 +386,8 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start, virNetworkPtr ret = NULL; nsresult rc;
- virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE, NULL); + virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE | + VIR_NETWORK_CREATE_VALIDATE, NULL);
Again, since we rely on these two flags to be the same, I'd leave this only checking for VIR_NETWORK_DEFINE_VALIDATE. Anyone adding asymetric flags will then do the work to split them up. Jano
if (!data->vboxObj) return ret; -- 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 2204bed3bb..b05b25c555 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -5162,13 +5162,15 @@ net-create :: - net-create file + net-create file [--validate] Create a transient (temporary) virtual network from an XML *file* and instantiate (start) the network. See the documentation at `https://libvirt.org/formatnetwork.html <https://libvirt.org/formatnetwork.html>`__ to get a description of the XML network format used by libvirt. +Optionally, the format of the input XML file can be validated against an +internal RNG schema with *--validate*. net-define ---------- diff --git a/tools/virsh-network.c b/tools/virsh-network.c index badbcd0a92..eff9d153c4 100644 --- a/tools/virsh-network.c +++ b/tools/virsh-network.c @@ -197,6 +197,10 @@ static const vshCmdInfo info_network_create[] = { static const vshCmdOptDef opts_network_create[] = { 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} }; @@ -207,15 +211,22 @@ cmdNetworkCreate(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_CREATE_VALIDATE; + if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0) return false; - network = virNetworkCreateXML(priv->conn, buffer); + if (flags) + network = virNetworkCreateXMLFlags(priv->conn, buffer, flags); + else + network = virNetworkCreateXML(priv->conn, buffer); if (network != NULL) { vshPrintExtra(ctl, _("Network %s created from %s\n"), -- 2.31.1

On a Thursday in 2021, Kristina Hanicova wrote:
Kristina Hanicova (6): api: add public virNetworkCreateXMLFlags() and remote protocol src: add driver support for networkCreateXMLFlags() api: add virNetworkCreateFlags network_conf: add validation against schema in create network: allow VIR_NETWORK_CREATE_VALIDATE flag virsh: add support for '--validate' option in create network
docs/manpages/virsh.rst | 4 ++- include/libvirt/libvirt-network.h | 7 ++++++ src/conf/network_conf.c | 3 ++- src/driver-network.h | 6 +++++ src/libvirt-network.c | 41 +++++++++++++++++++++++++++++++ src/libvirt_public.syms | 5 ++++ src/network/bridge_driver.c | 20 ++++++++++++--- src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 18 +++++++++++++- src/remote_protocol-structs | 8 ++++++ src/test/test_driver.c | 15 +++++++++-- src/vbox/vbox_network.c | 10 +++++++- tools/virsh-network.c | 13 +++++++++- 13 files changed, 140 insertions(+), 11 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (3)
-
Daniel P. Berrangé
-
Ján Tomko
-
Kristina Hanicova