diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index d9bfb6e76d..84ac2d0612 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 + * 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 definition the provided + * xml should be applied to. + * + */ +typedef enum { + VIR_NETWORK_SECTION_NONE = 0, /* (invalid) */ + VIR_NETWORK_SECTION_BRIDGE = 1, /* */ + VIR_NETWORK_SECTION_DOMAIN = 2, /* */ + VIR_NETWORK_SECTION_IP = 3, /* */ + VIR_NETWORK_SECTION_IP_DHCP_HOST = 4, /* // */ + VIR_NETWORK_SECTION_IP_DHCP_RANGE = 5, /* // */ + VIR_NETWORK_SECTION_FORWARD = 6, /* */ + VIR_NETWORK_SECTION_FORWARD_INTERFACE = 7, /* / */ + VIR_NETWORK_SECTION_FORWARD_PF = 8, /* / */ + VIR_NETWORK_SECTION_PORTGROUP = 9, /* */ + VIR_NETWORK_SECTION_DNS_HOST = 10, /* / */ + VIR_NETWORK_SECTION_DNS_TXT = 11, /* / */ + VIR_NETWORK_SECTION_DNS_SRV = 12, /* / */ +#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 063bbbfaa0..bdcaa0183d 100644 --- a/src/driver.h +++ b/src/driver.h @@ -1119,6 +1119,13 @@ typedef virNetworkPtr const char *xml); 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 @@ -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 5438fe4cd1..24d572939f 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -10406,6 +10406,68 @@ error: return -1; } +/** + * 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 element when modifying + * a / 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 d965c7f2b8..2c924d5e3f 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;