Re: [PATCH 3/8] Add Event ID, Server side dispatcher and virsh print function
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 > --- > 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(, 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(, 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, > + ); > +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; > }; > >
[PATCH 3/8] Add Event ID, Server side dispatcher and virsh print function
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 --- 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(, 0, sizeof(data)); + +data.type = type; +if (nsuri) { +data.nsuri = g_new0(remote_nonnull_string, 1); +*(data.nsuri) = g_strdup(nsuri); +} + +make_nonnull_network(, 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, + ); +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 */ -