Configure gerrit trigger

PROD-16423

Change-Id: Id99189525bc02e08c5c9eafa4110aa0f356d48e8
diff --git a/README.rst b/README.rst
index d721873..588d72b 100644
--- a/README.rst
+++ b/README.rst
@@ -798,6 +798,32 @@
               visible_for_project: ''
               timestamps: false
               timestamp_format: ''
+=======
+Gerrit trigger plugin configuration
+
+.. code-block:: yaml
+
+    jenkins:
+      client:
+        gerrit:
+          server1:
+            host: "gerrit.domain.local"
+            port: 29418
+            username: "jenkins"
+            email: "jenkins@domain.local"
+            auth_key_file: "/var/jenkins_home/.ssh/id_rsa"
+            frontendURL: "https://gerrit.domain.local"
+            authkey: |
+              SOMESSHKEY
+          server2:
+            host: "gerrit2.domain.local"
+            port: 29418
+            username: "jenkins"
+            email: "jenkins@domain.local"
+            auth_key_file: "/var/jenkins_home/.ssh/id_rsa"
+            frontendURL: "https://gerrit2.domain.local"
+            authkey: |
+              SOMESSHKEY
 
 Usage
 =====
diff --git a/_states/jenkins_gerrit.py b/_states/jenkins_gerrit.py
new file mode 100644
index 0000000..26b1259
--- /dev/null
+++ b/_states/jenkins_gerrit.py
@@ -0,0 +1,51 @@
+import logging
+
+logger = logging.getLogger(__name__)
+
+def __virtual__():
+    '''
+    Only load if jenkins_common module exist.
+    '''
+    if 'jenkins_common.call_groovy_script' not in __salt__:
+        return (
+            False,
+            'The jenkins_gerrit state module cannot be loaded: '
+            'jenkins_common not found')
+    return True
+
+
+def present(name, hostname, username, frontendurl, auth_key_file, authkey,
+            port="29418", auth_key_file_password=None, email="", proxy=""):
+    """
+    Jenkins gerrit-trigger state method
+
+    :param name: server name
+    :param host: server hostname
+    :param username: username
+    :param email: trigger email (optional)
+    :param port: server ssh port
+    :param proxy: proxy url (optional)
+    :param frontendurl: server frontend URL
+    :param auth_key_file: path to key file
+    :param authkey: ssh key
+    :param auth_key_file_password: password for keyfile (optional)
+    :returns: salt-specified state dict
+    """
+    template = __salt__['jenkins_common.load_template'](
+        'salt://jenkins/files/groovy/gerrit.template',
+        __env__)
+    return __salt__['jenkins_common.api_call'](name, template,
+                        ["CREATED", "EXISTS"],
+                        {
+                            "name": name,
+                            "hostname": hostname,
+                            "port": port if port else "29418",
+                            "proxy": proxy if proxy else "",
+                            "username": username,
+                            "email": email if email else "",
+                            "frontendurl": frontendurl,
+                            "auth_key_file": auth_key_file,
+                            "authkey": authkey,
+                            "auth_key_file_password": auth_key_file_password if auth_key_file_password else None
+                        },
+                        "Gerrit server")
diff --git a/jenkins/client/gerrit.sls b/jenkins/client/gerrit.sls
new file mode 100644
index 0000000..c540b20
--- /dev/null
+++ b/jenkins/client/gerrit.sls
@@ -0,0 +1,20 @@
+{% from "jenkins/map.jinja" import client with context %}
+{%- if client.gerrit is defined %}
+{% for name, gerrit in client.get('gerrit',{}).iteritems() %}
+jenkins_gerrit_trigger_{{ name }}:
+  jenkins_gerrit.present:
+  - name: {{ name }}
+  - hostname: {{ gerrit.get('host', '') }}
+  - port: {{ gerrit.get('port', '29418') }}
+  - proxy: {{ gerrit.get('proxy', '')  }}
+  - username: {{ gerrit.get('username', '') }}
+  - email: {{ gerrit.get('email', '') }}
+  - auth_key_file: {{ gerrit.get('auth_key_file', '') }}
+  - frontendurl: {{ gerrit.get('frontendURL','') }}
+  {%- if gerrit.authkey is defined %}
+  - authkey: |
+      {{ gerrit.get('authkey','')|indent(6) }}
+  {%- endif %}
+  - auth_key_file_password: {{ gerrit.get('auth_key_file_password', '') }}
+{% endfor %}
+{%- endif %}
diff --git a/jenkins/client/init.sls b/jenkins/client/init.sls
index 46fb104..f68d83d 100644
--- a/jenkins/client/init.sls
+++ b/jenkins/client/init.sls
@@ -59,6 +59,10 @@
   - jenkins.client.job_template
 {%- endif %}
 
+{%- if client.gerrit is defined %}
+  - jenkins.client.gerrit
+{%- endif %}
+
 
 jenkins_client_install:
   pkg.installed:
diff --git a/jenkins/files/groovy/gerrit.template b/jenkins/files/groovy/gerrit.template
new file mode 100644
index 0000000..1895494
--- /dev/null
+++ b/jenkins/files/groovy/gerrit.template
@@ -0,0 +1,56 @@
+#!groovy
+import jenkins.model.*;
+import net.sf.json.*;
+import com.sonyericsson.hudson.plugins.gerrit.trigger.*;
+
+if ( Jenkins.instance.pluginManager.activePlugins.find { it.shortName == "gerrit-trigger" } != null ) {
+    def gerritPlugin = Jenkins.instance.getPlugin(com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl.class)
+    gerritPlugin.getPluginConfig().setNumberOfReceivingWorkerThreads(3)
+    gerritPlugin.getPluginConfig().setNumberOfSendingWorkerThreads(1)
+
+    def authkey = """${authkey}
+    """
+
+    def serverName = "${name}"
+    def gerritServer = new GerritServer(serverName)
+
+    def gerritTriggerPlugin = PluginImpl.getInstance()
+    def gerritServers = gerritTriggerPlugin.getServerNames()
+    def gerritServerExists = false
+    gerritServers.each {
+        serverName = (String) it
+        if ( serverName == gerritServer.getName() ) {
+            gerritServerExists = true
+        }
+    }
+    if (!gerritServerExists){
+
+        def triggerConfig = new config.Config()
+
+        triggerConfig.setGerritHostName("${hostname}")
+        triggerConfig.setGerritUserName("${username}")
+        triggerConfig.setGerritFrontEndURL("${frontendurl}")
+        triggerConfig.setGerritSshPort(${port})
+        triggerConfig.setGerritProxy("${proxy}")
+        triggerConfig.setGerritEMail("${email}")
+
+        def gerritAuthKeyFile = new File("${auth_key_file}")
+        gerritAuthKeyFile.write(authkey)
+        if ( gerritAuthKeyFile.exists() ) {
+            triggerConfig.setGerritAuthKeyFile(gerritAuthKeyFile)
+        }
+
+        triggerConfig.setGerritAuthKeyFilePassword("${auth_key_file_password}")
+
+        gerritServer.setConfig(triggerConfig)
+
+        gerritPlugin.addServer(gerritServer)
+        gerritServer.start()
+        gerritServer.startConnection()
+        Jenkins.instance.save()
+        print("CREATED")
+    }
+    else {
+        print("EXISTS")
+    }
+}