[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