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

Unified Diff: gm/rebaseline_server/download_actuals.py

Issue 688353003: Add support for rebaselining from trybots. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 1 month 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 | « no previous file | gm/rebaseline_server/server.py » ('j') | gm/rebaseline_server/server.py » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gm/rebaseline_server/download_actuals.py
diff --git a/gm/rebaseline_server/download_actuals.py b/gm/rebaseline_server/download_actuals.py
index c11f1914b2abd4f70cf56a1196e9936725751111..fcbf746949783bf1637482d9e0aafce4496e3c94 100755
--- a/gm/rebaseline_server/download_actuals.py
+++ b/gm/rebaseline_server/download_actuals.py
@@ -10,10 +10,13 @@ Download actual GM results for a particular builder.
"""
# System-level imports
+import httplib
+import logging
import optparse
import os
import posixpath
import re
+import traceback
import urllib2
# Must fix up PYTHONPATH before importing from within Skia
@@ -96,6 +99,85 @@ def get_builders_list(summaries_bucket=GM_SUMMARIES_BUCKET):
dirs, _ = gs_utils.GSUtils().list_bucket_contents(bucket=GM_SUMMARIES_BUCKET)
return dirs
+def get_rietveld_actuals(issue, json_filename):
+ """ Returns the actuals for the given rietveld issue's tryjobs.
+ {non_try_builder:string -> [ bucket:string, path:string, generation:string ]}
+
+ e.g.
+ {'Test-Android-Xoom-Tegra2-Arm7-Release': (
+ 'chromium-skia-gm-summaries',
+ 'Test-Android-Xoom-Tegra2-Arm7-Release-Trybot/actual-results.json',
+ '1415041165535000')}
+ """
+ result = dict()
+ json_filename_re = re.compile('^Created: gs://([^/]+)/((?:[^/]+/)+%s)#(\d+)$'
+ % re.escape(json_filename), re.MULTILINE)
+ codereview_api_url = 'https://codereview.chromium.org/api'
+ upload_gm_results_step_url = '/steps/Upload GM Results/logs/stdio'
+
+ logging.info('Fetching issue %s ...' % (issue,))
+ json_issue_url = '%s/%s' % (codereview_api_url, issue)
+ json_issue_data = urllib2.urlopen(json_issue_url).read()
+ issue_dict = gm_json.LoadFromString(json_issue_data)
+
+ patchsets = issue_dict.get("patchsets", [])
+ patchset = patchsets[-1]
+ if not patchset:
+ logging.warning('No patchsets for rietveld issue %s.' % (issue,))
+ return result
+
+ logging.info('Fetching issue %s patch %s...' % (issue, patchset))
+ json_patchset_url = '%s/%s/%s' % (codereview_api_url, issue, patchset)
+ json_patchset_data = urllib2.urlopen(json_patchset_url).read()
+ patchset_dict = gm_json.LoadFromString(json_patchset_data)
+
+ # try_job_results is ordered reverse chronologically
+ try_job_results = patchset_dict.get('try_job_results', [])
+ for try_job_result in try_job_results:
+ builder = try_job_result.get('builder', '<bad builder>')
+ non_try_builder = builder
rmistry 2014/11/05 13:39:16 Seems confusing to switch non_try_builder's value
bungeman-skia 2014/11/07 22:56:52 Done.
+ if non_try_builder.endswith('-Trybot'):
+ non_try_builder = non_try_builder[:-len('-Trybot')]
+ if non_try_builder in result:
+ continue
+
+ logging.info('Fetching issue %s patch %s try %s...' %
+ (issue, patchset, builder))
+ build_url = try_job_result.get('url', '<bad url>')
+ gm_upload_output_url = build_url + urllib2.quote(upload_gm_results_step_url)
+ logging.info('Fetching %s ...' % (gm_upload_output_url,))
+
+ # Tryjobs might not produce the step, but don't let that fail everything.
+ gm_upload_output = None
+ try:
+ gm_upload_output = urllib2.urlopen(gm_upload_output_url).read()
+ except urllib2.HTTPError, e:
+ logging.warning('HTTPError: ' + str(e.code))
+ except urllib2.URLError, e:
+ logging.warning('URLError: ' + str(e.reason))
+ except httplib.HTTPException, e:
+ logging.warning('HTTPException')
+ except Exception:
+ logging.warning('generic exception: ' + traceback.format_exc())
rmistry 2014/11/05 13:39:16 traceback.format_exc() returns None so this will p
bungeman-skia 2014/11/07 22:56:53 Done.
+ if not gm_upload_output:
+ logging.warning('Could not fetch %s .' % (gm_upload_output_url,))
+ continue
+
+ json_filename_match = json_filename_re.search(gm_upload_output)
+ if json_filename_match:
+ logging.info('Found issue %s patch %s try %s result gs://%s/%s#%s .' %
+ (issue, patchset, non_try_builder,
+ json_filename_match.group(1),
+ json_filename_match.group(2),
+ json_filename_match.group(3)))
+ result[non_try_builder] = [json_filename_match.group(1),
+ json_filename_match.group(2),
+ json_filename_match.group(3)]
+ else:
+ logging.warning('Did not find %s for issue %s patch %s try %s.' %
+ (json_filename, issue, patchset, builder))
+
+ return result
def main():
parser = optparse.OptionParser()
« no previous file with comments | « no previous file | gm/rebaseline_server/server.py » ('j') | gm/rebaseline_server/server.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698