Re: [PATCH 3/8] Add Event ID, Server side dispatcher and virsh print function

2023-09-18 Thread Michal Prívozník
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

2023-09-03 Thread K Shiva Kiran
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
  */
-