[libvirt] [test-API][PATCH 3/3] Add domain event handler testcase into domain testing directory

Alex Jia ajia at redhat.com
Wed Aug 31 03:23:54 UTC 2011


On 08/30/2011 04:10 PM, Guannan Ren wrote:
> This testcase is for domain event: shutdown, start, suspend, resume
> testing.
> ---
>   repos/domain/eventhandler.py |  287 ++++++++++++++++++++++++++++++++++++++++++
>   1 files changed, 287 insertions(+), 0 deletions(-)
>   create mode 100644 repos/domain/eventhandler.py
>
> diff --git a/repos/domain/eventhandler.py b/repos/domain/eventhandler.py
> new file mode 100644
> index 0000000..cdbba90
> --- /dev/null
> +++ b/repos/domain/eventhandler.py
> @@ -0,0 +1,287 @@
> +#!/usr/bin/env python
> +""" To test domain event handler feature through operating a certain
> +    guest then, do the checking.
> +    domain:eventhandler
> +        guestname
> +            xxx
> +"""
> +
> +__author__ = 'Guannan Ren: gren at redhat.com'
> +__date__ = 'Mon Aug 29, 2011'
> +__version__ = '0.1.0'
> +__credits__ = 'Copyright (C) 2011 Red Hat, Inc.'
> +__all__ = ['eventhandler', 'lifecycle_callback', 'loop_start',
> +           'loop_stop', 'shutdown_event', 'bootup_event',
> +           'suspend_event', 'resume_event']
> +
> +import os
> +import re
> +import sys
> +import time
> +import threading
> +
> +def append_path(path):
> +    """Append root path of package"""
> +    if path in sys.path:
> +        pass
> +    else:
> +        sys.path.append(path)
> +
> +pwd = os.getcwd()
> +result = re.search('(.*)libvirt-test-API', pwd)
> +append_path(result.group(0))
> +
> +from lib import connectAPI
> +from lib import eventAPI
> +from lib import domainAPI
> +from utils.Python import utils
> +from exception import LibvirtAPI
> +
> +LoopThread = None
> +looping = True
> +STATE = None
> +
> +def eventToString(event):
Missing docstring.
> +    eventStrings = ( "Defined",
> +                     "Undefined",
> +                     "Started",
> +                     "Suspended",
> +                     "Resumed",
> +                     "Stopped" );
Unnecessary semicolon.
> +    return eventStrings[event];
Unnecessary semicolon.
> +
> +def detailToString(event, detail):
Missing docstring.
> +    eventStrings = (
> +        ( "Added", "Updated" ),
> +        ( "Removed" ),
> +        ( "Booted", "Migrated", "Restored", "Snapshot" ),
> +        ( "Paused", "Migrated", "IOError", "Watchdog" ),
> +        ( "Unpaused", "Migrated"),
> +        ( "Shutdown", "Destroyed", "Crashed", "Migrated", "Saved", "Failed", "Snapshot")
> +        )
> +    return eventStrings[event][detail]
> +
> +def check_params(params):
> +    """check out the arguments requried for testing"""
> +    logger = params['logger']
> +    keys = ['guestname']
> +    for key in keys:
> +        if key not in params:
> +            logger.error("Argument %s is required" % key)
> +            return 1
> +    return 0
> +
> +def check_domain_running(domobj, guestname, logger):
> +    """ check if the domain exists, may or may not be active """
> +    guest_names = domobj.get_list()
> +
> +    if guestname not in guest_names:
> +        logger.error("%s doesn't exist or not running" % guestname)
> +        return 1
> +    else:
> +        return 0
> +
> +def loop_run(eventobj):
Missing docstring.
> +    global looping
> +    while looping:
Using global for 'looping' but no assignment is done.
> +        eventobj.run_default_impl()
> +
> +    return 0
> +
> +def loop_stop(conn):
> +    """stop event thread and deregister domain callback function"""
> +    global looping
> +    global LoopThread
> +    looping = False
> +    conn.domain_event_deregister(lifecycle_callback)
> +    LoopThread.join()
> +
> +def loop_start(eventobj):
> +    """start running default event handler implementation"""
> +    global LoopThread
> +    eventobj.register_default_impl()
> +    loop_run_arg = (eventobj,)
> +    LoopThread = threading.Thread(target=loop_run, args=loop_run_arg, name="libvirtEventLoop")
> +    LoopThread.setDaemon(True)
> +    LoopThread.start()
> +
> +def lifecycle_callback(conn, domain, event, detail, opaque):
Unused argument 'conn'.
> +    """domain lifecycle callback function"""
> +    global STATE
> +    logger = opaque
> +    logger.debug("lifecycle_callback EVENT: Domain %s(%s) %s %s" % (domain.name(), domain.ID(),
> +                                                             eventToString(event),
> +                                                             detailToString(event, detail)))
> +    STATE = eventToString(event)
> +
> +def shutdown_event(domobj, guestname, timeout, logger):
> +    """shutdown the guest, then check the event infomation"""
> +    global STATE
> +    STATE = None
> +    logger.info("power off %s" % guestname)
> +    try:
> +        domobj.shutdown(guestname)
> +    except LibvirtAPI, e:
> +        logger.error("API error message: %s, error code is %s" %
> +                      (e.response()['message'], e.response()['code']))
> +        logger.error("Error: fail to power off %s" % guestname)
> +        return 1
> +
> +    while timeout:
> +        if STATE == "Stopped":
> +            logger.info("The event is Stopped, PASS")
> +            break
> +        elif STATE != None:
> +            logger.error("The event is %s, FAIL", STATE)
> +            break
> +        else:
> +            timeout -= 5
> +            time.sleep(5)
> +
> +    if timeout<= 0:
> +        logger.error("Timeout! The event is %s" % STATE)
> +        return 1
> +
> +    return 0
> +
> +def bootup_event(domobj, guestname, timeout, logger):
> +    """bootup the guest, then check the event infomation"""
> +    global STATE
> +    STATE = None
> +    logger.info("boot up guest %s" % guestname)
> +    try:
> +        domobj.start(guestname)
> +    except LibvirtAPI, e:
> +        logger.error("API error message: %s, error code is %s" %
> +                      (e.response()['message'], e.response()['code']))
> +        logger.error("Error: fail to bootup %s " % guestname)
> +        return 1
> +
> +    while timeout:
> +        if STATE == "Started":
> +            logger.info("The event is Started, PASS")
> +            break
> +        elif STATE != None:
> +            logger.error("The event is %s, FAIL", STATE)
> +            break
> +        else:
> +            timeout -= 5
> +            time.sleep(5)
> +
> +    if timeout<= 0:
> +        logger.error("Timeout! The event is %s" % STATE)
> +        return 1
> +
> +    return 0
> +
> +def suspend_event(domobj, guestname, timeout, logger):
> +    """suspend the guest, then check the event infomation"""
> +    global STATE
> +    STATE = None
> +    logger.info("suspend guest %s" % guestname)
> +    try:
> +        domobj.suspend(guestname)
> +    except LibvirtAPI, e:
> +        logger.error("API error message: %s, error code is %s" %
> +                      (e.response()['message'], e.response()['code']))
> +        logger.error("Error: fail to suspend %s" % guestname)
> +        return 1
> +
> +    while timeout:
> +        if STATE == "Suspended":
> +            logger.info("The event is Suspended, PASS")
> +            break
> +        elif STATE != None:
> +            logger.error("The event is %s, FAIL", STATE)
> +            break
> +        else:
> +            timeout -= 5
> +            time.sleep(5)
> +
> +    if timeout<= 0:
> +        logger.error("Timeout! The event is %s" % STATE)
> +        return 1
> +
> +    return 0
> +
> +def resume_event(domobj, guestname, timeout, logger):
> +    """resume the guest, then check the event infomation"""
> +    global STATE
> +    STATE = None
> +    logger.info("resume guest %s" % guestname)
> +    try:
> +        domobj.resume(guestname)
> +    except LibvirtAPI, e:
> +        logger.error("API error message: %s, error code is %s" %
> +                      (e.response()['message'], e.response()['code']))
> +        logger.error("Error: fail to resume %s" % guestname)
> +        return 1
> +
> +    while timeout:
> +        if STATE == "Resumed":
> +            logger.info("The event is Resumed, PASS")
> +            break
> +        elif STATE != None:
> +            logger.error("The event is %s, FAIL", STATE)
> +            break
> +        else:
> +            timeout -= 5
> +            time.sleep(5)
> +
> +    if timeout<= 0:
> +        logger.error("Timeout! The event is %s" % STATE)
> +        return 1
> +
> +    return 0
> +
> +def eventhandler(params):
> +    """ perform basic operation for a domain, then checking the result
> +        by using domain event handler.
> +    """
> +    logger = params['logger']
> +    params_check_result = check_params(params)
> +    if params_check_result:
> +        return 1
> +
> +    guestname = params['guestname']
> +    logger.info("the guestname is %s" % guestname)
> +
> +    eventobj = eventAPI.EventAPI()
> +    loop_start(eventobj)
> +
> +    # Connect to local hypervisor connection URI
> +    util = utils.Utils()
> +    uri = util.get_uri('127.0.0.1')
> +    conn = connectAPI.ConnectAPI()
> +
> +    virconn = conn.open(uri)
> +
> +    logger.info("the uri is %s" % uri)
> +    domobj = domainAPI.DomainAPI(virconn)
> +
> +    if check_domain_running(domobj, guestname, logger):
> +        conn.close()
> +        return 1
> +
> +    conn.domain_event_register(lifecycle_callback, logger)
> +
> +    timeout = 600
> +    if shutdown_event(domobj, guestname, timeout, logger):
> +        logger.warn("shutdown_event error")
> +
> +    if bootup_event(domobj, guestname, timeout, logger):
> +        logger.warn("bootup_event error")
> +
> +    if suspend_event(domobj, guestname, timeout, logger):
> +        logger.warn("suspend_event error")
> +
> +    if resume_event(domobj, guestname, timeout, logger):
> +        logger.warn("resume_event error")
> +
> +    loop_stop(conn)
> +    conn.close()
> +    return 0
> +
> +def eventhandler_clean(params):
> +    """cleanup the testing environment"""
> +    pass
In addition, some lines too long and are more than 80 characters.


Alex




More information about the libvir-list mailing list