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