[Libvirt-cim] [PATCH] [TEST] #3 Adding new tc to verify fs storage pool creation

Deepti B Kalakeri deeptik at linux.vnet.ibm.com
Tue Jun 30 13:56:23 UTC 2009


This tc needs to be applied on top of "Moving the pre_check() fn from 
main.py to common_util.py" patch.

Deepti B. Kalakeri wrote:
> # HG changeset patch
> # User Deepti B. Kalakeri<deeptik at linux.vnet.ibm.com>
> # Date 1246370002 25200
> # Node ID 479f287a17fd08e4e22ac37459393f6f8327315a
> # Parent  fe9471d9dd3372b673da5596a18cc49e553b13fa
> [TEST] #3 Adding new tc to verify fs storage pool creation.
>
> Updates in patch 3:
> -------------------
> 1) Used the pre_check from XenKvmLib.common_util
> 2) imported PASS /FAIL from CimTest.ReturnCodes
> 3) Modified the verify_pool()
> 4) Modified the clean_up()
> 5) Addressed some minor typos
>
> Update in patch 2:
> ------------------
> 1) rearranged import stmst
> 2) add check to see if cimserver is started
> 3) Added options to clean the old log
> 4) Added options to get the debug msg on the stdout
> 5) Added lxc support
> 6) Moved the looping for setting the poolsettings in a function
> 7) Rectified the virt_type to virt and also to use KVM for checking while setting vuri
>
>
>
> Patch 1:
> --------
> This tc will not be run in the batch mode of cimtest and hence needs to
> be run individually using the command below.
>
> python create_verify_storagepool.py -t 2  -d /dev/sda4 -m /tmp/mnt -n diskfs
>          -v Xen -u <username> -p <passwd>
>
> Tested with Xen on RHEL with current sources for fs type pool.
> Will Update the patch to include logical pool verification as well.
> Signed-off-by: Deepti B. Kalakeri <deeptik at linux.vnet.ibm.com>
>
> diff -r fe9471d9dd33 -r 479f287a17fd suites/libvirt-cim/misc_cimtests/create_verify_storagepool.py
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/suites/libvirt-cim/misc_cimtests/create_verify_storagepool.py	Tue Jun 30 06:53:22 2009 -0700
> @@ -0,0 +1,356 @@
> +#!/usr/bin/python
> +#
> +# Copyright 2009 IBM Corp.
> +#
> +# Authors:
> +#    Deepti B. Kalakeri<dkalaker at in.ibm.com> 
> +#    
> +#
> +# This library is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public
> +# License as published by the Free Software Foundation; either
> +# version 2.1 of the License, or (at your option) any later version.
> +#
> +# This library is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +# General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public
> +# License along with this library; if not, write to the Free Software
> +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
> +#
> +# This test case should test the  CreateChildResourcePool service 
> +# supplied by the RPCS provider. 
> +# This tc verifies the FileSystem Type storage pool.
> +#
> +# The test case is not run in the batch run and we need to run it using 
> +# the following command:
> +# python create_verify_storagepool.py -t 2  -d /dev/sda4 -m /tmp/mnt -n diskfs 
> +#         -v Xen -u <username> -p <passwd>
> +# 
> +# Where t can be :
> +#       2 - FileSystem
> +#       4 - Logical etc
> +# 
> +# 
> +#                                                         Date : 27.06.2009
> +
> +import os
> +import sys
> +from optparse import OptionParser
> +from commands  import getstatusoutput
> +from distutils.text_file import TextFile
> +from pywbem import WBEMConnection, cim_types, CIMInstanceName
> +sys.path.append('../../../lib')
> +from CimTest import Globals
> +from CimTest.Globals import logger, log_param
> +from CimTest.ReturnCodes import PASS, FAIL
> +sys.path.append('../lib')
> +from XenKvmLib.classes import inst_to_mof, get_typed_class
> +from XenKvmLib.pool import get_pool_rasds
> +from XenKvmLib.common_util import pre_check
> +from XenKvmLib.enumclass import EnumInstances
> +
> +TEST_LOG="cimtest.log"
> +
> +supp_types = [ 'Xen', 'KVM' , 'LXC' ]
> +pool_types = { 'DISK_POOL_FS' : 2 }
> +
> +def verify_cmd_options(options):
> +    try: 
> +        if options.part_dev == None:
> +            raise Exception("Free Partition to be mounted not specified")
> +
> +        if options.mnt_pt == None:
> +            raise Exception("Mount points to be used not specified")
> +
> +        if options.pool_name == None:
> +            raise Exception("Must specify the Pool Name to be created")
> +
> +        if options.virt == None or options.virt not in supp_types:
> +            raise Exception("Must specify virtualization type")
> +
> +        if options.pool_type == None:
> +            raise Exception("Must specify pool type to be tested")
> +
> +    except Exception, details:
> +        print "FATAL: ", details
> +        print parser.print_help()
> +        return FAIL
> +
> +    return PASS
> +
> +def env_setup(sysname, virt, clean, debug):
> +    env_ready = pre_check(sysname, virt)
> +    if env_ready != None: 
> +        print "\n%s.  Please check your environment.\n" % env_ready
> +        return FAIL
> +
> +    if clean:
> +        cmd = "rm -f %s" % (os.path.join(os.getcwd(), TEST_LOG))
> +        status, output = getstatusoutput(cmd)
> +
> +    if debug:
> +        dbg = "-d"
> +    else:
> +        dbg = ""
> +
> +    return PASS
> +
> +def get_pooltype(pooltype, virt):
> +    if pooltype == "fs":
> +       pool_type = pool_types['DISK_POOL_FS']
> +    else:
> +       logger.error("Invalid pool type ....")
> +       return None, None
> +    return PASS, pool_type
> +
> +def verify_inputs(part_dev, mount_pt):
> +    del_dir = False   
> +    cmd = "mount"
> +    status, mount_info = getstatusoutput(cmd)
> +    if status != PASS:
> +        logger.error("Failed to get mount info.. ")
> +        return FAIL, del_dir
> +     
> +    for line in mount_info.split('\n'):
> +        try:
> +            # Check if the specified partition is mounted before using it 
> +            part_name = line.split()[0]
> +            if part_dev == part_name:
> +                logger.error("[%s] already mounted", part_dev)
> +                raise Exception("Please specify free partition other than " \
> +                                "[%s]" % part_dev)
> +
> +            # Check if mount point is already used for mounting
> +            mount_name = line.split()[2]
> +	    if mount_pt == mount_name:
> +                logger.error("[%s] already mounted", mount_pt)
> +                raise Exception("Please specify dir other than [%s]" %mount_pt)
> +
> +        except Exception, details:
> +            logger.error("%s", details)
> +            return FAIL, del_dir
> +
> +    # Check if the mount point specified already exist, if not then create it..
> +    if not os.path.exists(mount_pt):
> +        os.mkdir(mount_pt)
> +
> +        # set del_dir to True so that we remove it before exiting from the tc.
> +        del_dir = True 
> +    else:
> +        # Check if the mount point specified is a dir
> +        if not os.path.isdir(mount_pt):
> +            logger.error("The mount point [%s] should be a dir", mount_pt)
> +            return FAIL, del_dir
> +
> +        files = os.listdir(mount_pt)
> +        if len(files) != 0:
> +            logger.info("The mount point [%s] given is not empty", mount_pt)
> +
> +    return PASS, del_dir
> +
> +def get_uri(virt):
> +    if virt == 'Xen':
> +        vuri = 'xen:///'
> +    elif virt == 'KVM':
> +        vuri = 'qemu:///system'
> +    elif virt == 'LXC':
> +        vuri = 'lxc:///system'
> +    return vuri
> +
> +def get_pool_settings(dp_rasds, pooltype, part_dev, mount_pt, pool_name):
> +    pool_settings = None
> +    for dpool_rasd in dp_rasds:
> +        if dpool_rasd['Type'] == pooltype and \
> +            dpool_rasd['InstanceID'] == 'Default':
> +            dpool_rasd['DevicePaths'] = [part_dev]
> +            dpool_rasd['Path'] = mount_pt
> +            dp_pid = "%s/%s" % ("DiskPool", pool_name)
> +            dpool_rasd['PoolID'] = dpool_rasd['InstanceID'] = dp_pid
> +            break
> +
> +    if not pool_name in dpool_rasd['InstanceID']:
> +        return pool_settings
> +
> +    pool_settings = inst_to_mof(dpool_rasd)
> +    return pool_settings
> +
> +
> +def verify_pool(sysname, virt, pool_name, dp_cn):
> +    try:
> +        pool = EnumInstances(sysname, dp_cn)
> +        for dpool in pool:
> +            ret_pool = dpool.InstanceID
> +            if pool_name == ret_pool: 
> +               logger.info("Found the pool '%s'", pool_name)
> +               return PASS
> +    except Exception, details:
> +        logger.error("Exception details: %s", details)
> +
> +    return FAIL
> +
> +def cleanup(virt, rpcs_conn, rpcs_cn, dp_cn, dp_id, 
> +            pool_name, sysname, mount_pt, del_dir, res):
> +
> +    if res == PASS:
> +        pool_settings = CIMInstanceName(dp_cn, namespace=Globals.CIM_NS, 
> +                                        keybindings = {'InstanceID': dp_id})
> +        rpcs_conn.InvokeMethod("DeleteResourcePool",
> +                               rpcs_cn,
> +                               Pool = pool_settings)
> +        pool = EnumInstances(sysname, dp_cn)
> +        for dpool in pool:
> +            ret_pool = dpool.InstanceID
> +            if ret_pool == dp_id:
> +                logger.error("Failed to delete diskpool '%s'", pool_name)
> +                return FAIL
> +
> +    if del_dir == True:
> +        cmd ="rm -rf %s"  % mount_pt
> +        ret, out = getstatusoutput(cmd)
> +        if ret != PASS:
> +            logger.error("WARNING: '%s' was not removed", mount_pt)
> +            logger.error("WARNING: Please remove %s manually", mount_pt)
> +
> +    return PASS
> +
> +
> +def main():
> +    usage = "usage: %prog [options] \nex: %prog -i localhost"
> +    parser = OptionParser(usage)
> +
> +    parser.add_option("-i", "--host-url", dest="h_url", default="localhost:5988",
> +                      help="URL of CIMOM to connect to (host:port)")
> +    parser.add_option("-N", "--ns", dest="ns", default="root/virt",
> +                      help="Namespace (default is root/virt)")
> +    parser.add_option("-u", "--user", dest="username", default=None,
> +                      help="Auth username for CIMOM on source system")
> +    parser.add_option("-p", "--pass", dest="password", default=None,
> +                      help="Auth password for CIMOM on source system")
> +    parser.add_option("-v", "--virt-type", dest="virt", default=None,
> +                      help="Virtualization type [ Xen | KVM ]")
> +    parser.add_option("-t", "--pool-type", dest="pool_type", default=None,
> +                      help="Pool type:[ fs | logical ]")
> +    parser.add_option("-d", "--part-dev", dest="part_dev", default=None,
> +                      help="specify the free partition to be used")
> +    parser.add_option("-m", "--mnt_pt", dest="mnt_pt", default=None, 
> +                      help="Mount point to be used")
> +    parser.add_option("-n", "--pool-name", dest="pool_name", default=None, 
> +                      help="Pool to be created")
> +    parser.add_option("-c", "--clean-log",  
> +                      action="store_true", dest="clean",
> +                      help="Will remove existing log files before test run")
> +    parser.add_option("-l", "--debug-output", action="store_true", dest="debug",
> +                      help="Duplicate the output to stderr")
> +
> +    (options, args) = parser.parse_args()
> +
> +    # Verify command line options
> +    status = verify_cmd_options(options)
> +    if status != PASS:
> +       return status
> +    
> +    part_dev = options.part_dev
> +    mount_pt = options.mnt_pt
> +    pool_name = options.pool_name
> +    virt = options.virt
> +
> +    if ":" in options.h_url:
> +        (sysname, port) = options.h_url.split(":")
> +    else:
> +        sysname = options.h_url
> +
> +    # Verify if the CIMOM is running, clean cimtest.log if requested
> +    # Set Debug option if requested
> +    status = env_setup(sysname, virt, options.clean, options.debug)
> +    if status != PASS:
> +       return status
> +
> +    log_param(file_name=TEST_LOG)
> +
> +    print "Please check cimtest.log in the curr dir for debug log msgs..."
> +
> +    status, pooltype = get_pooltype(options.pool_type, virt)
> +    if status != PASS:
> +       return FAIL
> +   
> +    pooltype = cim_types.Uint16(pooltype)
> +
> +    status, del_dir = verify_inputs(part_dev, mount_pt)
> +    if status != PASS:
> +        if del_dir == True:
> +            cmd ="rm -rf %s" % mount_pt
> +            status, out = getstatusoutput(cmd)
> +        logger.error("Input verification failed")
> +        return status
> +
> +   
> +    os.environ['CIM_NS'] = Globals.CIM_NS = options.ns
> +    os.environ['CIM_USER'] = Globals.CIM_USER = options.username
> +    os.environ['CIM_PASS'] = Globals.CIM_PASS = options.password
> +    cn = "DiskPool"
> +    dp_cn = get_typed_class(virt, cn)
> +    dp_id = "%s/%s" % (cn, pool_name) 
> +    rpcs_cn = get_typed_class(virt, "ResourcePoolConfigurationService")
> +
> +    status = verify_pool(sysname, virt, dp_id, dp_cn)
> +    if status == PASS:
> +        logger.error("Pool --> '%s' already exist", pool_name)
> +        logger.error("Specify some other pool name")
> +        return status
> +
> +    res = [FAIL]
> +    try:
> +        src_conn = WBEMConnection('http://%s' % sysname, (options.username, 
> +                                   options.password), options.ns)
> +   
> +        # Get DiskPoolRASD's from SDC association with AC of DiskPool/0
> +        status, dp_rasds = get_pool_rasds(sysname, virt, cn)
> +        if status != PASS:
> +           raise Exception("Failed to get DiskPool Rasd's")
> +
> +        # Get the DiskPoolRASD mof with appropriate values of diskpool 
> +        # to be created....
> +        pool_settings = get_pool_settings(dp_rasds, pooltype, part_dev, 
> +                                          mount_pt, pool_name)
> +        if pool_settings == None:
> +            raise Exception("Did not get the required pool settings ...")
> +
> +        # Create DiskPool..
> +        res = src_conn.InvokeMethod("CreateChildResourcePool",
> +                                    rpcs_cn,
> +                                    Settings=[pool_settings],
> +                                    ElementName=pool_name)
> +
> +    except Exception, details:
> +        logger.error("In main(), exception '%s'", details)
> +
> +    # Verify if the desired pool was successfully created ..
> +    if res[0] == PASS:
> +        status = verify_pool(sysname, virt, dp_id, dp_cn)
> +        if status != PASS:
> +            logger.error("Failed to verify pool: %s " % pool_name)
> +
> +    # Clean up the pool and the mount dir that was created ...
> +    status = cleanup(virt, src_conn, rpcs_cn, dp_cn, dp_id,
> +                      pool_name, sysname, mount_pt, del_dir, res[0])
> +
> +    if res[0] == PASS and status == PASS:
> +        logger.info("Pool %s was successfully verified for pool type %s", 
> +                    pool_name , options.pool_type)
> +
> +        # Place holder to give a hint to the user the tc passed 
> +        # otherwise the user will have to look into the cimtest.log in the 
> +        # current dir.
> +        print "Pool '", pool_name,"' was successfully verified for pool type "\
> +              "'", options.pool_type , "'"
> +        return PASS
> +    else:
> +        logger.error("Test Failed to verify '%s' pool creation ....", 
> +                     options.pool_type)
> +        return FAIL
> +if __name__=="__main__":
> +    sys.exit(main())
> +
>
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim at redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim
>   

-- 
Thanks and Regards,
Deepti B. Kalakeri
IBM Linux Technology Center
deeptik at linux.vnet.ibm.com




More information about the Libvirt-cim mailing list