I say keep the title like test: implement storage lifecycle event APIs and in the body say something about extending objecteventtest On 06/09/2016 02:25 PM, Jovanka Gulicoska wrote: > --- > src/test/test_driver.c | 76 +++++++++++++++++++++ > tests/objecteventtest.c | 176 ++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 252 insertions(+) > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > index 6ab939a..fc8e56b 100644 > --- a/src/test/test_driver.c > +++ b/src/test/test_driver.c > @@ -49,6 +49,7 @@ > #include "snapshot_conf.h" > #include "fdstream.h" > #include "storage_conf.h" > +#include "storage_event.h" > #include "node_device_conf.h" > #include "virxml.h" > #include "virthread.h" > @@ -4114,6 +4115,7 @@ testStoragePoolCreate(virStoragePoolPtr pool, > testDriverPtr privconn = pool->conn->privateData; > virStoragePoolObjPtr privpool; > int ret = -1; > + virObjectEventPtr event = NULL; > > virCheckFlags(0, -1); > > @@ -4134,9 +4136,14 @@ testStoragePoolCreate(virStoragePoolPtr pool, > } > > privpool->active = 1; > + > + event = virStoragePoolEventLifecycleNew(pool->name, pool->uuid, > + VIR_STORAGE_POOL_EVENT_STARTED, > + 0); > ret = 0; > > cleanup: > + testObjectEventQueue(privconn, event); > if (privpool) > virStoragePoolObjUnlock(privpool); > return ret; > @@ -4204,6 +4211,7 @@ testStoragePoolCreateXML(virConnectPtr conn, > virStoragePoolDefPtr def; > virStoragePoolObjPtr pool = NULL; > virStoragePoolPtr ret = NULL; > + virObjectEventPtr event = NULL; > > virCheckFlags(0, NULL); > > @@ -4231,11 +4239,16 @@ testStoragePoolCreateXML(virConnectPtr conn, > } > pool->active = 1; > > + event = virStoragePoolEventLifecycleNew(pool->def->name, pool->def->uuid, > + VIR_STORAGE_POOL_EVENT_STARTED, > + 0); > + > ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid, > NULL, NULL); > > cleanup: > virStoragePoolDefFree(def); > + testObjectEventQueue(privconn, event); > if (pool) > virStoragePoolObjUnlock(pool); > testDriverUnlock(privconn); > @@ -4251,6 +4264,7 @@ testStoragePoolDefineXML(virConnectPtr conn, > virStoragePoolDefPtr def; > virStoragePoolObjPtr pool = NULL; > virStoragePoolPtr ret = NULL; > + virObjectEventPtr event = NULL; > > virCheckFlags(0, NULL); > > @@ -4266,6 +4280,10 @@ testStoragePoolDefineXML(virConnectPtr conn, > goto cleanup; > def = NULL; > > + event = virStoragePoolEventLifecycleNew(pool->def->name, pool->def->uuid, > + VIR_STORAGE_POOL_EVENT_DEFINED, > + 0); > + > if (testStoragePoolObjSetDefaults(pool) == -1) { > virStoragePoolObjRemove(&privconn->pools, pool); > pool = NULL; > @@ -4277,6 +4295,7 @@ testStoragePoolDefineXML(virConnectPtr conn, > > cleanup: > virStoragePoolDefFree(def); > + testObjectEventQueue(privconn, event); > if (pool) > virStoragePoolObjUnlock(pool); > testDriverUnlock(privconn); > @@ -4289,6 +4308,7 @@ testStoragePoolUndefine(virStoragePoolPtr pool) > testDriverPtr privconn = pool->conn->privateData; > virStoragePoolObjPtr privpool; > int ret = -1; > + virObjectEventPtr event = NULL; > > testDriverLock(privconn); > privpool = virStoragePoolObjFindByName(&privconn->pools, > @@ -4305,6 +4325,10 @@ testStoragePoolUndefine(virStoragePoolPtr pool) > goto cleanup; > } > > + event = virStoragePoolEventLifecycleNew(pool->name, pool->uuid, > + VIR_STORAGE_POOL_EVENT_UNDEFINED, > + 0); > + > virStoragePoolObjRemove(&privconn->pools, privpool); > privpool = NULL; > ret = 0; > @@ -4312,6 +4336,7 @@ testStoragePoolUndefine(virStoragePoolPtr pool) > cleanup: > if (privpool) > virStoragePoolObjUnlock(privpool); > + testObjectEventQueue(privconn, event); > testDriverUnlock(privconn); > return ret; > } > @@ -4323,6 +4348,7 @@ testStoragePoolBuild(virStoragePoolPtr pool, > testDriverPtr privconn = pool->conn->privateData; > virStoragePoolObjPtr privpool; > int ret = -1; > + virObjectEventPtr event = NULL; > > virCheckFlags(0, -1); > > @@ -4341,9 +4367,11 @@ testStoragePoolBuild(virStoragePoolPtr pool, > _("storage pool '%s' is already active"), pool->name); > goto cleanup; > } > + > ret = 0; > > cleanup: > + testObjectEventQueue(privconn, event); > if (privpool) > virStoragePoolObjUnlock(privpool); > return ret; Looks like something went wrong for PoolBuild, I don't think we should be emitting any event here, so all these three hunks should be dropped. > @@ -4356,6 +4384,7 @@ testStoragePoolDestroy(virStoragePoolPtr pool) > testDriverPtr privconn = pool->conn->privateData; > virStoragePoolObjPtr privpool; > int ret = -1; > + virObjectEventPtr event = NULL; > > testDriverLock(privconn); > privpool = virStoragePoolObjFindByName(&privconn->pools, > @@ -4373,6 +4402,9 @@ testStoragePoolDestroy(virStoragePoolPtr pool) > } > > privpool->active = 0; > + event = virStoragePoolEventLifecycleNew(privpool->def->name, privpool->def->uuid, > + VIR_STORAGE_POOL_EVENT_STOPPED, > + 0); > > if (privpool->configFile == NULL) { > virStoragePoolObjRemove(&privconn->pools, privpool); > @@ -4381,6 +4413,7 @@ testStoragePoolDestroy(virStoragePoolPtr pool) > ret = 0; > > cleanup: > + testObjectEventQueue(privconn, event); > if (privpool) > virStoragePoolObjUnlock(privpool); > testDriverUnlock(privconn); > @@ -4430,6 +4463,7 @@ testStoragePoolRefresh(virStoragePoolPtr pool, > testDriverPtr privconn = pool->conn->privateData; > virStoragePoolObjPtr privpool; > int ret = -1; > + virObjectEventPtr event = NULL; > > virCheckFlags(0, -1); > > @@ -4448,9 +4482,15 @@ testStoragePoolRefresh(virStoragePoolPtr pool, > _("storage pool '%s' is not active"), pool->name); > goto cleanup; > } > + > + event = virStoragePoolEventLifecycleNew(pool->name, pool->uuid, > + VIR_STORAGE_POOL_EVENT_REFRESHED, > + 0); > + In the early case like this, you didn't add a newline between the LifecycleNew call, and the ret = 0; ... I say remove the newline here to be consistent. > ret = 0; > > cleanup: > + testObjectEventQueue(privconn, event); > if (privpool) > virStoragePoolObjUnlock(privpool); > return ret; > @@ -5644,6 +5684,39 @@ testConnectNetworkEventDeregisterAny(virConnectPtr conn, > return ret; > } > > +static int > +testConnectStoragePoolEventRegisterAny(virConnectPtr conn, > + virStoragePoolPtr pool, > + int eventID, > + virConnectStoragePoolEventGenericCallback callback, > + void *opaque, > + virFreeCallback freecb) > +{ > + testDriverPtr driver = conn->privateData; > + int ret; > + > + if (virStoragePoolEventStateRegisterID(conn, driver->eventState, > + pool, eventID, callback, > + opaque, freecb, &ret) < 0) > + ret = -1; > + > + return ret; > +} > + > +static int > +testConnectStoragePoolEventDeregisterAny(virConnectPtr conn, > + int callbackID) > +{ > + testDriverPtr driver = conn->privateData; > + int ret = 0; > + > + if (virObjectEventStateDeregisterID(conn, driver->eventState, > + callbackID) < 0) > + ret = -1; > + > + return ret; > +} > + > static int testConnectListAllDomains(virConnectPtr conn, > virDomainPtr **domains, > unsigned int flags) > @@ -6781,6 +6854,9 @@ static virStorageDriver testStorageDriver = { > .storageVolGetPath = testStorageVolGetPath, /* 0.5.0 */ > .storagePoolIsActive = testStoragePoolIsActive, /* 0.7.3 */ > .storagePoolIsPersistent = testStoragePoolIsPersistent, /* 0.7.3 */ > + There aren't any newlines anywhere else in the structure, so I say drop this... > + .connectStoragePoolEventRegisterAny = testConnectStoragePoolEventRegisterAny, /*1.3.6*/ > + .connectStoragePoolEventDeregisterAny = testConnectStoragePoolEventDeregisterAny, /*1.3.6*/ And move these two up above, after the other collection of methods that start with 'connect' > }; > > static virNodeDeviceDriver testNodeDeviceDriver = { > diff --git a/tests/objecteventtest.c b/tests/objecteventtest.c > index c77b0cd..9e53758 100644 > --- a/tests/objecteventtest.c > +++ b/tests/objecteventtest.c > @@ -53,6 +53,20 @@ static const char networkDef[] = > " </ip>\n" > "</network>\n"; > > +static const char storagePoolDef[] = > +"<pool type='dir'>\n" > +" <name>P</name>\n" > +" <source>\n" > +" <host name='src-host'/>\n" > +" <dir path='/src/path'/>\n" > +" <device path='/src/dev'/>\n" > +" <name>test-storage_pool</name>\n" You can drop the whole <source> block, it shouldn't matter for type='dir' > +" </source>\n" > +" <target>\n" > +" <path>/target-path</path>\n" > +" </target>\n" > +"</pool>\n"; > + > typedef struct { > int startEvents; > int stopEvents; > @@ -74,6 +88,7 @@ lifecycleEventCounter_reset(lifecycleEventCounter *counter) > typedef struct { > virConnectPtr conn; > virNetworkPtr net; > + virStoragePoolPtr pool; > } objecteventTest; > > > @@ -125,6 +140,24 @@ networkLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED, > counter->undefineEvents++; > } > > +static void > +storagePoolLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED, > + virStoragePoolPtr pool ATTRIBUTE_UNUSED, > + int event, > + int detail ATTRIBUTE_UNUSED, > + void* opaque) > +{ > + lifecycleEventCounter *counter = opaque; > + > + if (event == VIR_STORAGE_POOL_EVENT_STARTED) > + counter->startEvents++; > + else if (event == VIR_STORAGE_POOL_EVENT_STOPPED) > + counter->stopEvents++; > + else if (event == VIR_STORAGE_POOL_EVENT_DEFINED) > + counter->defineEvents++; > + else if (event == VIR_STORAGE_POOL_EVENT_UNDEFINED) > + counter->undefineEvents++; > +} This doesn't track REFRESHED events, so the lifecycleEventCounter needs to be extended, and some of the below code as well. > > static int > testDomainCreateXMLOld(const void *data) > @@ -523,6 +556,130 @@ testNetworkStartStopEvent(const void *data) > return ret; > } > > +static int > +testStoragePoolCreateXML(const void *data) > +{ > + const objecteventTest *test = data; > + lifecycleEventCounter counter; > + virStoragePoolPtr pool; > + 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); This line is over 80 columns, so maybe unindent these three lines so it fits. > + pool = virStoragePoolCreateXML(test->conn, storagePoolDef, 0); > + > + if (!pool || virEventRunDefaultImpl() < 0) { > + ret = -1; > + goto cleanup; > + } > + > + if (counter.startEvents != 1 || counter.unexpectedEvents > 0) { > + ret = -1; > + goto cleanup; > + } > + > + cleanup: > + virConnectStoragePoolEventDeregisterAny(test->conn, id); > + if (pool) { > + virStoragePoolDestroy(pool); > + virStoragePoolFree(pool); > + } > + return ret; > +} > + > +static int > +testStoragePoolDefine(const void *data) > +{ > + const objecteventTest *test = data; > + lifecycleEventCounter counter; > + virStoragePoolPtr pool; > + 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); > + same > + /* Make sure the define event is triggered */ > + pool = virStoragePoolDefineXML(test->conn, storagePoolDef, 0); > + > + if (!pool || virEventRunDefaultImpl() < 0) { > + ret = -1; > + goto cleanup; > + } > + > + if (counter.defineEvents != 1 || counter.unexpectedEvents > 0) { > + ret = -1; > + goto cleanup; > + } > + > + /* Make sure the undefine event is triggered */ > + virStoragePoolUndefine(pool); > + > + if (virEventRunDefaultImpl() < 0) { > + ret = -1; > + goto cleanup; > + } > + > + if (counter.undefineEvents != 1 || counter.unexpectedEvents > 0) { > + ret = -1; > + goto cleanup; > + } > + > + > + cleanup: > + virConnectStoragePoolEventDeregisterAny(test->conn, id); > + if (pool) > + virStoragePoolFree(pool); > + > + return ret; > +} > + > +static int > +testStoragePoolStartStopEvent(const void *data) > +{ > + const objecteventTest *test = data; > + lifecycleEventCounter counter; > + int id; > + int ret = 0; > + > + if (!test->pool) > + return -1; > + > + lifecycleEventCounter_reset(&counter); > + > + id = virConnectStoragePoolEventRegisterAny(test->conn, test->pool, > + VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE, > + VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb), > + &counter, NULL); same here > + virStoragePoolCreate(test->pool, 0); > + virStoragePoolRefresh(test->pool, 0); > + virStoragePoolDestroy(test->pool); > + > + if (virEventRunDefaultImpl() < 0) { > + ret = -1; > + goto cleanup; > + } > + > + if (counter.startEvents != 1 || counter.stopEvents != 1 || > + counter.unexpectedEvents > 0) { > + ret = -1; > + goto cleanup; > + } > + cleanup: > + virConnectStoragePoolEventDeregisterAny(test->conn, id); > + > + return ret; > +} > + > static void > timeout(int id ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) > { > @@ -581,6 +738,25 @@ mymain(void) > virNetworkUndefine(test.net); > virNetworkFree(test.net); > } > + > + /* Storage pool event tests */ > + if (virTestRun("Storage pool createXML start event ", testStoragePoolCreateXML, &test) < 0) > + ret = EXIT_FAILURE; Break this long line > + if (virTestRun("Storage pool (un)define events", testStoragePoolDefine, &test) < 0) > + ret = EXIT_FAILURE; > + > + /* Define a test storage pool */ > + if (!(test.pool = virStoragePoolDefineXML(test.conn, storagePoolDef, 0))) > + ret = EXIT_FAILURE; > + if (virTestRun("Storage pool start stop events ", testStoragePoolStartStopEvent, &test) < 0) Break this long line > + ret = EXIT_FAILURE; > + > + /* Cleanup */ > + if (test.pool) { > + virStoragePoolUndefine(test.pool); > + virStoragePoolFree(test.pool); > + } > + > virConnectClose(test.conn); > virEventRemoveTimeout(timer); > Thanks, Cole -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list