mirror of
				https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
				synced 2025-11-04 10:34:05 +00:00 
			
		
		
		
	merge trunk
This commit is contained in:
		
						commit
						4e5ed1739d
					
				@ -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:
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
 | 
			
		||||
@ -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'''
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user