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)