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@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list