Gerrit client and project enforcement
diff --git a/_modules/gerrit.py b/_modules/gerrit.py
new file mode 100644
index 0000000..c4048cf
--- /dev/null
+++ b/_modules/gerrit.py
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+'''
+Module for handling gerrit calls.
+
+:optdepends: - gerritlib Python adapter
+:configuration: This module is not usable until the following are specified
+ either in a pillar or in the minion's config file::
+
+ gerrit.host: localhost
+ gerrit.user: admin
+ gerrit.key: |
+ -----BEGIN RSA PRIVATE KEY-----
+ MIIEowIBAAKCAQEAs0Y8mxS3dfs5zG8Du5vdBkfOCOng1IEUmFZIirJ8oBgJOd54
+ ...
+ jvMXms60iD/A5OpG33LWHNNzQBP486SxG75LB+Xs5sp5j2/b7VF5LJLhpGiJv9Mk
+ ydbuy8iuuvali2uF133kAlLqnrWfVTYQQI1OfW5glOv1L6kv94dU
+ -----END RSA PRIVATE KEY-----
+
+'''
+
+from __future__ import absolute_import
+
+import logging
+import os
+
+LOG = logging.getLogger(__name__)
+
+# Import third party libs
+HAS_GERRIT = False
+try:
+ from gerritlib import gerrit
+ HAS_GERRIT = True
+except ImportError:
+ pass
+
+
+def __virtual__():
+ '''
+ Only load this module if gerrit
+ is installed on this minion.
+ '''
+ if HAS_GERRIT:
+ return 'gerrit'
+ return False
+
+__opts__ = {}
+
+
+def auth(**connection_args):
+ '''
+ Set up gerrit credentials
+
+ Only intended to be used within gerrit-enabled modules
+ '''
+
+ prefix = "gerrit"
+
+ # look in connection_args first, then default to config file
+ def get(key, default=None):
+ return connection_args.get('connection_' + key,
+ __salt__['config.get'](prefix, {})).get(key, default)
+
+ host = get('host', 'localhost')
+ user = get('user', 'admin')
+ keyfile = get('keyfile', '/var/cache/salt/minion/gerrit_rsa')
+
+ gerrit_client = gerrit.Gerrit(host, user, keyfile=keyfile)
+ return gerrit_client
+
+
+def project_create(name, **kwargs):
+ '''
+ Create a gerrit project
+
+ :param name: new project name
+
+ CLI Examples:
+
+ .. code-block:: bash
+
+ salt '*' gerrit.project_create namespace/nova description='nova project'
+
+ '''
+ ret = {}
+ gerrit_client = auth(**kwargs)
+
+ project = project_get(name, **kwargs)
+
+ if project and not "Error" in project:
+ LOG.debug("Project {0} exists".format(name))
+ return project
+
+ new = gerrit_client.createProject(name)
+ return project_get(name, **kwargs)
+
+def project_get(name, **kwargs):
+ '''
+ Return a specific project
+
+ CLI Examples:
+
+ .. code-block:: bash
+
+ salt '*' gerrit.project_get projectname
+ '''
+ gerrit_client = auth(**kwargs)
+ ret = {}
+
+ projects = gerrit_client.listProjects()
+ if not name in projects:
+ return {'Error': 'Error in retrieving project'}
+ ret[name] = {'name': name}
+ return ret
+
+
+def project_list(**connection_args):
+ '''
+ Return a list of available projects
+
+ CLI Example:
+
+ .. code-block:: bash
+
+ salt '*' gerrit.project_list
+ '''
+ gerrit_client = auth(**connection_args)
+ ret = {}
+
+ projects = gerrit_client.listProjects()
+
+ for project in projects:
+ ret[project] = {
+ 'name': project
+ }
+ return ret
+
+
+def query(change, **kwargs):
+ '''
+ Query gerrit
+
+ :param change: Query content
+
+ CLI Examples:
+
+ .. code-block:: bash
+
+ salt '*' gerrit.query 'status:open project:tools/gerrit limit:2'
+
+ '''
+ ret = {}
+ gerrit_client = auth(**kwargs)
+ msg = gerrit_client.query(change)
+ ret['query'] = msg
+ return ret