mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
interface: Implement driver methods for network config transaction API
This is the functionality at the end of the libvirt part of the call chain - for each function, the corresponding netcf API is called.
This commit is contained in:
parent
761d1880be
commit
9c6000579b
@ -1491,6 +1491,11 @@ if test "$with_netcf" = "yes" || test "$with_netcf" = "check"; then
|
|||||||
if test "$with_netcf" = "yes" ; then
|
if test "$with_netcf" = "yes" ; then
|
||||||
AC_DEFINE_UNQUOTED([WITH_NETCF], 1,
|
AC_DEFINE_UNQUOTED([WITH_NETCF], 1,
|
||||||
[whether libnetcf is available to configure physical host network interfaces])
|
[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
|
||||||
fi
|
fi
|
||||||
AM_CONDITIONAL([WITH_NETCF], [test "$with_netcf" = "yes"])
|
AM_CONDITIONAL([WITH_NETCF], [test "$with_netcf" = "yes"])
|
||||||
|
@ -86,6 +86,11 @@ static int netcf_to_vir_err(int netcf_errcode)
|
|||||||
case NETCF_EEXEC:
|
case NETCF_EEXEC:
|
||||||
/* external program execution failed or returned non-0 */
|
/* external program execution failed or returned non-0 */
|
||||||
return VIR_ERR_INTERNAL_ERROR;
|
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:
|
default:
|
||||||
return VIR_ERR_INTERNAL_ERROR;
|
return VIR_ERR_INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
@ -540,6 +545,74 @@ cleanup:
|
|||||||
return ret;
|
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 = {
|
static virInterfaceDriver interfaceDriver = {
|
||||||
"Interface",
|
"Interface",
|
||||||
.open = interfaceOpenInterface, /* 0.7.0 */
|
.open = interfaceOpenInterface, /* 0.7.0 */
|
||||||
@ -556,6 +629,11 @@ static virInterfaceDriver interfaceDriver = {
|
|||||||
.interfaceCreate = interfaceCreate, /* 0.7.0 */
|
.interfaceCreate = interfaceCreate, /* 0.7.0 */
|
||||||
.interfaceDestroy = interfaceDestroy, /* 0.7.0 */
|
.interfaceDestroy = interfaceDestroy, /* 0.7.0 */
|
||||||
.interfaceIsActive = interfaceIsActive, /* 0.7.3 */
|
.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) {
|
int interfaceRegister(void) {
|
||||||
|
Loading…
Reference in New Issue
Block a user