diff --git a/openqa_trigger/report_job_results.py b/openqa_trigger/report_job_results.py index ef58fd7..483bf0a 100644 --- a/openqa_trigger/report_job_results.py +++ b/openqa_trigger/report_job_results.py @@ -1,9 +1,11 @@ import requests import argparse -import os +import sys import time import conf_test_suites +from operator import attrgetter +from wikitcms.wiki import Wiki, ResTuple API_ROOT = "http://localhost/api/v1" SLEEPTIME = 60 @@ -27,47 +29,53 @@ def get_passed_testcases(job_ids): if running_jobs: time.sleep(SLEEPTIME) - passed_testcases = {} # key = VERSION_BUILD_ARCH + passed_testcases = set() for job_id in job_ids: job = finished_jobs[job_id] if job['result'] =='passed': - key = (job['settings']['VERSION'], job['settings']['FLAVOR'], job['settings'].get('BUILD', None), job['settings']['ARCH']) - passed_testcases.setdefault(key, []) - passed_testcases[key].extend(conf_test_suites.TESTSUITES[job['settings']['TEST']]) + (release, milestone, compose) = job['settings']['BUILD'].split('_') + testsuite = job['settings']['TEST'] + arch = job['settings']['ARCH'] + flavor = job['settings']['FLAVOR'] - for key, value in passed_testcases.iteritems(): - passed_testcases[key] = sorted(list(set(value))) - return passed_testcases + for testcase in conf_test_suites.TESTSUITES[testsuite]: + # each 'testsuite' is a list using testcase names to indicate which Wikitcms tests have + # passed if this job passes. Each testcase name is the name of a dict in the TESTCASES + # dict-of-dicts which more precisely identifies the 'test instance' (when there is more + # than one for a testcase) and environment for which the result should be filed. + uniqueres = conf_test_suites.TESTCASES[testcase] + testname = '' + if 'name_cb' in uniqueres: + testname = uniqueres['name_cb'](flavor) + env = arch if uniqueres['env'] == '$RUNARCH$' else uniqueres['env'] + result = ResTuple( + testtype=uniqueres['type'], release=release, milestone=milestone, compose=compose, + testcase=testcase, section=uniqueres['section'], testname=testname, env=env, status='pass') + passed_testcases.add(result) + return sorted(list(passed_testcases), key=attrgetter('testcase')) -def get_relval_commands(passed_testcases): - relval_template = "relval report-auto" - commands = [] - for key in passed_testcases: - cmd_ = relval_template - version, flavor, build, arch = key - cmd_ += ' --release "%s" --milestone "%s" --compose "%s"' % tuple(build.split('_')) +def report_results(job_ids, printcases=False, report=True): + passed_testcases = get_passed_testcases(job_ids) + if printcases: + for restup in passed_testcases: + print(restup) - for tc_name in passed_testcases[key]: - testcase = conf_test_suites.TESTCASES[tc_name] - tc_env = arch if testcase['env'] == '$RUNARCH$' else testcase['env'] - tc_type = testcase['type'] - tc_section = testcase['section'] - if 'name_cb' in testcase: - tc_name = testcase['name_cb'](flavor) + if report: + print "Reporting test passes:" + wiki = Wiki() + wiki.login() + if not wiki.logged_in: + sys.exit("Could not log in to wiki!") - commands.append('%s --environment "%s" --testtype "%s" --section "%s" --testcase "%s" pass' % (cmd_, tc_env, tc_type, tc_section, tc_name)) - - return commands - - -def report_results(job_ids): - commands = get_relval_commands(get_passed_testcases(job_ids)) - print "Running relval commands:" - for command in commands: - print command - os.system(command) + # Submit the results + (insuffs, dupes) = wiki.report_validation_results(passed_testcases) + for dupe in dupes: + tmpl = "Already reported result for test {0}, env {1}! Will not report dupe." + print(tmpl.format(dupe.testcase, dupe.env)) + else: + print "\n\n### No reporting is done! ###\n\n" if __name__ == "__main__": parser = argparse.ArgumentParser(description="Evaluate per-testcase results from OpenQA job runs") @@ -75,17 +83,4 @@ if __name__ == "__main__": parser.add_argument('--report', default=False, action='store_true') args = parser.parse_args() - - passed_testcases = get_passed_testcases(args.jobs) - commands = get_relval_commands(passed_testcases) - - import pprint - pprint.pprint(passed_testcases) - if not args.report: - print "\n\n### No reporting is done! ###\n\n" - pprint.pprint(commands) - else: - for command in commands: - print command - os.system(command) - + report_results(args.jobs, printcases=True, report=args.report)