libvirt-cim-bounces@redhat.com wrote on 2008-08-07 03:28:37:

> # HG changeset patch
> # User Kaitlin Rupert <karupert@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@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@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@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@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)


       Do you think it's better to add distribution info in heading? Otherwise,
       +1 for me =)
 

> +    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())
>
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim@redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim