[libvirt] [PATCHv2 1/9] network: define new API virNetworkUpdate

Daniel Veillard veillard at redhat.com
Tue Sep 18 07:48:15 UTC 2012


On Tue, Sep 18, 2012 at 03:38:57AM -0400, Laine Stump wrote:
> This patch adds a new public API virNetworkUpdate that will permit
> updating an existing network configuration without requiring that the
> network be destroyed/restarted for the changes to take effect.
> ---
>  include/libvirt/libvirt.h.in | 66 ++++++++++++++++++++++++++++++++++++++++++++
>  src/driver.h                 |  8 ++++++
>  src/libvirt.c                | 62 +++++++++++++++++++++++++++++++++++++++++
>  src/libvirt_public.syms      |  1 +
>  4 files changed, 137 insertions(+)
> 
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index d9bfb6e..84ac2d0 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -2347,6 +2347,72 @@ virNetworkPtr           virNetworkDefineXML     (virConnectPtr conn,
>   */
>  int                     virNetworkUndefine      (virNetworkPtr network);
>  
> +/**
> + * virNetworkUpdateCommand:
> + *
> + * describes which type of update to perform on a <network>
> + * definition.
> + *
> + */
> +typedef enum {
> +    VIR_NETWORK_UPDATE_COMMAND_NONE      = 0, /* (invalid) */
> +    VIR_NETWORK_UPDATE_COMMAND_MODIFY    = 2, /* modify an existing element */
> +    VIR_NETWORK_UPDATE_COMMAND_DELETE    = 3, /* delete an existing element */
> +    VIR_NETWORK_UPDATE_COMMAND_ADD_LAST  = 4, /* add an element at end of list */
> +    VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST = 5, /* add an element at start of list */
> +#ifdef VIR_ENUM_SENTINELS
> +    VIR_NETWORK_UPDATE_COMMAND_LAST
> +#endif
> +} virNetworkUpdateCommand;
> +
> +/**
> + * virNetworkUpdateSection:
> + *
> + * describes which section of a <network> definition the provided
> + * xml should be applied to.
> + *
> + */
> +typedef enum {
> +    VIR_NETWORK_SECTION_NONE              =  0, /* (invalid) */
> +    VIR_NETWORK_SECTION_BRIDGE            =  1, /* <bridge> */
> +    VIR_NETWORK_SECTION_DOMAIN            =  2, /* <domain> */
> +    VIR_NETWORK_SECTION_IP                =  3, /* <ip> */
> +    VIR_NETWORK_SECTION_IP_DHCP_HOST      =  4, /* <ip>/<dhcp>/<host> */
> +    VIR_NETWORK_SECTION_IP_DHCP_RANGE     =  5, /* <ip>/<dhcp>/<range> */
> +    VIR_NETWORK_SECTION_FORWARD           =  6, /* <forward> */
> +    VIR_NETWORK_SECTION_FORWARD_INTERFACE =  7, /* <forward>/<interface> */
> +    VIR_NETWORK_SECTION_FORWARD_PF        =  8, /* <forward>/<pf> */
> +    VIR_NETWORK_SECTION_PORTGROUP         =  9, /* <portgroup> */
> +    VIR_NETWORK_SECTION_DNS_HOST          = 10, /* <dns>/<host> */
> +    VIR_NETWORK_SECTION_DNS_TXT           = 11, /* <dns>/<txt> */
> +    VIR_NETWORK_SECTION_DNS_SRV           = 12, /* <dns>/<srv> */
> +#ifdef VIR_ENUM_SENTINELS
> +    VIR_NETWORK_SECTION_LAST
> +#endif
> +} virNetworkUpdateSection;
> +
> +/**
> + * virNetworkUpdateFlags:
> + *
> + * Flags to control options for virNetworkUpdate()
> + */
> +typedef enum {
> +    VIR_NETWORK_UPDATE_AFFECT_CURRENT = 0,      /* affect live if network is active,
> +                                                   config if it's not active */
> +    VIR_NETWORK_UPDATE_AFFECT_LIVE    = 1 << 0, /* affect live state of network only */
> +    VIR_NETWORK_UPDATE_AFFECT_CONFIG  = 1 << 1, /* affect persistent config only */
> +    } virNetworkUpdateFlags;
> +
> +/*
> + * Update an existing network definition
> + */
> +int                     virNetworkUpdate(virNetworkPtr network,
> +                                         unsigned int command, /* virNetworkUpdateCommand */
> +                                         unsigned int section, /* virNetworkUpdateSection */
> +                                         int parentIndex,
> +                                         const char *xml,
> +                                         unsigned int flags);
> +
>  /*
>   * Activate persistent network
>   */
> diff --git a/src/driver.h b/src/driver.h
> index 063bbbf..bdcaa01 100644
> --- a/src/driver.h
> +++ b/src/driver.h
> @@ -1120,6 +1120,13 @@ typedef virNetworkPtr
>  typedef int
>          (*virDrvNetworkUndefine)        (virNetworkPtr network);
>  typedef int
> +        (*virDrvNetworkUpdate)          (virNetworkPtr network,
> +                                         unsigned int command, /* virNetworkUpdateCommand */
> +                                         unsigned int section, /* virNetworkUpdateSection */
> +                                         int parentIndex,
> +                                         const char *xml,
> +                                         unsigned int flags);
> +typedef int
>          (*virDrvNetworkCreate)          (virNetworkPtr network);
>  typedef int
>          (*virDrvNetworkDestroy)         (virNetworkPtr network);
> @@ -1169,6 +1176,7 @@ struct _virNetworkDriver {
>          virDrvNetworkCreateXML      networkCreateXML;
>          virDrvNetworkDefineXML      networkDefineXML;
>          virDrvNetworkUndefine       networkUndefine;
> +        virDrvNetworkUpdate         networkUpdate;
>          virDrvNetworkCreate         networkCreate;
>          virDrvNetworkDestroy        networkDestroy;
>          virDrvNetworkGetXMLDesc     networkGetXMLDesc;
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 5438fe4..24d5729 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -10407,6 +10407,68 @@ error:
>  }
>  
>  /**
> + * virNetworkUpdate:
> + * @network: pointer to a defined network
> + * @section: which section of the network to update
> + *           (see virNetworkUpdateSection for descriptions)
> + * @command: what action to perform (add/delete/modify)
> + *           (see virNetworkUpdateCommand for descriptions)
> + * @parentIndex: which parent element, if there are multiple parents
> + *           of the same type (e.g. which <ip> element when modifying
> + *           a <dhcp>/<host> element), or "-1" for "don't care" or
> + *           "automatically find appropriate one".
> + * @xml: the XML description for the network, preferably in UTF-8
> + * @flags: bitwise OR of virNetworkUpdateFlags.
> + *
> + * Update the definition of an existing network, either its live
> + * running state, its persistent configuration, or both.
> + *
> + * Returns 0 in case of success, -1 in case of error
> + */
> +int
> +virNetworkUpdate(virNetworkPtr network,
> +                 unsigned int command, /* virNetworkUpdateCommand */
> +                 unsigned int section, /* virNetworkUpdateSection */
> +                 int parentIndex,
> +                 const char *xml,
> +                 unsigned int flags)
> +{
> +    virConnectPtr conn;
> +    VIR_DEBUG("network=%p, section=%d, parentIndex=%d, xml=%s, flags=0x%x",
> +              network, section, parentIndex, xml, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECTED_NETWORK(network)) {
> +        virLibNetworkError(VIR_ERR_INVALID_NETWORK, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return -1;
> +    }
> +    conn = network->conn;
> +    if (conn->flags & VIR_CONNECT_RO) {
> +        virLibNetworkError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
> +        goto error;
> +    }
> +
> +    virCheckNonNullArgGoto(xml, error);
> +
> +    if (conn->networkDriver && conn->networkDriver->networkUpdate) {
> +        int ret;
> +        ret = conn->networkDriver->networkUpdate(network, section, command,
> +                                                 parentIndex, xml, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(network->conn);
> +    return -1;
> +}
> +
> +/**
>   * virNetworkCreate:
>   * @network: pointer to a defined network
>   *
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index d965c7f..2c924d5 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -563,6 +563,7 @@ LIBVIRT_0.10.2 {
>          virConnectListAllSecrets;
>          virConnectListAllStoragePools;
>          virDomainBlockCommit;
> +        virNetworkUpdate;
>          virNodeGetMemoryParameters;
>          virNodeSetMemoryParameters;
>          virStoragePoolListAllVolumes;

  Okay, ACK, the separation of the parameters makes sense, this won't
solve Dan's problem with making a simple binding but we don't have a
solution for that,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list