[Libvirt-cim] [PATCH 2 of 2] [TEST] Add test report generation

Kaitlin Rupert kaitlin at linux.vnet.ibm.com
Wed Aug 6 19:28:37 UTC 2008


# HG changeset patch
# User Kaitlin Rupert <karupert at us.ibm.com>
# Date 1213136844 25200
# Node ID 723430f4ceb0770b1a133c6babfc4fd63c17f7a5
# Parent  63757929dd9a15671ae59fb54b89121bbc93d50d
[TEST] Add test report generation.

Using the --report option, you can generate a report and have it mailed to the address supplied.

How to call using the report option:

./runtests libvirt-cim -i localhost -c -d -v LXC -g VirtualSystemManagementService -t 01_definesystem_name.py --report <my_to_addr at test.com>

The user will need to create a .cimtestrc file in their home directory in the following format:

[email]
relay = my.mail.relay.com
from = Joe User <joe at test.com>

Will need to add revision number support to cimtest and then add the cimtest revision number to the report.

Signed-off-by: Kaitlin Rupert <karupert at us.ibm.com>

diff -r 63757929dd9a -r 723430f4ceb0 suites/libvirt-cim/main.py
--- a/suites/libvirt-cim/main.py	Tue Jun 10 15:27:24 2008 -0700
+++ b/suites/libvirt-cim/main.py	Tue Jun 10 15:27:24 2008 -0700
@@ -25,6 +25,8 @@
 from optparse import OptionParser
 import os
 import sys
+import smtplib
+from time import gmtime, strftime
 from pywbem import WBEMConnection
 sys.path.append('../../lib')
 import TestSuite
@@ -35,6 +37,7 @@
 from CimTest.Globals import platform_sup
 sys.path.append('./lib')
 from XenKvmLib.classes import get_typed_class
+import ConfigParser
 
 parser = OptionParser()
 parser.add_option("-i", "--ip", dest="ip", default="localhost",
@@ -54,8 +57,11 @@
                   help="Virt type, select from 'Xen' & 'KVM' & 'XenFV' & 'LXC'(default: Xen). ")
 parser.add_option("-d", "--debug-output", action="store_true", dest="debug",
                   help="Duplicate the output to stderr")
+parser.add_option("--report", dest="report",
+                  help="Send report using mail info: --report=<recipient addr>")
 
 TEST_SUITE = 'cimtest'
+CIMTEST_RCFILE = '%s/.cimtestrc' % os.environ['HOME']
 
 def set_python_path():
     previous_pypath = os.environ.get('PYTHONPATH')
@@ -82,6 +88,28 @@
 
     print "Cleaned log files."
 
