Implemented new jenkins_job states.
Added forgotten node enforcement statement.
Fixed PEP8 errors.
diff --git a/_states/jenkins_job.py b/_states/jenkins_job.py
new file mode 100644
index 0000000..e28bed8
--- /dev/null
+++ b/_states/jenkins_job.py
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+
+# Import Python libs
+from __future__ import absolute_import
+import difflib
+import logging
+
+# Import Salt libs
+import salt.ext.six as six
+import salt.utils
+
+# Import XML parser
+import xml.etree.ElementTree as ET
+
+log = logging.getLogger(__name__)
+
+
+def _elements_equal(e1, e2):
+ if e1.tag != e2.tag:
+ return False
+ if e1.text != e2.text:
+ return False
+ if e1.tail != e2.tail:
+ return False
+ if e1.attrib != e2.attrib:
+ return False
+ if len(e1) != len(e2):
+ return False
+ return all(_elements_equal(c1, c2) for c1, c2 in zip(e1, e2))
+
+
+def present(name,
+ config=None,
+ **kwargs):
+ '''
+ Ensure the job is present in the Jenkins
+ configured jobs
+ name
+ The unique name for the Jenkins job
+ config
+ The Salt URL for the file to use for
+ configuring the job.
+ '''
+
+ ret = {'name': name,
+ 'result': True,
+ 'changes': {},
+ 'comment': ['Job {0} is up to date.'.format(name)]}
+
+ _job_exists = __salt__['jenkins.job_exists'](name)
+
+ if _job_exists:
+ _current_job_config = __salt__['jenkins.get_job_config'](name)
+ buf = six.moves.StringIO(_current_job_config)
+ oldXML = ET.fromstring(buf.read())
+
+ cached_source_path = __salt__['cp.cache_file'](config, __env__)
+ with salt.utils.fopen(cached_source_path) as _fp:
+ newXML = ET.fromstring(_fp.read())
+ if not _elements_equal(oldXML, newXML):
+ diff = difflib.unified_diff(
+ oldXML.tostring(), newXML.tostring(), lineterm='')
+ __salt__['jenkins.update_job'](name, config, __env__)
+ ret['changes'] = ''.join(diff)
+ ret['comment'].append('Job {0} updated.'.format(name))
+
+ else:
+ cached_source_path = __salt__['cp.cache_file'](config, __env__)
+ with salt.utils.fopen(cached_source_path) as _fp:
+ new_config_xml = _fp.read()
+
+ __salt__['jenkins.create_job'](name, config, __env__)
+
+ buf = six.moves.StringIO(new_config_xml)
+ _current_job_config = buf.readlines()
+
+ diff = difflib.unified_diff('', buf, lineterm='')
+ ret['changes'] = ''.join(diff)
+ ret['comment'].append('Job {0} added.'.format(name))
+
+ ret['comment'] = '\n'.join(ret['comment'])
+ return ret
+
+
+def absent(name,
+ **kwargs):
+ '''
+ Ensure the job is present in the Jenkins
+ configured jobs
+
+ name
+ The name of the Jenkins job to remove.
+
+ '''
+
+ ret = {'name': name,
+ 'result': True,
+ 'changes': {},
+ 'comment': []}
+
+ _job_exists = __salt__['jenkins.job_exists'](name)
+
+ if _job_exists:
+ __salt__['jenkins.delete_job'](name)
+ ret['comment'] = 'Job {0} deleted.'.format(name)
+ else:
+ ret['comment'] = 'Job {0} already absent.'.format(name)
+ return ret
diff --git a/_states/jenkins_user.py b/_states/jenkins_user.py
index 6f37ec3..0441b42 100644
--- a/_states/jenkins_user.py
+++ b/_states/jenkins_user.py
@@ -21,6 +21,7 @@
print(result)
""" # noqa
+
def present(name, username, password, admin=False):
"""
Main jenkins users state method
@@ -47,7 +48,7 @@
# try to call jenkins script api with given user and password to prove
# his existence
user_exists_result = __salt__['jenkins_common.call_groovy_script'](
- "print(\"TEST\")", {"username": username}, username, password,[200, 401])
+ "print(\"TEST\")", {"username": username}, username, password, [200, 401])
user_exists = user_exists_result and user_exists_result[
"code"] == 200 and user_exists_result["msg"].count("TEST") == 1
if not user_exists:
diff --git a/jenkins/client/init.sls b/jenkins/client/init.sls
index a31d0a1..a126e87 100644
--- a/jenkins/client/init.sls
+++ b/jenkins/client/init.sls
@@ -6,6 +6,7 @@
- jenkins.client.job
- jenkins.client.credential
- jenkins.client.user
+ - jenkins.client.node
jenkins_client_install:
pkg.installed:
diff --git a/jenkins/client/job.sls b/jenkins/client/job.sls
index 8139299..3138d4d 100644
--- a/jenkins/client/job.sls
+++ b/jenkins/client/job.sls
@@ -19,7 +19,7 @@
- file: jenkins_client_dirs
jenkins_job_{{ job_name }}_present:
- jenkins.present:
+ jenkins_job.present:
- name: {{ job_name }}
- config: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
- watch:
@@ -35,7 +35,7 @@
- file: jenkins_client_dirs
jenkins_job_{{ job_name }}_absent:
- jenkins.absent:
+ jenkins_job.absent:
- name: {{ job_name }}
- watch:
- file: /etc/salt/minion.d/_jenkins.conf