On 07/20/2016 09:50 AM, Jovanka Gulicoska wrote:
Also includes unittests for node device lifecycle events API
---
src/test/test_driver.c | 49 +++++++++++++++++++++++++++++++++
tests/objecteventtest.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 121 insertions(+)
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 672c163..8233d74 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -51,6 +51,7 @@
#include "storage_conf.h"
#include "storage_event.h"
#include "node_device_conf.h"
+#include "node_device_event.h"
#include "virxml.h"
#include "virthread.h"
#include "virlog.h"
@@ -504,6 +505,7 @@ static const char *defaultPoolSourcesNetFSXML =
" </source>\n"
"</sources>\n";
+
Stray whitespace change, please drop this
static const unsigned long long defaultPoolCap = (100 * 1024 * 1024
* 1024ull);
static const unsigned long long defaultPoolAlloc;
@@ -5427,6 +5429,7 @@ testNodeDeviceCreateXML(virConnectPtr conn,
int parent_host = -1;
virNodeDevicePtr dev = NULL;
virNodeDevCapsDefPtr caps;
+ virObjectEventPtr event = NULL;
virCheckFlags(0, NULL);
@@ -5470,11 +5473,16 @@ testNodeDeviceCreateXML(virConnectPtr conn,
goto cleanup;
virNodeDeviceObjUnlock(obj);
+ event = virNodeDeviceEventLifecycleNew(def->name,
+ VIR_NODE_DEVICE_EVENT_CREATED,
+ 0);
+
dev = virGetNodeDevice(conn, def->name);
def = NULL;
cleanup:
testDriverUnlock(driver);
virNodeDeviceDefFree(def);
+ testObjectEventQueue(driver, event);
VIR_FREE(wwnn);
VIR_FREE(wwpn);
return dev;
@@ -5488,6 +5496,7 @@ testNodeDeviceDestroy(virNodeDevicePtr dev)
virNodeDeviceObjPtr obj = NULL;
char *parent_name = NULL, *wwnn = NULL, *wwpn = NULL;
int parent_host = -1;
+ virObjectEventPtr event = NULL;
testDriverLock(driver);
obj = virNodeDeviceFindByName(&driver->devs, dev->name);
@@ -5521,12 +5530,17 @@ testNodeDeviceDestroy(virNodeDevicePtr dev)
goto out;
}
+ event = virNodeDeviceEventLifecycleNew(dev->name,
+ VIR_NODE_DEVICE_EVENT_DELETED,
+ 0);
+
virNodeDeviceObjLock(obj);
virNodeDeviceObjRemove(&driver->devs, obj);
out:
if (obj)
virNodeDeviceObjUnlock(obj);
+ testObjectEventQueue(driver, event);
VIR_FREE(parent_name);
VIR_FREE(wwnn);
VIR_FREE(wwpn);
@@ -5667,6 +5681,39 @@ testConnectStoragePoolEventDeregisterAny(virConnectPtr conn,
return ret;
}
+static int
+testConnectNodeDeviceEventRegisterAny(virConnectPtr conn,
+ virNodeDevicePtr dev,
+ int eventID,
+ virConnectNodeDeviceEventGenericCallback
callback,
+ void *opaque,
+ virFreeCallback freecb)
+{
+ testDriverPtr driver = conn->privateData;
+ int ret;
+
+ if (virNodeDeviceEventStateRegisterID(conn, driver->eventState,
+ dev, eventID, callback,
+ opaque, freecb, &ret) < 0)
+ ret = -1;
+
+ return ret;
+}
+
+static int
+testConnectNodeDeviceEventDeregisterAny(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)
@@ -6809,6 +6856,8 @@ static virStorageDriver testStorageDriver = {
};
static virNodeDeviceDriver testNodeDeviceDriver = {
+ .connectNodeDeviceEventRegisterAny = testConnectNodeDeviceEventRegisterAny, /* 2.1.0
*/
+ .connectNodeDeviceEventDeregisterAny = testConnectNodeDeviceEventDeregisterAny, /*
2.1.0 */
.nodeNumOfDevices = testNodeNumOfDevices, /* 0.7.2 */
.nodeListDevices = testNodeListDevices, /* 0.7.2 */
.nodeDeviceLookupByName = testNodeDeviceLookupByName, /* 0.7.2 */
These versions will need to be updated to 2.2.0
diff --git a/tests/objecteventtest.c b/tests/objecteventtest.c
index 5e8087b..d25a9e2 100644
--- a/tests/objecteventtest.c
+++ b/tests/objecteventtest.c
@@ -61,12 +61,25 @@ static const char storagePoolDef[] =
" </target>\n"
"</pool>\n";
+static const char nodeDeviceDef[] =
+"<device>\n"
+" <parent>test-scsi-host-vport</parent>\n"
+" <capability type='scsi_host'>\n"
+" <capability type='fc_host'>\n"
+" <wwpn>1111222233334444</wwpn>\n"
+" <wwnn>5555666677778888</wwnn>\n"
+" </capability>\n"
+" </capability>\n"
+"</device>\n";
+
typedef struct {
int startEvents;
int stopEvents;
int defineEvents;
int undefineEvents;
int unexpectedEvents;
+ int createdEvents;
+ int deletedEvents;
} lifecycleEventCounter;
static void
@@ -77,12 +90,15 @@ lifecycleEventCounter_reset(lifecycleEventCounter *counter)
counter->defineEvents = 0;
counter->undefineEvents = 0;
counter->unexpectedEvents = 0;
+ counter->createdEvents = 0;
+ counter->deletedEvents = 0;
}
typedef struct {
virConnectPtr conn;
virNetworkPtr net;
virStoragePoolPtr pool;
+ virNodeDevicePtr dev;
} objecteventTest;
@@ -163,6 +179,21 @@ storagePoolRefreshCb(virConnectPtr conn ATTRIBUTE_UNUSED,
(*counter)++;
}
+static void
+nodeDeviceLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED,
+ virNodeDevicePtr dev ATTRIBUTE_UNUSED,
+ int event,
+ int detail ATTRIBUTE_UNUSED,
+ void* opaque)
+{
+ lifecycleEventCounter *counter = opaque;
+
+ if (event == VIR_NODE_DEVICE_EVENT_CREATED)
+ counter->createdEvents++;
+ else if (event == VIR_NODE_DEVICE_EVENT_DELETED)
+ counter->deletedEvents++;
+}
+
static int
testDomainCreateXMLOld(const void *data)
{
@@ -691,6 +722,42 @@ testStoragePoolStartStopEvent(const void *data)
return ret;
}
+static int
+testNodeDeviceCreateXML(const void *data)
+{
+ const objecteventTest *test = data;
+ lifecycleEventCounter counter;
+ virNodeDevicePtr dev;
+ int id;
+ int ret = 0;
+
+ lifecycleEventCounter_reset(&counter);
+
+ id = virConnectNodeDeviceEventRegisterAny(test->conn, NULL,
+ VIR_NODE_DEVICE_EVENT_ID_LIFECYCLE,
+ VIR_NODE_DEVICE_EVENT_CALLBACK(&nodeDeviceLifecycleCb),
+ &counter, NULL);
+ dev = virNodeDeviceCreateXML(test->conn, nodeDeviceDef, 0);
+ virNodeDeviceDestroy(dev);
+
+ if (!dev || virEventRunDefaultImpl() < 0) {
+ ret = -1;
+ goto cleanup;
+ }
+
+ if (counter.createdEvents != 1 || counter.deletedEvents != 1 ||
+ counter.unexpectedEvents > 0) {
+ ret = -1;
+ goto cleanup;
+ }
+
+ cleanup:
+ virConnectNodeDeviceEventDeregisterAny(test->conn, id);
+ if (dev)
+ virNodeDeviceFree(dev);
+ return ret;
+}
+
static void
timeout(int id ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED)
{
@@ -765,6 +832,11 @@ mymain(void)
testStoragePoolStartStopEvent, &test) < 0)
ret = EXIT_FAILURE;
+ /* Node device event tests */
+ if (virTestRun("Node device createXML add event ",
+ testNodeDeviceCreateXML, &test) < 0)
+ ret = EXIT_FAILURE;
+
/* Cleanup */
if (test.pool) {
virStoragePoolUndefine(test.pool);
Rest looks good to me
Thanks,
Cole