This patch adds a new public API virNetworkUpdate that will permit updating an existing network configuration without requiring that the network be destroyed/restarted for the changes to take effect. --- include/libvirt/libvirt.h.in | 50 +++++++++++++++++++++++++++++++++++++ src/driver.h | 7 ++++++ src/libvirt.c | 59 ++++++++++++++++++++++++++++++++++++++++++++ src/libvirt_public.syms | 1 + 4 files changed, 117 insertions(+) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index b12f7e3..fae0848 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -2328,6 +2328,56 @@ virNetworkPtr virNetworkDefineXML (virConnectPtr conn, int virNetworkUndefine (virNetworkPtr network); /* + * virNetworkUpdateSection: + * + * describes which section of a <network> definition the provided + * xml should be applied to. + * + */ +typedef enum { + VIR_NETWORK_SECTION_BRIDGE = 0, + VIR_NETWORK_SECTION_DOMAIN = 1, + VIR_NETWORK_SECTION_IP = 2, + VIR_NETWORK_SECTION_IP_DHCP_HOST = 3, + VIR_NETWORK_SECTION_IP_DHCP_RANGE = 4, + VIR_NETWORK_SECTION_FORWARD = 5, + VIR_NETWORK_SECTION_FORWARD_INTERFACE = 6, + VIR_NETWORK_SECTION_FORWARD_PF = 7, + VIR_NETWORK_SECTION_PORTGROUP = 8, + VIR_NETWORK_SECTION_DNS_HOST = 9, + VIR_NETWORK_SECTION_DNS_TXT = 10, + VIR_NETWORK_SECTION_DNS_SRV = 11, +#ifdef VIR_ENUM_SENTINELS + VIR_NETWORK_SECTION_LAST +#endif +} virNetworkUpdateSection; + +/* + * virNetworkUpdateFlags: + * + * Used to specify what type of operation to perform, and whether to + * affect live network, persistent config, or both. + */ +typedef enum { + VIR_NETWORK_UPDATE_AFFECT_CURRENT = 0, + VIR_NETWORK_UPDATE_AFFECT_LIVE = 1 << 0, + VIR_NETWORK_UPDATE_AFFECT_CONFIG = 1 << 1, + VIR_NETWORK_UPDATE_EXISTING = 1 << 2, + VIR_NETWORK_UPDATE_DELETE = 1 << 3, + VIR_NETWORK_UPDATE_ADD_LAST = 1 << 4, + VIR_NETWORK_UPDATE_ADD_FIRST = 1 << 5, + } virNetworkUpdateFlags; + +/* + * Update an existing network definition + */ +int virNetworkUpdate(virNetworkPtr network, + unsigned int section, /* virNetworkUpdateSection */ + int parentIndex, + const char *xml, + unsigned int flags); + +/* * Activate persistent network */ int virNetworkCreate (virNetworkPtr network); diff --git a/src/driver.h b/src/driver.h index bb470fe..cd82c34 100644 --- a/src/driver.h +++ b/src/driver.h @@ -1115,6 +1115,12 @@ typedef virNetworkPtr typedef int (*virDrvNetworkUndefine) (virNetworkPtr network); typedef int + (*virDrvNetworkUpdate) (virNetworkPtr network, + unsigned int section, /* virNetworkUpdateSection */ + int parentIndex, + const char *xml, + unsigned int flags); +typedef int (*virDrvNetworkCreate) (virNetworkPtr network); typedef int (*virDrvNetworkDestroy) (virNetworkPtr network); @@ -1164,6 +1170,7 @@ struct _virNetworkDriver { virDrvNetworkCreateXML networkCreateXML; virDrvNetworkDefineXML networkDefineXML; virDrvNetworkUndefine networkUndefine; + virDrvNetworkUpdate networkUpdate; virDrvNetworkCreate networkCreate; virDrvNetworkDestroy networkDestroy; virDrvNetworkGetXMLDesc networkGetXMLDesc; diff --git a/src/libvirt.c b/src/libvirt.c index dc8f4e4..bcf5c48 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -10407,6 +10407,65 @@ error: } /** + * virNetworkUpdate: + * @network: pointer to a defined network + * @section: which section of the network to update + * (virNetworkUpdateSection) + * @parentIndex: which parent element, if there are multiples parents + * of the same type (e.g. which <ip> element when modifying + * a <dhcp>/<host> element), or "-1" for "don't care" or + * "automatically find appropriate one". + * @xml: the XML description for the network, preferably in UTF-8 + * @flags: bitwise OR of virNetworkUpdateFlags. + * + * Update the definition of an existing network, either its live + * running state, its persistent configuration, or both. + * + * Returns 0 in case of success, -1 in case of error + */ +int +virNetworkUpdate(virNetworkPtr network, + unsigned int section, /* virNetworkUpdateSection */ + int parentIndex, + const char *xml, + unsigned int flags) +{ + virConnectPtr conn; + VIR_DEBUG("network=%p, section=%d, parentIndex=%d, xml=%s, flags=0x%x", + network, section, parentIndex, xml, flags); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_NETWORK(network)) { + virLibNetworkError(VIR_ERR_INVALID_NETWORK, __FUNCTION__); + virDispatchError(NULL); + return -1; + } + conn = network->conn; + if (conn->flags & VIR_CONNECT_RO) { + virLibNetworkError(VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + virCheckNonNullArgGoto(xml, error); + + if (conn->networkDriver && conn->networkDriver->networkUpdate) { + int ret; + ret = conn->networkDriver->networkUpdate(network, section, + parentIndex, xml, flags); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + virDispatchError(network->conn); + return -1; +} + +/** * virNetworkCreate: * @network: pointer to a defined network * diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 28b92ad..77cc4f2 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -565,6 +565,7 @@ LIBVIRT_0.10.2 { virNodeGetMemoryParameters; virNodeSetMemoryParameters; virStoragePoolListAllVolumes; + virNetworkUpdate; } LIBVIRT_0.10.0; # .... define new API here using predicted next version number .... -- 1.7.11.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list