[libvirt] [test-API][PATCH 1/3] Remove API wrappers that have been flagged internal use

*lib/connectAPI.py --- lib/connectAPI.py | 108 ----------------------------------------------------- 1 files changed, 0 insertions(+), 108 deletions(-) diff --git a/lib/connectAPI.py b/lib/connectAPI.py index cfa4fea..9f2b728 100644 --- a/lib/connectAPI.py +++ b/lib/connectAPI.py @@ -248,114 +248,6 @@ class ConnectAPI(object): code = e.get_error_code() raise exception.LibvirtAPI(message, code) - def dispatch_domain_event_callback(self, dom, event, detail): - try: - return self.conn.dispatchDomainEventCallbacks(dom, event, detail) - except libvirt.libvirtError, e: - message = e.get_error_message() - code = e.get_error_code() - raise exception.LibvirtAPI(message, code) - - def dispatch_domain_event_generic_callback(self, dom, cbData): - try: - return self.conn.dispatchDomainEventGenericCallback(dom, cbData) - except libvirt.libvirtError, e: - message = e.get_error_message() - code = e.get_error_code() - raise exception.LibvirtAPI(message, code) - - def dispatch_domain_event_graphics_callback(self, - dom, - phase, - localAddr, - remoteAddr, - authScheme, - subject, - cbData): - try: - return self.conn.dispatchDomainEventGraphicsCallback(dom, - phase, - localAddr, - remoteAddr, - authScheme, - subject, - cbData) - except libvirt.libvirtError, e: - message = e.get_error_message() - code = e.get_error_code() - raise exception.LibvirtAPI(message, code) - - def dispatch_domain_event_IOError_callback(self, - dom, - srcPath, - devAlias, - action, - cbData): - try: - return self.conn.dispatchDomainEventIOErrorCallback(dom, - srcPath, - devAlias, - action, - cbData) - except libvirt.libvirtError, e: - message = e.get_error_message() - code = e.get_error_code() - raise exception.LibvirtAPI(message, code) - - def dispatch_domain_event_IOError_reason_callback(self, - dom, - srcPath, - devAlias, - action, - reason, - cbData): - try: - return self.conn.dispatchDomainEventIOErrorReasonCallback(dom, - srcPath, - devAlias, - action, - reason, - cbData) - except libvirt.libvirtError, e: - message = e.get_error_message() - code = e.get_error_code() - raise exception.LibvirtAPI(message, code) - - def dispatch_domain_event_lifecycle_callback(self, - dom, - event, - detail, - cbData): - try: - return self.conn.dispatchDomainEventLifecycleCallback(dom, - event, - detail, - cbData) - except libvirt.libvirtError, e: - message = e.get_error_message() - code = e.get_error_code() - raise exception.LibvirtAPI(message, code) - - def dispatch_domain_event_RTC_change_callback(self, dom, offset, cbData): - try: - return self.conn.dispatchDomainEventRTCChangeCallback(dom, - offset, - cbData) - except libvirt.libvirtError, e: - message = e.get_error_message() - code = e.get_error_code() - raise exception.LibvirtAPI(message, code) - - def dispatch_domain_event_watchdog_callback(self, dom, action, cbData): - try: - return self.conn.dispatchDomainEventWatchdogCallback(dom, - action, - cbData) - except libvirt.libvirtError, e: - message = e.get_error_message() - code = e.get_error_code() - raise exception.LibvirtAPI(message, code) - def domain_event_deregister(self, cb): try: return self.conn.domainEventDeregister(cb) -- 1.7.1

*lib/eventAPI.py --- lib/eventAPI.py | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 125 insertions(+), 0 deletions(-) create mode 100644 lib/eventAPI.py diff --git a/lib/eventAPI.py b/lib/eventAPI.py new file mode 100644 index 0000000..44edbcc --- /dev/null +++ b/lib/eventAPI.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python +# +# libvirt-test-API is copyright 2010 Red Hat, Inc. +# +# libvirt-test-API 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 of the License, or +# (at your option) any later version. This program is distributed in +# the hope that it will be useful, but WITHOUT ANY WARRANTY; without +# even the implied warranties of TITLE, NON-INFRINGEMENT, +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# The GPL text is available in the file COPYING that accompanies this +# distribution and at <http://www.gnu.org/licenses>. +# +# Summary: class event. +# Description: event operation. +# Maintainer: Guannan Ren <gren@redhat.com> +# Updated: Mon Aug 29, 2011 +# Version: 0.1.0 + +import sys +import os +import re + +import libvirt + +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)) + +import exception + +class EventAPI(object): + def __init__(self): + pass + + def register_default_impl(self): + try: + return libvirt.virEventRegisterDefaultImpl() + except libvirt.libvirtError, e: + message = e.get_error_message() + code = e.get_error_code() + raise exception.LibvirtAPI(message, code) + + def register_impl(self, addHandle, + updateHandle, + removeHandle, + addTimeout, + updateTimeout, + removeTimeout): + try: + return libvirt.virEventRegisterImpl(addHandle, + updateHandle, + removeHandle, + addTimeout, + updateTimeout, + removeTimeout) + except libvirt.libvirtError, e: + message = e.get_error_message() + code = e.get_error_code() + raise exception.LibvirtAPI(message, code) + + def add_handle(self, fd, events, cb, opaque): + try: + return libvirt.virEventAddHandle(fd, events, cb, opaque) + except libvirt.libvirtError, e: + message = e.get_error_message() + code = e.get_error_code() + raise exception.LibvirtAPI(message, code) + + def update_handle(self, watch, events): + try: + return libvirt.virEventUpdateHandle(watch, events) + except libvirt.libvirtError, e: + message = e.get_error_message() + code = e.get_error_code() + raise exception.LibvirtAPI(message, code) + + def remove_handle(self, watch): + try: + return libvirt.virEventRemoveHandle(watch) + except libvirt.libvirtError, e: + message = e.get_error_message() + code = e.get_error_code() + raise exception.LibvirtAPI(message, code) + + def add_timeout(self, timeout, cb, opaque): + try: + return libvirt.virEventAddTimeout(timeout, cb, opaque) + except libvirt.libvirtError, e: + message = e.get_error_message() + code = e.get_error_code() + raise exception.LibvirtAPI(message, code) + + def update_timeout(self, timer, timeout): + try: + return libvirt.virEventUpdateTimeout(timer, timeout) + except libvirt.libvirtError, e: + message = e.get_error_message() + code = e.get_error_code() + raise exception.LibvirtAPI(message, code) + + def remove_timeout(self, timer): + try: + return libvirt.virEventRemoveTimeout(timer) + except libvirt.libvirtError, e: + message = e.get_error_message() + code = e.get_error_code() + raise exception.LibvirtAPI(message, code) + + def run_default_impl(self): + try: + return libvirt.virEventRunDefaultImpl() + except libvirt.libvirtError, e: + message = e.get_error_message() + code = e.get_error_code() + raise exception.LibvirtAPI(message, code) -- 1.7.1

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@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

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@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
participants (2)
-
Alex Jia
-
Guannan Ren