blob: 3afb2b3a5f2f370ce3df78e973387902e80e88b2 [file] [log] [blame]
#!/usr/bin/env vpython
# Copyright 2016 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.
# This file was copy-pasted over from:
# //build/scripts/slave/upload_perf_dashboard_results.py
# with sections copied from:
# //build/scripts/slave/slave_utils.py
import json
import optparse
import re
import sys
import time
import urllib
from core import results_dashboard
RESULTS_LINK_PATH = '/report?masters=%s&bots=%s&tests=%s&rev=%s'
def _GetMainRevision(commit_pos):
"""Return revision to use as the numerical x-value in the perf dashboard.
This will be used as the value of "rev" in the data passed to
results_dashboard.SendResults.
This function returns the value of "got_revision_cp" in build properties.
"""
return int(re.search(r'{#(\d+)}', commit_pos).group(1))
def _GetDashboardJson(options):
main_revision = _GetMainRevision(options.got_revision_cp)
revisions = _GetPerfDashboardRevisionsWithProperties(
options.got_webrtc_revision, options.got_v8_revision,
options.git_revision, main_revision)
reference_build = 'reference' in options.name
stripped_test_name = options.name.replace('.reference', '')
results = {}
print 'Opening results file %s' % options.results_file
with open(options.results_file) as f:
results = json.load(f)
dashboard_json = {}
if 'charts' not in results:
# These are legacy results.
# pylint: disable=redefined-variable-type
dashboard_json = results_dashboard.MakeListOfPoints(
results, options.configuration_name, stripped_test_name,
options.buildername, options.buildnumber, {},
options.perf_dashboard_machine_group,
revisions_dict=revisions)
else:
dashboard_json = results_dashboard.MakeDashboardJsonV1(
results,
revisions, stripped_test_name, options.configuration_name,
options.buildername, options.buildnumber,
{}, reference_build,
perf_dashboard_machine_group=options.perf_dashboard_machine_group)
return dashboard_json
def _GetDashboardHistogramData(options):
revisions = {
'--chromium_commit_positions': _GetMainRevision(options.got_revision_cp),
'--chromium_revisions': options.git_revision
}
if options.got_webrtc_revision:
revisions['--webrtc_revisions'] = options.got_webrtc_revision
if options.got_v8_revision:
revisions['--v8_revisions'] = options.got_v8_revision
is_reference_build = 'reference' in options.name
stripped_test_name = options.name.replace('.reference', '')
begin_time = time.time()
hs = results_dashboard.MakeHistogramSetWithDiagnostics(
histograms_file=options.results_file, test_name=stripped_test_name,
bot=options.configuration_name, buildername=options.buildername,
buildnumber=options.buildnumber,
project=options.project, buildbucket=options.buildbucket,
revisions_dict=revisions, is_reference_build=is_reference_build,
perf_dashboard_machine_group=options.perf_dashboard_machine_group)
end_time = time.time()
print 'Duration of adding diagnostics for %s: %d seconds' % (
stripped_test_name, end_time - begin_time)
return hs
def _CreateParser():
# Parse options
parser = optparse.OptionParser()
parser.add_option('--name')
parser.add_option('--results-file')
parser.add_option('--output-json-file')
parser.add_option('--got-revision-cp')
parser.add_option('--configuration-name')
parser.add_option('--results-url')
parser.add_option('--perf-dashboard-machine-group')
parser.add_option('--project')
parser.add_option('--buildbucket')
parser.add_option('--buildername')
parser.add_option('--buildnumber')
parser.add_option('--got-webrtc-revision')
parser.add_option('--got-v8-revision')
parser.add_option('--git-revision')
parser.add_option('--output-json-dashboard-url')
parser.add_option('--send-as-histograms', action='store_true')
parser.add_option('--service-account-file', default=None)
return parser
def main(args):
parser = _CreateParser()
options, extra_args = parser.parse_args(args)
# Validate options.
if extra_args:
parser.error('Unexpected command line arguments')
if not options.configuration_name or not options.results_url:
parser.error('configuration_name and results_url are required.')
service_account_file = options.service_account_file
if not options.perf_dashboard_machine_group:
print 'Error: Invalid perf dashboard machine group'
return 1
if not options.send_as_histograms:
dashboard_json = _GetDashboardJson(options)
else:
dashboard_json = _GetDashboardHistogramData(options)
if options.output_json_file:
json.dump(dashboard_json, options.output_json_file,
indent=4, separators=(',', ': '))
if dashboard_json:
if options.output_json_dashboard_url:
# Dump dashboard url to file.
dashboard_url = GetDashboardUrl(options.name,
options.configuration_name, options.results_url,
options.got_revision_cp,
options.perf_dashboard_machine_group)
with open(options.output_json_dashboard_url, 'w') as f:
json.dump(dashboard_url if dashboard_url else '', f)
if not results_dashboard.SendResults(
dashboard_json,
options.name,
options.results_url,
send_as_histograms=options.send_as_histograms,
service_account_file=service_account_file):
return 1
else:
# The upload didn't fail since there was no data to upload.
print 'Warning: No perf dashboard JSON was produced.'
return 0
if __name__ == '__main__':
sys.exit(main((sys.argv[1:])))
def GetDashboardUrl(name, configuration_name, results_url,
got_revision_cp, perf_dashboard_machine_group):
"""Optionally writes the dashboard url to a file
and returns a link to the dashboard.
"""
name = name.replace('.reference', '')
dashboard_url = results_url + RESULTS_LINK_PATH % (
urllib.quote(perf_dashboard_machine_group),
urllib.quote(configuration_name),
urllib.quote(name),
_GetMainRevision(got_revision_cp))
return dashboard_url
def _GetPerfDashboardRevisionsWithProperties(
got_webrtc_revision, got_v8_revision, git_revision, main_revision,
point_id=None):
"""Fills in the same revisions fields that process_log_utils does."""
versions = {}
versions['rev'] = main_revision
versions['webrtc_git'] = got_webrtc_revision
versions['v8_rev'] = got_v8_revision
versions['git_revision'] = git_revision
versions['point_id'] = point_id
# There are a lot of "bad" revisions to check for, so clean them all up here.
for key in versions.keys():
if not versions[key] or versions[key] == 'undefined':
del versions[key]
return versions