summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Tools/TestResultServer/handlers/buildershandler.py
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Tools/TestResultServer/handlers/buildershandler.py')
-rw-r--r--chromium/third_party/WebKit/Tools/TestResultServer/handlers/buildershandler.py150
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 + ');'