merge trunk

This commit is contained in:
Martin Pitt 2015-08-04 07:36:42 +02:00
commit 4e5ed1739d
3 changed files with 200 additions and 13 deletions

View File

@ -30,7 +30,7 @@ from urllib import urlencode, urlopen
import apt_pkg
import kombu
from consts import (AUTOPKGTEST, BINARIES, RDEPENDS, SOURCE, VERSION)
from consts import (AUTOPKGTEST, BINARIES, DEPENDS, RDEPENDS, SOURCE, VERSION)
ADT_EXCUSES_LABELS = {
@ -122,6 +122,22 @@ class AutoPackageTest(object):
def log_error(self, msg):
print('E: [%s] - %s' % (time.asctime(), msg))
def has_autodep8(self, srcinfo):
'''Check if package is covered by autodep8
srcinfo is an item from self.britney.sources
'''
# DKMS: some binary depends on "dkms"
for bin_arch in srcinfo[BINARIES]:
binpkg = bin_arch.split('/')[0] # chop off arch
try:
bininfo = self.britney.binaries['unstable']['amd64'][0][binpkg]
except KeyError:
continue
if 'dkms' in (bininfo[DEPENDS] or ''):
return True
return False
def tests_for_source(self, src, ver):
'''Iterate over all tests that should be run for given source'''
@ -137,7 +153,7 @@ class AutoPackageTest(object):
srcinfo = sources_info[src]
# we want to test the package itself, if it still has a test in
# unstable
if srcinfo[AUTOPKGTEST]:
if srcinfo[AUTOPKGTEST] or self.has_autodep8(srcinfo):
reported_pkgs.add(src)
tests.append((src, ver))
@ -152,7 +168,8 @@ class AutoPackageTest(object):
continue
for rdep in rdeps:
rdep_src = binaries_info[rdep][SOURCE]
if sources_info[rdep_src][AUTOPKGTEST]:
rdep_src_info = sources_info[rdep_src]
if rdep_src_info[AUTOPKGTEST] or self.has_autodep8(rdep_src_info):
if rdep_src not in reported_pkgs:
# we don't care about the version of rdep
tests.append((rdep_src, sources_info[rdep_src][VERSION]))
@ -254,9 +271,7 @@ class AutoPackageTest(object):
query = {'delimiter': '@',
'prefix': '%s/%s/%s/%s/' % (self.series, arch, srchash(src), src)}
try:
# don't include the last run again, so make the marker
# "infinitesimally later" by appending 'zz'
query['marker'] = self.test_results[src][arch][0] + 'zz'
query['marker'] = query['prefix'] + self.test_results[src][arch][0]
except KeyError:
# no stamp yet, download all results
pass
@ -325,8 +340,8 @@ class AutoPackageTest(object):
# allow some skipped tests, but nothing else
passed = exitcode in [0, 2]
self.log_verbose('Fetched test result for %s/%s on %s: %s' % (
src, ver, arch, passed and 'pass' or 'fail'))
self.log_verbose('Fetched test result for %s/%s/%s %s: %s' % (
src, ver, arch, stamp, passed and 'pass' or 'fail'))
# remove matching test requests, remember triggers
satisfied_triggers = set()
@ -486,11 +501,16 @@ class AutoPackageTest(object):
arch_status = {}
for arch in self.britney.options.adt_arches.split():
try:
if self.test_results[testsrc][arch][1][testver][0]:
(_, ver_map, ever_passed) = self.test_results[testsrc][arch]
(status, triggers) = ver_map[testver]
# triggers might contain tuples or lists
if (trigsrc, trigver) not in triggers and [trigsrc, trigver] not in triggers:
raise KeyError('No result for trigger %s/%s yet' % (trigsrc, trigver))
if status:
arch_status[arch] = 'PASS'
else:
# test failed, check ever_passed flag for that src/arch
if self.test_results[testsrc][arch][2]:
if ever_passed:
arch_status[arch] = 'REGRESSION'
passed = False
else:

View File

@ -76,15 +76,15 @@ class SwiftHTTPRequestHandler(BaseHTTPRequestHandler):
if 'prefix' in query:
p = query['prefix'][-1]
objs = set([o for o in objs if o.startswith(p)])
if 'marker' in query:
m = query['marker'][-1]
objs = set([o for o in objs if o >= m])
if 'delimiter' in query:
d = query['delimiter'][-1]
# if find() returns a value, we want to include the delimiter, thus
# bump its result; for "not found" return None
find_adapter = lambda i: (i >= 0) and (i + 1) or None
objs = set([o[:find_adapter(o.find(d))] for o in objs])
if 'marker' in query:
m = query['marker'][-1]
objs = set([o for o in objs if o > m])
self.send_response(objs and 200 or 204) # 204: "No Content"
self.send_header('Content-type', 'text/plain')
@ -138,3 +138,18 @@ class AutoPkgTestSwiftServer:
os.kill(self.server_pid, 15)
os.waitpid(self.server_pid, 0)
self.server_pid = None
if __name__ == '__main__':
srv = AutoPkgTestSwiftServer()
srv.set_results({'autopkgtest-series': {
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
'series/i386/g/green/20150101_100000@': (0, 'green 1'),
'series/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1'),
'series/i386/l/lightgreen/20150101_100101@': (4, 'lightgreen 2'),
'series/i386/l/lightgreen/20150101_100102@': (0, 'lightgreen 3'),
}})
srv.start()
print('Running on http://localhost:8080/autopkgtest-series')
print('Press Enter to quit.')
sys.stdin.readline()
srv.stop()

