#!/usr/bin/env python
# Copyright 2015 Cloudera, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


# This tool triggers a Jenkins build based on a particular gerrit URL.
# The Jenkins build will post a +1 or -1 on the gerrit.
#
# NOTE: currently this is hard-coded to an internal Cloudera server.
# We plan to move to upstream infrastructure at some later date.

import logging
import json
import re
import subprocess
import sys
import urllib
import urllib2
import urlparse

GERRIT_HOST = "gerrit.cloudera.org"
JENKINS_URL = "http://sandbox.jenkins.cloudera.com/"
JENKINS_JOB = "kudu-public-gerrit"


def check_output(*popenargs, **kwargs):
  r"""Run command with arguments and return its output as a byte string.
  Backported from Python 2.7 as it's implemented as pure python on stdlib.
  >>> check_output(['/usr/bin/python', '--version'])
  Python 2.6.2
  """
  process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
  output, unused_err = process.communicate()
  retcode = process.poll()
  if retcode:
    cmd = kwargs.get("args")
    if cmd is None:
      cmd = popenargs[0]
    error = subprocess.CalledProcessError(retcode, cmd)
    error.output = output
    raise error
  return output


def get_gerrit_ssh_command():
  url = check_output("git config --get remote.gerrit.url".split(" "))
  m = re.match(r'ssh://(.+)@(.+):(\d+)/.+', url)
  if not m:
    raise Exception("expected gerrit remote to be an ssh://user@host:port/ URL: %s" % url)
  user, host, port = m.groups()
  if host != GERRIT_HOST:
    raise Exception("unexpected gerrit host %s in remote 'gerrit'. Expected %s" % (
        host, GERRIT_HOST))
  return ["ssh", "-p", port, "-l", user, host]


def current_ref_for_gerrit_number(change_num):
  j = check_output(get_gerrit_ssh_command() + [
      "gerrit", "query", "--current-patch-set", "--format", "JSON",
      "change:%d" % change_num])
  j = json.loads(j.split("\n")[0])
  return j['currentPatchSet']['ref']


def url_to_ref(url):
  u = urlparse.urlparse(url)
  if not u.netloc.startswith(GERRIT_HOST):
    print >>sys.stderr, "unexpected gerrit host %s, expected %s\n" % (
        u.netloc, GERRIT_HOST)
    usage()
    sys.exit(1)
  if u.path == '/':
    m = re.match(r'/c/(\d+)/', u.fragment)
    if m:
      return current_ref_for_gerrit_number(int(m.group(1)))
  print >>sys.stderr, "invalid gerrit URL: ", url
  usage()
  sys.exit(1)

def usage():
  print >>sys.stderr, "usage: %s <url>\n" % sys.argv[0]
  print >>sys.stderr, "The provided URL should look something like:"
  print >>sys.stderr, "http://gerrit.cloudera.org:8080/#/c/963/\n"


def determine_ref():
  if len(sys.argv) != 2:
    usage()
    sys.exit(1)

  arg = sys.argv[1]
  if arg.startswith("http"):
    return url_to_ref(arg)
  else:
    print >>sys.stderr, "Unable to parse argument: %s\n" % arg
    sys.exit(1)


def trigger_jenkins(ref):
  logging.info("Will trigger Jenkins for ref %s" % ref)
  url = "%s/job/%s/buildWithParameters" % (JENKINS_URL, JENKINS_JOB)
  params = dict(GERRIT_BRANCH=ref)
  req = urllib2.Request(url,
                        data=urllib.urlencode(params),
                        headers={"Accept": "application/json"})
  urllib2.urlopen(req).read()
  logging.info("Successfuly triggered jenkins job!")


def main():
  gerrit_ref = determine_ref()
  trigger_jenkins(gerrit_ref)

if __name__ == "__main__":
  logging.basicConfig(level=logging.INFO)
  main()
