[libvirt] [RFC][PATCH 7/7] interface: implement test driver

Daniel P. Berrange berrange at redhat.com
Tue May 10 09:43:16 UTC 2011


On Mon, May 09, 2011 at 09:28:53PM +0200, Michal Privoznik wrote:
> ---
>  src/test/test_driver.c |  116 ++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 113 insertions(+), 3 deletions(-)
> 
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 83dcf1a..9ae6e7a 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -85,6 +85,8 @@ struct _testConn {
>      virDomainObjList domains;
>      virNetworkObjList networks;
>      virInterfaceObjList ifaces;
> +    int transaction_running:1;

Or a 'bool'

> +    virInterfaceObjList backupIfaces;
>      virStoragePoolObjList pools;
>      virNodeDeviceObjList devs;
>      int numCells;
> @@ -3433,6 +3435,114 @@ cleanup:
>      return ret;
>  }
>  
> +static int testInterfaceChangeStart(virConnectPtr conn,
> +                                    unsigned int flags ATTRIBUTE_UNUSED)
> +{
> +    testConnPtr privconn = conn->privateData;
> +    int ret = -1;
> +    unsigned int i, cnt;
> +
> +    testDriverLock(privconn);
> +    if (privconn->transaction_running) {
> +        testError(VIR_ERR_OPERATION_INVALID, _("there is another change "
> +                                               "running."));
> +        goto cleanup;
> +    }

I think we should refer to it as 'transaction' not 'change'.

> +
> +    privconn->transaction_running = 1;
> +
> +    cnt = privconn->ifaces.count;
> +    for (i = 0; i < cnt; i++) {
> +        virInterfaceDefPtr def = privconn->ifaces.objs[i]->def;
> +        virInterfaceDefPtr backup;
> +        virInterfaceObjPtr iface;
> +        char *xml = virInterfaceDefFormat(def);
> +
> +        if (!xml) {
> +            virReportOOMError();
> +            goto no_memory;
> +        }
> +
> +        if ((backup = virInterfaceDefParseString(xml)) == NULL) {
> +            VIR_FREE(xml);
> +            goto cleanup;
> +        }
> +
> +        if ((iface =
> +             virInterfaceAssignDef(&privconn->backupIfaces, backup)) == NULL) {
> +            VIR_FREE(xml);
> +            goto cleanup;
> +        }
> +
> +        virInterfaceObjUnlock(iface);
> +
> +        conn->refs++;
> +
> +        VIR_FREE(xml);
> +    }

Perhaps in src/conf/interface_conf.c  add a method

  virInterfaceObjListClone()

to contain this code.

> +
> +    ret = 0;
> +cleanup:
> +    testDriverUnlock(privconn);
> +    return ret;
> +no_memory:
> +    virInterfaceObjListFree(&privconn->backupIfaces);
> +    goto cleanup;
> +}
> +
> +static int testInterfaceChangeCommit(virConnectPtr conn,
> +                                     unsigned int flags ATTRIBUTE_UNUSED)
> +{
> +    testConnPtr privconn = conn->privateData;
> +    int ret = -1;
> +
> +    testDriverLock(privconn);
> +
> +    if (!privconn->transaction_running) {
> +        testError(VIR_ERR_OPERATION_INVALID, _("no transaction running, "
> +                  "nothing to be commited."));
> +        goto cleanup;
> +    }
> +
> +    virInterfaceObjListFree(&privconn->backupIfaces);
> +    privconn->transaction_running = 0;
> +
> +    ret = 0;
> +
> +cleanup:
> +    testDriverUnlock(privconn);
> +
> +    return ret;
> +}
> +
> +static int testInterfaceChangeRollback(virConnectPtr conn,
> +                                       unsigned int flags ATTRIBUTE_UNUSED)
> +{
> +    testConnPtr privconn = conn->privateData;
> +    int ret = -1;
> +
> +    testDriverLock(privconn);
> +
> +    if (!privconn->transaction_running) {
> +        testError(VIR_ERR_OPERATION_INVALID, _("no transaction running, "
> +                  "nothing to rollback."));
> +        goto cleanup;
> +    }
> +
> +    virInterfaceObjListFree(&privconn->ifaces);
> +    privconn->ifaces.count = privconn->backupIfaces.count;
> +    privconn->ifaces.objs = privconn->backupIfaces.objs;
> +    privconn->backupIfaces.count = 0;
> +    privconn->backupIfaces.objs = NULL;
> +
> +    privconn->transaction_running = 0;
> +
> +    ret = 0;
> +
> +cleanup:
> +    testDriverUnlock(privconn);
> +    return ret;
> +}
>  
>  static char *testInterfaceGetXMLDesc(virInterfacePtr iface,
>                                       unsigned int flags ATTRIBUTE_UNUSED)
> @@ -5488,9 +5598,9 @@ static virInterfaceDriver testInterfaceDriver = {
>      testInterfaceCreate,        /* interfaceCreate */
>      testInterfaceDestroy,       /* interfaceDestroy */
>      testInterfaceIsActive,      /* interfaceIsActive */
> -    NULL,                       /* interfaceChangeStart */
> -    NULL,                       /* interfaceChangeCommit */
> -    NULL,                       /* interfaceChangeRollback */
> +    testInterfaceChangeStart,   /* interfaceChangeStart */
> +    testInterfaceChangeCommit,  /* interfaceChangeCommit */
> +    testInterfaceChangeRollback, /* interfaceChangeRollback */
>  };



Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list