From: Michal Privoznik <mprivozn(a)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.
---
configure.ac | 5 +++
src/interface/netcf_driver.c | 76 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 81 insertions(+), 0 deletions(-)
diff --git a/configure.ac b/configure.ac
index 8db3226..dbec54c 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..c94cbd5 100644
--- a/src/interface/netcf_driver.c
+++ b/src/interface/netcf_driver.c
@@ -540,6 +540,77 @@ cleanup:
return ret;
}
+#ifdef HAVE_NETCF_TRANSACTIONS
+static int interfaceChangeBegin(virConnectPtr conn ATTRIBUTE_UNUSED,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+ 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 (netcf: %s -
%s)"),
+ errmsg, details ? details : "");
+ }
+
+ interfaceDriverUnlock(driver);
+ return ret;
+}
+
+static int interfaceChangeCommit(virConnectPtr conn ATTRIBUTE_UNUSED,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+ 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 begin transaction (netcf: %s -
%s)"),
+ errmsg, details ? details : "");
+ }
+
+ interfaceDriverUnlock(driver);
+ return ret;
+}
+
+static int interfaceChangeRollback(virConnectPtr conn ATTRIBUTE_UNUSED,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+ 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 begin transaction (netcf: %s -
%s)"),
+ errmsg, details ? details : "");
+ }
+
+ interfaceDriverUnlock(driver);
+ return ret;
+}
+#endif /* HAVE_NETCF_TRANSACTIONS */
+
static virInterfaceDriver interfaceDriver = {
"Interface",
.open = interfaceOpenInterface, /* 0.7.0 */
@@ -556,6 +627,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