[libvirt PATCH v3 3/8] Added Metadata change events

K Shiva shiva_kr at riseup.net
Mon Jun 26 13:55:18 UTC 2023


Added:
- Methods to handle metadata change events.

Signed-off-by: K Shiva <shiva_kr at riseup.net>
---
 po/POTFILES              |   1 +
 src/conf/network_event.c | 115 +++++++++++++++++++++++++++++++++++++++
 src/conf/network_event.h |  11 ++++
 3 files changed, 127 insertions(+)

diff --git a/po/POTFILES b/po/POTFILES
index 5d6ec195b4..933a2e07a4 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -39,6 +39,7 @@ src/conf/netdev_bandwidth_conf.c
 src/conf/netdev_vlan_conf.c
 src/conf/netdev_vport_profile_conf.c
 src/conf/network_conf.c
+src/conf/network_event.c
 src/conf/networkcommon_conf.c
 src/conf/node_device_conf.c
 src/conf/node_device_util.c
diff --git a/src/conf/network_event.c b/src/conf/network_event.c
index 6f25e43711..0e12cc2687 100644
--- a/src/conf/network_event.c
+++ b/src/conf/network_event.c
@@ -26,6 +26,9 @@
 #include "object_event_private.h"
 #include "datatypes.h"
 #include "virlog.h"
+#include "virerror.h"
+
+#define VIR_FROM_THIS VIR_FROM_NETWORK
 
 VIR_LOG_INIT("conf.network_event");
 
@@ -45,10 +48,21 @@ struct _virNetworkEventLifecycle {
 };
 typedef struct _virNetworkEventLifecycle virNetworkEventLifecycle;
 
+struct _virNetworkEventMetadataChange {
+    virNetworkEvent parent;
+
+    int type;
+    char *nsuri;
+};
+typedef struct _virNetworkEventMetadataChange virNetworkEventMetadataChange;
+
 static virClass *virNetworkEventClass;
 static virClass *virNetworkEventLifecycleClass;
+static virClass *virNetworkEventMetadataChangeClass;
+
 static void virNetworkEventDispose(void *obj);
 static void virNetworkEventLifecycleDispose(void *obj);
+static void virNetworkEventMetadataChangeDispose(void *obj);
 
 static int
 virNetworkEventsOnceInit(void)
@@ -59,6 +73,9 @@ virNetworkEventsOnceInit(void)
     if (!VIR_CLASS_NEW(virNetworkEventLifecycle, virNetworkEventClass))
         return -1;
 
+    if (!VIR_CLASS_NEW(virNetworkEventMetadataChange, virNetworkEventClass))
+        return -1;
+
     return 0;
 }
 
@@ -104,9 +121,22 @@ 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;
     }
+
     VIR_WARN("Unexpected event ID %d", event->eventID);
 }
 
@@ -231,3 +261,88 @@ virNetworkEventLifecycleNew(const char *name,
 
     return (virObjectEvent *)event;
 }
+
+
+static void *
+virNetworkEventNew(virClass *klass,
+                  int eventID,
+                  const char *name,
+                  const unsigned char *uuid)
+{
+    virNetworkEvent *event;
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+    if (virNetworkEventsInitialize() < 0)
+        return NULL;
+
+    if (!virClassIsDerivedFrom(klass, virNetworkEventClass)) {
+        virReportInvalidArg(klass,
+                            _("Class %1$s must derive from virNetworkEvent"),
+                            virClassName(klass));
+        return NULL;
+    }
+
+    /* We use uuid for matching key. We ignore 'name' because
+     * Xen sometimes renames guests during migration, thus
+     * 'uuid' is the only truly reliable key we can use. */
+    virUUIDFormat(uuid, uuidstr);
+    if (!(event = virObjectEventNew(klass,
+                                    virNetworkEventDispatchDefaultFunc,
+                                    eventID,
+                                    0, name, uuid, uuidstr)))
+        return NULL;
+
+    return (virObjectEvent *)event;
+}
+
+
+static void
+virNetworkEventMetadataChangeDispose(void *obj)
+{
+    virNetworkEventMetadataChange *event = obj;
+    VIR_DEBUG("obj=%p", event);
+
+    g_free(event->nsuri);
+}
+
+
+static virObjectEvent *
+virNetworkEventMetadataChangeNew(const char *name,
+                                 unsigned char *uuid,
+                                 int type,
+                                 const char *nsuri)
+{
+    virNetworkEventMetadataChange *ev;
+
+    if (virNetworkEventsInitialize() < 0)
+        return NULL;
+
+    if (!(ev = virNetworkEventNew(virNetworkEventMetadataChangeClass,
+                                 VIR_NETWORK_EVENT_ID_METADATA_CHANGE,
+                                 name, uuid)))
+        return NULL;
+
+    ev->type = type;
+    if (nsuri)
+        ev->nsuri = g_strdup(nsuri);
+
+    return (virObjectEvent *)ev;
+}
+
+virObjectEvent *
+virNetworkEventMetadataChangeNewFromObj(virNetworkObj *obj,
+                                       int type,
+                                       const char *nsuri)
+{
+    return virNetworkEventMetadataChangeNew(obj->def->name,
+                                           obj->def->uuid, type, nsuri);
+}
+
+virObjectEvent *
+virNetworkEventMetadataChangeNewFromNet(virNetworkPtr net,
+                                       int type,
+                                       const char *nsuri)
+{
+    return virNetworkEventMetadataChangeNew(net->name, net->uuid,
+                                           type, nsuri);
+}
diff --git a/src/conf/network_event.h b/src/conf/network_event.h
index 4502bfcaef..7c98a6ac92 100644
--- a/src/conf/network_event.h
+++ b/src/conf/network_event.h
@@ -23,6 +23,7 @@
 
 #include "internal.h"
 #include "object_event.h"
+#include "virnetworkobj.h"
 
 int
 virNetworkEventStateRegisterID(virConnectPtr conn,
@@ -53,3 +54,13 @@ virNetworkEventLifecycleNew(const char *name,
                             const unsigned char *uuid,
                             int type,
                             int detail);
+
+virObjectEvent *
+virNetworkEventMetadataChangeNewFromObj(virNetworkObj *obj,
+                                       int type,
+                                       const char *nsuri);
+
+virObjectEvent *
+virNetworkEventMetadataChangeNewFromNet(virNetworkPtr net,
+                                       int type,
+                                       const char *nsuri);
-- 
2.41.0



More information about the libvir-list mailing list