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