From b06521928cca0b55987bdc49360f8d78a56feb04 Mon Sep 17 00:00:00 2001 From: Julio Faracco Date: Sat, 9 Sep 2017 12:09:49 -0300 Subject: [PATCH] storage: Add new events for *PoolBuild() and *PoolDelete(). This commit adds new events for two methods and operations: *PoolBuild() and *PoolDelete(). Using the event-test and the commands set below we have the following outputs: $ sudo ./event-test Registering event callbacks myStoragePoolEventCallback EVENT: Storage pool test Defined 0 myStoragePoolEventCallback EVENT: Storage pool test Created 0 myStoragePoolEventCallback EVENT: Storage pool test Started 0 myStoragePoolEventCallback EVENT: Storage pool test Stopped 0 myStoragePoolEventCallback EVENT: Storage pool test Deleted 0 myStoragePoolEventCallback EVENT: Storage pool test Undefined 0 Another terminal: $ sudo virsh pool-define test.xml Pool test defined from test.xml $ sudo virsh pool-build test Pool test built $ sudo virsh pool-start test Pool test started $ sudo virsh pool-destroy test Pool test destroyed $ sudo virsh pool-delete test Pool test deleted $ sudo virsh pool-undefine test Pool test has been undefined This commits can be a solution for RHBZ #1475227. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1475227 Signed-off-by: Julio Faracco Signed-off-by: Michal Privoznik --- examples/object-events/event-test.c | 4 ++ include/libvirt/libvirt-storage.h | 2 + src/storage/storage_driver.c | 17 +++++++ src/test/test_driver.c | 14 ++++++ tests/objecteventtest.c | 74 +++++++++++++++++++++++++++++ tools/virsh-pool.c | 4 +- 6 files changed, 114 insertions(+), 1 deletion(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 78d2008066..a144638879 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -356,6 +356,10 @@ storagePoolEventToString(int event) return "Started"; case VIR_STORAGE_POOL_EVENT_STOPPED: return "Stopped"; + case VIR_STORAGE_POOL_EVENT_CREATED: + return "Created"; + case VIR_STORAGE_POOL_EVENT_DELETED: + return "Deleted"; case VIR_STORAGE_POOL_EVENT_LAST: break; } diff --git a/include/libvirt/libvirt-storage.h b/include/libvirt/libvirt-storage.h index 4517f713c3..736e2e3b80 100644 --- a/include/libvirt/libvirt-storage.h +++ b/include/libvirt/libvirt-storage.h @@ -465,6 +465,8 @@ typedef enum { VIR_STORAGE_POOL_EVENT_UNDEFINED = 1, VIR_STORAGE_POOL_EVENT_STARTED = 2, VIR_STORAGE_POOL_EVENT_STOPPED = 3, + VIR_STORAGE_POOL_EVENT_CREATED = 4, + VIR_STORAGE_POOL_EVENT_DELETED = 5, # ifdef VIR_ENUM_SENTINELS VIR_STORAGE_POOL_EVENT_LAST diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 7db1f54637..4096d29701 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -956,6 +956,7 @@ storagePoolBuild(virStoragePoolPtr pool, { virStoragePoolObjPtr obj; virStorageBackendPtr backend; + virObjectEventPtr event = NULL; int ret = -1; if (!(obj = virStoragePoolObjFromStoragePool(pool))) @@ -977,9 +978,17 @@ storagePoolBuild(virStoragePoolPtr pool, if (backend->buildPool && backend->buildPool(pool->conn, obj, flags) < 0) goto cleanup; + + event = virStoragePoolEventLifecycleNew(obj->def->name, + obj->def->uuid, + VIR_STORAGE_POOL_EVENT_CREATED, + 0); + ret = 0; cleanup: + if (event) + virObjectEventStateQueue(driver->storageEventState, event); virStoragePoolObjUnlock(obj); return ret; } @@ -1059,6 +1068,7 @@ storagePoolDelete(virStoragePoolPtr pool, { virStoragePoolObjPtr obj; virStorageBackendPtr backend; + virObjectEventPtr event = NULL; char *stateFile = NULL; int ret = -1; @@ -1103,9 +1113,16 @@ storagePoolDelete(virStoragePoolPtr pool, if (backend->deletePool(pool->conn, obj, flags) < 0) goto cleanup; + event = virStoragePoolEventLifecycleNew(obj->def->name, + obj->def->uuid, + VIR_STORAGE_POOL_EVENT_DELETED, + 0); + ret = 0; cleanup: + if (event) + virObjectEventStateQueue(driver->storageEventState, event); virStoragePoolObjUnlock(obj); return ret; } diff --git a/src/test/test_driver.c b/src/test/test_driver.c index aacb513d68..660626406e 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4584,13 +4584,20 @@ testStoragePoolBuild(virStoragePoolPtr pool, { testDriverPtr privconn = pool->conn->privateData; virStoragePoolObjPtr obj; + virObjectEventPtr event = NULL; virCheckFlags(0, -1); if (!(obj = testStoragePoolObjFindInactiveByName(privconn, pool->name))) return -1; + event = virStoragePoolEventLifecycleNew(pool->name, pool->uuid, + VIR_STORAGE_POOL_EVENT_CREATED, + 0); + virStoragePoolObjUnlock(obj); + + testObjectEventQueue(privconn, event); return 0; } @@ -4675,12 +4682,19 @@ testStoragePoolDelete(virStoragePoolPtr pool, { testDriverPtr privconn = pool->conn->privateData; virStoragePoolObjPtr obj; + virObjectEventPtr event = NULL; virCheckFlags(0, -1); if (!(obj = testStoragePoolObjFindInactiveByName(privconn, pool->name))) return -1; + event = virStoragePoolEventLifecycleNew(pool->name, pool->uuid, + VIR_STORAGE_POOL_EVENT_DELETED, + 0); + + testObjectEventQueue(privconn, event); + virStoragePoolObjUnlock(obj); return 0; } diff --git a/tests/objecteventtest.c b/tests/objecteventtest.c index 77a48a1495..4b12572eb4 100644 --- a/tests/objecteventtest.c +++ b/tests/objecteventtest.c @@ -167,6 +167,10 @@ storagePoolLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED, counter->defineEvents++; else if (event == VIR_STORAGE_POOL_EVENT_UNDEFINED) counter->undefineEvents++; + else if (event == VIR_STORAGE_POOL_EVENT_CREATED) + counter->createdEvents++; + else if (event == VIR_STORAGE_POOL_EVENT_DELETED) + counter->deletedEvents++; } static void @@ -722,6 +726,69 @@ testStoragePoolStartStopEvent(const void *data) return ret; } +static int +testStoragePoolBuild(const void *data) +{ + const objecteventTest *test = data; + lifecycleEventCounter counter; + int id; + int ret = 0; + + lifecycleEventCounter_reset(&counter); + + id = virConnectStoragePoolEventRegisterAny(test->conn, NULL, + VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE, + VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb), + &counter, NULL); + + virStoragePoolBuild(test->pool, 0); + + if (virEventRunDefaultImpl() < 0) { + ret = -1; + goto cleanup; + } + + if (counter.createdEvents != 1) { + ret = -1; + goto cleanup; + } + + cleanup: + virConnectStoragePoolEventDeregisterAny(test->conn, id); + return ret; +} + +static int +testStoragePoolDelete(const void *data) +{ + const objecteventTest *test = data; + lifecycleEventCounter counter; + int id; + int ret = 0; + + lifecycleEventCounter_reset(&counter); + + id = virConnectStoragePoolEventRegisterAny(test->conn, NULL, + VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE, + VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb), + &counter, NULL); + + virStoragePoolDelete(test->pool, 0); + + if (virEventRunDefaultImpl() < 0) { + ret = -1; + goto cleanup; + } + + if (counter.deletedEvents != 1) { + ret = -1; + goto cleanup; + } + + cleanup: + virConnectStoragePoolEventDeregisterAny(test->conn, id); + return ret; +} static int testNodeDeviceCreateXML(const void *data) { @@ -831,6 +898,13 @@ mymain(void) if (virTestRun("Storage pool start stop events ", testStoragePoolStartStopEvent, &test) < 0) ret = EXIT_FAILURE; + /* Storage pool build and delete events */ + if (virTestRun("Storage pool build event ", + testStoragePoolBuild, &test) < 0) + ret = EXIT_FAILURE; + if (virTestRun("Storage pool delete event ", + testStoragePoolDelete, &test) < 0) + ret = EXIT_FAILURE; /* Node device event tests */ if (virTestRun("Node device createXML add event ", diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c index ba9281fbb9..558461b3dc 100644 --- a/tools/virsh-pool.c +++ b/tools/virsh-pool.c @@ -1952,7 +1952,9 @@ VIR_ENUM_IMPL(virshPoolEvent, N_("Defined"), N_("Undefined"), N_("Started"), - N_("Stopped")) + N_("Stopped"), + N_("Created"), + N_("Deleted")) static const char * virshPoolEventToString(int event)