[libvirt] [test-API][PATCH v2] Add ownership_test.py test case

Guannan Ren gren at redhat.com
Fri Aug 26 09:50:39 UTC 2011


On 08/25/2011 07:42 PM, Wayne Sun wrote:
>    * Save a domain to a file, check the ownership of the file after
>      save and restore operation
> ---
>   repos/domain/ownership_test.py |  302 ++++++++++++++++++++++++++++++++++++++++
>   1 files changed, 302 insertions(+), 0 deletions(-)
>   create mode 100644 repos/domain/ownership_test.py
>
> diff --git a/repos/domain/ownership_test.py b/repos/domain/ownership_test.py
> new file mode 100644
> index 0000000..cba1424
> --- /dev/null
> +++ b/repos/domain/ownership_test.py
> @@ -0,0 +1,302 @@
> +#!/usr/bin/env python
> +"""Setting the dynamic_ownership in /etc/libvirt/qemu.conf,
> +   check the ownership of saved domain file. Test could be on
> +   local or root_squash nfs.
> +   domain:ownership_test
> +       guestname
> +           #GUESTNAME#
> +       dynamic_ownership
> +           0|1
> +       use_nfs
> +           0|1

         It's better to use "enable|disable" as the value to 
"dynamic_ownership"
         and "use_nfs", that make the config file easier to read.
         "0|1" is not a good representation.


> +
> +   use_nfs is a flag for decide using nfs or not
> +"""
> +
> +__author__ = 'Wayne Sun: gsun at redhat.com'
> +__date__ = 'Mon Jul 25, 2011'
> +__version__ = '0.1.0'
> +__credits__ = 'Copyright (C) 2011 Red Hat, Inc.'
> +__all__ = ['ownership_test']
> +
> +import os
> +import re
> +import sys
> +import commands
> +
> +QEMU_CONF = "/etc/libvirt/qemu.conf"
> +SAVE_FILE = "/mnt/test.save"
> +TEMP_FILE = "/tmp/test.save"
> +
> +from utils.Python import utils
> +
> +def append_path(path):
> +    """Append root path of package"""
> +    if path in sys.path:
> +        pass
> +    else:
> +        sys.path.append(path)
> +
> +from lib import connectAPI
> +from lib import domainAPI
> +from utils.Python import utils
> +from exception import LibvirtAPI
> +
> +pwd = os.getcwd()
> +result = re.search('(.*)libvirt-test-API', pwd)
> +append_path(result.group(0))
> +
> +def return_close(conn, logger, ret):
> +    conn.close()
> +    logger.info("closed hypervisor connection")
> +    return ret
> +
> +def check_params(params):
> +    """Verify inputing parameter dictionary"""
> +    logger = params['logger']
> +    keys = ['guestname', 'dynamic_ownership']
> +    for key in keys:
> +        if key not in params:
> +            logger.error("%s is required" %key)
> +            return 1
> +    return 0

         The  use_nfs is missed. we need to check it too.

