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

Daniel P. Berrange berrange at redhat.com
Fri May 27 13:14:35 UTC 2011


On Thu, May 26, 2011 at 12:17:44PM -0400, Laine Stump wrote:
> From: Michal Privoznik <mprivozn at 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) {

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 :|




More information about the libvir-list mailing list