Move gerrit scripts to puppet.

Take the things from openstack-ci/gerrit and move them directly
in to the puppet module. Install them using the model we're using
for the jenkins slave scripts.

Change-Id: I420b2b895bd57d40232b2cdda437617373a82890
diff --git a/update_blueprint.py b/update_blueprint.py
new file mode 100755
index 0000000..9c18f1d
--- /dev/null
+++ b/update_blueprint.py
@@ -0,0 +1,139 @@
+#!/usr/bin/env python
+# Copyright (c) 2011 OpenStack, LLC.
+#
+# 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 is designed to be called by a gerrit hook.  It searched new
+# patchsets for strings like "blueprint FOO" or "bp FOO" and updates
+# corresponding Launchpad blueprints with links back to the change.
+
+from launchpadlib.launchpad import Launchpad
+from launchpadlib.uris import LPNET_SERVICE_ROOT
+import os
+import argparse
+import re
+import subprocess
+
+import StringIO
+import ConfigParser
+import MySQLdb
+
+BASE_DIR = '/home/gerrit2/review_site'
+GERRIT_CACHE_DIR = os.path.expanduser(os.environ.get('GERRIT_CACHE_DIR',
+                                '~/.launchpadlib/cache'))
+GERRIT_CREDENTIALS = os.path.expanduser(os.environ.get('GERRIT_CREDENTIALS',
+                                '~/.launchpadlib/creds'))
+GERRIT_CONFIG = os.environ.get('GERRIT_CONFIG',
+                                 '/home/gerrit2/review_site/etc/gerrit.config')
+GERRIT_SECURE_CONFIG = os.environ.get('GERRIT_SECURE_CONFIG',
+                                 '/home/gerrit2/review_site/etc/secure.config')
+SPEC_RE = re.compile(r'(blueprint|bp)\s*[#:]?\s*(\S+)', re.I)
+BODY_RE = re.compile(r'^\s+.*$')
+
+def get_broken_config(filename):
+    """ gerrit config ini files are broken and have leading tabs """
+    text = ""
+    with open(filename,"r") as conf:
+        for line in conf.readlines():
+            text = "%s%s" % (text, line.lstrip())
+
+    fp = StringIO.StringIO(text)
+    c=ConfigParser.ConfigParser()
+    c.readfp(fp)
+    return c
+
+GERRIT_CONFIG = get_broken_config(GERRIT_CONFIG)
+SECURE_CONFIG = get_broken_config(GERRIT_SECURE_CONFIG)
+DB_USER = GERRIT_CONFIG.get("database", "username")
+DB_PASS = SECURE_CONFIG.get("database","password")
+DB_DB = GERRIT_CONFIG.get("database","database")
+
+def update_spec(launchpad, project, name, subject, link, topic=None):
+    # For testing, if a project doesn't match openstack/foo, use
+    # the openstack-ci project instead.
+    group, project = project.split('/')
+    if group != 'openstack':
+        project = 'openstack-ci'
+
+    spec = launchpad.projects[project].getSpecification(name=name)
+    if not spec: return
+
+    if spec.whiteboard:
+        wb = spec.whiteboard.strip()
+    else:
+        wb = ''
+    changed = False
+    if topic:
+        topiclink = '%s/#q,topic:%s,n,z' % (link[:link.find('/',8)],
+                                            topic)
+        if topiclink not in wb:
+            wb += "\n\n\nGerrit topic: %(link)s" % dict(link=topiclink)
+            changed = True
+
+    if link not in wb:
+        wb += "\n\n\nAddressed by: %(link)s\n    %(subject)s\n" % dict(subject=subject,
+                                                                      link=link)
+        changed = True
+
+    if changed:
+        spec.whiteboard = wb
+        spec.lp_save()
+
+def find_specs(launchpad, dbconn, args):
+    git_log = subprocess.Popen(['git',
+                                '--git-dir=' + BASE_DIR + '/git/' + args.project + '.git',
+                                'log', '--no-merges',
+                                args.commit + '^1..' + args.commit],
+                               stdout=subprocess.PIPE).communicate()[0]
+
+    cur = dbconn.cursor()
+    cur.execute("select subject, topic from changes where change_key=%s", args.change)
+    subject, topic = cur.fetchone()
+    specs = set([m.group(2) for m in SPEC_RE.finditer(git_log)])
+
+    if topic:
+        topicspec = topic.split('/')[-1]
+        specs |= set([topicspec])
+
+    for spec in specs:
+        update_spec(launchpad, args.project, spec, subject,
+                    args.change_url, topic)
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('hook')
+    #common
+    parser.add_argument('--change', default=None)
+    parser.add_argument('--change-url', default=None)
+    parser.add_argument('--project', default=None)
+    parser.add_argument('--branch', default=None)
+    parser.add_argument('--commit', default=None)
+    #change-merged
+    parser.add_argument('--submitter', default=None)
+    # patchset-created
+    parser.add_argument('--uploader', default=None)
+    parser.add_argument('--patchset', default=None)
+
+    args = parser.parse_args()
+
+    launchpad = Launchpad.login_with('Gerrit User Sync', LPNET_SERVICE_ROOT,
+                                     GERRIT_CACHE_DIR,
+                                     credentials_file = GERRIT_CREDENTIALS,
+                                     version='devel')
+
+    conn = MySQLdb.connect(user = DB_USER, passwd = DB_PASS, db = DB_DB)
+
+    find_specs(launchpad, conn, args)
+
+if __name__ == '__main__':
+    main()