summaryrefslogtreecommitdiff
path: root/lib/ansible/modules/web_infrastructure/jenkins_job.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/modules/web_infrastructure/jenkins_job.py')
-rw-r--r--lib/ansible/modules/web_infrastructure/jenkins_job.py366
1 files changed, 0 insertions, 366 deletions
diff --git a/lib/ansible/modules/web_infrastructure/jenkins_job.py b/lib/ansible/modules/web_infrastructure/jenkins_job.py
deleted file mode 100644
index d637011369..0000000000
--- a/lib/ansible/modules/web_infrastructure/jenkins_job.py
+++ /dev/null
@@ -1,366 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright: (c) Ansible Project
-# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
-
-from __future__ import absolute_import, division, print_function
-__metaclass__ = type
-
-
-ANSIBLE_METADATA = {'metadata_version': '1.1',
- 'status': ['preview'],
- 'supported_by': 'community'}
-
-
-DOCUMENTATION = '''
----
-module: jenkins_job
-short_description: Manage jenkins jobs
-description:
- - Manage Jenkins jobs by using Jenkins REST API.
-requirements:
- - "python-jenkins >= 0.4.12"
-version_added: "2.2"
-author: "Sergio Millan Rodriguez (@sermilrod)"
-options:
- config:
- description:
- - config in XML format.
- - Required if job does not yet exist.
- - Mutually exclusive with C(enabled).
- - Considered if C(state=present).
- required: false
- enabled:
- description:
- - Whether the job should be enabled or disabled.
- - Mutually exclusive with C(config).
- - Considered if C(state=present).
- type: bool
- required: false
- name:
- description:
- - Name of the Jenkins job.
- required: true
- password:
- description:
- - Password to authenticate with the Jenkins server.
- required: false
- state:
- description:
- - Attribute that specifies if the job has to be created or deleted.
- required: false
- default: present
- choices: ['present', 'absent']
- token:
- description:
- - API token used to authenticate alternatively to password.
- required: false
- url:
- description:
- - URL where the Jenkins server is accessible.
- required: false
- default: http://localhost:8080
- user:
- description:
- - User to authenticate with the Jenkins server.
- required: false
-'''
-
-EXAMPLES = '''
-# Create a jenkins job using basic authentication
-- jenkins_job:
- config: "{{ lookup('file', 'templates/test.xml') }}"
- name: test
- password: admin
- url: http://localhost:8080
- user: admin
-
-# Create a jenkins job using the token
-- jenkins_job:
- config: "{{ lookup('template', 'templates/test.xml.j2') }}"
- name: test
- token: asdfasfasfasdfasdfadfasfasdfasdfc
- url: http://localhost:8080
- user: admin
-
-# Delete a jenkins job using basic authentication
-- jenkins_job:
- name: test
- password: admin
- state: absent
- url: http://localhost:8080
- user: admin
-
-# Delete a jenkins job using the token
-- jenkins_job:
- name: test
- token: asdfasfasfasdfasdfadfasfasdfasdfc
- state: absent
- url: http://localhost:8080
- user: admin
-
-# Disable a jenkins job using basic authentication
-- jenkins_job:
- name: test
- password: admin
- enabled: False
- url: http://localhost:8080
- user: admin
-
-# Disable a jenkins job using the token
-- jenkins_job:
- name: test
- token: asdfasfasfasdfasdfadfasfasdfasdfc
- enabled: False
- url: http://localhost:8080
- user: admin
-'''
-
-RETURN = '''
----
-name:
- description: Name of the jenkins job.
- returned: success
- type: str
- sample: test-job
-state:
- description: State of the jenkins job.
- returned: success
- type: str
- sample: present
-enabled:
- description: Whether the jenkins job is enabled or not.
- returned: success
- type: bool
- sample: true
-user:
- description: User used for authentication.
- returned: success
- type: str
- sample: admin
-url:
- description: Url to connect to the Jenkins server.
- returned: success
- type: str
- sample: https://jenkins.mydomain.com
-'''
-
-import traceback
-import xml.etree.ElementTree as ET
-
-JENKINS_IMP_ERR = None
-try:
- import jenkins
- python_jenkins_installed = True
-except ImportError:
- JENKINS_IMP_ERR = traceback.format_exc()
- python_jenkins_installed = False
-
-from ansible.module_utils.basic import AnsibleModule, missing_required_lib
-from ansible.module_utils._text import to_native
-
-
-class JenkinsJob:
-
- def __init__(self, module):
- self.module = module
-
- self.config = module.params.get('config')
- self.name = module.params.get('name')
- self.password = module.params.get('password')
- self.state = module.params.get('state')
- self.enabled = module.params.get('enabled')
- self.token = module.params.get('token')
- self.user = module.params.get('user')
- self.jenkins_url = module.params.get('url')
- self.server = self.get_jenkins_connection()
-
- self.result = {
- 'changed': False,
- 'url': self.jenkins_url,
- 'name': self.name,
- 'user': self.user,
- 'state': self.state,
- 'diff': {
- 'before': "",
- 'after': ""
- }
- }
-
- self.EXCL_STATE = "excluded state"
-
- def get_jenkins_connection(self):
- try:
- if (self.user and self.password):
- return jenkins.Jenkins(self.jenkins_url, self.user, self.password)
- elif (self.user and self.token):
- return jenkins.Jenkins(self.jenkins_url, self.user, self.token)
- elif (self.user and not (self.password or self.token)):
- return jenkins.Jenkins(self.jenkins_url, self.user)
- else:
- return jenkins.Jenkins(self.jenkins_url)
- except Exception as e:
- self.module.fail_json(msg='Unable to connect to Jenkins server, %s' % to_native(e), exception=traceback.format_exc())
-
- def get_job_status(self):
- try:
- response = self.server.get_job_info(self.name)
- if "color" not in response:
- return self.EXCL_STATE
- else:
- return to_native(response['color'])
-
- except Exception as e:
- self.module.fail_json(msg='Unable to fetch job information, %s' % to_native(e), exception=traceback.format_exc())
-
- def job_exists(self):
- try:
- return bool(self.server.job_exists(self.name))
- except Exception as e:
- self.module.fail_json(msg='Unable to validate if job exists, %s for %s' % (to_native(e), self.jenkins_url),
- exception=traceback.format_exc())
-
- def get_config(self):
- return job_config_to_string(self.config)
-
- def get_current_config(self):
- return job_config_to_string(self.server.get_job_config(self.name).encode('utf-8'))
-
- def has_config_changed(self):
- # config is optional, if not provided we keep the current config as is
- if self.config is None:
- return False
-
- config_file = self.get_config()
- machine_file = self.get_current_config()
-
- self.result['diff']['after'] = config_file
- self.result['diff']['before'] = machine_file
-
- if machine_file != config_file:
- return True
- return False
-
- def present_job(self):
- if self.config is None and self.enabled is None:
- self.module.fail_json(msg='one of the following params is required on state=present: config,enabled')
-
- if not self.job_exists():
- self.create_job()
- else:
- self.update_job()
-
- def has_state_changed(self, status):
- # Keep in current state if enabled arg_spec is not given
- if self.enabled is None:
- return False
-
- if ((self.enabled is False and status != "disabled") or (self.enabled is True and status == "disabled")):
- return True
- return False
-
- def switch_state(self):
- if self.enabled is False:
- self.server.disable_job(self.name)
- else:
- self.server.enable_job(self.name)
-
- def update_job(self):
- try:
- status = self.get_job_status()
-
- # Handle job config
- if self.has_config_changed():
- self.result['changed'] = True
- if not self.module.check_mode:
- self.server.reconfig_job(self.name, self.get_config())
-
- # Handle job disable/enable
- elif (status != self.EXCL_STATE and self.has_state_changed(status)):
- self.result['changed'] = True
- if not self.module.check_mode:
- self.switch_state()
-
- except Exception as e:
- self.module.fail_json(msg='Unable to reconfigure job, %s for %s' % (to_native(e), self.jenkins_url),
- exception=traceback.format_exc())
-
- def create_job(self):
- if self.config is None:
- self.module.fail_json(msg='missing required param: config')
-
- self.result['changed'] = True
- try:
- config_file = self.get_config()
- self.result['diff']['after'] = config_file
- if not self.module.check_mode:
- self.server.create_job(self.name, config_file)
- except Exception as e:
- self.module.fail_json(msg='Unable to create job, %s for %s' % (to_native(e), self.jenkins_url),
- exception=traceback.format_exc())
-
- def absent_job(self):
- if self.job_exists():
- self.result['changed'] = True
- self.result['diff']['before'] = self.get_current_config()
- if not self.module.check_mode:
- try:
- self.server.delete_job(self.name)
- except Exception as e:
- self.module.fail_json(msg='Unable to delete job, %s for %s' % (to_native(e), self.jenkins_url),
- exception=traceback.format_exc())
-
- def get_result(self):
- result = self.result
- if self.job_exists():
- result['enabled'] = self.get_job_status() != "disabled"
- else:
- result['enabled'] = None
- return result
-
-
-def test_dependencies(module):
- if not python_jenkins_installed:
- module.fail_json(
- msg=missing_required_lib("python-jenkins",
- url="https://python-jenkins.readthedocs.io/en/latest/install.html"),
- exception=JENKINS_IMP_ERR)
-
-
-def job_config_to_string(xml_str):
- return ET.tostring(ET.fromstring(xml_str)).decode('ascii')
-
-
-def main():
- module = AnsibleModule(
- argument_spec=dict(
- config=dict(required=False),
- name=dict(required=True),
- password=dict(required=False, no_log=True),
- state=dict(required=False, choices=['present', 'absent'], default="present"),
- enabled=dict(required=False, type='bool'),
- token=dict(required=False, no_log=True),
- url=dict(required=False, default="http://localhost:8080"),
- user=dict(required=False)
- ),
- mutually_exclusive=[
- ['password', 'token'],
- ['config', 'enabled'],
- ],
- supports_check_mode=True,
- )
-
- test_dependencies(module)
- jenkins_job = JenkinsJob(module)
-
- if module.params.get('state') == "present":
- jenkins_job.present_job()
- else:
- jenkins_job.absent_job()
-
- result = jenkins_job.get_result()
- module.exit_json(**result)
-
-
-if __name__ == '__main__':
- main()