[libvirt] [test-API][PATCH] Add dir volume wipe cases
Guannan Ren
gren at redhat.com
Mon Jan 7 07:08:14 UTC 2013
On 01/06/2013 05:40 PM, Wayne Sun wrote:
> * add dir volume wipe and wipe pattern cases
> * wipe case compare wiped volume with zero volume file with same
> capacity
> * wipe pattern cases support algorithms in:
> zero|nnsa|dod|bsi|gutmann|schneier|pfitzner7|pfitzner33|random,
> Besides zero, other algorithms are patterns supported by scrub,
> some algorithm might fail due to scrub version.
> * the check method in wipe pattern case for each algorithm is the
> same, only to make sure digest before and after wipe is
> different.
>
> Signed-off-by: Wayne Sun <gsun at redhat.com>
> ---
> cases/storage_dir_vol_wipe.conf | 132 ++++++++++++++++++++++++++++++++
> repos/storage/dir_vol_wipe.py | 136 +++++++++++++++++++++++++++++++++
> repos/storage/dir_vol_wipe_pattern.py | 123 +++++++++++++++++++++++++++++
> 3 files changed, 391 insertions(+), 0 deletions(-)
> create mode 100644 cases/storage_dir_vol_wipe.conf
> create mode 100644 repos/storage/dir_vol_wipe.py
> create mode 100644 repos/storage/dir_vol_wipe_pattern.py
>
> diff --git a/cases/storage_dir_vol_wipe.conf b/cases/storage_dir_vol_wipe.conf
> new file mode 100644
> index 0000000..aa39415
> --- /dev/null
> +++ b/cases/storage_dir_vol_wipe.conf
> @@ -0,0 +1,132 @@
> +storage:create_dir_pool
> + poolname
> + $defaultpoolname
> +
> +storage:dir_vol_wipe
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 2M
> + volformat
> + raw
> +clean
> +
> +storage:dir_vol_wipe
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 50M
> + volformat
> + qcow2
> +clean
> +
> +storage:dir_vol_wipe
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 30M
> + volformat
> + qed
> +clean
> +
> +storage:dir_vol_wipe_pattern
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 2M
> + volformat
> + raw
> + algorithm
> + zero
> +clean
> +
> +storage:dir_vol_wipe_pattern
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 50M
> + volformat
> + qcow2
> + algorithm
> + nnsa
> +clean
> +
> +storage:dir_vol_wipe_pattern
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 30M
> + volformat
> + qed
> + algorithm
> + pfitzner7
> +clean
> +
> +storage:dir_vol_wipe_pattern
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 1K
> + volformat
> + raw
> + algorithm
> + random
> +clean
> +
> +storage:dir_vol_wipe_pattern
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 1K
> + volformat
> + raw
> + algorithm
> + dod
> +clean
> +
> +storage:dir_vol_wipe_pattern
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 1K
> + volformat
> + raw
> + algorithm
> + bsi
> +clean
> +
> +storage:dir_vol_wipe_pattern
> + poolname
> + $defaultpoolname
> + volname
> + $defaultvolumename
> + capacity
> + 1K
> + volformat
> + raw
> + algorithm
> + gutmann
> +clean
> +
> +
> +storage:destroy_pool
> + poolname
> + $defaultpoolname
> diff --git a/repos/storage/dir_vol_wipe.py b/repos/storage/dir_vol_wipe.py
> new file mode 100644
> index 0000000..c020b43
> --- /dev/null
> +++ b/repos/storage/dir_vol_wipe.py
> @@ -0,0 +1,136 @@
> +#!/usr/bin/env python
> +# volume wipe testing
> +
> +import os
> +import string
> +from xml.dom import minidom
> +
> +import libvirt
> +from libvirt import libvirtError
> +
> +from src import sharedmod
> +from utils import utils
> +
> +required_params = ('poolname', 'volname', 'volformat', 'capacity',)
> +optional_params = {'xml' : 'xmls/dir_volume.xml',
> + }
> +
> +def get_pool_path(poolobj):
> + """ get pool xml description
> + """
> + poolxml = poolobj.XMLDesc(0)
> +
> + logger.debug("the xml description of pool is %s" % poolxml)
> +
> + doc = minidom.parseString(poolxml)
> + path_element = doc.getElementsByTagName('path')[0]
> + textnode = path_element.childNodes[0]
> + path_value = textnode.data
> +
> + return path_value
> +
> +def write_file(path, capacity):
> + """write test data to file
> + """
> + logger.info("write %s data into file %s" % (capacity, path))
> + out = utils.get_capacity_suffix_size(capacity)
> + f = open(path, 'w')
> + datastr = ''.join(string.lowercase + string.uppercase
> + + string.digits + '.' + '\n')
> + repeat = out['capacity_byte'] / 64
> + data = ''.join(repeat * datastr)
> + f.write(data)
> + f.close()
> +
> +def dir_vol_wipe(params):
> + """test volume download and check"""
> +
> + global logger
> + logger = params['logger']
> + poolname = params['poolname']
> + volname = params['volname']
> + volformat = params['volformat']
> + capacity = params['capacity']
> + xmlstr = params['xml']
> +
> + logger.info("the poolname is %s, volname is %s, volformat is %s" %
> + (poolname, volname, volformat))
> +
> + conn = sharedmod.libvirtobj['conn']
> + try:
> + poolobj = conn.storagePoolLookupByName(poolname)
> + path_value = get_pool_path(poolobj)
> + volume_path = path_value + "/" + volname
> +
> + xmlstr = xmlstr.replace('VOLPATH', volume_path)
> + xmlstr = xmlstr.replace('SUFFIX', capacity[-1])
> + xmlstr = xmlstr.replace('CAP', capacity[:-1])
> + logger.debug("volume xml:\n%s" % xmlstr)
> +
> + logger.info("create %s %s volume" % (volname, volformat))
> + vol = poolobj.createXML(xmlstr, 0)
> +
> + write_file(volume_path, capacity)
> +
> + poolobj.refresh(0)
> +
> + origdigest = utils.digest(volume_path, 0, 0)
> + logger.debug("the md5 hex digest of data read from %s is: %s" %
> + (volume_path, origdigest))
> +
> + test_path = path_value + "/" + "vol_test"
> + out = utils.get_capacity_suffix_size(capacity)
> + count = out['capacity_byte'] / 1024
> + logger.info("write %s zero to test volume %s" % (capacity, test_path))
> + cmd = "dd if=/dev/zero of=%s bs=1024 count=%s" % (test_path, count)
> + utils.exec_cmd(cmd, shell=True)
> + cmpdigest = utils.digest(test_path, 0, 0)
> + logger.debug("the compare volume digest is: %s" % cmpdigest)
> +
> + logger.info("wipe volume %s" % volume_path)
> + vol.wipe(0)
> +
> + newdigest = utils.digest(volume_path, 0, 0)
> + logger.debug("the volum digest of data read from %s after wipe is: %s"
> + % (volume_path, newdigest))
> +
> + logger.info("check the digest before and after wipe")
> + if newdigest == origdigest:
> + logger.error("wipe failed, digest did not change")
> + return 1
> + else:
> + logger.info("digest is different before and after wipe")
> +
> + logger.info("compare the digest after wipe with digest of volume %s" %
> + test_path)
> + if not newdigest == cmpdigest:
> + logger.error("wipe failed, digest is different")
> + return 1
> + else:
> + logger.info("digest is same with zero volume %s" % test_path)
> +
> + logger.info("wipe succeed")
> +
> + except libvirtError, e:
> + logger.error("libvirt call failed: " + str(e))
> + return 1
> +
> + return 0
> +
> +def dir_vol_wipe_clean(params):
> + """clean testing environment"""
> + poolname = params['poolname']
> + volname = params['volname']
> +
> + conn = sharedmod.libvirtobj['conn']
> + poolobj = conn.storagePoolLookupByName(poolname)
> + path_value = get_pool_path(poolobj)
> + test_path = path_value + "/" + "vol_test"
> +
> + vol = poolobj.storageVolLookupByName(volname)
> + vol.delete(0)
> +
> + if os.path.exists(test_path):
> + os.unlink(test_path)
> +
> + return 0
> diff --git a/repos/storage/dir_vol_wipe_pattern.py b/repos/storage/dir_vol_wipe_pattern.py
> new file mode 100644
> index 0000000..86e3ea2
> --- /dev/null
> +++ b/repos/storage/dir_vol_wipe_pattern.py
> @@ -0,0 +1,123 @@
> +#!/usr/bin/env python
> +# volume wipe with pattern testing, the supported algorithm are
> +# zero and algorithm patterns supported by 'scrub' command which
> +# are nnsa|dod|bsi|gutmann|schneier|pfitzner7|pfitzner33|random
> +
> +import os
> +import string
> +from xml.dom import minidom
> +
> +import libvirt
> +from libvirt import libvirtError
> +
> +from src import sharedmod
> +from utils import utils
> +
> +required_params = ('poolname', 'volname', 'volformat', 'capacity', 'algorithm',)
> +optional_params = {'xml' : 'xmls/dir_volume.xml',
> + }
> +
> +def get_pool_path(poolobj):
> + """ get pool xml description
> + """
> + poolxml = poolobj.XMLDesc(0)
> +
> + logger.debug("the xml description of pool is %s" % poolxml)
> +
> + doc = minidom.parseString(poolxml)
> + path_element = doc.getElementsByTagName('path')[0]
> + textnode = path_element.childNodes[0]
> + path_value = textnode.data
> +
> + return path_value
> +
> +def write_file(path, capacity):
> + """write test data to file
> + """
> + logger.info("write %s data into file %s" % (capacity, path))
> + out = utils.get_capacity_suffix_size(capacity)
> + f = open(path, 'w')
> + datastr = ''.join(string.lowercase + string.uppercase
> + + string.digits + '.' + '\n')
> + repeat = out['capacity_byte'] / 64
> + data = ''.join(repeat * datastr)
> + f.write(data)
> + f.close()
> +
> +def dir_vol_wipe_pattern(params):
> + """test volume download and check"""
> +
> + global logger
> + logger = params['logger']
> + poolname = params['poolname']
> + volname = params['volname']
> + volformat = params['volformat']
> + capacity = params['capacity']
> + algorithm = params['algorithm']
> + xmlstr = params['xml']
> +
> + logger.info("the poolname is %s, volname is %s, volformat is %s" %
> + (poolname, volname, volformat))
> +
> + logger.info("the wipe algorithm given is %s" % algorithm)
> + alg_str = 'libvirt.VIR_STORAGE_VOL_WIPE_ALG_%s' % algorithm.upper()
> + alg_val = eval(alg_str)
> + logger.info("the correspond algorithm value is %s" % alg_val)
> +
> + conn = sharedmod.libvirtobj['conn']
> + try:
> + poolobj = conn.storagePoolLookupByName(poolname)
> + path_value = get_pool_path(poolobj)
> + volume_path = path_value + "/" + volname
> +
> + xmlstr = xmlstr.replace('VOLPATH', volume_path)
> + xmlstr = xmlstr.replace('SUFFIX', capacity[-1])
> + xmlstr = xmlstr.replace('CAP', capacity[:-1])
> + logger.debug("volume xml:\n%s" % xmlstr)
> +
> + logger.info("create %s %s volume" % (volname, volformat))
> + vol = poolobj.createXML(xmlstr, 0)
> +
> + write_file(volume_path, capacity)
> +
> + poolobj.refresh(0)
> +
> + origdigest = utils.digest(volume_path, 0, 0)
> + logger.debug("the md5 hex digest of data read from %s is: %s" %
> + (volume_path, origdigest))
> +
> + logger.info("wipe volume %s with algorithm value %s" %
> + (volume_path, alg_val))
> + vol.wipePattern(alg_val, 0)
> +
> + newdigest = utils.digest(volume_path, 0, 0)
> + logger.debug("the volum digest of data read from %s after wipe is: %s"
> + % (volume_path, newdigest))
> +
> + logger.info("check the digest before and after wipe")
> + if newdigest == origdigest:
> + logger.error("wipe with algorithm %s failed, digest is the same"
> + % algorithm)
> + return 1
> + else:
> + logger.info("digest is different before and after wipe")
> +
> + logger.info("wipe with algorithm %s succeed" % algorithm)
> +
> + except libvirtError, e:
> + logger.error("libvirt call failed: " + str(e))
> + return 1
> +
> + return 0
> +
> +def dir_vol_wipe_pattern_clean(params):
> + """clean testing environment"""
> + poolname = params['poolname']
> + volname = params['volname']
> +
> + conn = sharedmod.libvirtobj['conn']
> + poolobj = conn.storagePoolLookupByName(poolname)
> + vol = poolobj.storageVolLookupByName(volname)
> + vol.delete(0)
> +
> + return 0
ACK and pushed
Thanks
Guannan
More information about the libvir-list
mailing list