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

This is v2 of: https://listman.redhat.com/archives/libvir-list/2021-August/msg00871.html diff to v1: - rebased onto the current master - changed the way of working with flags to make the code more readable (suggested by Jano and Daniel). I added a comment in one case when it was not possible without further refactoring of more functions. Kristina Hanicova (5): api: add public virNetworkCreateXMLFlags() and remote protocol src: add driver support for networkCreateXMLFlags() api: add virNetworkCreateFlags 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/driver-network.h | 6 +++++ src/libvirt-network.c | 41 +++++++++++++++++++++++++++++++ src/libvirt_public.syms | 1 + src/network/bridge_driver.c | 21 +++++++++++++--- src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 18 +++++++++++++- src/remote_protocol-structs | 8 ++++++ src/test/test_driver.c | 16 ++++++++++-- src/vbox/vbox_network.c | 13 +++++++++- tools/virsh-network.c | 13 +++++++++- 12 files changed, 139 insertions(+), 10 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 | 1 + src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 18 +++++++++++++- src/remote_protocol-structs | 8 ++++++ 7 files changed, 77 insertions(+), 1 deletion(-) diff --git a/include/libvirt/libvirt-network.h b/include/libvirt/libvirt-network.h index df29aabd5f..e505c3eb7e 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 cf32912063..ee53b9f2c5 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 905072a21e..788a967df7 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -908,6 +908,7 @@ LIBVIRT_7.8.0 { virNodeDeviceGetAutostart; virNodeDeviceIsPersistent; virNodeDeviceIsActive; + 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 49afcc9924..83ea33e91b 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 9d8a66786b..296610a94d 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; }; @@ -6875,6 +6884,13 @@ enum remote_procedure { * @priority: high * @acl: node_device:read */ - REMOTE_PROC_NODE_DEVICE_IS_ACTIVE = 436 + REMOTE_PROC_NODE_DEVICE_IS_ACTIVE = 436, + /** + * @generate: both + * @priority: high + * @acl: network:write + * @acl: network:start + */ + REMOTE_PROC_NETWORK_CREATE_XML_FLAGS = 437 }; diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 8d012dc8a0..de06895d53 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; }; @@ -3665,4 +3672,5 @@ enum remote_procedure { REMOTE_PROC_NODE_DEVICE_SET_AUTOSTART = 434, REMOTE_PROC_NODE_DEVICE_IS_PERSISTENT = 435, REMOTE_PROC_NODE_DEVICE_IS_ACTIVE = 436, + REMOTE_PROC_NETWORK_CREATE_XML_FLAGS = 437, }; -- 2.31.1

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 86cefbd82b..dbb8846e05 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, false))) 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, @@ -5630,6 +5641,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 2c2c6f52d1..26ff2cc759 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, false)) == 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, @@ -9723,6 +9733,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 e772e580ad..1c23b880e8 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -561,6 +561,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); @@ -930,6 +936,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 e505c3eb7e..398d8fccd4 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 ee53b9f2c5..883dd40f6b 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 9/15/21 1:07 PM, 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 e505c3eb7e..398d8fccd4 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 */
Since in patch 4/5 we rely on the fact that VIR_NETWORK_CREATE_VALIDATE = VIR_NETWORK_DEFINE_VALIDATE should we reflect this in define? I mean, this could be VIR_NETWORK_CREATE_VALIDATE = VIR_NETWORK_DEFINE_VALIDATE /* Validate ... */ But since VIR_NETWORK_DEFINE_VALIDATE is declared only after these lines we would also need to move this typedef :( Alternatively, we may do G_STATIC_ASSERT(VIR_NETWORK_CREATE_VALIDATE == VIR_NETWORK_DEFINE_VALIDATE) somewhere in our code (we can't do it in public header because that's glib-free). Michal

On Thu, Sep 16, 2021 at 4:02 PM Michal Prívozník <mprivozn@redhat.com> wrote:
On 9/15/21 1:07 PM, 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 e505c3eb7e..398d8fccd4 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 */
Since in patch 4/5 we rely on the fact that VIR_NETWORK_CREATE_VALIDATE = VIR_NETWORK_DEFINE_VALIDATE should we reflect this in define?
I mean, this could be
VIR_NETWORK_CREATE_VALIDATE = VIR_NETWORK_DEFINE_VALIDATE /* Validate ... */
But since VIR_NETWORK_DEFINE_VALIDATE is declared only after these lines we would also need to move this typedef :(
Alternatively, we may do G_STATIC_ASSERT(VIR_NETWORK_CREATE_VALIDATE == VIR_NETWORK_DEFINE_VALIDATE) somewhere in our code (we can't do it in public header because that's glib-free).
Michal
Michal, please squash this into the fourth patch: diff --git i/src/vbox/vbox_network.c w/src/vbox/vbox_network.c index 343b8d35ad..9c27ccda56 100644 --- i/src/vbox/vbox_network.c +++ w/src/vbox/vbox_network.c @@ -385,9 +385,15 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start, IHost *host = NULL; virNetworkPtr ret = NULL; nsresult rc; + bool validate; - virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE | - VIR_NETWORK_CREATE_VALIDATE, NULL); + if (start) { + virCheckFlags(VIR_NETWORK_CREATE_VALIDATE, NULL); + validate = flags & VIR_NETWORK_CREATE_VALIDATE; + } else { + virCheckFlags(VIR_NETWORK_DEFINE_VALIDATE, NULL); + validate = flags & VIR_NETWORK_DEFINE_VALIDATE; + } if (!data->vboxObj) return ret; @@ -398,11 +404,7 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start, VBOX_IID_INITIALIZE(&vboxnetiid); - /* Here we rely on the fact that VIR_NETWORK_DEFINE_VALIDATE and - * VIR_NETWORK_CREATE_VALIDATE always have the same value. - */ - if (!(def = virNetworkDefParseString(xml, NULL, - !!(flags & VIR_NETWORK_DEFINE_VALIDATE))) || + if (!(def = virNetworkDefParseString(xml, NULL, validate)) || (def->forward.type != VIR_NETWORK_FORWARD_NONE) || (def->nips == 0 || !def->ips)) goto cleanup; Kristina

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/network/bridge_driver.c | 5 +++-- src/test/test_driver.c | 5 +++-- src/vbox/vbox_network.c | 6 +++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index dbb8846e05..7027dc636c 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -3475,9 +3475,10 @@ 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, false))) + if (!(newDef = virNetworkDefParseString(xml, network_driver->xmlopt, + !!(flags & VIR_NETWORK_CREATE_VALIDATE)))) goto cleanup; if (virNetworkCreateXMLFlagsEnsureACL(conn, newDef) < 0) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 26ff2cc759..4f3fd0197e 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -5582,9 +5582,10 @@ 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, false)) == NULL) + if (!(newDef = virNetworkDefParseString(xml, NULL, + !!(flags & VIR_NETWORK_CREATE_VALIDATE)))) goto cleanup; if (!(obj = virNetworkObjAssignDef(privconn->networks, newDef, diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 1c23b880e8..343b8d35ad 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; @@ -397,6 +398,9 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start, VBOX_IID_INITIALIZE(&vboxnetiid); + /* Here we rely on the fact that VIR_NETWORK_DEFINE_VALIDATE and + * VIR_NETWORK_CREATE_VALIDATE always have the same value. + */ if (!(def = virNetworkDefParseString(xml, NULL, !!(flags & VIR_NETWORK_DEFINE_VALIDATE))) || (def->forward.type != VIR_NETWORK_FORWARD_NONE) || -- 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 ce98283ae3..48d6ab54df 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -5189,13 +5189,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 a8f7f46905..37c19b663b 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 9/15/21 1:07 PM, Kristina Hanicova wrote:
This is v2 of: https://listman.redhat.com/archives/libvir-list/2021-August/msg00871.html
diff to v1: - rebased onto the current master - changed the way of working with flags to make the code more readable (suggested by Jano and Daniel). I added a comment in one case when it was not possible without further refactoring of more functions.
Kristina Hanicova (5): api: add public virNetworkCreateXMLFlags() and remote protocol src: add driver support for networkCreateXMLFlags() api: add virNetworkCreateFlags 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/driver-network.h | 6 +++++ src/libvirt-network.c | 41 +++++++++++++++++++++++++++++++ src/libvirt_public.syms | 1 + src/network/bridge_driver.c | 21 +++++++++++++--- src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 18 +++++++++++++- src/remote_protocol-structs | 8 ++++++ src/test/test_driver.c | 16 ++++++++++-- src/vbox/vbox_network.c | 13 +++++++++- tools/virsh-network.c | 13 +++++++++- 12 files changed, 139 insertions(+), 10 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Kristina Hanicova
-
Michal Prívozník