Index: tools/lua/trigger_ct_lua |
diff --git a/tools/lua/trigger_ct_lua b/tools/lua/trigger_ct_lua |
new file mode 100755 |
index 0000000000000000000000000000000000000000..78915548aeb1c9ff4c72d93da60a609da982b0c4 |
--- /dev/null |
+++ b/tools/lua/trigger_ct_lua |
@@ -0,0 +1,103 @@ |
+#!/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() |