On Thu, May 26, 2011 at 12:17:44PM -0400, Laine Stump wrote: > From: Michal Privoznik <mprivozn@xxxxxxxxxx> > > 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) { ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list