Implemented jenkins user enforcing by script API from client side
diff --git a/_states/jenkins_users.py b/_states/jenkins_users.py
new file mode 100644
index 0000000..29a2f64
--- /dev/null
+++ b/_states/jenkins_users.py
@@ -0,0 +1,59 @@
+import logging
+logger = logging.getLogger(__name__)
+
+create_admin_groovy = u"""\
+import jenkins.model.*
+import hudson.security.*
+def instance = Jenkins.getInstance()
+def hudsonRealm = new HudsonPrivateSecurityRealm(false)
+def result=hudsonRealm.createAccount("{username}","{password}")
+instance.setSecurityRealm(hudsonRealm)
+def strategy = new hudson.security.FullControlOnceLoggedInAuthorizationStrategy()
+strategy.setAllowAnonymousRead(false)
+instance.setAuthorizationStrategy(strategy)
+instance.save()
+print(result)
+""" #noqa
+
+
+create_user_groovy = u"""\
+def result=jenkins.model.Jenkins.instance.securityRealm.createAccount("{username}", "{password}")
+print(result)
+""" # noqa
+
+
+def present(name, username, password, admin=False):
+ """
+ Main jenkins users state method
+
+ :param username: user name
+ :param password: user password
+ :param admin: is admin user flag (username will be always admin)
+ :returns: salt-specified state dict
+ """
+ test = __opts__['test'] # noqa
+ ret = {
+ 'name': username,
+ 'changes': {},
+ 'result': False,
+ 'comment': '',
+ }
+
+ result = False
+ if test:
+ status = 'CREATED'
+ ret['changes'][username] = status
+ ret['comment'] = 'User %s %s' % (username, status.lower())
+ else:
+ call_result = __salt__['jenkins_common.call_groovy_script'](create_admin_groovy if admin else create_user_groovy, {"username": username, "password":password})
+ if call_result["code"] == 200 and call_result["msg"].count(username) == 1:
+ status = "CREATED" if not admin else "ADMIN CREATED"
+ ret['changes'][username] = status
+ ret['comment'] = 'User %s %s' % (username, status.lower())
+ result = True
+ else:
+ status = 'FAILED'
+ logger.error("Jenkins user API call failure: %s", call_result["msg"])
+ ret['comment'] = 'Jenkins user API call failure: %s' % (call_result["msg"])
+ ret['result'] = None if test else result
+ return ret