diff options
Diffstat (limited to 'chromium/third_party/WebKit/Tools/TestResultServer/handlers/buildershandler.py')
-rw-r--r-- | chromium/third_party/WebKit/Tools/TestResultServer/handlers/buildershandler.py | 150 |
1 files changed, 72 insertions, 78 deletions
diff --git a/chromium/third_party/WebKit/Tools/TestResultServer/handlers/buildershandler.py b/chromium/third_party/WebKit/Tools/TestResultServer/handlers/buildershandler.py index f67866c17b5..dc1e73740ab 100644 --- a/chromium/third_party/WebKit/Tools/TestResultServer/handlers/buildershandler.py +++ b/chromium/third_party/WebKit/Tools/TestResultServer/handlers/buildershandler.py @@ -29,6 +29,7 @@ import datetime import json import logging +import re import sys import traceback import urllib2 @@ -37,32 +38,51 @@ import webapp2 from google.appengine.api import memcache MASTERS = [ - {'name': 'ChromiumWin', 'url': 'http://build.chromium.org/p/chromium.win', 'groups': ['@ToT Chromium']}, - {'name': 'ChromiumMac', 'url': 'http://build.chromium.org/p/chromium.mac', 'groups': ['@ToT Chromium']}, - {'name': 'ChromiumLinux', 'url': 'http://build.chromium.org/p/chromium.linux', 'groups': ['@ToT Chromium']}, - {'name': 'ChromiumChromiumOS', 'url': 'http://build.chromium.org/p/chromium.chromiumos', 'groups': ['@ToT ChromeOS']}, - {'name': 'ChromiumGPU', 'url': 'http://build.chromium.org/p/chromium.gpu', 'groups': ['@ToT Chromium']}, - {'name': 'ChromiumGPUFYI', 'url': 'http://build.chromium.org/p/chromium.gpu.fyi', 'groups': ['@ToT Chromium FYI']}, - {'name': 'ChromiumPerfAv', 'url': 'http://build.chromium.org/p/chromium.perf_av', 'groups': ['@ToT Chromium']}, - {'name': 'ChromiumWebkit', 'url': 'http://build.chromium.org/p/chromium.webkit', 'groups': ['@ToT Chromium', '@ToT Blink']}, - {'name': 'ChromiumFYI', 'url': 'http://build.chromium.org/p/chromium.fyi', 'groups': ['@ToT Chromium FYI']}, - {'name': 'V8', 'url': 'http://build.chromium.org/p/client.v8', 'groups': ['@ToT V8']}, + {'name': 'ChromiumWin', 'url_name': 'chromium.win', 'groups': ['@ToT Chromium']}, + {'name': 'ChromiumMac', 'url_name': 'chromium.mac', 'groups': ['@ToT Chromium']}, + {'name': 'ChromiumLinux', 'url_name': 'chromium.linux', 'groups': ['@ToT Chromium']}, + {'name': 'ChromiumChromiumOS', 'url_name': 'chromium.chromiumos', 'groups': ['@ToT ChromeOS']}, + {'name': 'ChromiumGPU', 'url_name': 'chromium.gpu', 'groups': ['@ToT Chromium']}, + {'name': 'ChromiumGPUFYI', 'url_name': 'chromium.gpu.fyi', 'groups': ['@ToT Chromium FYI']}, + {'name': 'ChromiumWebkit', 'url_name': 'chromium.webkit', 'groups': ['@ToT Chromium', '@ToT Blink']}, + {'name': 'ChromiumFYI', 'url_name': 'chromium.fyi', 'groups': ['@ToT Chromium FYI']}, + {'name': 'V8', 'url_name': 'client.v8', 'groups': ['@ToT V8']}, ] +# Buildbot steps that have test in the name, but don't run tests. +NON_TEST_STEP_NAMES = [ + 'archive', + 'Run tests', + 'find isolated tests', + 'read test spec', + 'Download latest chromedriver', + 'compile tests', + 'create_coverage_', + 'update test result log', + 'memory test:', + 'install_', +] -class FetchBuildersException(Exception): pass - - -def master_json_url(master_url): - return master_url + '/json/builders' - +# Buildbot steps that run tests but don't upload results to the flakiness dashboard server. +# FIXME: These should be fixed to upload and then removed from this list. +TEST_STEPS_THAT_DO_NOT_UPLOAD_YET = [ + 'java_tests(chrome', + 'python_tests(chrome', + 'run_all_tests.py', + 'test_report', + 'test CronetSample', + 'test_mini_installer', + 'telemetry_unittests', + 'webkit_python_tests', + 'webkit_unit_tests', +] -def builder_json_url(master_url, builder): - return master_json_url(master_url) + '/' + urllib2.quote(builder) +BUILDS_URL = 'http://chrome-build-extract.appspot.com/get_builds?builder=%s&master=%s&num_builds=1' +MASTER_URL = 'http://chrome-build-extract.appspot.com/get_master/%s' -def cached_build_json_url(master_url, builder, build_number): - return builder_json_url(master_url, builder) + '/builds/' + str(build_number) +class FetchBuildersException(Exception): + pass def fetch_json(url): @@ -84,67 +104,43 @@ def fetch_json(url): return fetched_json -def get_latest_build(build_data): - cached_builds = [] - if 'cachedBuilds' in build_data: - cached_builds = build_data['cachedBuilds'] - - current_builds = build_data['currentBuilds'] - - latest_cached_builds = set(cached_builds) - set(current_builds) - if len(latest_cached_builds) != 0: - latest_cached_builds = sorted(list(latest_cached_builds)) - latest_build = latest_cached_builds[-1] - elif len(current_builds) != 0: - latest_build = current_builds[0] - else: - basedir = build_data['basedir'] if 'basedir' in build_data else 'current builder' - logging.info('No cached or current builds for %s', basedir) - return None - - return latest_build - - def dump_json(data): return json.dumps(data, separators=(',', ':'), sort_keys=True) -def fetch_buildbot_data(masters, force_update=False): - if force_update: - logging.info('Starting a forced buildbot update. Failure to fetch a master\'s data will not abort the fetch.') - +def fetch_buildbot_data(masters): start_time = datetime.datetime.now() master_data = masters[:] for master in master_data: - master_url = master['url'] - tests_object = master.setdefault('tests', {}) - master['tests'] = tests_object - - builders = fetch_json(master_json_url(master_url)) + master_url = MASTER_URL % master['url_name'] + builders = fetch_json(master_url) if not builders: - msg = 'Could not fetch builders from master "%s": %s.' % (master['name'], master_url) + msg = 'Aborting fetch. Could not fetch builders from master "%s": %s.' % (master['name'], master_url) logging.warning(msg) - if force_update: - continue - else: - logging.warning('Aborting fetch.') - raise FetchBuildersException(msg) + raise FetchBuildersException(msg) - for builder in builders: - build_data = fetch_json(builder_json_url(master_url, builder)) + tests_object = master.setdefault('tests', {}) - latest_build = get_latest_build(build_data) - if not latest_build: - logging.info('Skipping builder %s because it lacked cached or current builds.', builder) + for builder in builders['builders'].keys(): + build = fetch_json(BUILDS_URL % (urllib2.quote(builder), master['url_name'])) + if not build: + logging.info('Skipping builder %s on master %s due to empty data.', builder, master['url_name']) continue - build = fetch_json(cached_build_json_url(master_url, builder, latest_build)) - if not build: - logging.info('Skipping build %s on builder %s due to empty data', latest_build, builder) - for step in build['steps']: + if not build['builds']: + logging.info('Skipping builder %s on master %s due to empty builds list.', builder, master['url_name']) + continue + + for step in build['builds'][0]['steps']: step_name = step['name'] - is_test_step = 'test' in step_name and 'archive' not in step_name and 'Run tests' not in step_name - if not is_test_step: + + if not 'test' in step_name: + continue + + if any(name in step_name for name in NON_TEST_STEP_NAMES): + continue + + if re.search('_only|_ignore|_perf$', step_name): continue if step_name == 'webkit_tests': @@ -156,7 +152,7 @@ def fetch_buildbot_data(masters, force_update=False): for builders in tests_object.values(): builders['builders'].sort() - output_data = {'masters': master_data} + output_data = {'masters': master_data, 'no_upload_test_types': TEST_STEPS_THAT_DO_NOT_UPLOAD_YET} delta = datetime.datetime.now() - start_time @@ -168,9 +164,8 @@ def fetch_buildbot_data(masters, force_update=False): class UpdateBuilders(webapp2.RequestHandler): """Fetch and update the cached buildbot data.""" def get(self): - force_update = True if self.request.get('force') else False try: - buildbot_data = fetch_buildbot_data(MASTERS, force_update) + buildbot_data = fetch_buildbot_data(MASTERS) memcache.set('buildbot_data', buildbot_data) self.response.set_status(200) self.response.out.write("ok") @@ -180,24 +175,23 @@ class UpdateBuilders(webapp2.RequestHandler): self.response.out.write(ex.message) - class GetBuilders(webapp2.RequestHandler): """Return a list of masters mapped to their respective builders, possibly using cached data.""" def get(self): - callback = self.request.get('callback') - buildbot_data = memcache.get('buildbot_data') if not buildbot_data: logging.warning('No buildbot data in memcache. If this message repeats, something is probably wrong with memcache.') - - # Since we have no cached buildbot data, we would rather have missing masters than no data at all. - buildbot_data = fetch_buildbot_data(MASTERS, True) try: + buildbot_data = fetch_buildbot_data(MASTERS) memcache.set('buildbot_data', buildbot_data) - except ValueError, err: - logging.error(str(err)) + except FetchBuildersException, ex: + logging.error('Builders fetch failed: %s', str(ex)) + self.response.set_status(500) + self.response.out.write(ex.message) + return + callback = self.request.get('callback') if callback: buildbot_data = callback + '(' + buildbot_data + ');' |