| #!/usr/bin/env python3 |
| |
| # Copyright 2022 gRPC authors. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import os |
| import re |
| import subprocess |
| import sys |
| |
| from google.cloud import bigquery |
| import run_buildozer |
| import update_flakes_query |
| |
| lookback_hours = 24 * 7 * 4 |
| |
| |
| def include_test(test): |
| if '@' in test: |
| return False |
| if test.startswith("//test/cpp/qps:"): |
| return False |
| return True |
| |
| |
| TEST_DIRS = ['test/core', 'test/cpp'] |
| tests = {} |
| already_flaky = set() |
| for test_dir in TEST_DIRS: |
| for line in subprocess.check_output( |
| ['bazel', 'query', 'tests({}/...)'.format(test_dir)]).splitlines(): |
| test = line.strip().decode('utf-8') |
| if not include_test(test): |
| continue |
| tests[test] = False |
| for test_dir in TEST_DIRS: |
| for line in subprocess.check_output( |
| ['bazel', 'query', |
| 'attr(flaky, 1, tests({}/...))'.format(test_dir)]).splitlines(): |
| test = line.strip().decode('utf-8') |
| if not include_test(test): |
| continue |
| already_flaky.add(test) |
| |
| flaky_e2e = set() |
| |
| client = bigquery.Client() |
| for row in client.query( |
| update_flakes_query.QUERY.format( |
| lookback_hours=lookback_hours)).result(): |
| if "/macos/" in row.job_name: |
| continue # we know mac stuff is flaky |
| if row.test_binary not in tests: |
| m = re.match(r'^//test/core/end2end:([^@]*)@([^@]*)(.*)', |
| row.test_binary) |
| if m: |
| flaky_e2e.add('{}@{}{}'.format(m.group(1), m.group(2), m.group(3))) |
| print("will mark end2end test {} as flaky".format(row.test_binary)) |
| else: |
| print("skip obsolete test {}".format(row.test_binary)) |
| continue |
| print("will mark {} as flaky".format(row.test_binary)) |
| tests[row.test_binary] = True |
| |
| buildozer_commands = [] |
| for test, flaky in sorted(tests.items()): |
| if flaky: |
| buildozer_commands.append('set flaky True|{}'.format(test)) |
| elif test in already_flaky: |
| buildozer_commands.append('remove flaky|{}'.format(test)) |
| |
| with open('test/core/end2end/flaky.bzl', 'w') as f: |
| with open(sys.argv[0]) as my_source: |
| for line in my_source: |
| if line[0] != '#': |
| break |
| for line in my_source: |
| if line[0] == '#': |
| print(line.strip(), file=f) |
| break |
| for line in my_source: |
| if line[0] != '#': |
| break |
| print(line.strip(), file=f) |
| print( |
| "\"\"\"A list of flaky tests, consumed by generate_tests.bzl to set flaky attrs.\"\"\"", |
| file=f) |
| print("FLAKY_TESTS = [", file=f) |
| for line in sorted(list(flaky_e2e)): |
| print(" \"{}\",".format(line), file=f) |
| print("]", file=f) |
| |
| run_buildozer.run_buildozer(buildozer_commands) |