> +
> +def nfs_setup(util, logger):
> +    """setup nfs on localhost
> +    """
> +    logger.info("set nfs service")
> +    cmd = "echo /tmp *\(rw,root_squash\)>  /etc/exports"
> +    ret, out = util.exec_cmd(cmd, shell=True)
> +    if ret:
> +        logger.error("failed to config nfs export")
> +        return 1
> +
> +    logger.info("start nfs service")
> +    cmd = "service nfs start"
> +    ret, out = util.exec_cmd(cmd, shell=True)
> +    if ret:
> +        logger.error("failed to start nfs service")
> +        return 1
> +    else:
> +        for i in range(len(out)):
> +            logger.info(out[i])
> +
> +    return 0
> +
> +def chown_file(util, filepath, logger):
> +    """touch a file and setting the chown
> +    """
> +    if os.path.exists(filepath):
> +        os.remove(filepath)
> +
> +    touch_cmd = "touch %s" % filepath
> +    logger.info(touch_cmd)
> +    ret, out = util.exec_cmd(touch_cmd, shell=True)
> +    if ret:
> +        logger.error("failed to touch a new file")
> +        logger.error(out[0])
> +        return 1
> +
> +    logger.info("set chown of %s as 107:107" % filepath)
> +    chown_cmd = "chown 107:107 %s" % filepath
> +    ret, out = util.exec_cmd(chown_cmd, shell=True)
> +    if ret:
> +        logger.error("failed to set the ownership of %s" % filepath)
> +        return 1
> +
> +    logger.info("set %s mode as 644" % filepath)
> +    cmd = "chmod 644 %s" % filepath
> +    ret, out = util.exec_cmd(cmd, shell=True)
> +    if ret:
> +        logger.error("failed to set the mode of %s" % filepath)
> +        return 1
> +
> +    return 0
> +
> +def prepare_env(util, guestname, dynamic_ownership, use_nfs, logger):
> +    """configure dynamic_ownership in /etc/libvirt/qemu.conf,
> +       set chown of the file to save
> +    """
> +    logger.info("set the dynamic ownership in %s as %s" % \
> +                (QEMU_CONF, dynamic_ownership))
> +    set_cmd = "echo dynamic_ownership = %s>>  %s" % (dynamic_ownership, QEMU_CONF)
> +    ret, out = util.exec_cmd(set_cmd, shell=True)
> +    if ret:
> +        logger.error("failed to set dynamic ownership")

             if the execution failed, why not return directly.
             add "return 1"

> +
> +    logger.info("restart libvirtd")
> +    restart_cmd = "service libvirtd restart"
> +    ret, out = util.exec_cmd(restart_cmd, shell=True)
> +    if ret:
> +        logger.error("failed to restart libvirtd")
> +        return 1
> +    else:
> +        for i in range(len(out)):
> +            logger.info(out[i])
> +
> +    if use_nfs == '1':
> +        ret = nfs_setup(util, logger)
> +        if ret:
> +            return 1
> +
> +        logger.info("mount the nfs path to /mnt")
> +        mount_cmd = "mount -o vers=3 127.0.0.1:/tmp /mnt"
> +        ret, out = util.exec_cmd(mount_cmd, shell=True)
> +        if ret:
> +            logger.error("Failed to mount the nfs path")
> +            for i in range(len(out)):
> +                logger.info(out[i])
> +
> +        filepath = TEMP_FILE
> +    else:
> +        filepath = SAVE_FILE

            It's better to change the ownership of the file before 
mounting it.

> +
> +    ret = chown_file(util, filepath, logger)
> +    if ret:
> +        return 1
> +
> +    return 0
> +
> +def ownership_get(logger):
> +    """check the ownership of file"""
> +
> +    statinfo = os.stat(SAVE_FILE)
> +    uid = statinfo.st_uid
> +    gid = statinfo.st_gid
> +
> +    logger.info("the uid and gid of %s is %s:%s" %(SAVE_FILE, uid, gid))
> +
> +    return 0, uid, gid
> +
> +def ownership_test(params):
> +    """Save a domain to a file, check the ownership of
> +       the file after save and restore
> +    """
> +    # Initiate and check parameters
> +    params_check_result = check_params(params)
> +    if params_check_result:
> +        return 1
> +
> +    logger = params['logger']
> +    guestname = params['guestname']
> +    dynamic_ownership = params['dynamic_ownership']
> +    use_nfs = params['use_nfs']
> +    test_result = False
> +
> +    util = utils.Utils()
> +
> +    # set env
> +    logger.info("prepare the environment")
> +    ret = prepare_env(util, guestname, dynamic_ownership, use_nfs, logger)
> +    if ret:
> +        logger.error("failed to prepare the environment")

            return 1, it needs not to do testing further if failing to 
perpare testing
            environment.

> +
> +    # Connect to local hypervisor connection URI
> +    uri = util.get_uri('127.0.0.1')
> +    conn = connectAPI.ConnectAPI()
> +    virconn = conn.open(uri)
> +
> +    # save domain to the file
> +    logger.info("save the domain to the file")
> +    domobj = domainAPI.DomainAPI(virconn)
> +    try:
> +        domobj.save(guestname, SAVE_FILE)

            it's better to add a log information here for saving success.

