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