View File

@ -520,6 +520,130 @@ newgreen 2 i386 newgreen 2
[r'\bdarkgreen\b.*>1</a> to .*>2<',
r'autopkgtest for darkgreen 2: .*amd64.*in progress.*i386.*in progress'])
self.assertEqual(
self.amqp_requests,
set(['debci-series-i386:darkgreen', 'debci-series-amd64:darkgreen']))
self.assertEqual(self.pending_requests,
'darkgreen 2 amd64 darkgreen 2\ndarkgreen 2 i386 darkgreen 2\n')
os.unlink(self.fake_amqp)
# second run gets the results for darkgreen 2
self.swift.set_results({'autopkgtest-series': {
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
'series/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
'series/i386/d/darkgreen/20150101_100010@': (0, 'darkgreen 2'),
'series/amd64/d/darkgreen/20150101_100010@': (0, 'darkgreen 2'),
}})
self.do_test(
[],
VALID_CANDIDATE,
[r'\bdarkgreen\b.*>1</a> to .*>2<',
r'autopkgtest for darkgreen 2: .*amd64.*Pass.*i386.*Pass'])
self.assertEqual(self.amqp_requests, set())
self.assertEqual(self.pending_requests, '')
# next run sees a newer darkgreen, should re-run tests
self.data.remove_all(True)
self.do_test(
[('darkgreen', {'Version': '3', 'Depends': 'libc6 (>= 0.9), libgreen1'}, 'autopkgtest')],
NOT_CONSIDERED,
[r'\bdarkgreen\b.*>1</a> to .*>3<',
r'autopkgtest for darkgreen 3: .*amd64.*in progress.*i386.*in progress'])
self.assertEqual(
self.amqp_requests,
set(['debci-series-i386:darkgreen', 'debci-series-amd64:darkgreen']))
self.assertEqual(self.pending_requests,
'darkgreen 3 amd64 darkgreen 3\ndarkgreen 3 i386 darkgreen 3\n')
def test_old_result_from_rdep_version(self):
'''re-runs reverse dependency test on new versions'''
self.swift.set_results({'autopkgtest-series': {
'series/i386/g/green/20150101_100000@': (0, 'green 1'),
'series/amd64/g/green/20150101_100000@': (0, 'green 1'),
'series/i386/g/green/20150101_100010@': (0, 'green 2'),
'series/amd64/g/green/20150101_100010@': (0, 'green 2'),
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
'series/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
'series/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1'),
'series/amd64/l/lightgreen/20150101_100000@': (0, 'lightgreen 1'),
}})
self.do_test(
[('libgreen1', {'Version': '2', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest')],
VALID_CANDIDATE,
[r'\green\b.*>1</a> to .*>2<',
r'autopkgtest for green 2: .*amd64.*Pass.*i386.*Pass',
r'autopkgtest for darkgreen 1: .*amd64.*Pass.*i386.*Pass'])
self.assertEqual(
self.amqp_requests,
set(['debci-series-i386:green', 'debci-series-amd64:green',
'debci-series-i386:lightgreen', 'debci-series-amd64:lightgreen',
'debci-series-i386:darkgreen', 'debci-series-amd64:darkgreen']))
self.assertEqual(self.pending_requests, '')
os.unlink(self.fake_amqp)
self.data.remove_all(True)
# second run: new version re-triggers all tests
self.do_test(
[('libgreen1', {'Version': '3', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest')],
NOT_CONSIDERED,
[r'\green\b.*>1</a> to .*>3<',
r'autopkgtest for green 3: .*amd64.*in progress.*i386.*in progress',
r'autopkgtest for lightgreen 1: .*amd64.*in progress.*i386.*in progress',
r'autopkgtest for darkgreen 1: .*amd64.*in progress.*i386.*in progress'])
self.assertEqual(
self.amqp_requests,
set(['debci-series-i386:green', 'debci-series-amd64:green',
'debci-series-i386:lightgreen', 'debci-series-amd64:lightgreen',
'debci-series-i386:darkgreen', 'debci-series-amd64:darkgreen']))
expected_pending = '''darkgreen 1 amd64 green 3
darkgreen 1 i386 green 3
green 3 amd64 green 3
green 3 i386 green 3
lightgreen 1 amd64 green 3
lightgreen 1 i386 green 3
'''
self.assertEqual(self.pending_requests, expected_pending)
os.unlink(self.fake_amqp)
# third run gets the results for green and lightgreen, darkgreen is
# still running
self.swift.set_results({'autopkgtest-series': {
'series/i386/g/green/20150101_100020@': (0, 'green 3'),
'series/amd64/g/green/20150101_100020@': (0, 'green 3'),
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
'series/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
'series/i386/l/lightgreen/20150101_100010@': (0, 'lightgreen 1'),
'series/amd64/l/lightgreen/20150101_100010@': (0, 'lightgreen 1'),
}})
self.do_test(
[], NOT_CONSIDERED,
[r'\green\b.*>1</a> to .*>3<',
r'autopkgtest for green 3: .*amd64.*Pass.*i386.*Pass',
r'autopkgtest for lightgreen 1: .*amd64.*Pass.*i386.*Pass',
r'autopkgtest for darkgreen 1: .*amd64.*in progress.*i386.*in progress'])
self.assertEqual(self.amqp_requests, set())
self.assertEqual(self.pending_requests,
'darkgreen 1 amd64 green 3\ndarkgreen 1 i386 green 3\n')
# fourth run finally gets the new darkgreen result
self.swift.set_results({'autopkgtest-series': {
'series/i386/d/darkgreen/20150101_100010@': (0, 'darkgreen 1'),
'series/amd64/d/darkgreen/20150101_100010@': (0, 'darkgreen 1'),
}})
self.do_test(
[], VALID_CANDIDATE,
[r'\green\b.*>1</a> to .*>3<',
r'autopkgtest for green 3: .*amd64.*Pass.*i386.*Pass',
r'autopkgtest for lightgreen 1: .*amd64.*Pass.*i386.*Pass',
r'autopkgtest for darkgreen 1: .*amd64.*Pass.*i386.*Pass'])
self.assertEqual(self.amqp_requests, set())
self.assertEqual(self.pending_requests, '')
def test_tmpfail(self):
'''tmpfail result is considered a failure'''
@ -620,6 +744,22 @@ newgreen 2 i386 newgreen 2
# green
self.data.remove_all(True)
self.swift.set_results({'autopkgtest-series': {
'series/i386/g/green/20150101_100101@': (0, 'green 1'),
'series/amd64/g/green/20150101_100101@': (0, 'green 1'),
'series/i386/g/green/20150101_100201@': (0, 'green 2'),
'series/amd64/g/green/20150101_100201@': (0, 'green 2'),
'series/i386/l/lightgreen/20150101_100101@': (0, 'lightgreen 1'),
'series/amd64/l/lightgreen/20150101_100101@': (0, 'lightgreen 1'),
'series/i386/l/lightgreen/20150101_100201@': (4, 'lightgreen 2'),
'series/amd64/l/lightgreen/20150101_100201@': (4, 'lightgreen 2'),
# add new result for lightgreen 1
'series/i386/l/lightgreen/20150101_100301@': (0, 'lightgreen 1'),
'series/amd64/l/lightgreen/20150101_100301@': (0, 'lightgreen 1'),
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
'series/amd64/d/darkgreen/20150101_100001@': (0, 'darkgreen 1'),
}})
# next run should re-trigger lightgreen 1 to test against green/2
self.do_test(
[('libgreen1', {'Version': '2', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest')],
@ -659,6 +799,18 @@ newgreen 2 i386 newgreen 2
r'autopkgtest for lightgreen 2: .*amd64.*in progress.*i386.*in progress',
r'autopkgtest for rainbow 1: .*amd64.*in progress.*i386.*in progress'])
def test_dkms(self):
'''DKMS packages are autopkgtested (via autodep8)'''
self.data.add('dkms', False, {})
self.data.add('fancy-dkms', False, {'Source': 'fancy', 'Depends': 'dkms (>= 1)'})
self.do_test(
[('dkms', {'Version': '2'}, None)],
NOT_CONSIDERED,
[r'\bdkms\b.*>1</a> to .*>2<',
r'autopkgtest for fancy 1: .*amd64.*in progress.*i386.*in progress'])
def test_no_amqp_config(self):
'''Run without autopkgtest requests'''