[libvirt] [test-API][PATCH] Add the volume clone case

Guannan Ren gren at redhat.com
Tue Jan 15 04:28:02 UTC 2013


On 01/14/2013 05:36 PM, Wayne Sun wrote:
> This is for volume clone testing by using createXMLFrom API
> * add the vol_clone case under storage
>    it is general for all pool types
> * add cases into confs:
>    cases/storage_dir.conf
>    cases/storage_logical.conf
>    cases/storage_netfs.conf
> * add variable 'defaultvolclonename' in global.cfg
>
> Signed-off-by: Wayne Sun <gsun at redhat.com>
> ---
>   cases/storage_dir.conf     |   14 +++++++
>   cases/storage_logical.conf |   14 +++++++
>   cases/storage_netfs.conf   |   14 +++++++
>   global.cfg                 |    2 +
>   repos/storage/vol_clone.py |   81 ++++++++++++++++++++++++++++++++++++++++++++
>   5 files changed, 125 insertions(+), 0 deletions(-)
>   create mode 100644 repos/storage/vol_clone.py
>
> diff --git a/cases/storage_dir.conf b/cases/storage_dir.conf
> index dcac700..38b349d 100644
> --- a/cases/storage_dir.conf
> +++ b/cases/storage_dir.conf
> @@ -20,6 +20,20 @@ storage:create_dir_volume
>       capacity
>           $defaultvolumesize
>   
> +storage:vol_clone
> +    poolname
> +        $defaultpoolname
> +    volname
> +        $defaultvolumename
> +    clonevolname
> +        $defaultvolclonename
> +
> +storage:delete_dir_volume
> +    poolname
> +        $defaultpoolname
> +    volname
> +        $defaultvolclonename
> +
>   storage:delete_dir_volume
>       poolname
>           $defaultpoolname
> diff --git a/cases/storage_logical.conf b/cases/storage_logical.conf
> index 3334abd..d374dfa 100644
> --- a/cases/storage_logical.conf
> +++ b/cases/storage_logical.conf
> @@ -22,6 +22,20 @@ storage:create_logical_volume
>       capacity
>           $defaultvolumesize
>   
> +storage:vol_clone
> +    poolname
> +        $defaultpoolname
> +    volname
> +        $defaultvolumename
> +    clonevolname
> +        $defaultvolclonename
> +
> +storage:delete_logical_volume
> +    poolname
> +        $defaultpoolname
> +    volname
> +        $defaultvolclonename
> +
>   storage:delete_logical_volume
>       poolname
>           $defaultpoolname
> diff --git a/cases/storage_netfs.conf b/cases/storage_netfs.conf
> index e764813..f486ff4 100644
> --- a/cases/storage_netfs.conf
> +++ b/cases/storage_netfs.conf
> @@ -24,6 +24,20 @@ storage:create_netfs_volume
>       capacity
>           $defaultvolumesize
>   
> +storage:vol_clone
> +    poolname
> +        $defaultpoolname
> +    volname
> +        $defaultvolumename
> +    clonevolname
> +        $defaultvolclonename
> +
> +storage:delete_netfs_volume
> +    poolname
> +        $defaultpoolname
> +    volname
> +        $defaultvolclonename
> +
>   storage:delete_netfs_volume
>       poolname
>           $defaultpoolname
> diff --git a/global.cfg b/global.cfg
> index 9e28614..182acbd 100644
> --- a/global.cfg
> +++ b/global.cfg
> @@ -156,6 +156,8 @@ defaultpoolname = test_api_pool
>   defaultpoolpath = /var/lib/libvirt/images/dir_pool
>   # default volume name for creating new volume
>   defaultvolumename = test_api_volume
> +# default clone volume name for clone a volume
> +defaultvolclonename = test_clone_volume
>   # default volume type for creating a new volume
>   defaultvolumetype = raw
>   # default volume capacity for creating a new volume
> diff --git a/repos/storage/vol_clone.py b/repos/storage/vol_clone.py
> new file mode 100644
> index 0000000..abf5644
> --- /dev/null
> +++ b/repos/storage/vol_clone.py
> @@ -0,0 +1,81 @@
> +#!/usr/bin/env python
> +# volume clone testing
> +
> +import os
> +from xml.dom import minidom
> +
> +import libvirt
> +from libvirt import libvirtError
> +
> +from src import sharedmod
> +
> +required_params = ('poolname', 'volname', 'clonevolname',)
> +optional_params = {}
> +
> +def prepare_clone_xml(xmlstr, volname):
> +    """prepare clone xmldesc by replace name element
> +       with clone souce volume xml
> +    """
> +    doc = minidom.parseString(xmlstr)
> +    oldname = doc.getElementsByTagName("name")[0]
> +
> +    newname = doc.createElement('name')
> +    newnameval = doc.createTextNode(volname)
> +    newname.appendChild(newnameval)
> +
> +    volume = doc.getElementsByTagName('volume')[0]
> +
> +    volume.replaceChild(newname, oldname)
> +    newxmlstr = doc.toxml()
> +
> +    return newxmlstr
> +
> +def vol_clone(params):
> +    """volume clone testing"""
> +
> +    global logger
> +    logger = params['logger']
> +    poolname = params['poolname']
> +    volname = params['volname']
> +    clonevolname = params['clonevolname']
> +
> +    logger.info("the poolname is %s, volname is %s" % (poolname, volname))
> +    logger.info("the clone volume name is %s" % clonevolname)
> +
> +    conn = sharedmod.libvirtobj['conn']
> +    try:
> +        poolobj = conn.storagePoolLookupByName(poolname)
> +        old_vol = poolobj.storageVolLookupByName(volname)
> +
> +        xmlstr = old_vol.XMLDesc(0)
> +        newxmlstr = prepare_clone_xml(xmlstr, clonevolname)
> +        logger.debug("volume xml:\n%s" % newxmlstr)
> +
> +        logger.info("clone volume %s from source volume %s" %
> +                    (clonevolname, volname))
> +
> +        old_volnum = poolobj.numOfVolumes()
> +
> +        new_vol = poolobj.createXMLFrom(newxmlstr, old_vol, 0)
> +        poolobj.refresh(0)
> +
> +        new_volnum = poolobj.numOfVolumes()
> +
> +        logger.debug("new cloned volume path is: %s" % new_vol.path())
> +        if os.access(new_vol.path(), os.R_OK):
> +            logger.info("cloned volume path exist")
> +        else:
> +            logger.error("cloned volume path not exist")
> +            return 1
> +
> +        if new_volnum > old_volnum:
> +            logger.info("clone succeed")
> +        else:
> +            logger.error("clone failed")
> +            return 1
> +
> +    except libvirtError, e:
> +        logger.error("libvirt call failed: " + str(e))
> +        return 1
> +
> +    return 0

    ACK and pushed
    Thanks.

    Guannan




More information about the libvir-list mailing list