mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-02-14 15:58:20 +00:00
merge trunk
This commit is contained in:
commit
4e5ed1739d
@ -30,7 +30,7 @@ from urllib import urlencode, urlopen
|
|||||||
import apt_pkg
|
import apt_pkg
|
||||||
import kombu
|
import kombu
|
||||||
|
|
||||||
from consts import (AUTOPKGTEST, BINARIES, RDEPENDS, SOURCE, VERSION)
|
from consts import (AUTOPKGTEST, BINARIES, DEPENDS, RDEPENDS, SOURCE, VERSION)
|
||||||
|
|
||||||
|
|
||||||
ADT_EXCUSES_LABELS = {
|
ADT_EXCUSES_LABELS = {
|
||||||
@ -122,6 +122,22 @@ class AutoPackageTest(object):
|
|||||||
def log_error(self, msg):
|
def log_error(self, msg):
|
||||||
print('E: [%s] - %s' % (time.asctime(), 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):
|
def tests_for_source(self, src, ver):
|
||||||
'''Iterate over all tests that should be run for given source'''
|
'''Iterate over all tests that should be run for given source'''
|
||||||
|
|
||||||
@ -137,7 +153,7 @@ class AutoPackageTest(object):
|
|||||||
srcinfo = sources_info[src]
|
srcinfo = sources_info[src]
|
||||||
# we want to test the package itself, if it still has a test in
|
# we want to test the package itself, if it still has a test in
|
||||||
# unstable
|
# unstable
|
||||||
if srcinfo[AUTOPKGTEST]:
|
if srcinfo[AUTOPKGTEST] or self.has_autodep8(srcinfo):
|
||||||
reported_pkgs.add(src)
|
reported_pkgs.add(src)
|
||||||
tests.append((src, ver))
|
tests.append((src, ver))
|
||||||
|
|
||||||
@ -152,7 +168,8 @@ class AutoPackageTest(object):
|
|||||||
continue
|
continue
|
||||||
for rdep in rdeps:
|
for rdep in rdeps:
|
||||||
rdep_src = binaries_info[rdep][SOURCE]
|
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:
|
if rdep_src not in reported_pkgs:
|
||||||
# we don't care about the version of rdep
|
# we don't care about the version of rdep
|
||||||
tests.append((rdep_src, sources_info[rdep_src][VERSION]))
|
tests.append((rdep_src, sources_info[rdep_src][VERSION]))
|
||||||
@ -254,9 +271,7 @@ class AutoPackageTest(object):
|
|||||||
query = {'delimiter': '@',
|
query = {'delimiter': '@',
|
||||||
'prefix': '%s/%s/%s/%s/' % (self.series, arch, srchash(src), src)}
|
'prefix': '%s/%s/%s/%s/' % (self.series, arch, srchash(src), src)}
|
||||||
try:
|
try:
|
||||||
# don't include the last run again, so make the marker
|
query['marker'] = query['prefix'] + self.test_results[src][arch][0]
|
||||||
# "infinitesimally later" by appending 'zz'
|
|
||||||
query['marker'] = self.test_results[src][arch][0] + 'zz'
|
|
||||||
except KeyError:
|
except KeyError:
|
||||||
# no stamp yet, download all results
|
# no stamp yet, download all results
|
||||||
pass
|
pass
|
||||||
@ -325,8 +340,8 @@ class AutoPackageTest(object):
|
|||||||
# allow some skipped tests, but nothing else
|
# allow some skipped tests, but nothing else
|
||||||
passed = exitcode in [0, 2]
|
passed = exitcode in [0, 2]
|
||||||
|
|
||||||
self.log_verbose('Fetched test result for %s/%s on %s: %s' % (
|
self.log_verbose('Fetched test result for %s/%s/%s %s: %s' % (
|
||||||
src, ver, arch, passed and 'pass' or 'fail'))
|
src, ver, arch, stamp, passed and 'pass' or 'fail'))
|
||||||
|
|
||||||
# remove matching test requests, remember triggers
|
# remove matching test requests, remember triggers
|
||||||
satisfied_triggers = set()
|
satisfied_triggers = set()
|
||||||
@ -486,11 +501,16 @@ class AutoPackageTest(object):
|
|||||||
arch_status = {}
|
arch_status = {}
|
||||||
for arch in self.britney.options.adt_arches.split():
|
for arch in self.britney.options.adt_arches.split():
|
||||||
try:
|
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'
|
arch_status[arch] = 'PASS'
|
||||||
else:
|
else:
|
||||||
# test failed, check ever_passed flag for that src/arch
|
# test failed, check ever_passed flag for that src/arch
|
||||||
if self.test_results[testsrc][arch][2]:
|
if ever_passed:
|
||||||
arch_status[arch] = 'REGRESSION'
|
arch_status[arch] = 'REGRESSION'
|
||||||
passed = False
|
passed = False
|
||||||
else:
|
else:
|
||||||
|
@ -76,15 +76,15 @@ class SwiftHTTPRequestHandler(BaseHTTPRequestHandler):
|
|||||||
if 'prefix' in query:
|
if 'prefix' in query:
|
||||||
p = query['prefix'][-1]
|
p = query['prefix'][-1]
|
||||||
objs = set([o for o in objs if o.startswith(p)])
|
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:
|
if 'delimiter' in query:
|
||||||
d = query['delimiter'][-1]
|
d = query['delimiter'][-1]
|
||||||
# if find() returns a value, we want to include the delimiter, thus
|
# if find() returns a value, we want to include the delimiter, thus
|
||||||
# bump its result; for "not found" return None
|
# bump its result; for "not found" return None
|
||||||
find_adapter = lambda i: (i >= 0) and (i + 1) or None
|
find_adapter = lambda i: (i >= 0) and (i + 1) or None
|
||||||
objs = set([o[:find_adapter(o.find(d))] for o in objs])
|
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_response(objs and 200 or 204) # 204: "No Content"
|
||||||
self.send_header('Content-type', 'text/plain')
|
self.send_header('Content-type', 'text/plain')
|
||||||
@ -138,3 +138,18 @@ class AutoPkgTestSwiftServer:
|
|||||||
os.kill(self.server_pid, 15)
|
os.kill(self.server_pid, 15)
|
||||||
os.waitpid(self.server_pid, 0)
|
os.waitpid(self.server_pid, 0)
|
||||||
self.server_pid = None
|
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()
|
||||||
|
@ -520,6 +520,130 @@ newgreen 2 i386 newgreen 2
|
|||||||
[r'\bdarkgreen\b.*>1</a> to .*>2<',
|
[r'\bdarkgreen\b.*>1</a> to .*>2<',
|
||||||
r'autopkgtest for darkgreen 2: .*amd64.*in progress.*i386.*in progress'])
|
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):
|
def test_tmpfail(self):
|
||||||
'''tmpfail result is considered a failure'''
|
'''tmpfail result is considered a failure'''
|
||||||
|
|
||||||
@ -620,6 +744,22 @@ newgreen 2 i386 newgreen 2
|
|||||||
# green
|
# green
|
||||||
self.data.remove_all(True)
|
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
|
# next run should re-trigger lightgreen 1 to test against green/2
|
||||||
self.do_test(
|
self.do_test(
|
||||||
[('libgreen1', {'Version': '2', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest')],
|
[('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 lightgreen 2: .*amd64.*in progress.*i386.*in progress',
|
||||||
r'autopkgtest for rainbow 1: .*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):
|
def test_no_amqp_config(self):
|
||||||
'''Run without autopkgtest requests'''
|
'''Run without autopkgtest requests'''
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user