> +    except LibvirtAPI, e:
> +        logger.error("API error message: %s, error code is %s" % \
> +                      (e.response()['message'], e.response()['code']))
> +        logger.error("Error: fail to save %s domain" %guestname)
> +        return return_close(conn, logger, 1)
> +
> +    logger.info("check the ownership of %s after save" % SAVE_FILE)
> +    ret, uid, gid = ownership_get(logger)
> +    if use_nfs == '1':
> +        if uid == 107 and gid == 107:
> +            logger.info("As expected, the chown not change.")
> +            test_result = True
> +        else:
> +            logger.error("The chown of %s is %s:%s, it's not as expected" % \
> +                             (SAVE_FILE, uid, gid))
> +            return return_close(conn, logger, 1)
> +    else:
> +        if dynamic_ownership == '1':
> +            if uid == 0 and gid == 0:
> +                logger.info("As expected, the chown changed to root:root")
> +                test_result = True
> +            else:
> +                logger.error("The chown of %s is %s:%s, it's not as expected" % \
> +                             (SAVE_FILE, uid, gid))
> +                return return_close(conn, logger, 1)
> +        elif dynamic_ownership == '0':
> +            if uid == 107 and gid == 107:
> +                logger.info("As expected, the chown not change.")
> +                test_result = True
> +            else:
> +                logger.error("The chown of %s is %s:%s, it's not as expected" % \
> +                             (SAVE_FILE, uid, gid))
> +                return return_close(conn, logger, 1)
> +        else:
> +            logger.error("wrong dynamic_ownership value %s" % dynamic_ownership)
> +            return 1
> +

              Here , we still call return_close() to close the connection.

> +
> +    # restore domain from file
> +    logger.info("restore the domain from the file")
> +    try:
> +        domobj.restore(guestname, SAVE_FILE)
> +        logger.info("check the ownership of %s after restore" % SAVE_FILE)
> +        ret, uid, gid = ownership_get(logger)
> +        if uid == 107 and gid == 107:
> +            logger.info("As expected, the chown not change.")
> +            test_result = True
> +        else:
> +            logger.error("The chown of %s is %s:%s, not change back as expected" % \
> +                         (SAVE_FILE, uid, gid))
> +            test_result = False
> +    except LibvirtAPI, e:
> +        logger.error("API error message: %s, error code is %s" % \
> +                      (e.response()['message'], e.response()['code']))
> +        logger.error("Error: fail to restore %s domain" %guestname)
> +        test_result = False
> +
> +    if test_result:
> +        return return_close(conn, logger, 0)
> +    else:
> +        return return_close(conn, logger, 1)
> +
> +def ownership_test_clean(params):
> +    """clean testing environment"""
> +    logger = params['logger']
> +    use_nfs = params['use_nfs']
> +
> +    util = utils.Utils()
> +
> +    if use_nfs == '1':
> +        logger.info("umount the nfs path")
> +        umount_cmd = "umount /mnt"
> +        ret, out = util.exec_cmd(umount_cmd, shell=True)
> +        if ret:
> +            logger.error("Failed to mount the nfs path")
> +            for i in range(len(out)):
> +                logger.error(out[i])
> +
> +        logger.info("stop nfs service")
> +        cmd = "service nfs stop"
> +        ret, out = util.exec_cmd(cmd, shell=True)
> +        if ret:
> +            logger.error("Failed to stop nfs service")
> +            for i in range(len(out)):
> +                logger.error(out[i])
> +
> +        logger.info("clear the exports file")
> +        cmd = ">/etc/exports"
> +        if ret:
> +            logger.error("Failed to clear exports file")
> +
> +        filepath = TEMP_FILE
> +    else:
> +        filepath = SAVE_FILE
> +
> +    if os.path.exists(filepath):
> +        logger.info("remove dump file from save %s" % filepath)
> +        os.remove(filepath)
> +




More information about the libvir-list mailing list