#!/usr/bin/env python3
#
# Copyright (c) 2019, Linux Foundation
#
# SPDX-License-Identifier: GPL-2.0-only
#
import argparse
import os
import glob
import json
import subprocess
from jinja2 import Template
index_templpate = """
Index of autobuilder test results
Build |
Type |
Branch |
Report |
Buildhistory |
{% for entry in entries %}
{{entry[0]}} |
{% if entry[2] %} {{entry[2]}}{% endif %} |
{% if entry[4] %} {{entry[4]}}{% endif %} |
{% if entry[3] %}Report{% endif %} |
{% for bh in entry[5] %}
{{bh[1]}}
{% endfor %}
|
{% endfor %}
"""
def parse_args(argv=None):
"""Parse command line arguments"""
parser = argparse.ArgumentParser(
description="Generate an html index for a directory of autobuilder results",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('path', help='path to directory to index')
return parser.parse_args(argv)
args = parse_args()
path = os.path.abspath(args.path)
entries = []
def get_build_branch(p):
for root, dirs, files in os.walk(p):
for name in files:
if name == "testresults.json":
f = os.path.join(root, name)
with open(f, "r") as filedata:
data = json.load(filedata)
for build in data:
try:
return data[build]['configuration']['LAYERS']['meta']['branch']
except KeyError:
continue
return ""
# Pad so 20190601-1 becomes 20190601-000001 and sorts correctly
def keygen(k):
if "-" not in k:
return k
k1, k2 = k.split("-")
return k1 + "-" + k2.rjust(6, '0')
for build in sorted(os.listdir(path), key=keygen, reverse=True):
buildpath = os.path.join(path, build, "testresults")
if not os.path.exists(buildpath):
# No test results
continue
reldir = "./" + build + "/testresults/"
btype = "other"
files = os.listdir(buildpath)
if os.path.exists(buildpath + "/a-full"):
btype = "full"
elif os.path.exists(buildpath + "/a-quick"):
btype = "quick"
elif len(files) == 1:
btype = files[0]
testreport = ""
if os.path.exists(buildpath + "/testresult-report.txt"):
testreport = reldir + "testresult-report.txt"
elif btype.startswith("buildperf-"):
testreport = reldir + btype + "/" + os.path.basename(glob.glob(buildpath + "/" + btype + "/*.html")[0])
buildhistory = []
if os.path.exists(buildpath + "/qemux86-64/buildhistory.txt"):
buildhistory.append((reldir + "/qemux86-64/buildhistory.txt", "qemux86-64"))
if os.path.exists(buildpath + "/qemuarm/buildhistory.txt"):
buildhistory.append((reldir + "/qemuarm/buildhistory.txt", "qemuarm"))
branch = get_build_branch(buildpath)
entries.append((build, reldir, btype, testreport, branch, buildhistory))
# Also ensure we have saved out log data for ptest runs to aid debugging
if "ptest" in btype or btype in ["full", "quick"]:
for root, dirs, files in os.walk(buildpath):
for name in dirs:
if "ptest" in name:
f = os.path.join(root, name)
logs = glob.glob(f + "/*.log")
if logs:
continue
subprocess.check_call(["resulttool", "log", f, "--dump-ptest", f])
t = Template(index_templpate)
with open(os.path.join(path, "index.html"), 'w') as f:
f.write(t.render(entries = entries))