mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-06-03 22:01:35 +00:00
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:
parent
123eb43320
commit
a4f3abacad
@ -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)
|
||||||
|
@ -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:
|
||||||
|
12
excuse.py
12
excuse.py
@ -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):
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user