| #!/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() |