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

View File

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

View File

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

View File

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