Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
src/secret/secret_driver.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 70 insertions(+)
diff --git a/src/secret/secret_driver.c b/src/secret/secret_driver.c
index 70e4dd7..0e3d97e 100644
--- a/src/secret/secret_driver.c
+++ b/src/secret/secret_driver.c
@@ -43,6 +43,7 @@
#include "configmake.h"
#include "virstring.h"
#include "viraccessapicheck.h"
+#include "secret_event.h"
#define VIR_FROM_THIS VIR_FROM_SECRET
@@ -58,6 +59,9 @@ struct _virSecretDriverState {
virMutex lock;
virSecretObjListPtr secrets;
char *configDir;
+
+ /* Immutable pointer, self-locking APIs */
+ virObjectEventStatePtr secretEventState;
};
static virSecretDriverStatePtr driver;
@@ -218,6 +222,7 @@ secretDefineXML(virConnectPtr conn,
virSecretObjPtr secret = NULL;
virSecretDefPtr backup = NULL;
virSecretDefPtr new_attrs;
+ virObjectEventPtr event = NULL;
virCheckFlags(0, NULL);
@@ -256,6 +261,12 @@ secretDefineXML(virConnectPtr conn,
/* Saved successfully - drop old values */
virSecretDefFree(backup);
+ event = virSecretEventLifecycleNew(new_attrs->uuid,
+ new_attrs->usage_type,
+ new_attrs->usage_id,
+ VIR_SECRET_EVENT_DEFINED,
+ 0);
+
ret = virGetSecret(conn,
new_attrs->uuid,
new_attrs->usage_type,
@@ -276,6 +287,8 @@ secretDefineXML(virConnectPtr conn,
cleanup:
virSecretDefFree(new_attrs);
virSecretObjEndAPI(&secret);
+ if (event)
+ virObjectEventStateQueue(driver->secretEventState, event);
return ret;
}
@@ -381,6 +394,7 @@ secretUndefine(virSecretPtr obj)
int ret = -1;
virSecretObjPtr secret;
virSecretDefPtr def;
+ virObjectEventPtr event = NULL;
if (!(secret = secretObjFromSecret(obj)))
goto cleanup;
@@ -392,6 +406,12 @@ secretUndefine(virSecretPtr obj)
if (virSecretObjDeleteConfig(secret) < 0)
goto cleanup;
+ event = virSecretEventLifecycleNew(def->uuid,
+ def->usage_type,
+ def->usage_id,
+ VIR_SECRET_EVENT_UNDEFINED,
+ 0);
+
virSecretObjDeleteData(secret);
virSecretObjListRemove(driver->secrets, secret);
@@ -400,6 +420,8 @@ secretUndefine(virSecretPtr obj)
cleanup:
virSecretObjEndAPI(&secret);
+ if (event)
+ virObjectEventStateQueue(driver->secretEventState, event);
return ret;
}
@@ -415,6 +437,8 @@ secretStateCleanup(void)
virObjectUnref(driver->secrets);
VIR_FREE(driver->configDir);
+ virObjectUnref(driver->secretEventState);
+
secretDriverUnlock();
virMutexDestroy(&driver->lock);
VIR_FREE(driver);
@@ -438,6 +462,8 @@ secretStateInitialize(bool privileged,
}
secretDriverLock();
+ driver->secretEventState = virObjectEventStateNew();
+
if (privileged) {
if (VIR_STRDUP(base, SYSCONFDIR "/libvirt") < 0)
goto error;
@@ -479,6 +505,48 @@ secretStateReload(void)
return 0;
}
+static int
+secretConnectSecretEventRegisterAny(virConnectPtr conn,
+ virSecretPtr secret,
+ int eventID,
+ virConnectSecretEventGenericCallback callback,
+ void *opaque,
+ virFreeCallback freecb)
+{
+ int callbackID = -1;
+
+ if (virConnectSecretEventRegisterAnyEnsureACL(conn) < 0)
+ goto cleanup;
+
+ if (virSecretEventStateRegisterID(conn, driver->secretEventState,
+ secret, eventID, callback,
+ opaque, freecb, &callbackID) < 0)
+ callbackID = -1;
+ cleanup:
+ return callbackID;
+}
+
+static int
+secretConnectSecretEventDeregisterAny(virConnectPtr conn,
+ int callbackID)
+{
+ int ret = -1;
+
+ if (virConnectSecretEventDeregisterAnyEnsureACL(conn) < 0)
+ goto cleanup;
+
+ if (virObjectEventStateDeregisterID(conn,
+ driver->secretEventState,
+ callbackID) < 0)
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ return ret;
+}
+
+
static virSecretDriver secretDriver = {
.name = "secret",
.connectNumOfSecrets = secretConnectNumOfSecrets, /* 0.7.1 */
@@ -491,6 +559,8 @@ static virSecretDriver secretDriver = {
.secretSetValue = secretSetValue, /* 0.7.1 */
.secretGetValue = secretGetValue, /* 0.7.1 */
.secretUndefine = secretUndefine, /* 0.7.1 */
+ .connectSecretEventRegisterAny = secretConnectSecretEventRegisterAny, /* 3.0.0 */
+ .connectSecretEventDeregisterAny = secretConnectSecretEventDeregisterAny, /* 3.0.0
*/
};
static virStateDriver stateDriver = {
--
2.9.3