xml_string = get_xml(os.path.join(outdir, build_id), name)
- data = {"image_xml": xml_string,
- "name": fields['name'],
- "project": fields.get('project', ''),
- "status": status,
- "url": os.path.join(fields.get('url_pub_base', ''),
- fields['repo_path'],
- fields['images_path'])
- }
+ url = os.path.join(fields.get('url_pub_base', ''),
+ fields['repo_path'], fields['images_path'])
# If the project is prerelease project, trigger the post-image-creation
if is_prerelease_project(fields.get('project', '')):
# Trigger info for post image creation job
+ data = {"image_xml": xml_string,
+ "name": fields['name'],
+ "project": fields.get('project', ''),
+ "status": status,
+ "url": url
+ }
+
trigger_next("POST-IMAGE-CREATION", data)
if status == 'success':
testable_images = re.compile(os.getenv("TESTABLE_IMAGES"))
if testable_images.match(fields["name"]):
- print "The target HW is supported and automated testing will follow."
- trigger_next("IMAGE-TESTING", data)
+ print ("The target HW is supported "
+ "and automated testing will follow.")
+ fields["image_xml"] = xml_string
+ fields["status"] = status
+ fields["url"] = url
+ trigger_next("IMAGE-TESTING", fields)
else:
print "However the target HW is NOT supported for automated testing."
return 0
--- /dev/null
+#!/usr/bin/env python
+
+"""Publish the test results to OBS"""
+
+import os
+import sys
+from common.buildservice import BuildService
+from common.buildtrigger import trigger_info
+
+
+
+def main():
+ """The main body"""
+
+ try:
+ api_url = os.getenv("OBS_API_URL")
+ api_username = os.getenv("OBS_API_USERNAME")
+ api_password = os.getenv("OBS_API_PASSWD")
+ fields = trigger_info(os.getenv("TRIGGER_INFO"))
+
+ project = fields["project"]
+ result = fields["test_result"]
+ name = fields["name"]
+ test_details = fields["test_details"]
+
+
+ build = BuildService(api_url, api_username, api_password)
+ info = build.get_info(str(project))
+ for i in range(len(info["images"])):
+ if info["images"][i]["name"] == name:
+ info["images"][i]["test_status"] = result
+ info["images"][i]["test_details"] = test_details
+ break
+ build.update_info(info, project)
+ except (TypeError) as error:
+ sys.exit("Error accessing OBS: " + str(error))
+
+
+if __name__ == "__main__":
+ sys.exit(main())
import glob
import tarfile
import subprocess
-from common.buildtrigger import trigger_info
+from lxml import etree
+from common.buildtrigger import trigger_info, trigger_next
def dump_result(outcome="TESTER_FAILURE", image="Not found"):
print output
result = "PASS"
print "All the tests succeeded."
- dump_result(result, image)
return result
def pack_results(results_folder):
else:
print "done."
+def xml_tree_to_dict(tree):
+ """Converts junit xml file to a dictionary"""
+ #pylint: disable=W0141
+ dic = {tree.tag : map(xml_tree_to_dict, tree.iterchildren())}
+ #pylint: enable=W0141
+ dic.update(('@' + k, v) for k, v in tree.attrib.iteritems())
+ dic['text'] = tree.text
+ return dic
+
+
+def get_test_dict(xml_file):
+ """Gets simplified list of test cases and their status"""
+ full_results = xml_tree_to_dict(etree.parse(xml_file).getroot())
+ dic = {}
+ for test in full_results["testsuite"]:
+ dic[test["@name"]] = 1 if test["testcase"] == [] else 0
+ return dic
+
+
def main():
"""The main body"""
# Note: the script, by design, will not return errors
# Rather, it will inject the error status in the environment
- content = trigger_info(os.getenv("TRIGGER_INFO"))
- url = content.get("url", "")
+ fields = trigger_info(os.getenv("TRIGGER_INFO"))
+ url = fields["url"]
image = fetch_image(url)
if not image:
return
- dump_result(test_image(image), image)
- pack_results(glob.glob("tztestrobot-results.*")[0])
+ result = test_image(image)
+ fields["test_result"] = result
+ dump_result(result, image)
+
+ results_folder = glob.glob("tztestrobot-results.*")
+
+ if results_folder != []:
+ results_folder = results_folder[0]
+ pack_results(results_folder)
+ fields["test_details"] = \
+ get_test_dict(results_folder + "/results.xml")
+ else:
+ fields["test_details"] = {}
+
+ trigger_next("RESULTS-PUBLISHING", fields)
if __name__ == "__main__":
sys.exit(main())
Requires: python-requests >= 2.0.1
Requires: python-snapdiff
Requires: python-yaml
+Requires: python-lxml
Requires: gbs-api
%description common
%{destdir}/job_local_cache_cleanups.py
%{destdir}/job_policycheck.py
%{destdir}/job_pre_release_obs.py
+%{destdir}/job_publish_test_results.py
%{destdir}/job_request.py
%{destdir}/job_test_build.py
%{destdir}/requests