+def get_rcfile_vals():
+    if not os.access(CIMTEST_RCFILE, os.R_OK):
+        print "\nCould not access the %s file for this user." % CIMTEST_RCFILE
+        print "Create this file and add the appropriate relay:"
+        print "\tfrom = me at isp.com\n\trelay = my.relay\n"
+        return None, None
+
+    try:
+        conf = ConfigParser.ConfigParser()
+        if not conf.read(CIMTEST_RCFILE):
+            return None, None
+
+        addr = conf.get("email", "from")
+        relay = conf.get("email", "relay")
+
+    except Exception, details:
+        print "\n%s" % details 
+        print "\nPlease verify the format of the %s file\n" % CIMTEST_RCFILE 
+        return None, None
+
+    return addr, relay
+
 def get_version(virt, ip):
     conn = WBEMConnection('http://%s' % ip, 
                           (os.getenv('CIM_USER'), os.getenv('CIM_PASS')),
@@ -99,9 +127,139 @@
         changeset = 'Unknown'
     return revision, changeset
 
+def get_cmd_val(cmd, ip):
+    rc, out = utils.run_remote(ip, cmd)
+    if rc != 0:
+        return "Unknown"
+    return out
+
+def get_env_data(rev, changeset, ip):
+    distro = get_cmd_val("cat /etc/issue | awk 'NR<=1'", ip)
+    kernel_ver = get_cmd_val("uname -r", ip)
+   
+    libvirt_ver = "Unknown"
+    hyp_ver = "Unknown"
+    cmd = "virsh version"
+    virsh_ver = get_cmd_val(cmd, ip)
+    if virsh_ver != "Unknown":
+        if len(virsh_ver.splitlines()) == 4:
+            if virsh_ver.splitlines()[0].find("libvir"):
+                libvirt_ver = virsh_ver.splitlines()[0].split()[4]
+
+            if virsh_ver.splitlines()[3].find("hypervisor"):
+                hyp_ver = virsh_ver.splitlines()[3].split("hypervisor")[1]
+                hyp_ver = hyp_ver.split(": ")[1]
+            
+    cimom = get_cmd_val("ps -ef | grep cimserver | grep -v grep", ip)
+    if cimom != "Unknown":
+        cimom = "Pegasus"
+    else:
+        cimom = get_cmd_val("ps -ef | grep sfcb | grep -v grep", ip)
+        if cimom != "Unknown":
+            cimom = "sfcb"
+
+    if cimom == "Pegasus":
+        cimom_ver = get_cmd_val("cimserver -v", ip)
+    elif cimom == "sfcb":
+        cimom_ver = get_cmd_val("sfcbd -v", ip)
+    else:
+        cimom_ver = "unknown version"
+
+    env = "Distro: %s\nKernel: %s\nlibvirt: %s\nHypervisor: %s\nCIMOM: %s %s\n"\
+          % (distro, kernel_ver, libvirt_ver, hyp_ver, cimom, cimom_ver)
+
+    lc_ver = "Libvirt-cim revision: %s\nLibvirt-cim changeset: %s\n" % \
+             (rev, changeset)
+
+    return env + lc_ver
+
+def build_report(run_output, rev, changeset, virt, ip):
+    rvals = { 'PASS' : 0,
+              'FAIL' : 0,
+              'XFAIL' : 0,
+              'SKIP' : 0,
+            }
+
+    tstr = { 'PASS' : "",
+             'FAIL' : "",
+             'XFAIL' : "",
+             'SKIP' : "",
+           }
+                 
+    date = strftime("%b %d %Y", gmtime())
+
+    heading  = "%s Test Run Summary %s" % (virt, date)
+    sys_env = get_env_data(rev, changeset, ip)
+
+    divider = "=================================================\n" 
+
+    for line in run_output.splitlines():
+        for type, val in rvals.iteritems():
+            if type in line:
+                if type == "FAIL" and "py: FAIL" not in line:
+                    continue 
+                rvals[type] += 1
+                tstr[type] += "%s\n" % line
+
+    results = ""
+    test_total = 0
+    for type, val in rvals.iteritems():
+        results += " %s:\t%d\n" % (type, val) 
+        test_total += val
+
+    results_total  = " -----------------\n Total:\t%d\n" % test_total 
+
+    test_block = ""
+    for type, str in tstr.iteritems():
+        if type == "PASS" or str == "":
+            continue
+        test_block += "%s Test Summary:\n%s\n%s" % (type, str, divider)
+
+    report = divider + heading + "\n" + divider + sys_env + divider + results \
+             + results_total + divider + test_block + "Full report:\n" \
+             + run_output
+
+    return report, heading 
+
+def gen_report(rev, changeset, virt, ip, log_file):
+    fd = open(log_file, "r")
+    run_results = fd.read()
+    fd.close()
+
+    msg_body, heading = build_report(run_results, rev, changeset, virt, ip)
+
+    fd = open(log_file, "w")
+    rc = fd.write(msg_body)
+    if rc is not None:
+        print "Error %s writing report to: %s." % (rc, log_file)
+    fd.close()
+
+    return msg_body, heading
+
+def send_report(to_addr, from_addr, relay, report, heading):
+    headers = "From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (from_addr, to_addr,
+              heading)
+
+    message = headers + report
+
+    try:
+        server = smtplib.SMTP(relay)
+        result = server.sendmail(to_addr, from_addr, message)
+        server.quit()
+
+        if result:
+            for recip in result.keys():
+                print "Could not deliver mail to: %s" % recip
+
+    except Exception, details:
+        print "Encountered a problem mailing report: %s" % details
+
 def main():
     (options, args) = parser.parse_args()
-
+    to_addr = None
+    from_addr = None
+    relay = None
+    div = "--------------------------------------------------------------------"
 
     if options.test and not options.group:
         parser.print_help()
@@ -114,7 +272,15 @@
         os.environ['CIMOM_PORT'] = str(options.port)
     #
 
-    testsuite = TestSuite.TestSuite()
+    if options.report:
+        from_addr, relay = get_rcfile_vals()
+
+        if from_addr == None or relay == None:
+            return 1
+         
+        to_addr = options.report
+
+    testsuite = TestSuite.TestSuite(log=True)
    
     set_python_path()
 
@@ -139,9 +305,10 @@
 
     revision, changeset = get_version(options.virt, options.ip)
 
-    print "Testing " + options.virt + " hypervisor"
+    print "\nTesting " + options.virt + " hypervisor"
 
-    for test in test_list:
+    for test in test_list: 
+        testsuite.debug(div) 
         t_path = os.path.join(TEST_SUITE, test['group'])
         os.environ['CIM_TC'] = test['test'] 
         cdto = 'cd %s' % t_path
@@ -155,7 +322,16 @@
 
         testsuite.print_results(test['group'], test['test'], os_status)
 
+    testsuite.debug("%s\n" % div) 
     testsuite.finish()
+
+    msg_body, heading = gen_report(revision, changeset, options.virt,
+                                   options.ip, testsuite.log_file)
+
+    if options.report:
+        print "Sending mail from %s to %s using %s relay.\n" % \
+              (from_addr, to_addr, relay)
+        send_report(to_addr, from_addr, relay, msg_body, heading)
 
 if __name__ == '__main__':
     sys.exit(main())




More information about the Libvirt-cim mailing list