You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
3.6 KiB

#!/usr/bin/env python
""" Trigger a Cluster Telemetry job with the given Lua script. """
import argparse
import base64
import getpass
import httplib2
import json
import subprocess
import urllib
CT_URL = 'https://skia-tree-status.appspot.com/skia-telemetry/'
CT_ADD_LUA_TASK_URL = CT_URL + 'add_lua_task'
CT_GET_SKP_REPOS_URL = CT_URL + 'get_skp_repos'
CT_PENDING_TASKS_URL = CT_URL + 'pending_tasks'
POST_DATA = ('username=%s'
'&password=%s'
'&description=%s'
'&lua_script=%s'
'&pagesets_type_and_chromium_build=%s')
def trigger_ct_run(user, password, description, script, skp_repo,
aggregator=None):
"""Trigger a Cluster Telemetry run of the given script."""
with open(script) as f:
script_contents = urllib.quote(base64.b64encode(f.read()))
body = POST_DATA % (user, password, description, script_contents, skp_repo)
if aggregator:
with open(aggregator) as f:
body += '&lua_aggregator=%s' % urllib.quote(base64.b64encode(f.read()))
resp, content = httplib2.Http().request(
CT_ADD_LUA_TASK_URL, 'POST', body=body)
if resp['status'] != '200':
raise Exception(
'Failed to trigger Cluster Telemetry job: (%s): %s' % (
resp['status'], content))
def parse_args():
"""Parse command-line flags and obtain any additional information."""
parser = argparse.ArgumentParser(
description='Trigger a Cluster Telemetry job with the given Lua script.')
parser.add_argument('--script', help='Lua script to run', required=True)
parser.add_argument('--aggregator', help='Aggregator script')
parser.add_argument('--description', help='Description of the job.')
parser.add_argument('--email',
help=('Email address to send results. If not specified, '
'the value of `git config user.email` is used.'))
parser.add_argument('--password_file',
help=('File in which the CT password is stored. Will '
'prompt for password if not specified.'))
parser.add_argument('--skp_repo', default='10k',
help='Which set of SKPs to use, eg. "10k", "All"')
args = parser.parse_args()
# If the user provided their email address, use that. Otherwise obtain it
# from the Git config.
user = args.email
if not user:
user = subprocess.check_output(['git', 'config', 'user.email']).rstrip()
# Read the password from the password file, if provided, otherwise prompt.
if args.password_file:
with open(args.password_file) as f:
password = f.read().rstrip()
else:
password = getpass.getpass(
'Enter the skia_status_password '
'(on https://valentine.corp.google.com/): ')
# Find an SKP repo to use.
resp, content = httplib2.Http().request(CT_GET_SKP_REPOS_URL, "GET")
if resp['status'] != '200':
raise Exception('Failed to obtain SKP repos from %s' % CT_GET_SKP_REPOS_URL)
skp_repos = json.loads(content)
chosen_skp_repo = skp_repos.get(args.skp_repo)[0]
if not chosen_skp_repo:
raise Exception('No generated SKPs exist for "%s"' % args.skp_repo)
skp_repo = '-'.join((args.skp_repo,
chosen_skp_repo[0],
chosen_skp_repo[1]))
return (user, password, args.description, args.script, skp_repo,
args.aggregator)
def main():
user, password, description, script, skp_repo, aggregator = parse_args()
trigger_ct_run(user, password, description, script, skp_repo, aggregator)
print ('Successfully triggered Cluster Telemetry job. View the queue at %s' %
CT_PENDING_TASKS_URL)
if __name__ == '__main__':
main()