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

Guannan Ren gren at redhat.com
Tue Aug 30 08:10:39 UTC 2011


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):
+    eventStrings = ( "Defined",
+                     "Undefined",
+                     "Started",
+                     "Suspended",
+                     "Resumed",
+                     "Stopped" );
+    return eventStrings[event];
+
+def detailToString(event, detail):
+    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):
+    global looping
+    while looping:
+        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):
+    """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
-- 
1.7.1




More information about the libvir-list mailing list