libvirt-cim-bounces@redhat.com wrote on 2008-08-01
07:24:23:
> # HG changeset patch
> # User Kaitlin Rupert <karupert@us.ibm.com>
> # Date 1217543970 25200
> # Node ID a0f1042dd8dd0b685aa755e1cedbbd7cdd71bbfc
> # Parent 837943c970641071e55637386d9ac30df5d41e4b
> [TEST] Modify CSI test to support modified and deleted indications.
>
> This may fail on KVM with the following error message:
> "CIM_ERR_FAILED: Invalid state transition." Will follow
up on this issue.
Yup, I run it on KVM, and below is the detail
error message:
ComputerSystemIndication - 01_created_indication.py:
FAIL
ERROR - Exception: (1, u'CIM_ERR_FAILED:
Invalid state transition')
ERROR - Failed to start domain: domU
InvokeMethod(RequestStateChange): CIM_ERR_FAILED:
Invalid state transition
>
> Signed-off-by: Kaitlin Rupert <karupert@us.ibm.com>
>
> diff -r 837943c97064 -r a0f1042dd8dd suites/libvirt-
> cim/cimtest/ComputerSystemIndication/01_created_indication.py
> --- a/suites/libvirt-
> cim/cimtest/ComputerSystemIndication/01_created_indication.py
Thu
> Jul 31 15:35:35 2008 -0700
> +++ b/suites/libvirt-
> cim/cimtest/ComputerSystemIndication/01_created_indication.py
Thu
> Jul 31 15:39:30 2008 -0700
> @@ -24,91 +24,163 @@
> import os
> import signal
> import time
> +from pywbem.cim_obj import CIMInstanceName
> from CimTest.Globals import logger
> from CimTest.Globals import do_main
> from CimTest.ReturnCodes import PASS, FAIL
> -from XenKvmLib.common_util import create_using_definesystem
> -from XenKvmLib.test_doms import undefine_test_domain
> +from XenKvmLib.common_util import create_using_definesystem, \
> +
call_request_state_change
> +from XenKvmLib.test_doms import destroy_and_undefine_domain
> from XenKvmLib.classes import get_typed_class
> from XenKvmLib.indication_tester import CIMIndicationSubscription
> from XenKvmLib.vxml import set_default
> +from XenKvmLib.vsms import get_vsms_class
>
> SUPPORTED_TYPES = ['Xen', 'XenFV', 'KVM']
>
> test_dom = "domU"
> +REQ_STATE = 2
> +TIME = "00000000000000.000000:000"
> +
> +def sub_ind(ip, virt):
> + dict = set_default(ip)
> + ind_names = {"define" : 'ComputerSystemCreatedIndication',
> + "start"
: 'ComputerSystemModifiedIndication',
> + "destroy"
: 'ComputerSystemDeletedIndication'
> + }
> +
> + sub_list = {}
> + port = 5
> +
> + for ind, iname in ind_names.iteritems():
> + ind_name = get_typed_class(virt, iname)
> +
> + sub_name = "Test%s" % ind_name
It's better to insert a whitespace
here.
> + port += 1
> +
> + sub = CIMIndicationSubscription(sub_name,
ind_name,
> +
dict['default_ns'],
> +
dict['default_print_ind'],
> +
dict['default_sysname'],
> +
port)
> + sub.subscribe(dict['default_url'], dict['default_auth'])
> + logger.info("Watching for %s"
% iname)
> + ind_names[ind] = ind_name
> + sub_list[ind] = sub
> +
> + return sub_list, ind_names, dict
> +
> +def gen_ind(test_dom, ip, vtype, ind):
> + if ind == "define":
> + return create_using_definesystem(test_dom,
ip, virt=vtype)
Do you have to check the return status
of create_using_definesystem() function here?
> +
> + elif ind == "start":
> + rc = call_request_state_change(test_dom,
ip, REQ_STATE, TIME, vtype)
> + if rc != 0:
> + logger.error("Failed
to start domain: %s" % test_dom)
> + return FAIL
> + return PASS
> +
> + elif ind == "destroy":
> + service = get_vsms_class(vtype)(ip)
> + try:
> + classname = get_typed_class(vtype,
'ComputerSystem')
> + cs_ref = CIMInstanceName(classname,
keybindings = {
> +
'Name':test_dom,
> +
'CreationClassName':classname})
> + service.DestroySystem(AffectedSystem=cs_ref)
> + except Exception, details:
> + logger.error('Unknow exception
happened')
> + logger.error(details)
> + return FAIL
> + return PASS
> +
> + return FAIL
> +
> +def handle_request(sub, ind_name):
> + sub.server.handle_request()
> + if len(sub.server.indications) == 0:
> + logger.error("No valid indications
received")
> + return FAIL
> + elif str(sub.server.indications[0]) != ind_name:
> + logger.error("Received indication
%s instead of %s" % \
> +
(str(sub.server.indications[0])), ind_name)
> + return FAIL
> +
> + return PASS
> +
> +def poll_for_ind(pid):
> + for i in range(0, 20):
> + pw = os.waitpid(pid, os.WNOHANG)
> +
> + # If pid exits, waitpid returns [pid,
return_code]
> + # If pid is still running, waitpid returns
[0, 0]
> + # Only return a success if waitpid returns
the expected pid
> + # and the return code is 0.
> + if pw[0] == pid and pw[1] == 0:
> + logger.info("Great,
got indication successfuly")
> + status = PASS
> + break
> + elif pw[1] == 0 and i < 19:
> + if i % 10 == 0:
> + logger.info("In
child process, waiting for indication")
> + time.sleep(1)
> + else:
> + # Time is up and waitpid
never returned the expected pid
> + if pw[0] != pid:
> + logger.error("Waited
too long for indication")
> + os.kill(pid,
signal.SIGKILL)
> + else:
> + logger.error("Received
indication error: %d" % pw[1])
> +
> + status = FAIL
> + break
> +
> + return status
>
> @do_main(SUPPORTED_TYPES)
> def main():
> options = main.options
> status = FAIL
>
> - dict = set_default(options.ip)
> - indication_name = get_typed_class(options.virt,
> -
'ComputerSystemCreatedIndication')
> -
> - sub = CIMIndicationSubscription(dict['default_name'],
indication_name,
> -
dict['default_ns'],
> -
dict['default_print_ind'],
> -
dict['default_sysname'])
> - sub.subscribe(dict['default_url'], dict['default_auth'])
> - logger.info("Watching for %s" % indication_name)
> -
> - try:
> - pid = os.fork()
> - if pid == 0:
> - sub.server.handle_request()
> - if len(sub.server.indications)
== 0:
> - logger.error("No
valid indications received")
> - os._exit(1)
> - elif str(sub.server.indications[0])
!= indication_name:
> - logger.error("Received
indication %s instead of %s" % \
> -
(indication_name, str(sub.server.
> indications[0])))
> - os._exit(2)
> + sub_list, ind_names, dict = sub_ind(options.ip, options.virt)
> +
> + ind_list = ["define", "start",
"destroy"]
> +
> + for ind in ind_list:
> + sub = sub_list[ind]
> + ind_name = ind_names[ind]
> +
> + try:
> + pid = os.fork()
> + if pid == 0:
> + status =
handle_request(sub, ind_name)
> + if status
!= PASS:
> + os._exit(1)
> +
> + os._exit(0)
> else:
> - os._exit(0)
> - else:
> - status = create_using_definesystem(test_dom,
options.
> ip, None, None,
> -
options.virt)
> - if status != PASS:
> - sub.unsubscribe(dict['default_auth'])
> - logger.info("Cancelling
subscription for %s" %
> indication_name)
> - os.kill(pid,
signal.SIGKILL)
> - return status
> + try:
> + status
= gen_ind(test_dom, options.ip, options.virt, ind)
> + if
status != PASS:
> +
os.kill(pid, signal.SIGKILL)
> +
return FAIL
>
> - status = FAIL
> - for i in range(0,100):
> - pw = os.waitpid(pid,
os.WNOHANG)
> + status
= poll_for_ind(pid)
> + except Exception,
details:
> + logger.error("Exception:
%s" % details)
> + os.kill(pid,
signal.SIGKILL)
> + return
FAIL
>
> - # If pid
exits, waitpid returns [pid, return_code]
> - # If pid
is still running, waitpid returns [0, 0]
> - # Only return
a success if waitpid returns the expected pid
> - # and the
return code is 0.
> - if pw[0]
== pid and pw[1] == 0:
> - logger.info("Great,
got indication successfuly")
> - status
= PASS
> - break
> - elif pw[1]
== 0 and i < 99:
> - if
i % 10 == 0:
> -
logger.info("In child process, waiting for
> indication")
> - time.sleep(1)
> - else:
> - status
= FAIL
> -
> - #
Time is up and waitpid never returned the expected pid
> - if
pw[0] != pid:
> -
logger.error("Waited too long for indication")
> -
os.kill(pid, signal.SIGKILL)
> - else:
> -
logger.error("Received indication error: %d" % pw[1])
> - break
> + except Exception, details:
> + logger.error("Exception:
%s" % details)
> + return FAIL
>
> - except Exception, details:
> - logger.error("Unknown
exception happened")
> - logger.error(details)
> -
> - sub.unsubscribe(dict['default_auth'])
> - logger.info("Cancelling subscription for %s"
% indication_name)
> - undefine_test_domain(test_dom, options.ip, options.virt)
> + for ind, sub in sub_list.iteritems():
> + sub.unsubscribe(dict['default_auth'])
> + logger.info("Cancelling subscription
for %s" % ind_names[ind])
> +
> + destroy_and_undefine_domain(test_dom, options.ip, options.virt)
>
> return status
>
>
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim@redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim