From 0b4cd56d68b373a5897932691baf76d7b9aaf736 Mon Sep 17 00:00:00 2001 From: Steve Langasek Date: Fri, 1 Oct 2021 12:09:36 -0700 Subject: [PATCH 1/6] Initial infrastructure for testing db-based autopkgtest results --- tests/__init__.py | 1 + tests/test_autopkgtest.py | 63 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/tests/__init__.py b/tests/__init__.py index c6cd09d..eaa9436 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -397,6 +397,7 @@ ADT_SHARED_RESULTS_CACHE = ADT_SWIFT_URL = http://localhost:18085 ADT_CI_URL = https://autopkgtest.ubuntu.com/ ADT_HUGE = 20 +ADT_DB_URL = ADT_SUCCESS_BOUNTY = ADT_REGRESSION_PENALTY = diff --git a/tests/test_autopkgtest.py b/tests/test_autopkgtest.py index 801c166..f8960f9 100644 --- a/tests/test_autopkgtest.py +++ b/tests/test_autopkgtest.py @@ -12,6 +12,7 @@ import fileinput import unittest import json import pprint +import sqlite3 import urllib.parse import apt_pkg @@ -44,11 +45,14 @@ class TestAutopkgtestBase(TestBase): def setUp(self): super().setUp() self.fake_amqp = os.path.join(self.data.path, 'amqp') + self.db_path = os.path.join(self.data.path, 'autopkgtest.db') - # Set fake AMQP and Swift server + # Set fake AMQP and Swift server and autopkgtest.db for line in fileinput.input(self.britney_conf, inplace=True): if 'ADT_AMQP' in line: print('ADT_AMQP = file://%s' % self.fake_amqp) + elif 'ADT_DB_URL' in line: + print('ADT_DB_URL = file://%s' % self.db_path) else: sys.stdout.write(line) @@ -82,8 +86,65 @@ class TestAutopkgtestBase(TestBase): self.swift = mock_swift.AutoPkgTestSwiftServer(port=18085) self.swift.set_results({}) + self.db = self.init_sqlite_db(self.db_path) + def tearDown(self): del self.swift + self.db.close() + try: + os.unlink(self.db_path) + except FileNotFoundError: pass + + # https://git.launchpad.net/autopkgtest-cloud/tree/charms/focal/autopkgtest-web/webcontrol/publish-db, + # https://git.launchpad.net/autopkgtest-cloud/tree/charms/focal/autopkgtest-web/webcontrol/helpers/utils.py + def init_sqlite_db(self, path): + """Create DB if it does not exist, and connect to it""" + + db = sqlite3.connect(path) + db.execute("PRAGMA journal_mode = MEMORY") + db.execute( + "CREATE TABLE current_version(" + " release CHAR[20], " + " pocket CHAR[40], " + " component CHAR[10]," + " package CHAR[50], " + " version CHAR[120], " + " PRIMARY KEY(release, package))" + ) + db.execute("CREATE INDEX IF NOT EXISTS current_version_pocket_ix " + "ON current_version(pocket, component)") + + db.execute( + "CREATE TABLE url_last_checked(" + " url CHAR[100], " + " timestamp CHAR[50], " + " PRIMARY KEY(url))" + ) + + db.execute('CREATE TABLE IF NOT EXISTS test (' + ' id INTEGER PRIMARY KEY, ' + ' release CHAR[20], ' + ' arch CHAR[20], ' + ' package char[120])') + db.execute('CREATE TABLE IF NOT EXISTS result (' + ' test_id INTEGER, ' + ' run_id CHAR[30], ' + ' version VARCHAR[200], ' + ' triggers TEXT, ' + ' duration INTEGER, ' + ' exitcode INTEGER, ' + ' requester TEXT, ' + ' PRIMARY KEY(test_id, run_id), ' + ' FOREIGN KEY(test_id) REFERENCES test(id))') + # /packages/ mostly benefits from the index on package (0.8s -> 0.01s), + # but adding the other fields improves it a further 50% to 0.005s. + db.execute('CREATE UNIQUE INDEX IF NOT EXISTS test_package_uix ON test(' + ' package, release, arch)') + db.execute('CREATE INDEX IF NOT EXISTS result_run_ix ON result(' + ' run_id desc)') + + db.commit() + return db def run_it(self, unstable_add, expect_status, expect_excuses={}): '''Run britney with some unstable packages and verify excuses. From 3814d6366672ad9d1e4bfedb153f6e9196b27fad Mon Sep 17 00:00:00 2001 From: Steve Langasek Date: Fri, 1 Oct 2021 12:13:57 -0700 Subject: [PATCH 2/6] Make download_retry work with non-HTTP urls urlopen() supports non-http URLs, but when called on them, http-related features are absent - such as getcode(). Make the code work with file:/// URLs. --- britney2/policies/autopkgtest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/britney2/policies/autopkgtest.py b/britney2/policies/autopkgtest.py index 20452bf..700ebef 100644 --- a/britney2/policies/autopkgtest.py +++ b/britney2/policies/autopkgtest.py @@ -807,7 +807,7 @@ class AutopkgtestPolicy(BasePolicy): try: req = urlopen(url, timeout=30) code = req.getcode() - if 200 <= code < 300: + if not code or 200 <= code < 300: return req except socket.timeout as e: self.logger.info( From af8890bc4bdb22ec17c0ddf2777cc8b0855211c1 Mon Sep 17 00:00:00 2001 From: Steve Langasek Date: Fri, 1 Oct 2021 12:14:50 -0700 Subject: [PATCH 3/6] Preliminary code to make autopkgtest policy download autopkgtest.db Include test to assert britney failure if the database is unavailable --- britney2/policies/autopkgtest.py | 34 ++++++++++++++++++++++++++++++++ tests/test_autopkgtest.py | 23 +++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/britney2/policies/autopkgtest.py b/britney2/policies/autopkgtest.py index 700ebef..555b7be 100644 --- a/britney2/policies/autopkgtest.py +++ b/britney2/policies/autopkgtest.py @@ -124,6 +124,7 @@ class AutopkgtestPolicy(BasePolicy): self.pending_tests_file = os.path.join(self.state_dir, 'autopkgtest-pending.json') self.testsuite_triggers = {} self.result_in_baseline_cache = collections.defaultdict(dict) + self.database = os.path.join(self.state_dir, 'autopkgtest.db') # results map: trigger -> src -> arch -> [passed, version, run_id, seen] # - trigger is "source/version" of an unstable package that triggered @@ -140,6 +141,11 @@ class AutopkgtestPolicy(BasePolicy): else: self.results_cache_file = os.path.join(self.state_dir, 'autopkgtest-results.cache') + if hasattr(self.options,'adt_db_url') and self.options.adt_db_url: + if not self.fetch_db(): + self.logger.error('No autopkgtest db present, exiting') + sys.exit(1) + try: self.options.adt_ppas = self.options.adt_ppas.strip().split() except AttributeError: @@ -157,6 +163,34 @@ class AutopkgtestPolicy(BasePolicy): else: self.logger.info("Ignoring ADT_ARCHES %s as it is not in architectures list", arch) + def fetch_db(self): + f = None + try: + f = self.download_retry(self.options.adt_db_url) + http_code = f.getcode() + # file:/// urls don't have the http niceties + if not http_code or http_code == 200: + new_file = self.database + '.new' + with open(new_file,'wb') as f_out: + while True: + data=f.read(2048*1024) + if not data: + break + f_out.write(data) + if http_code and os.path.getsize(new_file) != int(f.getheader('content-length')): + self.logger.info('Short read downloading autopkgtest results') + os.unlink(new_file) + else: + os.rename(new_file, self.database) + else: + self.logger.error('Failure to fetch autopkgtest results %s: HTTP code=%d', self.options.adt_db_url, f.getcode()) + except IOError as e: + self.logger.error('Failure to fetch autopkgtest results %s: %s', self.options.adt_db_url, str(e)) + finally: + if f is not None: + f.close() + return os.path.exists(self.database) + def register_hints(self, hint_parser): hint_parser.register_hint_type('force-badtest', britney2.hints.split_into_one_hint_per_package) hint_parser.register_hint_type('force-skiptest', britney2.hints.split_into_one_hint_per_package) diff --git a/tests/test_autopkgtest.py b/tests/test_autopkgtest.py index f8960f9..56aef6f 100644 --- a/tests/test_autopkgtest.py +++ b/tests/test_autopkgtest.py @@ -242,6 +242,29 @@ class AT(TestAutopkgtestBase): # Tests for generic packages ################################################################ + def test_fail_on_missing_database(self): + '''Fails if autopkgtest.db is requested but not available''' + + os.unlink(self.db_path) + + self.data.add_default_packages(lightgreen=False) + + britney_failed = 0 + try: + self.run_it( + # uninstallable unstable version + [('lightgreen', {'Version': '1.1~beta', 'Depends': 'libc6 (>= 0.9), libgreen1 (>= 2)'}, 'autopkgtest')], + {'lightgreen': (False, {})}, + {'lightgreen': [('old-version', '1'), ('new-version', '1.1~beta'), + ('reason', 'depends'), + ('excuses', 'uninstallable on arch amd64, not running autopkgtest there') + ] + })[1] + except AssertionError as e: + britney_failed = 1 + + self.assertEqual(britney_failed, 1, "DB missing but britney succeeded") + def test_no_request_for_uninstallable(self): '''Does not request a test for an uninstallable package''' From 173deaff396c038b76e136f63486bc940c239b67 Mon Sep 17 00:00:00 2001 From: Steve Langasek Date: Fri, 1 Oct 2021 13:18:47 -0700 Subject: [PATCH 4/6] Support setting test results in swift and sqlite3 simultaneously --- tests/test_autopkgtest.py | 195 +++++++++++++++++++++++--------------- 1 file changed, 116 insertions(+), 79 deletions(-) diff --git a/tests/test_autopkgtest.py b/tests/test_autopkgtest.py index 56aef6f..5c7bb72 100644 --- a/tests/test_autopkgtest.py +++ b/tests/test_autopkgtest.py @@ -146,6 +146,43 @@ class TestAutopkgtestBase(TestBase): db.commit() return db + def set_results(self, results): + '''Wrapper to set autopkgtest results in both swift and sqlite3''' + self.swift.set_results(results) + + # swift bucket name is irrelevant for sqlite + for i in results.values(): + for k,v in i.items(): + (series, arch, discard, source, latest) = k.split('/') + retcode = v[0] + if not v[1]: + source_ver = None + else: + source_ver = v[1].split(' ')[1] + try: + trigger = v[2]['custom_environment'][0].split('=')[1] + except (IndexError, KeyError): + trigger = None + + try: + self.db.execute('INSERT INTO test (release, arch, package) ' + 'VALUES (?, ?, ?)', + (series, arch, source)) + except sqlite3.IntegrityError: + # Completely normal if we have more than one result for + # the same source package; ignore + pass + + self.db.execute('INSERT INTO result ' + '(test_id, run_id, version, triggers, ' + ' exitcode) ' + 'SELECT test.id, ?, ?, ?, ? FROM test ' + 'WHERE release=? AND arch=? AND package=?', + (latest, source_ver, trigger, retcode, + series, arch, source)) + + self.db.commit() + def run_it(self, unstable_add, expect_status, expect_excuses={}): '''Run britney with some unstable packages and verify excuses. @@ -299,7 +336,7 @@ class AT(TestAutopkgtestBase): self.sourceppa_cache['purple'] = {'2': ''} # The package has passed before on i386 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/p/purple/20150101_100000@': (0, 'purple 1', tr('purple/1')), 'testing/amd64/p/purple/20150101_100000@': (0, 'purple 1', tr('purple/1')), 'testing/amd64/p/purple/20200101_100000@': (0, 'purple 2', tr('purple/2')), @@ -325,7 +362,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(darkgreen=False) # The package has failed before, and with a trigger too on amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (4, 'green 1'), 'testing/amd64/d/darkgreen/20150101_100000@': (4, 'green 1', tr('failedbefore/1')), }}) @@ -370,7 +407,7 @@ class AT(TestAutopkgtestBase): # green has passed on amd64 before # lightgreen has passed on i386, therefore we should block on it returning - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/g/green/20150101_100000@': (0, 'green 4', tr('green/1')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), }}) @@ -402,7 +439,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) # green has passed before on i386 only, therefore ALWAYSFAIL on amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('passedbefore/1')), }}) @@ -445,7 +482,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) # green has passed before on i386 only, therefore ALWAYSFAIL on amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('passedbefore/1')), }}) @@ -463,7 +500,7 @@ class AT(TestAutopkgtestBase): self.assertNotIn('brittle', exc['green']['policy_info']['autopkgtest']) # second run collects the results - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100001@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/2')), @@ -507,7 +544,7 @@ class AT(TestAutopkgtestBase): # third run should not trigger any new tests, should all be in the # cache - self.swift.set_results({}) + self.set_results({}) out = self.run_it( [], {'green': (True, {'green/2': {'amd64': 'PASS', 'i386': 'PASS'}, @@ -525,7 +562,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) # green has passed before on i386 only, therefore ALWAYSFAIL on amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('passedbefore/1')), }}) @@ -540,7 +577,7 @@ class AT(TestAutopkgtestBase): {'green': [('old-version', '1'), ('new-version', '2')]}) # second run collects the results - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), 'testing/amd64/l/lightgreen/20150101_100101@': (4, 'lightgreen 1', tr('green/2')), @@ -572,7 +609,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'), 'testing/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 1'), 'testing/amd64/l/lightgreen/20150101_100101@': (4, 'lightgreen 1'), @@ -601,7 +638,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), @@ -657,7 +694,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/2')), @@ -686,7 +723,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (4, 'lightgreen 1', tr('green/1')), @@ -718,7 +755,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) # green has passed before on amd64, doesn't exist on i386 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/g/green64/20150101_100000@': (0, 'green64 0.1', tr('passedbefore/1')), }}) @@ -753,7 +790,7 @@ class AT(TestAutopkgtestBase): 'green': ['amd64', 'i386']}}) # second run collects the results - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100001@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/2')), @@ -844,7 +881,7 @@ class AT(TestAutopkgtestBase): 'Conflicts': 'blue'}, testsuite='autopkgtest', add_src=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/2')), 'testing/i386/g/green/20150101_100200@': (0, 'green 2', tr('green/2')), @@ -876,7 +913,7 @@ class AT(TestAutopkgtestBase): 'Conflicts': 'blue'}, testsuite='autopkgtest', add_src=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/2')), 'testing/i386/g/green/20150101_100200@': (0, 'green 2', tr('green/2')), @@ -901,7 +938,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False, lightgreen=False) # old lightgreen fails, thus new green should be held back - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/1.1')), 'testing/amd64/d/darkgreen/20150101_100001@': (0, 'darkgreen 1', tr('green/1.1')), 'testing/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1', tr('green/1')), @@ -964,7 +1001,7 @@ class AT(TestAutopkgtestBase): 'debci-testing-i386:lightgreen {"triggers": ["lightgreen/2"]}'])) # next run collects the results - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/l/lightgreen/20150101_100200@': (0, 'lightgreen 2', tr('lightgreen/2')), 'testing/amd64/l/lightgreen/20150101_102000@': (0, 'lightgreen 2', tr('lightgreen/2')), }}) @@ -989,7 +1026,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100001@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1', tr('green/2')), @@ -1030,7 +1067,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False, lightgreen=False) # old lightgreen fails, thus new green should be held back - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/1.1')), 'testing/amd64/d/darkgreen/20150101_100001@': (0, 'darkgreen 1', tr('green/1.1')), 'testing/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1', tr('green/1')), @@ -1065,7 +1102,7 @@ class AT(TestAutopkgtestBase): self.assertEqual(self.pending_requests, {}) # lightgreen 2 stays unbuilt in britney, but we get a test result for it - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/l/lightgreen/20150101_100200@': (0, 'lightgreen 2', tr('green/1.1')), 'testing/amd64/l/lightgreen/20150101_102000@': (0, 'lightgreen 2', tr('green/1.1')), }}) @@ -1095,7 +1132,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False, lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/l/lightgreen/20150101_100101@': (0, 'lightgreen 1', tr('lightgreen/1')), }}) @@ -1120,7 +1157,7 @@ class AT(TestAutopkgtestBase): self.assertEqual(len(self.amqp_requests), 6) # we only get a result for lightgreen 2, not for the requested 1 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100001@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 0.5', tr('green/1')), @@ -1176,7 +1213,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False, lightgreen=False) # green has passed before on i386 only, therefore ALWAYSFAIL on amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('passedbefore/1')), }}) @@ -1242,7 +1279,7 @@ class AT(TestAutopkgtestBase): self.data.add('brown', False, {'Depends': 'grey'}, testsuite='autopkgtest') self.data.add('brown', True, {'Depends': 'grey'}, testsuite='autopkgtest') - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/b/black/20150101_100000@': (0, 'black 1', tr('black/1')), 'testing/amd64/b/black/20150102_100000@': (99, 'black blacklisted', tr('black/2')), 'testing/amd64/g/grey/20150101_100000@': (99, 'grey blacklisted', tr('grey/1')), @@ -1271,7 +1308,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(black=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/b/black/20150101_100000@': (0, 'black 1', tr('black/1')), 'testing/amd64/b/black/20150102_100000@': (99, 'black blacklisted', tr('black/2')), 'testing/i386/b/black/20150101_100000@': (0, 'black 1', tr('black/1')), @@ -1294,7 +1331,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(black=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/b/black/20150101_100000@': (0, 'black 1', tr('black/1')), 'testing/i386/b/black/20150101_100001@': (0, 'black 1', tr('black/1')), 'testing/amd64/b/black/20150102_100000@': (4, 'black 2', tr('black/2')), @@ -1316,7 +1353,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('newgreen/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('newgreen/2')), 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('newgreen/2')), @@ -1345,7 +1382,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(darkgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('darkgreen/1')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('darkgreen/1')), }}) @@ -1362,7 +1399,7 @@ class AT(TestAutopkgtestBase): {'darkgreen/2': {'darkgreen': ['amd64', 'i386']}}) # second run gets the results for darkgreen 2 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100010@': (0, 'darkgreen 2', tr('darkgreen/2')), 'testing/amd64/d/darkgreen/20150101_100010@': (0, 'darkgreen 2', tr('darkgreen/2')), }}) @@ -1406,7 +1443,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('green/1')), 'testing/amd64/g/green/20150101_100000@': (0, 'green 1', tr('green/1')), 'testing/i386/g/green/20150101_100010@': (0, 'green 2', tr('green/2')), @@ -1446,7 +1483,7 @@ class AT(TestAutopkgtestBase): # third run gets the results for green and lightgreen, darkgreen is # still running - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100020@': (0, 'green 3', tr('green/3')), 'testing/amd64/g/green/20150101_100020@': (0, 'green 3', tr('green/3')), 'testing/i386/l/lightgreen/20150101_100010@': (0, 'lightgreen 1', tr('green/3')), @@ -1464,7 +1501,7 @@ class AT(TestAutopkgtestBase): {'green/3': {'darkgreen': ['amd64', 'i386']}}) # fourth run finally gets the new darkgreen result - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100010@': (0, 'darkgreen 1', tr('green/3')), 'testing/amd64/d/darkgreen/20150101_100010@': (0, 'darkgreen 1', tr('green/3')), }}) @@ -1483,7 +1520,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('passedbefore/1')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('passedbefore/1')), }}) @@ -1494,7 +1531,7 @@ class AT(TestAutopkgtestBase): {'green': (False, {'darkgreen': {'amd64': 'RUNNING', 'i386': 'RUNNING'}})}) # second run: i386 result has version 1.1 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100010@': (0, 'darkgreen 1.1', tr('green/2')) }}) self.run_it( @@ -1504,7 +1541,7 @@ class AT(TestAutopkgtestBase): })}) # third run: amd64 result has version 1.2 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/d/darkgreen/20150101_100010@': (0, 'darkgreen 1.2', tr('green/2')), }}) self.run_it( @@ -1519,7 +1556,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(lightgreen=False) # one tmpfail result without testpkg-version, should be ignored - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1', tr('lightgreen/1')), 'testing/i386/l/lightgreen/20150101_100101@': (16, None, tr('lightgreen/2')), 'testing/amd64/l/lightgreen/20150101_100000@': (0, 'lightgreen 1', tr('lightgreen/1')), @@ -1533,7 +1570,7 @@ class AT(TestAutopkgtestBase): {'lightgreen/2': {'lightgreen': ['i386']}}) # one more tmpfail result, should not confuse britney with None version - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/l/lightgreen/20150101_100201@': (16, None, tr('lightgreen/2')), }}) self.run_it( @@ -1550,7 +1587,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) # first run fails - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 2', tr('green/1')), 'testing/i386/g/green/20150101_100101@': (4, 'green 2', tr('green/2')), 'testing/amd64/g/green/20150101_100000@': (0, 'green 2', tr('green/1')), @@ -1574,7 +1611,7 @@ class AT(TestAutopkgtestBase): # re-running test manually succeeded (note: darkgreen result should be # cached already) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100201@': (0, 'green 2', tr('green/2')), 'testing/amd64/g/green/20150101_100201@': (0, 'green 2', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100201@': (0, 'lightgreen 1', tr('green/2')), @@ -1601,7 +1638,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(libc6=False) # new libc6 works fine with green - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('libc6/2')), 'testing/amd64/g/green/20150101_100000@': (0, 'green 1', tr('libc6/2')), }}) @@ -1625,7 +1662,7 @@ class AT(TestAutopkgtestBase): # new green fails; that's not libc6's fault though, so it should stay # valid - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100100@': (4, 'green 2', tr('green/2')), 'testing/amd64/g/green/20150101_100100@': (4, 'green 2', tr('green/2')), }}) @@ -1647,7 +1684,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False, lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100101@': (0, 'green 1', tr('green/1')), 'testing/amd64/g/green/20150101_100101@': (0, 'green 1', tr('green/1')), 'testing/i386/g/green/20150101_100201@': (0, 'green 2', tr('green/2')), @@ -1674,7 +1711,7 @@ class AT(TestAutopkgtestBase): # green self.data.remove_all(True) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { # add new result for lightgreen 1 'testing/i386/l/lightgreen/20150101_100301@': (0, 'lightgreen 1', tr('green/2')), 'testing/amd64/l/lightgreen/20150101_100301@': (0, 'lightgreen 1', tr('green/2')), @@ -1710,7 +1747,7 @@ class AT(TestAutopkgtestBase): # # self.data.add_default_packages(lightgreen=False) # # # # # lightgreen has passed before on i386 only, therefore ALWAYSFAIL on amd64 -# # self.swift.set_results({'autopkgtest-testing': { +# # self.set_results({'autopkgtest-testing': { # # 'testing/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1', tr('passedbefore/1')), # # }}) # # @@ -1770,7 +1807,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/r/rainbow/20150101_100000@': (0, 'rainbow 1', tr('passedbefore/1')), }}) @@ -1818,7 +1855,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), @@ -1846,7 +1883,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), @@ -1889,7 +1926,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), @@ -1931,7 +1968,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), @@ -1972,7 +2009,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), @@ -2001,7 +2038,7 @@ class AT(TestAutopkgtestBase): self.create_hint('autopkgtest', 'force-skiptest green/2') # regression of green, darkgreen ok, lightgreen running - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('passedbefore/1')), 'testing/i386/g/green/20150101_100200@': (4, 'green 2', tr('green/2')), 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), @@ -2025,7 +2062,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) # green has passed before on i386 only, therefore ALWAYSFAIL on amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('passedbefore/1')), }}) @@ -2048,7 +2085,7 @@ class AT(TestAutopkgtestBase): self.create_hint('freeze', 'block-all source') - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1', tr('passedbefore/1')), 'testing/amd64/l/lightgreen/20150101_100000@': (0, 'lightgreen 1', tr('passedbefore/1')), }}) @@ -2058,7 +2095,7 @@ class AT(TestAutopkgtestBase): {'lightgreen': (False, {'lightgreen': {'amd64': 'RUNNING', 'i386': 'RUNNING'}})} ) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 2', tr('lightgreen/2')), 'testing/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 2', tr('lightgreen/2')), }}) @@ -2074,7 +2111,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('lightgreen/1')), 'testing/amd64/l/lightgreen/20150101_100101@': (4, 'lightgreen 2', tr('lightgreen/2')), }}) @@ -2095,7 +2132,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('lightgreen/1')), 'testing/amd64/l/lightgreen/20150101_100101@': (4, 'lightgreen 2', tr('lightgreen/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('lightgreen/1')), @@ -2118,7 +2155,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/l/lightgreen/20150101_100100@': (4, 'lightgreen 1', tr('lightgreen/1')), 'testing/amd64/l/lightgreen/20150102_100101@': (0, 'lightgreen 2', tr('lightgreen/2')), }}) @@ -2139,7 +2176,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/l/lightgreen/20150101_100100@': (4, 'lightgreen 1', tr('lightgreen/1')), 'testing/amd64/l/lightgreen/20150102_100101@': (0, 'lightgreen 2', tr('lightgreen/2')), 'testing/amd64/l/lightgreen/20150103_100101@': (4, 'lightgreen 3', tr('lightgreen/3')), @@ -2161,7 +2198,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/l/lightgreen/20150101_100100@': (4, 'lightgreen 0.1', tr('lightgreen/0.1')), 'testing/amd64/l/lightgreen/20150102_100101@': (0, 'lightgreen 1', tr('lightgreen/1')), 'testing/amd64/l/lightgreen/20150103_100101@': (4, 'lightgreen 1', tr('green/2')), @@ -2183,7 +2220,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False, lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('lightgreen/1')), 'testing/amd64/l/lightgreen/20150102_100100@': (4, 'lightgreen 1', tr('green/2')), 'testing/amd64/l/lightgreen/20150103_100101@': (0, 'lightgreen 2', tr('lightgreen/2')), @@ -2235,7 +2272,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False, lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/l/lightgreen/20150101_100101@': (0, 'lightgreen 1', tr('lightgreen/1')), 'testing/amd64/l/lightgreen/20150102_100101@': (4, 'lightgreen 1', tr('green/2')), 'testing/amd64/l/lightgreen/20150103_100102@': (0, 'lightgreen 2', tr('lightgreen/2')), @@ -2263,7 +2300,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False, lightgreen=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/l/lightgreen/20150101_100101@': (0, 'lightgreen 1', tr('lightgreen/1')), 'testing/amd64/l/lightgreen/20150102_100101@': (0, 'lightgreen 1', tr('green/2')), 'testing/amd64/l/lightgreen/20150103_100102@': (0, 'lightgreen 2', tr('lightgreen/2')), @@ -2296,7 +2333,7 @@ class AT(TestAutopkgtestBase): self.data.add('dkms', False, {}) self.data.add('fancy-dkms', False, {'Source': 'fancy', 'Depends': 'dkms (>= 1)'}, testsuite='autopkgtest-pkg-dkms') - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/f/fancy/20150101_100101@': (0, 'fancy 0.1', tr('passedbefore/1')) }}) @@ -2344,7 +2381,7 @@ class AT(TestAutopkgtestBase): # works against linux-meta and -64only, fails against grumpy i386, no # result yet for grumpy amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/f/fancy/20150101_100301@': (0, 'fancy 0.5', tr('passedbefore/1')), 'testing/i386/f/fancy/20150101_100101@': (0, 'fancy 1', tr('linux-meta/1')), 'testing/amd64/f/fancy/20150101_100101@': (0, 'fancy 1', tr('linux-meta/1')), @@ -2373,7 +2410,7 @@ class AT(TestAutopkgtestBase): # works against linux-meta and -64only, fails against grumpy i386, no # result yet for grumpy amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { # old results without trigger info 'testing/i386/f/fancy/20140101_100101@': (0, 'fancy 1', {}), 'testing/amd64/f/fancy/20140101_100101@': (8, 'fancy 1', {}), @@ -2415,7 +2452,7 @@ class AT(TestAutopkgtestBase): self.data.add('linux-libc-dev', False, {'Source': 'linux'}, testsuite='autopkgtest') self.data.add('linux-image', False, {'Source': 'linux-meta', 'Depends': 'linux-image-1'}) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/amd64/l/lxc/20150101_100101@': (0, 'lxc 0.1', tr('passedbefore/1')) }}) @@ -2449,7 +2486,7 @@ class AT(TestAutopkgtestBase): self.data.add('linux-image-1', False, {'Source': 'linux'}, testsuite='autopkgtest') self.data.add('linux-firmware', False, {'Source': 'linux-firmware'}, testsuite='autopkgtest') - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/f/fancy/20150101_090000@': (0, 'fancy 0.5', tr('passedbefore/1')), 'testing/i386/l/linux/20150101_100000@': (0, 'linux 2', tr('linux-meta/0.2')), 'testing/amd64/l/linux/20150101_100000@': (0, 'linux 2', tr('linux-meta/0.2')), @@ -2476,7 +2513,7 @@ class AT(TestAutopkgtestBase): ) # now linux-meta is ready to go - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/f/fancy/20150101_100000@': (0, 'fancy 1', tr('linux-meta/0.2')), 'testing/amd64/f/fancy/20150101_100000@': (0, 'fancy 1', tr('linux-meta/0.2')), }}) @@ -2503,7 +2540,7 @@ class AT(TestAutopkgtestBase): self.data.add('notme', False, {'Depends': 'libgcc1'}, testsuite='autopkgtest') # binutils has passed before on i386 only, therefore ALWAYSFAIL on amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/b/binutils/20150101_100000@': (0, 'binutils 1', tr('passedbefore/1')), }}) @@ -2519,7 +2556,7 @@ class AT(TestAutopkgtestBase): self.data.add('gcc-7', False, {}, testsuite='autopkgtest') # gcc-7 has passed before on i386 only, therefore ALWAYSFAIL on amd64 - self.swift.set_results({'autopkgtest-series': { + self.set_results({'autopkgtest-series': { 'series/i386/g/gcc-7/20150101_100000@': (0, 'gcc-7 1', tr('passedbefore/1')), }}) @@ -2594,7 +2631,7 @@ class AT(TestAutopkgtestBase): self.assertEqual(len(self.amqp_requests), 2) # add results to PPA specific swift container - self.swift.set_results({'autopkgtest-testing-awesome-developers-staging': { + self.set_results({'autopkgtest-testing-awesome-developers-staging': { 'testing/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1', tr('passedbefore/1')), 'testing/i386/l/lightgreen/20150101_100100@': (4, 'lightgreen 2', tr('lightgreen/2')), 'testing/amd64/l/lightgreen/20150101_100101@': (0, 'lightgreen 2', tr('lightgreen/2')), @@ -2658,7 +2695,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(lightgreen=False) # first run to create autopkgtest-results.cache - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 2', tr('lightgreen/2')), 'testing/amd64/l/lightgreen/20150101_100000@': (0, 'lightgreen 2', tr('lightgreen/2')), }}) @@ -2683,7 +2720,7 @@ class AT(TestAutopkgtestBase): sys.stdout.write(line) # second run, should now not update cache - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 3', tr('lightgreen/3')), 'testing/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 3', tr('lightgreen/3')), }}) @@ -2798,7 +2835,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) # green has passed before on i386 only, therefore ALWAYSFAIL on amd64 - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/g/green/20150101_100000@': (0, 'green 1', tr('passedbefore/1')), }}) @@ -2816,7 +2853,7 @@ class AT(TestAutopkgtestBase): self.assertEqual(exc['green']['policy_info']['age']['age-requirement'], 40) # second run collects the results - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), 'testing/amd64/l/lightgreen/20150101_100101@': (4, 'lightgreen 1', tr('green/2')), @@ -2868,7 +2905,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/1')), 'testing/amd64/l/lightgreen/20150101_100101@': (4, 'lightgreen 1', tr('green/2')), @@ -2903,7 +2940,7 @@ class AT(TestAutopkgtestBase): self.data.add_default_packages(green=False) - self.swift.set_results({'autopkgtest-testing': { + self.set_results({'autopkgtest-testing': { 'testing/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1', tr('green/2')), 'testing/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/2')), From 794b14b3167f1adbe3aff056056972c8e62d178b Mon Sep 17 00:00:00 2001 From: Steve Langasek Date: Fri, 1 Oct 2021 18:53:58 -0700 Subject: [PATCH 5/6] Implement support for pulling autopkgtest results from sqlite db --- britney2/policies/autopkgtest.py | 85 +++++++++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 7 deletions(-) diff --git a/britney2/policies/autopkgtest.py b/britney2/policies/autopkgtest.py index 555b7be..e635866 100644 --- a/britney2/policies/autopkgtest.py +++ b/britney2/policies/autopkgtest.py @@ -28,6 +28,7 @@ import io import itertools import re import socket +import sqlite3 import sys import time import urllib.parse @@ -124,7 +125,7 @@ class AutopkgtestPolicy(BasePolicy): self.pending_tests_file = os.path.join(self.state_dir, 'autopkgtest-pending.json') self.testsuite_triggers = {} self.result_in_baseline_cache = collections.defaultdict(dict) - self.database = os.path.join(self.state_dir, 'autopkgtest.db') + self.database_path = os.path.join(self.state_dir, 'autopkgtest.db') # results map: trigger -> src -> arch -> [passed, version, run_id, seen] # - trigger is "source/version" of an unstable package that triggered @@ -145,6 +146,7 @@ class AutopkgtestPolicy(BasePolicy): if not self.fetch_db(): self.logger.error('No autopkgtest db present, exiting') sys.exit(1) + self.db = sqlite3.connect(self.database_path) try: self.options.adt_ppas = self.options.adt_ppas.strip().split() @@ -170,7 +172,7 @@ class AutopkgtestPolicy(BasePolicy): http_code = f.getcode() # file:/// urls don't have the http niceties if not http_code or http_code == 200: - new_file = self.database + '.new' + new_file = self.database_path + '.new' with open(new_file,'wb') as f_out: while True: data=f.read(2048*1024) @@ -181,7 +183,7 @@ class AutopkgtestPolicy(BasePolicy): self.logger.info('Short read downloading autopkgtest results') os.unlink(new_file) else: - os.rename(new_file, self.database) + os.rename(new_file, self.database_path) else: self.logger.error('Failure to fetch autopkgtest results %s: HTTP code=%d', self.options.adt_db_url, f.getcode()) except IOError as e: @@ -189,7 +191,7 @@ class AutopkgtestPolicy(BasePolicy): finally: if f is not None: f.close() - return os.path.exists(self.database) + return os.path.exists(self.database_path) def register_hints(self, hint_parser): hint_parser.register_hint_type('force-badtest', britney2.hints.split_into_one_hint_per_package) @@ -1004,6 +1006,71 @@ class AutopkgtestPolicy(BasePolicy): for trigger in result_triggers: self.add_trigger_to_results(trigger, src, ver, arch, run_id, seen, result) + def fetch_sqlite_results(self, src, arch): + '''Retrieve new results for source package/arch from sqlite + + Remove matching pending_tests entries. + ''' + + # determine latest run_id from results + latest_run_id = '' + if not self.options.adt_shared_results_cache: + latest_run_id = self.latest_run_for_package(src, arch) + if not latest_run_id: + latest_run_id = '' + + cur = self.db.cursor() + for row in cur.execute('SELECT r.exitcode,r.version,r.triggers,' + ' r.run_id FROM test AS t ' + 'LEFT JOIN result AS r ON t.id=r.test_id ' + 'WHERE t.release=? AND t.arch=? ' + 'AND t.package=? AND r.run_id >= ?', + (self.options.series,arch, src, latest_run_id)): + exitcode, ver, triggers, run_id = row + if not ver: + if exitcode in (4, 12, 20): + # repair it + ver = "unknown" + else: + self.logger.error('%s/%s/%s is damaged, ignoring', + arch, src, run_id) + # ignore this; this will leave an orphaned request + # in autopkgtest-pending.json and thus require + # manual retries after fixing the tmpfail, but we + # can't just blindly attribute it to some pending + # test. + return + + # parse recorded triggers in test result + if triggers: + result_triggers = [i for i in triggers.split(' ', 1) if '/' in i] + else: + self.logger.error('%s result has no ADT_TEST_TRIGGERS, ignoring') + continue + + # 20200101_000000 is 15 chars long + seen = round(calendar.timegm(time.strptime(run_id[0:15], '%Y%m%d_%H%M%S'))) + + # allow some skipped tests, but nothing else + if exitcode in [0, 2]: + result = Result.PASS + elif exitcode == 8: + result = Result.NEUTRAL + else: + result = Result.FAIL + + self.logger.info( + 'Fetched test result for %s/%s/%s %s (triggers: %s): %s', + src, ver, arch, run_id, result_triggers, result.name.lower()) + + # remove matching test requests + for trigger in result_triggers: + self.remove_from_pending(trigger, src, arch) + + # add this result + for trigger in result_triggers: + self.add_trigger_to_results(trigger, src, ver, arch, run_id, seen, result) + def remove_from_pending(self, trigger, src, arch): try: arch_list = self.pending_tests[trigger][src] @@ -1105,17 +1172,21 @@ class AutopkgtestPolicy(BasePolicy): result[3] + int(self.options.adt_retry_older_than) * SECPERDAY < self._now: # We might want to retry this failure, so continue pass - elif not uses_swift: + elif not uses_swift and not hasattr(self,'db'): # We're done if we don't retrigger and we're not using swift return elif result_state in {Result.PASS, Result.NEUTRAL}: self.logger.debug('%s/%s triggered by %s already known', src, arch, trigger) return - # Without swift we don't expect new results - if uses_swift: + # Without swift or autopkgtest.db we don't expect new results + if hasattr(self,'db'): + self.fetch_sqlite_results(src, arch) + elif uses_swift: self.logger.info('Checking for new results for failed %s/%s for trigger %s', src, arch, trigger) self.fetch_swift_results(self.options.adt_swift_url, src, arch) + + if hasattr(self,'db') or uses_swift: # do we have one now? try: self.test_results[trigger][src][arch] From 383887a8e3f724a06d6420d2b4ca1c66119944ce Mon Sep 17 00:00:00 2001 From: Steve Langasek Date: Fri, 22 Oct 2021 16:12:26 -0700 Subject: [PATCH 6/6] bdmurray-linting --- britney2/policies/autopkgtest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/britney2/policies/autopkgtest.py b/britney2/policies/autopkgtest.py index e635866..cf14135 100644 --- a/britney2/policies/autopkgtest.py +++ b/britney2/policies/autopkgtest.py @@ -1025,7 +1025,7 @@ class AutopkgtestPolicy(BasePolicy): 'LEFT JOIN result AS r ON t.id=r.test_id ' 'WHERE t.release=? AND t.arch=? ' 'AND t.package=? AND r.run_id >= ?', - (self.options.series,arch, src, latest_run_id)): + (self.options.series, arch, src, latest_run_id)): exitcode, ver, triggers, run_id = row if not ver: if exitcode in (4, 12, 20): @@ -1049,10 +1049,10 @@ class AutopkgtestPolicy(BasePolicy): continue # 20200101_000000 is 15 chars long - seen = round(calendar.timegm(time.strptime(run_id[0:15], '%Y%m%d_%H%M%S'))) + seen = round(calendar.timegm(time.strptime(run_id[:15], '%Y%m%d_%H%M%S'))) # allow some skipped tests, but nothing else - if exitcode in [0, 2]: + if exitcode in (0, 2): result = Result.PASS elif exitcode == 8: result = Result.NEUTRAL