On 9/3/23 16:58, K Shiva Kiran wrote:
> Adds the following for Network Metadata change callback events:
>
> - New Event ID VIR_NETWORK_EVENT_ID_METADATA_CHANGE
> - Server side dispatcher
>
> virsh:
> - New event type `metadata-change`
> - vshEventMetadataChangePrint() to display the above defined
> event type in virsh via `net-event`
>
> Signed-off-by: K Shiva Kiran <[email protected]>
> ---
> I was unable to split this patch due to static assertions (perfomed
> against VIR_NETWORK_EVENT_ID_LAST) in remote_daemon_dispatch.c and
> virsh-network.c
> Please let me know if there is a way to split patches in such cases.
>
> include/libvirt/libvirt-network.h | 1 +
> src/conf/network_event.c | 12 ++++++++
> src/remote/remote_daemon_dispatch.c | 38 ++++++++++++++++++++++++
> src/remote/remote_protocol.x | 15 +++++++++-
> src/remote_protocol-structs | 6 ++++
> tools/virsh-network.c | 46 ++++++++++++++++++++++++++++-
> 6 files changed, 116 insertions(+), 2 deletions(-)
>
> diff --git a/include/libvirt/libvirt-network.h
> b/include/libvirt/libvirt-network.h
> index 4b121ae0e7..58591be7ac 100644
> --- a/include/libvirt/libvirt-network.h
> +++ b/include/libvirt/libvirt-network.h
> @@ -330,6 +330,7 @@ typedef void
> (*virConnectNetworkEventLifecycleCallback)(virConnectPtr conn,
> */
> typedef enum {
> VIR_NETWORK_EVENT_ID_LIFECYCLE = 0, /*
> virConnectNetworkEventLifecycleCallback (Since: 1.2.1) */
> + VIR_NETWORK_EVENT_ID_METADATA_CHANGE = 1, /*
> virConnectNetworkEventMetadataChangeCallback (Since: 9.8.0) */
>
> # ifdef VIR_ENUM_SENTINELS
> VIR_NETWORK_EVENT_ID_LAST
> diff --git a/src/conf/network_event.c b/src/conf/network_event.c
> index 51fa092ffd..d1b3aa5721 100644
> --- a/src/conf/network_event.c
> +++ b/src/conf/network_event.c
> @@ -118,6 +118,18 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn,
> return;
> }
>
> + case VIR_NETWORK_EVENT_ID_METADATA_CHANGE:
> + {
> + virNetworkEventMetadataChange *metadataChangeEvent;
> +
> + metadataChangeEvent = (virNetworkEventMetadataChange *)event;
> + ((virConnectNetworkEventMetadataChangeCallback)cb)(conn, net,
> +
> metadataChangeEvent->type,
> +
> metadataChangeEvent->nsuri,
> + cbopaque);
> + return;
> + }
> +
> case VIR_NETWORK_EVENT_ID_LAST:
> break;
> }
> diff --git a/src/remote/remote_daemon_dispatch.c
> b/src/remote/remote_daemon_dispatch.c
> index 2bb9e306a4..7daf503b51 100644
> --- a/src/remote/remote_daemon_dispatch.c
> +++ b/src/remote/remote_daemon_dispatch.c
> @@ -1385,8 +1385,46 @@ remoteRelayNetworkEventLifecycle(virConnectPtr conn,
> return 0;
> }
>
> +static int
> +remoteRelayNetworkEventMetadataChange(virConnectPtr conn,
> + virNetworkPtr net,
> + int type,
> + const char *nsuri,
> + void *opaque)
> +{
> + daemonClientEventCallback *callback = opaque;
> + remote_network_event_callback_metadata_change_msg data;
> +
> + if (callback->callbackID < 0 ||
> + !remoteRelayNetworkEventCheckACL(callback->client, conn, net))
> + return -1;
> +
> + VIR_DEBUG("Relaying network metadata change %s %d %s, callback %d",
> + net->name, type, NULLSTR(nsuri), callback->callbackID);
> +
> + /* build return data */
> + memset(&data, 0, sizeof(data));
Declaring the variable with = { 0 } initializer is preferred (see
v9.7.0-rc1~160).
> +
> + data.type = type;
> + if (nsuri) {
> + data.nsuri = g_new0(remote_nonnull_string, 1);
> + *(data.nsuri) = g_strdup(nsuri);
> + }
> +
> + make_nonnull_network(&data.net, net);
> + data.callbackID = callback->callbackID;
> +
> + remoteDispatchObjectEventSend(callback->client, callback->program,
> +
> REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE,
> +
> (xdrproc_t)xdr_remote_network_event_callback_metadata_change_msg,
> + &data);
> + return 0;
> +}
> +
> +
> static virConnectNetworkEventGenericCallback networkEventCallbacks[] = {
> VIR_NETWORK_EVENT_CALLBACK(remoteRelayNetworkEventLifecycle),
> + VIR_NETWORK_EVENT_CALLBACK(remoteRelayNetworkEventMetadataChange),
> };
>
> G_STATIC_ASSERT(G_N_ELEMENTS(networkEventCallbacks) ==
> VIR_NETWORK_EVENT_ID_LAST);
> diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
> index 7ff059e393..e295b0acc3 100644
> --- a/src/remote/remote_protocol.x
> +++ b/src/remote/remote_protocol.x
> @@ -3323,6 +3323,13 @@ struct remote_network_event_lifecycle_msg {
> int detail;
> };
>
> +struct remote_network_event_callback_metadata_change_msg {
> + int callbackID;
> + remote_nonnull_network net;
> + int type;
> + remote_string nsuri;
> +};
> +
> struct remote_network_set_metadata_args {
> remote_nonnull_network network;
> int type;
> @@ -7008,5 +7015,11 @@ enum remote_procedure {
> * @generate: both
> * @acl: network:read
> */
> - REMOTE_PROC_NETWORK_GET_METADATA = 445
> + REMOTE_PROC_NETWORK_GET_METADATA = 445,
> +
> + /**
> + * @generate: both
> + * @acl: none
> + */
> + REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE = 446
> };
> diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
> index c07e0af1e6..e6132bee71 100644
> --- a/src/remote_protocol-structs
> +++ b/src/remote_protocol-structs
> @@ -2687,6 +2687,12 @@ struct remote_network_event_lifecycle_msg {
> int event;
> int detail;
> };
> +struct remote_network_event_callback_metadata_change_msg {
> + int callbackID;
> + remote_nonnull_network net;
> + int type;
> + remote_string nsuri;
> +};
> struct remote_network_set_metadata_args {
> remote_nonnull_network network;
> int type;
REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE = 446
is missing
Michal