| 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()
|
|
|