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

Unified Diff: dashboard/dashboard/pinpoint_request.py

Issue 3018723002: .
Patch Set: Created 3 years, 3 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 | « dashboard/dashboard/elements/trace-button.html ('k') | dashboard/dashboard/pinpoint_request_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dashboard/dashboard/pinpoint_request.py
diff --git a/dashboard/dashboard/pinpoint_request.py b/dashboard/dashboard/pinpoint_request.py
index a85a7a094729f1654448c1ae70682759bd8450c1..6c5d74d600165d45a37bc5266f1cf843835d092b 100644
--- a/dashboard/dashboard/pinpoint_request.py
+++ b/dashboard/dashboard/pinpoint_request.py
@@ -18,6 +18,11 @@ from dashboard.services import pinpoint_service
_BOTS_TO_DIMENSIONS = 'bot_dimensions_map'
_PINPOINT_REPOSITORIES = 'repositories'
+_ISOLATE_TARGETS = [
+ 'angle_perftests', 'cc_perftests', 'gpu_perftests',
+ 'load_library_perf_tests', 'media_perftests', 'net_perftests',
+ 'performance_browser_tests', 'telemetry_perf_tests',
+ 'telemetry_perf_webview_tests', 'tracing_perftests']
class InvalidParamsError(Exception):
@@ -30,7 +35,7 @@ class PinpointNewPrefillRequestHandler(request_handler.RequestHandler):
self.response.write(json.dumps({'story_filter': story_filter}))
-class PinpointNewRequestHandler(request_handler.RequestHandler):
+class PinpointNewBisectRequestHandler(request_handler.RequestHandler):
def post(self):
job_params = dict(
(a, self.request.get(a)) for a in self.request.arguments())
@@ -44,6 +49,20 @@ class PinpointNewRequestHandler(request_handler.RequestHandler):
self.response.write(json.dumps(pinpoint_service.NewJob(pinpoint_params)))
+class PinpointNewPerfTryRequestHandler(request_handler.RequestHandler):
+ def post(self):
+ job_params = dict(
+ (a, self.request.get(a)) for a in self.request.arguments())
+
+ try:
+ pinpoint_params = PinpointParamsFromPerfTryParams(job_params)
+ except InvalidParamsError as e:
+ self.response.write(json.dumps({'error': e.message}))
+ return
+
+ self.response.write(json.dumps(pinpoint_service.NewJob(pinpoint_params)))
+
+
def ParseMetricParts(test_path_parts):
metric_parts = test_path_parts[3:]
@@ -95,6 +114,104 @@ def ParseTIRLabelChartNameAndTraceName(test_path_parts):
return tir_label, chart_name, trace_name
+def _BotDimensionsFromBotName(bot_name):
+ bots_to_dimensions = namespaced_stored_object.Get(_BOTS_TO_DIMENSIONS)
+ dimensions = bots_to_dimensions.get(bot_name)
+ if not dimensions:
+ raise InvalidParamsError('No dimensions for bot %s defined.' % bot_name)
+ return dimensions
+
+
+def PinpointParamsFromPerfTryParams(params):
+ """Takes parameters from Dashboard's pinpoint-perf-job-dialog and returns
+ a dict with parameters for a new Pinpoint job.
+
+ Args:
+ params: A dict in the following format:
+ {
+ 'test_path': Test path for the metric being bisected.
+ 'start_commit': Git hash or commit position of earlier revision.
+ 'end_commit': Git hash or commit position of later revision.
+ 'start_repository': Repository for earlier revision.
+ 'end_repository': Repository for later revision.
+ 'extra_telemetry_args': Extra args for telemetry.
+ }
+
+ Returns:
+ A dict of params for passing to Pinpoint to start a job, or a dict with an
+ 'error' field.
+ """
+ if not utils.IsValidSheriffUser():
+ user = users.get_current_user()
+ raise InvalidParamsError('User "%s" not authorized.' % user)
+
+ # Pinpoint takes swarming dimensions, so we need to map bot name to those.
+ test_path = params['test_path']
+ test_path_parts = test_path.split('/')
+ bot_name = test_path_parts[1]
+ suite = test_path_parts[2]
+
+ dimensions = _BotDimensionsFromBotName(bot_name)
+
+ # Pinpoint also requires you specify which isolate target to run the
+ # test, so we derive that from the suite name. Eventually, this would
+ # ideally be stored in a SparesDiagnostic but for now we can guess.
+ target = 'telemetry_perf_tests'
+ if suite in _ISOLATE_TARGETS:
+ raise InvalidParamsError('Only telemetry is supported at the moment.')
+ elif 'webview' in bot_name:
+ target = 'telemetry_perf_webview_tests'
+
+ start_repository = params['start_repository']
+ end_repository = params['end_repository']
+ start_commit = params['start_commit']
+ end_commit = params['end_commit']
+
+ start_git_hash = ResolveToGitHash(start_commit, start_repository)
+ end_git_hash = ResolveToGitHash(end_commit, end_repository)
+
+ supported_repositories = namespaced_stored_object.Get(_PINPOINT_REPOSITORIES)
+
+ # Bail if it's not a supported repository to bisect on
+ if not start_repository in supported_repositories:
+ raise InvalidParamsError('Invalid repository: %s' % start_repository)
+ if not end_repository in supported_repositories:
+ raise InvalidParamsError('Invalid repository: %s' % end_repository)
+
+ # Pinpoint only supports chromium at the moment, so just throw up a
+ # different error for now.
+ if start_repository != 'chromium' or end_repository != 'chromium':
+ raise InvalidParamsError('Only chromium perf try jobs supported currently.')
+
+ extra_telemetry_args = params['extra_telemetry_args']
+
+ email = users.get_current_user().email()
+ job_name = 'Job on [%s/%s] for [%s]' % (bot_name, suite, email)
+
+ browser = start_try_job.GuessBrowserName(bot_name)
+
+ return {
+ 'configuration': bot_name,
+ 'browser': browser,
+ 'benchmark': suite,
+ 'trace': '',
+ 'chart': '',
+ 'tir_label': '',
+ 'story': '',
+ 'start_repository': start_repository,
+ 'end_repository': end_repository,
+ 'start_git_hash': start_git_hash,
+ 'end_git_hash': end_git_hash,
+ 'extra_telemetry_args': json.dumps(extra_telemetry_args),
+ 'bug_id': '',
+ 'auto_explore': '0',
+ 'target': target,
+ 'dimensions': json.dumps(dimensions),
+ 'email': email,
+ 'name': job_name
+ }
+
+
def PinpointParamsFromBisectParams(params):
"""Takes parameters from Dashboard's pinpoint-job-dialog and returns
a dict with parameters for a new Pinpoint job.
@@ -118,8 +235,6 @@ def PinpointParamsFromBisectParams(params):
user = users.get_current_user()
raise InvalidParamsError('User "%s" not authorized.' % user)
- bots_to_dimensions = namespaced_stored_object.Get(_BOTS_TO_DIMENSIONS)
-
# Pinpoint takes swarming dimensions, so we need to map bot name to those.
test_path = params['test_path']
test_path_parts = test_path.split('/')
@@ -140,21 +255,13 @@ def PinpointParamsFromBisectParams(params):
tir_label, chart_name, trace_name = ParseTIRLabelChartNameAndTraceName(
test_path_parts)
- dimensions = bots_to_dimensions.get(bot_name)
- if not dimensions:
- raise InvalidParamsError('No dimensions for bot %s defined.' % bot_name)
+ dimensions = _BotDimensionsFromBotName(bot_name)
# Pinpoint also requires you specify which isolate target to run the
# test, so we derive that from the suite name. Eventually, this would
# ideally be stored in a SparesDiagnostic but for now we can guess.
- isolate_targets = [
- 'angle_perftests', 'cc_perftests', 'gpu_perftests',
- 'load_library_perf_tests', 'media_perftests', 'net_perftests',
- 'performance_browser_tests', 'telemetry_perf_tests',
- 'telemetry_perf_webview_tests', 'tracing_perftests']
-
target = 'telemetry_perf_tests'
- if suite in isolate_targets:
+ if suite in _ISOLATE_TARGETS:
target = suite
elif 'webview' in bot_name:
target = 'telemetry_perf_webview_tests'
« no previous file with comments | « dashboard/dashboard/elements/trace-button.html ('k') | dashboard/dashboard/pinpoint_request_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698