[libvirt] [PATCH 3/6] unittests and test: implement storage lifecycle event APIs

Cole Robinson crobinso at redhat.com
Thu Jun 9 22:17:52 UTC 2016


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




More information about the libvir-list mailing list