Add direct log link to excuses

If we have a result, directly link to the log file on swift in excuses.html.
The architecture name still leads to the package history as before.
If result is still pending, link to the "running tests" page instead.
This commit is contained in:
Martin Pitt 2015-12-14 16:57:19 +01:00
parent 123eb43320
commit a4f3abacad
4 changed files with 33 additions and 18 deletions

View File

@ -78,6 +78,10 @@ class AutoPackageTest(object):
self.test_results = {}
self.results_cache_file = os.path.join(self.test_state_dir, 'results.cache')
self.swift_container = 'autopkgtest-' + self.series
if self.britney.options.adt_ppas:
self.swift_container += '-' + self.britney.options.adt_ppas[-1].replace('/', '-')
# read the cached results that we collected so far
if os.path.exists(self.results_cache_file):
with open(self.results_cache_file) as f:
@ -321,10 +325,7 @@ class AutoPackageTest(object):
query['marker'] = query['prefix'] + latest_run_id
# request new results from swift
container = 'autopkgtest-' + self.series
if self.britney.options.adt_ppas:
container += '-' + self.britney.options.adt_ppas[-1].replace('/', '-')
url = os.path.join(swift_url, container)
url = os.path.join(swift_url, self.swift_container)
url += '?' + urllib.parse.urlencode(query)
try:
f = urlopen(url)
@ -344,7 +345,7 @@ class AutoPackageTest(object):
for p in result_paths:
self.fetch_one_result(
os.path.join(swift_url, container, p, 'result.tar'), src, arch)
os.path.join(swift_url, self.swift_container, p, 'result.tar'), src, arch)
fetch_swift_results._done = set()
@ -542,7 +543,8 @@ class AutoPackageTest(object):
def results(self, trigsrc, trigver):
'''Return test results for triggering package
Return (passed, src, ver, arch -> ALWAYSFAIL|PASS|REGRESSION|RUNNING|RUNNING-ALWAYSFAIL)
Return (passed, src, ver, arch ->
(ALWAYSFAIL|PASS|REGRESSION|RUNNING|RUNNING-ALWAYSFAIL, log_url))
iterable for all package tests that got triggered by trigsrc/trigver.
'''
# (src, ver) -> arch -> ALWAYSFAIL|PASS|REGRESSION|RUNNING|RUNNING-ALWAYSFAIL
@ -552,12 +554,14 @@ class AutoPackageTest(object):
for arch in self.britney.options.adt_arches:
for testsrc, testver in self.tests_for_source(trigsrc, trigver, arch):
ever_passed = self.check_ever_passed(testsrc, arch)
url = None
# Do we have a result already? (possibly for an older or newer
# version, that's okay)
try:
r = self.test_results[trigger][testsrc][arch]
testver = r[1]
run_id = r[2]
if r[0]:
result = 'PASS'
else:
@ -570,10 +574,19 @@ class AutoPackageTest(object):
ever_passed = False
result = ever_passed and 'REGRESSION' or 'ALWAYSFAIL'
url = os.path.join(self.britney.options.adt_swift_url,
self.swift_container,
self.series,
arch,
srchash(testsrc),
testsrc,
run_id,
'log.gz')
except KeyError:
# no result for testsrc/arch; still running?
if arch in self.pending_tests.get(trigger, {}).get(testsrc, []):
result = ever_passed and 'RUNNING' or 'RUNNING-ALWAYSFAIL'
url = 'http://autopkgtest.ubuntu.com/running.shtml'
else:
# ignore if adt or swift results are disabled,
# otherwise this is unexpected
@ -582,9 +595,9 @@ class AutoPackageTest(object):
raise RuntimeError('Result for %s/%s/%s (triggered by %s) is neither known nor pending!' %
(testsrc, testver, arch, trigger))
pkg_arch_result.setdefault((testsrc, testver), {})[arch] = result
pkg_arch_result.setdefault((testsrc, testver), {})[arch] = (result, url)
for ((testsrc, testver), arch_results) in pkg_arch_result.items():
r = arch_results.values()
r = [v[0] for v in arch_results.values()]
passed = 'REGRESSION' not in r and 'RUNNING' not in r
yield (passed, testsrc, testver, arch_results)

View File

@ -1962,11 +1962,11 @@ class Britney(object):
adtpass = True
for passed, adtsrc, adtver, arch_status in autopkgtest.results(
e.name, e.ver[1]):
for arch in arch_status:
url = cloud_url % {'h': srchash(adtsrc), 's': adtsrc,
'r': self.options.series, 'a': arch}
for arch, (status, log_url) in arch_status.items():
history_url = cloud_url % {'h': srchash(adtsrc), 's': adtsrc,
'r': self.options.series, 'a': arch}
e.addtest('autopkgtest', '%s %s' % (adtsrc, adtver),
arch, arch_status[arch], url)
arch, status, log_url, history_url)
# hints can override failures
if not passed:

View File

@ -73,7 +73,7 @@ class Excuse(object):
self.reason = {}
self.htmlline = []
# type (e. g. "autopkgtest") -> package (e. g. "foo 2-1") -> arch ->
# ['PASS'|'ALWAYSFAIL'|'REGRESSION'|'RUNNING'|'RUNNING-ALWAYSFAIL', url]
# ['PASS'|'ALWAYSFAIL'|'REGRESSION'|'RUNNING'|'RUNNING-ALWAYSFAIL', log_url, history_url]
self.tests = {}
def sortkey(self):
@ -182,9 +182,9 @@ class Excuse(object):
for pkg in sorted(self.tests[testtype]):
archmsg = []
for arch in sorted(self.tests[testtype][pkg]):
status, url = self.tests[testtype][pkg][arch]
archmsg.append('<a href="%s">%s: %s</a>' %
(url, arch, EXCUSES_LABELS[status]))
status, log_url, history_url = self.tests[testtype][pkg][arch]
archmsg.append('<a href="%s">%s</a>: <a href="%s">%s</a>' %
(history_url or log_url, arch, log_url, EXCUSES_LABELS[status]))
res = res + ("<li>%s for %s: %s</li>\n" % (testtype, pkg, ', '.join(archmsg)))
for x in self.htmlline:
@ -215,9 +215,9 @@ class Excuse(object):
""""adding reason"""
self.reason[reason] = 1
def addtest(self, type_, package, arch, state, url):
def addtest(self, type_, package, arch, state, log_url, history_url=None):
"""Add test result"""
self.tests.setdefault(type_, {}).setdefault(package, {})[arch] = [state, url]
self.tests.setdefault(type_, {}).setdefault(package, {})[arch] = [state, log_url, history_url]
# TODO merge with html()
def text(self):

View File

@ -188,8 +188,10 @@ class T(TestBase):
self.assertEqual(exc['darkgreen']['tests'], {'autopkgtest':
{'darkgreen 2': {
'amd64': ['RUNNING-ALWAYSFAIL',
'http://autopkgtest.ubuntu.com/running.shtml',
'http://autopkgtest.ubuntu.com/packages/d/darkgreen/series/amd64'],
'i386': ['RUNNING-ALWAYSFAIL',
'http://autopkgtest.ubuntu.com/running.shtml',
'http://autopkgtest.ubuntu.com/packages/d/darkgreen/series/i386']}}})
self.assertEqual(self.pending_requests,