[libvirt] [PATCH 1/5] network: define new API virNetworkDefineXMLFlags

Osier Yang jyang at redhat.com
Mon Aug 20 10:21:51 UTC 2012


On 2012年08月20日 14:17, Laine Stump wrote:
> We need to be able to pass a flag when (re)defining a network that
> says to enact the changes immediately rather than waiting until the
> next restart of the network, but the existing virNetworkDefineXML has
> no flags arg.
>
> This patch adds a new public API virNetworkDefineXMLFlags that will be
> identical to virNetworkDefineXML, but with an added flags arg (which
> initially will only accept "0" on the remote end).
> ---
>   include/libvirt/libvirt.h.in | 11 ++++++++++
>   src/driver.h                 |  5 +++++
>   src/libvirt.c                | 49 +++++++++++++++++++++++++++++++++++++++++++-
>   src/libvirt_public.syms      |  1 +
>   4 files changed, 65 insertions(+), 1 deletion(-)
>
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index 91e0a29..70bb594 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -2266,6 +2266,17 @@ virNetworkPtr           virNetworkLookupByUUIDString    (virConnectPtr conn,
>   virNetworkPtr           virNetworkCreateXML     (virConnectPtr conn,
>                                                    const char *xmlDesc);
>
> +typedef enum {
> +    VIR_NETWORK_DEFINE_NONE = 0, /* default behavior */
> +} virNetworkDefineFlags;
> +
> +/*
> + * Define inactive persistent network with flags
> + */
> +virNetworkPtr           virNetworkDefineXMLFlags(virConnectPtr conn,
> +                                                 const char *xmlDesc,
> +                                                 unsigned int flags);
> +
>   /*
>    * Define inactive persistent network
>    */
> diff --git a/src/driver.h b/src/driver.h
> index aab9766..b25a6ac 100644
> --- a/src/driver.h
> +++ b/src/driver.h
> @@ -1072,6 +1072,10 @@ typedef virNetworkPtr
>           (*virDrvNetworkCreateXML)       (virConnectPtr conn,
>                                            const char *xmlDesc);
>   typedef virNetworkPtr
> +        (*virDrvNetworkDefineXMLFlags)  (virConnectPtr conn,
> +                                         const char *xml,
> +                                         unsigned int flags);
> +typedef virNetworkPtr
>           (*virDrvNetworkDefineXML)       (virConnectPtr conn,
>                                            const char *xml);
>   typedef int
> @@ -1123,6 +1127,7 @@ struct _virNetworkDriver {
>           virDrvNetworkLookupByUUID   networkLookupByUUID;
>           virDrvNetworkLookupByName   networkLookupByName;
>           virDrvNetworkCreateXML      networkCreateXML;
> +        virDrvNetworkDefineXMLFlags networkDefineXMLFlags;
>           virDrvNetworkDefineXML      networkDefineXML;
>           virDrvNetworkUndefine       networkUndefine;
>           virDrvNetworkCreate         networkCreate;
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 893d380..aa9f101 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -9920,11 +9920,58 @@ error:
>   }
>
>   /**
> + * virNetworkDefineXMLFlags:
> + * @conn: pointer to the hypervisor connection
> + * @xml: the XML description for the network, preferably in UTF-8
> + * @flags: bitwise or of virNetworkDefineFlags (currently must be 0).
> + *
> + * Define a network, but do not create it. This function is
> + * identical to the older virNetworkDefineXML, but with the addition
> + * of the flags argument.
> + *
> + * Returns NULL in case of error, a pointer to the network otherwise
> + */
> +virNetworkPtr
> +virNetworkDefineXMLFlags(virConnectPtr conn, const char *xml,
> +                         unsigned int flags)
> +{
> + VIR_DEBUG("conn=%p, xml=%s, flags=0x%x", conn, xml, flags);

Indention problem.

> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECT(conn)) {
> +        virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return NULL;
> +    }
> +    if (conn->flags&  VIR_CONNECT_RO) {
> +        virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
> +        goto error;
> +    }
> +    virCheckNonNullArgGoto(xml, error);
> +
> +    if (conn->networkDriver&&  conn->networkDriver->networkDefineXMLFlags) {
> +        virNetworkPtr ret;
> +        ret = conn->networkDriver->networkDefineXMLFlags(conn, xml, flags);
> +        if (!ret)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(conn);
> +    return NULL;
> +}
> +
> +/**
>    * virNetworkDefineXML:
>    * @conn: pointer to the hypervisor connection
>    * @xml: the XML description for the network, preferably in UTF-8
>    *
> - * Define a network, but does not create it
> + * Define a network, but do not create it. See
> + * virNetworkDefineXMLFlags() for more control.
>    *
>    * Returns NULL in case of error, a pointer to the network otherwise
>    */
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index e3ba119..c814cb7 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -549,6 +549,7 @@ LIBVIRT_0.10.0 {
>           virDomainGetHostname;
>           virConnectRegisterCloseCallback;
>           virConnectUnregisterCloseCallback;
> +        virNetworkDefineXMLFlags;

Conflicts with the atomic APIs, I can rebase if you push first. :-)

ACK.




More information about the libvir-list mailing list