[libvirt] [PATCH 03/10] network: define new API virNetworkUpdate

Laine Stump laine at laine.org
Mon Sep 17 09:48:48 UTC 2012


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




More information about the libvir-list mailing list