libvirt-cim-bounces(a)redhat.com wrote on 2008-08-01 07:24:23:
# HG changeset patch
# User Kaitlin Rupert <karupert(a)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(a)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(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvirt-cim