Re: [libvirt] [PATCH v4 5/7] Added network events to the bridged network driver

2013-12-11 Thread Daniel P. Berrange
On Wed, Dec 11, 2013 at 11:38:02AM +0100, Cédric Bosdonnat wrote:
> ---
>  src/network/bridge_driver.c  | 90 
> 
>  src/network/bridge_driver_platform.h |  3 ++
>  2 files changed, 93 insertions(+)

ACK

> +static int
> +networkConnectNetworkEventRegisterAny(virConnectPtr conn,
> +  virNetworkPtr net,
> +  int eventID,
> +  virConnectNetworkEventGenericCallback 
> callback,
> +  void *opaque,
> +  virFreeCallback freecb)
> +{
> +virNetworkDriverStatePtr driver = conn->networkPrivateData;
> +int ret = -1;
> +
> +networkDriverLock(driver);
> +
> +if (virConnectNetworkEventRegisterAnyEnsureACL(conn) < 0)
> +goto cleanup;
> +
> +if (virNetworkEventStateRegisterID(conn, driver->networkEventState,
> +   net, eventID,
> +   VIR_OBJECT_EVENT_CALLBACK(callback),
> +   opaque, freecb, &ret) < 0)
> +ret = -1;
> +
> +networkDriverUnlock(driver);
> +
> +cleanup:
> +return ret;
> +}

Opps, locking is wrong - if the ACL check fails we leave the driver locked.

We can actually do without locking entirely, since the event state struct
is self-locking, so I'll remove the lock/unlock

> +
> +static int
> +networkConnectNetworkEventDeregisterAny(virConnectPtr conn,
> +int callbackID)
> +{
> +virNetworkDriverStatePtr driver = conn->networkPrivateData;
> +int ret = -1;
> +
> +if (virConnectNetworkEventDeregisterAnyEnsureACL(conn) < 0)
> +goto cleanup;
> +
> +
> +networkDriverLock(driver);
> +ret = virObjectEventStateDeregisterID(conn,
> +  driver->networkEventState,
> +  callbackID);
> +networkDriverUnlock(driver);
> +
> +cleanup:
> +return ret;
> +}

Daniel
-- 
|: http://berrange.com  -o-http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org  -o- http://virt-manager.org :|
|: http://autobuild.org   -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org   -o-   http://live.gnome.org/gtk-vnc :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH v4 5/7] Added network events to the bridged network driver

2013-12-11 Thread Cédric Bosdonnat
---
 src/network/bridge_driver.c  | 90 
 src/network/bridge_driver_platform.h |  3 ++
 2 files changed, 93 insertions(+)

diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 80c5acb..4c0c352 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -70,6 +70,7 @@
 #include "virfile.h"
 #include "virstring.h"
 #include "viraccessapicheck.h"
+#include "network_event.h"
 
 #define VIR_FROM_THIS VIR_FROM_NETWORK
 
@@ -438,6 +439,8 @@ networkStateInitialize(bool privileged,
 networkReloadFirewallRules(driverState);
 networkRefreshDaemons(driverState);
 
+driverState->networkEventState = virObjectEventStateNew();
+
 networkDriverUnlock(driverState);
 
 #ifdef HAVE_FIREWALLD
@@ -532,6 +535,8 @@ networkStateCleanup(void) {
 
 networkDriverLock(driverState);
 
+virObjectEventStateFree(driverState->networkEventState);
+
 /* free inactive networks */
 virNetworkObjListFree(&driverState->networks);
 
@@ -2290,6 +2295,55 @@ cleanup:
 return ret;
 }
 
+static int
+networkConnectNetworkEventRegisterAny(virConnectPtr conn,
+  virNetworkPtr net,
+  int eventID,
+  virConnectNetworkEventGenericCallback 
callback,
+  void *opaque,
+  virFreeCallback freecb)
+{
+virNetworkDriverStatePtr driver = conn->networkPrivateData;
+int ret = -1;
+
+networkDriverLock(driver);
+
+if (virConnectNetworkEventRegisterAnyEnsureACL(conn) < 0)
+goto cleanup;
+
+if (virNetworkEventStateRegisterID(conn, driver->networkEventState,
+   net, eventID,
+   VIR_OBJECT_EVENT_CALLBACK(callback),
+   opaque, freecb, &ret) < 0)
+ret = -1;
+
+networkDriverUnlock(driver);
+
+cleanup:
+return ret;
+}
+
+static int
+networkConnectNetworkEventDeregisterAny(virConnectPtr conn,
+int callbackID)
+{
+virNetworkDriverStatePtr driver = conn->networkPrivateData;
+int ret = -1;
+
+if (virConnectNetworkEventDeregisterAnyEnsureACL(conn) < 0)
+goto cleanup;
+
+
+networkDriverLock(driver);
+ret = virObjectEventStateDeregisterID(conn,
+  driver->networkEventState,
+  callbackID);
+networkDriverUnlock(driver);
+
+cleanup:
+return ret;
+}
+
 static int networkIsActive(virNetworkPtr net)
 {
 virNetworkObjPtr obj;
@@ -2483,6 +2537,7 @@ static virNetworkPtr networkCreateXML(virConnectPtr conn, 
const char *xml) {
 virNetworkDefPtr def;
 virNetworkObjPtr network = NULL;
 virNetworkPtr ret = NULL;
+virObjectEventPtr event = NULL;
 
 networkDriverLock(driver);
 
@@ -2509,11 +2564,17 @@ static virNetworkPtr networkCreateXML(virConnectPtr 
conn, const char *xml) {
 goto cleanup;
 }
 
+event = virNetworkEventLifecycleNew(network->def->name,
+network->def->uuid,
+VIR_NETWORK_EVENT_STARTED);
+
 VIR_INFO("Creating network '%s'", network->def->name);
 ret = virGetNetwork(conn, network->def->name, network->def->uuid);
 
 cleanup:
 virNetworkDefFree(def);
+if (event)
+virObjectEventStateQueue(driver->networkEventState, event);
 if (network)
 virNetworkObjUnlock(network);
 networkDriverUnlock(driver);
@@ -2526,6 +2587,7 @@ static virNetworkPtr networkDefineXML(virConnectPtr conn, 
const char *xml) {
 bool freeDef = true;
 virNetworkObjPtr network = NULL;
 virNetworkPtr ret = NULL;
+virObjectEventPtr event = NULL;
 
 networkDriverLock(driver);
 
@@ -2565,10 +2627,15 @@ static virNetworkPtr networkDefineXML(virConnectPtr 
conn, const char *xml) {
 goto cleanup;
 }
 
+event = virNetworkEventLifecycleNew(def->name, def->uuid,
+VIR_NETWORK_EVENT_DEFINED);
+
 VIR_INFO("Defining network '%s'", def->name);
 ret = virGetNetwork(conn, def->name, def->uuid);
 
 cleanup:
+if (event)
+virObjectEventStateQueue(driver->networkEventState, event);
 if (freeDef)
virNetworkDefFree(def);
 if (network)
@@ -2583,6 +2650,7 @@ networkUndefine(virNetworkPtr net) {
 virNetworkObjPtr network;
 int ret = -1;
 bool active = false;
+virObjectEventPtr event = NULL;
 
 networkDriverLock(driver);
 
@@ -2610,6 +2678,10 @@ networkUndefine(virNetworkPtr net) {
 virNetworkDefFree(network->newDef);
 network->newDef = NULL;
 
+event = virNetworkEventLifecycleNew(network->def->name,
+network->def->uuid,
+VIR_NETWORK_EVENT_UNDEFINED);
+
 VIR_INFO("Un