提交 06fcee63 编写于 作者: D Daniel P. Berrange

secret: add support for lifecycle events

Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
上级 3b7bd6e5
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "configmake.h" #include "configmake.h"
#include "virstring.h" #include "virstring.h"
#include "viraccessapicheck.h" #include "viraccessapicheck.h"
#include "secret_event.h"
#define VIR_FROM_THIS VIR_FROM_SECRET #define VIR_FROM_THIS VIR_FROM_SECRET
...@@ -58,6 +59,9 @@ struct _virSecretDriverState { ...@@ -58,6 +59,9 @@ struct _virSecretDriverState {
virMutex lock; virMutex lock;
virSecretObjListPtr secrets; virSecretObjListPtr secrets;
char *configDir; char *configDir;
/* Immutable pointer, self-locking APIs */
virObjectEventStatePtr secretEventState;
}; };
static virSecretDriverStatePtr driver; static virSecretDriverStatePtr driver;
...@@ -218,6 +222,7 @@ secretDefineXML(virConnectPtr conn, ...@@ -218,6 +222,7 @@ secretDefineXML(virConnectPtr conn,
virSecretObjPtr secret = NULL; virSecretObjPtr secret = NULL;
virSecretDefPtr backup = NULL; virSecretDefPtr backup = NULL;
virSecretDefPtr new_attrs; virSecretDefPtr new_attrs;
virObjectEventPtr event = NULL;
virCheckFlags(0, NULL); virCheckFlags(0, NULL);
...@@ -256,6 +261,12 @@ secretDefineXML(virConnectPtr conn, ...@@ -256,6 +261,12 @@ secretDefineXML(virConnectPtr conn,
/* Saved successfully - drop old values */ /* Saved successfully - drop old values */
virSecretDefFree(backup); virSecretDefFree(backup);
event = virSecretEventLifecycleNew(new_attrs->uuid,
new_attrs->usage_type,
new_attrs->usage_id,
VIR_SECRET_EVENT_DEFINED,
0);
ret = virGetSecret(conn, ret = virGetSecret(conn,
new_attrs->uuid, new_attrs->uuid,
new_attrs->usage_type, new_attrs->usage_type,
...@@ -276,6 +287,8 @@ secretDefineXML(virConnectPtr conn, ...@@ -276,6 +287,8 @@ secretDefineXML(virConnectPtr conn,
cleanup: cleanup:
virSecretDefFree(new_attrs); virSecretDefFree(new_attrs);
virSecretObjEndAPI(&secret); virSecretObjEndAPI(&secret);
if (event)
virObjectEventStateQueue(driver->secretEventState, event);
return ret; return ret;
} }
...@@ -381,6 +394,7 @@ secretUndefine(virSecretPtr obj) ...@@ -381,6 +394,7 @@ secretUndefine(virSecretPtr obj)
int ret = -1; int ret = -1;
virSecretObjPtr secret; virSecretObjPtr secret;
virSecretDefPtr def; virSecretDefPtr def;
virObjectEventPtr event = NULL;
if (!(secret = secretObjFromSecret(obj))) if (!(secret = secretObjFromSecret(obj)))
goto cleanup; goto cleanup;
...@@ -392,6 +406,12 @@ secretUndefine(virSecretPtr obj) ...@@ -392,6 +406,12 @@ secretUndefine(virSecretPtr obj)
if (virSecretObjDeleteConfig(secret) < 0) if (virSecretObjDeleteConfig(secret) < 0)
goto cleanup; goto cleanup;
event = virSecretEventLifecycleNew(def->uuid,
def->usage_type,
def->usage_id,
VIR_SECRET_EVENT_UNDEFINED,
0);
virSecretObjDeleteData(secret); virSecretObjDeleteData(secret);
virSecretObjListRemove(driver->secrets, secret); virSecretObjListRemove(driver->secrets, secret);
...@@ -400,6 +420,8 @@ secretUndefine(virSecretPtr obj) ...@@ -400,6 +420,8 @@ secretUndefine(virSecretPtr obj)
cleanup: cleanup:
virSecretObjEndAPI(&secret); virSecretObjEndAPI(&secret);
if (event)
virObjectEventStateQueue(driver->secretEventState, event);
return ret; return ret;
} }
...@@ -415,6 +437,8 @@ secretStateCleanup(void) ...@@ -415,6 +437,8 @@ secretStateCleanup(void)
virObjectUnref(driver->secrets); virObjectUnref(driver->secrets);
VIR_FREE(driver->configDir); VIR_FREE(driver->configDir);
virObjectUnref(driver->secretEventState);
secretDriverUnlock(); secretDriverUnlock();
virMutexDestroy(&driver->lock); virMutexDestroy(&driver->lock);
VIR_FREE(driver); VIR_FREE(driver);
...@@ -438,6 +462,8 @@ secretStateInitialize(bool privileged, ...@@ -438,6 +462,8 @@ secretStateInitialize(bool privileged,
} }
secretDriverLock(); secretDriverLock();
driver->secretEventState = virObjectEventStateNew();
if (privileged) { if (privileged) {
if (VIR_STRDUP(base, SYSCONFDIR "/libvirt") < 0) if (VIR_STRDUP(base, SYSCONFDIR "/libvirt") < 0)
goto error; goto error;
...@@ -479,6 +505,48 @@ secretStateReload(void) ...@@ -479,6 +505,48 @@ secretStateReload(void)
return 0; 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 = { static virSecretDriver secretDriver = {
.name = "secret", .name = "secret",
.connectNumOfSecrets = secretConnectNumOfSecrets, /* 0.7.1 */ .connectNumOfSecrets = secretConnectNumOfSecrets, /* 0.7.1 */
...@@ -491,6 +559,8 @@ static virSecretDriver secretDriver = { ...@@ -491,6 +559,8 @@ static virSecretDriver secretDriver = {
.secretSetValue = secretSetValue, /* 0.7.1 */ .secretSetValue = secretSetValue, /* 0.7.1 */
.secretGetValue = secretGetValue, /* 0.7.1 */ .secretGetValue = secretGetValue, /* 0.7.1 */
.secretUndefine = secretUndefine, /* 0.7.1 */ .secretUndefine = secretUndefine, /* 0.7.1 */
.connectSecretEventRegisterAny = secretConnectSecretEventRegisterAny, /* 3.0.0 */
.connectSecretEventDeregisterAny = secretConnectSecretEventDeregisterAny, /* 3.0.0 */
}; };
static virStateDriver stateDriver = { static virStateDriver stateDriver = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册