Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(596)

Unified Diff: testing/buildbot/manage.py

Issue 1108173002: Roll //build, //native_client, and a few more targets of opportunity. Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Test fix Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « testing/buildbot/client.v8.json ('k') | testing/buildbot/trybot_analyze_config.json » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: testing/buildbot/manage.py
diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py
new file mode 100755
index 0000000000000000000000000000000000000000..bc362fd221b1f4578f44b542ba8fb04aff39f8ed
--- /dev/null
+++ b/testing/buildbot/manage.py
@@ -0,0 +1,193 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Toolbox to manage all the json files in this directory.
+
+It can reformat them in their canonical format or ensures they are well
+formatted.
+"""
+
+import argparse
+import collections
+import glob
+import json
+import os
+import subprocess
+import sys
+
+
+THIS_DIR = os.path.dirname(os.path.abspath(__file__))
+SRC_DIR = os.path.dirname(os.path.dirname(THIS_DIR))
+sys.path.insert(0, os.path.join(SRC_DIR, 'third_party', 'colorama', 'src'))
+
+import colorama
+
+
+SKIP = {
+ # These are not 'builders'.
+ 'compile_targets', 'gtest_tests', 'filter_compile_builders',
+ 'non_filter_builders', 'non_filter_tests_builders',
+
+ # These are not supported on Swarming yet.
+ # http://crbug.com/472205
+ 'Chromium Mac 10.10',
+ # http://crbug.com/441429
+ 'Linux Trusty (32)', 'Linux Trusty (dbg)(32)',
+
+ # One off builders. Note that Swarming does support ARM.
+ 'Linux ARM Cross-Compile',
+ 'Site Isolation Linux',
+ 'Site Isolation Win',
+}
+
+
+def upgrade_test(test):
+ """Converts from old style string to new style dict."""
+ if isinstance(test, basestring):
+ return {'test': test}
+ assert isinstance(test, dict)
+ return test
+
+
+def get_isolates():
+ """Returns the list of all isolate files."""
+ files = subprocess.check_output(['git', 'ls-files'], cwd=SRC_DIR).splitlines()
+ return [os.path.basename(f) for f in files if f.endswith('.isolate')]
+
+
+def main():
+ colorama.init()
+ parser = argparse.ArgumentParser(description=sys.modules[__name__].__doc__)
+ group = parser.add_mutually_exclusive_group(required=True)
+ group.add_argument(
+ '-c', '--check', action='store_true', help='Only check the files')
+ group.add_argument(
+ '--convert', action='store_true',
+ help='Convert a test to run on Swarming everywhere')
+ group.add_argument(
+ '--remaining', action='store_true',
+ help='Count the number of tests not yet running on Swarming')
+ group.add_argument(
+ '-w', '--write', action='store_true', help='Rewrite the files')
+ parser.add_argument(
+ 'test_name', nargs='?',
+ help='The test name to print which configs to update; only to be used '
+ 'with --remaining')
+ args = parser.parse_args()
+
+ if args.convert or args.remaining:
+ isolates = get_isolates()
+
+ if args.convert:
+ if not args.test_name:
+ parser.error('A test name is required with --convert')
+ if args.test_name + '.isolate' not in isolates:
+ parser.error('Create %s.isolate first' % args.test_name)
+
+ # Stats when running in --remaining mode;
+ tests_location = collections.defaultdict(
+ lambda: {
+ 'count_run_local': 0, 'count_run_on_swarming': 0, 'local_configs': {}
+ })
+
+ result = 0
+ for filepath in glob.glob(os.path.join(THIS_DIR, '*.json')):
+ filename = os.path.basename(filepath)
+ with open(filepath) as f:
+ content = f.read()
+ try:
+ config = json.loads(content)
+ except ValueError as e:
+ print "Exception raised while checking %s: %s" % (filepath, e)
+ raise
+ for builder, data in sorted(config.iteritems()):
+ if builder in SKIP:
+ # Oddities.
+ continue
+
+ if not isinstance(data, dict):
+ print('%s: %s is broken: %s' % (filename, builder, data))
+ continue
+
+ if 'gtest_tests' in data:
+ config[builder]['gtest_tests'] = sorted(
+ (upgrade_test(l) for l in data['gtest_tests']),
+ key=lambda x: x['test'])
+
+ if args.remaining:
+ for test in data['gtest_tests']:
+ name = test['test']
+ if test.get('swarming', {}).get('can_use_on_swarming_builders'):
+ tests_location[name]['count_run_on_swarming'] += 1
+ else:
+ tests_location[name]['count_run_local'] += 1
+ tests_location[name]['local_configs'].setdefault(
+ filename, []).append(builder)
+ elif args.convert:
+ for test in data['gtest_tests']:
+ if test['test'] != args.test_name:
+ continue
+ test.setdefault('swarming', {})
+ if not test['swarming'].get('can_use_on_swarming_builders'):
+ print('- %s: %s' % (filename, builder))
+ test['swarming']['can_use_on_swarming_builders'] = True
+
+ expected = json.dumps(
+ config, sort_keys=True, indent=2, separators=(',', ': ')) + '\n'
+ if content != expected:
+ result = 1
+ if args.write or args.convert:
+ with open(filepath, 'wb') as f:
+ f.write(expected)
+ if args.write:
+ print('Updated %s' % filename)
+ else:
+ print('%s is not in canonical format' % filename)
+
+ if args.remaining:
+ if args.test_name:
+ if args.test_name not in tests_location:
+ print('Unknown test %s' % args.test_name)
+ return 1
+ for config, builders in sorted(
+ tests_location[args.test_name]['local_configs'].iteritems()):
+ print('%s:' % config)
+ for builder in sorted(builders):
+ print(' %s' % builder)
+ else:
+ l = max(map(len, tests_location))
+ print('%-*s%sLocal %sSwarming %sMissing isolate' %
+ (l, 'Test', colorama.Fore.RED, colorama.Fore.GREEN,
+ colorama.Fore.MAGENTA))
+ total_local = 0
+ total_swarming = 0
+ for name, location in sorted(tests_location.iteritems()):
+ if not location['count_run_on_swarming']:
+ c = colorama.Fore.RED
+ elif location['count_run_local']:
+ c = colorama.Fore.YELLOW
+ else:
+ c = colorama.Fore.GREEN
+ total_local += location['count_run_local']
+ total_swarming += location['count_run_on_swarming']
+ missing_isolate = ''
+ if name + '.isolate' not in isolates:
+ missing_isolate = colorama.Fore.MAGENTA + '*'
+ print('%s%-*s %4d %4d %s' %
+ (c, l, name, location['count_run_local'],
+ location['count_run_on_swarming'], missing_isolate))
+
+ total = total_local + total_swarming
+ p_local = 100. * total_local / total
+ p_swarming = 100. * total_swarming / total
+ print('%s%-*s %4d (%4.1f%%) %4d (%4.1f%%)' %
+ (colorama.Fore.WHITE, l, 'Total:', total_local, p_local,
+ total_swarming, p_swarming))
+ print('%-*s %4d' % (l, 'Total executions:', total))
+ return result
+
+
+if __name__ == "__main__":
+ sys.exit(main())
« no previous file with comments | « testing/buildbot/client.v8.json ('k') | testing/buildbot/trybot_analyze_config.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698