[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCHv4 6/7] interface: Implement driver methods for network config transaction API



From: Michal Privoznik <mprivozn redhat com>

This is the functionality at the end of the libvirt part of the call
chain - for each function, the corresponding netcf API is called.

Change from previous version: modify the error log format as suggested by danpb.
---
 configure.ac                 |    5 +++
 src/interface/netcf_driver.c |   78 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+), 0 deletions(-)

diff --git a/configure.ac b/configure.ac
index e17e7af..58c7733 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1491,6 +1491,11 @@ if test "$with_netcf" = "yes" || test "$with_netcf" = "check"; then
   if test "$with_netcf" = "yes" ; then
     AC_DEFINE_UNQUOTED([WITH_NETCF], 1,
       [whether libnetcf is available to configure physical host network interfaces])
+    AC_CHECK_LIB([netcf], [ncf_change_begin], [netcf_transactions=1], [netcf_transactions=0])
+    if test "$netcf_transactions" = "1" ; then
+        AC_DEFINE_UNQUOTED([HAVE_NETCF_TRANSACTIONS], 1,
+          [we have sufficiently new version of netcf for transaction network API])
+    fi
   fi
 fi
 AM_CONDITIONAL([WITH_NETCF], [test "$with_netcf" = "yes"])
diff --git a/src/interface/netcf_driver.c b/src/interface/netcf_driver.c
index d5b401a..b5b4f79 100644
--- a/src/interface/netcf_driver.c
+++ b/src/interface/netcf_driver.c
@@ -86,6 +86,11 @@ static int netcf_to_vir_err(int netcf_errcode)
         case NETCF_EEXEC:
             /* external program execution failed or returned non-0 */
             return VIR_ERR_INTERNAL_ERROR;
+#ifdef NETCF_EINVALIDOP
+        case NETCF_EINVALIDOP:
+            /* attempted operation is invalid while the system is in the current state. */
+            return VIR_ERR_OPERATION_INVALID;
+#endif
         default:
             return VIR_ERR_INTERNAL_ERROR;
     }
@@ -540,6 +545,74 @@ cleanup:
     return ret;
 }
 
+#ifdef HAVE_NETCF_TRANSACTIONS
+static int interfaceChangeBegin(virConnectPtr conn, unsigned int flags)
+{
+    struct interface_driver *driver = conn->interfacePrivateData;
+    int ret;
+
+    virCheckFlags(0, -1); /* currently flags must be 0 */
+
+    interfaceDriverLock(driver);
+
+    ret = ncf_change_begin(driver->netcf, 0);
+    if (ret < 0) {
+        const char *errmsg, *details;
+        int errcode = ncf_error(driver->netcf, &errmsg, &details);
+        interfaceReportError(netcf_to_vir_err(errcode),
+                             _("failed to begin transaction: %s%s%s)"),
+                             errmsg, details ? " - " : "", details ? details : "");
+    }
+
+    interfaceDriverUnlock(driver);
+    return ret;
+}
+
+static int interfaceChangeCommit(virConnectPtr conn, unsigned int flags)
+{
+    struct interface_driver *driver = conn->interfacePrivateData;
+    int ret;
+
+    virCheckFlags(0, -1); /* currently flags must be 0 */
+
+    interfaceDriverLock(driver);
+
+    ret = ncf_change_commit(driver->netcf, 0);
+    if (ret < 0) {
+        const char *errmsg, *details;
+        int errcode = ncf_error(driver->netcf, &errmsg, &details);
+        interfaceReportError(netcf_to_vir_err(errcode),
+                             _("failed to commit transaction: %s%s%s)"),
+                             errmsg, details ? " - " : "", details ? details : "");
+    }
+
+    interfaceDriverUnlock(driver);
+    return ret;
+}
+
+static int interfaceChangeRollback(virConnectPtr conn, unsigned int flags)
+{
+    struct interface_driver *driver = conn->interfacePrivateData;
+    int ret;
+
+    virCheckFlags(0, -1); /* currently flags must be 0 */
+
+    interfaceDriverLock(driver);
+
+    ret = ncf_change_rollback(driver->netcf, 0);
+    if (ret < 0) {
+        const char *errmsg, *details;
+        int errcode = ncf_error(driver->netcf, &errmsg, &details);
+        interfaceReportError(netcf_to_vir_err(errcode),
+                             _("failed to rollback transaction: %s%s%s)"),
+                             errmsg, details ? " - " : "", details ? details : "");
+    }
+
+    interfaceDriverUnlock(driver);
+    return ret;
+}
+#endif /* HAVE_NETCF_TRANSACTIONS */
+
 static virInterfaceDriver interfaceDriver = {
     "Interface",
     .open = interfaceOpenInterface, /* 0.7.0 */
@@ -556,6 +629,11 @@ static virInterfaceDriver interfaceDriver = {
     .interfaceCreate = interfaceCreate, /* 0.7.0 */
     .interfaceDestroy = interfaceDestroy, /* 0.7.0 */
     .interfaceIsActive = interfaceIsActive, /* 0.7.3 */
+#ifdef HAVE_NETCF_TRANSACTIONS
+    .interfaceChangeBegin = interfaceChangeBegin, /* 0.9.2 */
+    .interfaceChangeCommit = interfaceChangeCommit, /* 0.9.2 */
+    .interfaceChangeRollback = interfaceChangeRollback, /* 0.9.2 */
+#endif /* HAVE_NETCF_TRANSACTIONS */
 };
 
 int interfaceRegister(void) {
-- 
1.7.3.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]