From: David Galloway Date: Thu, 29 Sep 2016 17:54:14 +0000 (-0400) Subject: Rename jenkins-node module for ansible v2 compatibility X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fe2f3416b547ecbbfcc3c1d8d001bb3088587650;p=ceph-build.git Rename jenkins-node module for ansible v2 compatibility Signed-off-by: David Galloway --- diff --git a/ansible/examples/slave.yml b/ansible/examples/slave.yml index 5ecc0013..e61ea101 100644 --- a/ansible/examples/slave.yml +++ b/ansible/examples/slave.yml @@ -222,7 +222,7 @@ key: "{{ lookup('file', 'playbook/files/ssh/hostkeys/github.com.pub') }}" - name: register the new slave to jenkins master with ssh - jenkins-node: + jenkins_node: username: "{{ api_user }}" uri: "{{ api_uri }}" password: "{{ token }}" @@ -239,7 +239,7 @@ when: not use_jnlp - name: register the new slave to jenkins master with jnlp - jenkins-node: + jenkins_node: username: "{{ api_user }}" uri: "{{ api_uri }}" password: "{{ token }}" diff --git a/ansible/examples/slave_static.yml b/ansible/examples/slave_static.yml index 3dffe8e9..f9c5e138 100644 --- a/ansible/examples/slave_static.yml +++ b/ansible/examples/slave_static.yml @@ -254,7 +254,7 @@ key: "{{ lookup('file', 'files/ssh/hostkeys/github.com.pub') }}" - name: register the new slave to jenkins master with ssh - jenkins-node: + jenkins_node: username: "{{ api_user }}" uri: "{{ api_uri }}" password: "{{ token }}" @@ -271,7 +271,7 @@ when: not use_jnlp - name: register the new slave to jenkins master with jnlp - jenkins-node: + jenkins_node: username: "{{ api_user }}" uri: "{{ api_uri }}" password: "{{ token }}" diff --git a/ansible/library/jenkins-node b/ansible/library/jenkins-node deleted file mode 100644 index b8e83c78..00000000 --- a/ansible/library/jenkins-node +++ /dev/null @@ -1,257 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -DOCUMENTATION = """ -module: jenkins-node -short_decription: Manage Jenkins nodes -description: - - This module provides some management features to control Jenkins - nodes. - -options: - uri: - description: - - Base URI for the Jenkins instance - required: true - - username: - description: - - The Jenkins username to log-in with. - required: true - - password: - description: - - The Jenkins password (or API token) to log-in with. - required: true - - operation: - description: - - Operation to perform - required: false - default: 'create' - choices: [ create, delete, enable, disable ] - - name: - description: - - Node name - required: true - - executors: - description: - - Number of executors in node - required: false - default: 2 - - description: - description: - - Description of the node - required: false - default: null - - labels: - description: - - Labels to associate with a node, like "amd64" or "python" - required: false - default: null - - exclusive: - description: - - Mark this node for tied jobs only - required: false - default: 'no' - choices: ['no', 'yes'] - - launcher: - description: - - Launcher method for a remote node (only needed for 'create' operations) - required: false - default: 'hudson.plugins.sshslaves.SSHLauncher' - - remoteFS: - description: - - Path to the directory used for builds - required: false - - credentialsId: - description: - - the ID of the user needed for authentication. Usually found in - credentials.xml or via the url - {host}/credential-store/domain/_/credential/{id}. By default this is an - SSH user account and key (see "launcher" above). - - host: - description: - - hostname or IP for the host to connect to the slave - -requirements: ['python-jenkins'] -author: - - "Alfredo Deza" - -""" - -EXAMPLES = """ -# Create new node -- name: Create new node - jenkins-node: uri={{ jenkins_uri }} username={{ user }} password={{ password }} - name={{ node_name }} operation=create - -# Delete an existing node -- name: Delete a node - jenkins-node: uri={{ jenkins_uri }} username={{ user }} password={{ password }} - name={{ node_name }} operation=delete -""" - -HAS_JENKINS_API = True -try: - import jenkins -except ImportError: - HAS_JENKINS_API = False - - -def _jenkins(uri, username, password): - return jenkins.Jenkins(uri, username, password) - - -def translate_params(params): - sanitized = {} - mapping = { - 'executors': 'numExecutors', - 'description': 'nodeDescription', - } - for k, v in params.items(): - key = mapping.get(k, k) - sanitized[key] = v - return sanitized - - -def create(uri, user, password, name, **kw): - launcher_params = {} - launcher_params['credentialsId'] = kw.pop('credentialsId', None) - launcher_params['host'] = kw.pop('host', None) - if all(launcher_params.values()) is False: - launcher_params = {} - params = translate_params(kw) - j = _jenkins(uri, user, password) - if j.node_exists(name): - return False, "Failed to create node '%s' - already exists." % name - j.create_node(name, launcher_params=launcher_params, **params) - if not j.node_exists(name): - return False, "Failed to create node '%s'." % name - return True, None - - -def delete(uri, user, password, name, **kw): - j = _jenkins(uri, user, password) - if not j.node_exists(name): - return False, "Could not delete '%s' - unknown node." % name - j.delete_node(name) - if j.node_exists(name): - return False, "Failed to delete node '%s'." % name - return True, None - - -def enable(uri, user, password, name, **kw): - j = _jenkins(uri, user, password) - if not j.node_exists(name): - return False, "Could not enable '%s' - unknown node." % name - j.enable_node(name) - return True, None - - -def disable(uri, user, password, name, **kw): - j = _jenkins(uri, user, password) - if not j.node_exists(name): - return False, "Could not disable '%s' - unknown node." % name - j.disable_node(name) - return True, None - - -def main(): - module = AnsibleModule( - argument_spec=dict( - uri=dict(required=True), - username=dict(required=True), - password=dict(required=True), - operation=dict(default='create', choices=['create', 'delete', 'enable', 'disable']), - name=dict(required=True), - executors=dict(required=False, default=2), - description=dict(required=False, default=None), - labels=dict(required=False, default=None), - host=dict(required=False, default=None), - credentialsId=dict(required=False, default=None), - launcher=dict(required=False, default='hudson.plugins.sshslaves.SSHLauncher'), - remoteFS=dict(required=False, default=None), - exclusive=dict(required=False, default='no', type='bool'), - ), - supports_check_mode=False - ) - - if not HAS_JENKINS_API: - module.fail_json(msg="Could not import python module: jenkins. Please install the python-jenkins package.") - - uri = module.params['uri'] - username = module.params['username'] - password = module.params['password'] - operation = module.params.get('operation', 'create') - name = module.params['name'] - executors = module.params['executors'] - description = module.params.get('description') - labels = module.params.get('labels') - exclusive = module.params.get('exclusive', False) - host = module.params.get('host') - remoteFS = module.params.get('remoteFS') - credentialsId = module.params.get('credentialsId') - launcher = module.params.get('launcher', 'hudson.plugins.sshslaves.SSHLauncher') - - api_calls = { - 'create': create, - 'delete': delete, - 'enable': enable, - 'disable': disable - } - - try: - func = api_calls[operation] - except KeyError: - return module.fail_json( - msg="operation: %s is not supported. Choose one of: %s'" % ( - operation, str(api_calls.keys())) - ) - - try: - changed, msg = func( - uri, - username, - password, - name, - executors=executors, - description=description, - labels=labels, - exclusive=exclusive, - host=host, - credentialsId=credentialsId, - launcher=launcher, - remoteFS=remoteFS, - ) - except Exception as ex: - # Ensure that errors going out to Jenkins, specifically the network - # requests, can be properly translated into meaningful errors so that - # Ansible can report those back. - if ex.__class__.__name__ == 'HTTPError': - msg = "HTTPError %s: %s" % (ex.code, ex.url) - else: - message = getattr(ex, 'message', None) - msg = getattr(ex, 'msg', message) - msg = "%s: %s" % (ex.__class__.__name__, msg) - return module.fail_json(msg=msg) - - args = {'changed': changed} - if msg: - args['msg'] = msg - module.exit_json(**args) - - -# yep, everything: https://docs.ansible.com/developing_modules.html#common-module-boilerplate -from ansible.module_utils.basic import * -if __name__ == '__main__': - main() diff --git a/ansible/library/jenkins_node b/ansible/library/jenkins_node new file mode 100644 index 00000000..f37846da --- /dev/null +++ b/ansible/library/jenkins_node @@ -0,0 +1,257 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +DOCUMENTATION = """ +module: jenkins_node +short_decription: Manage Jenkins nodes +description: + - This module provides some management features to control Jenkins + nodes. + +options: + uri: + description: + - Base URI for the Jenkins instance + required: true + + username: + description: + - The Jenkins username to log-in with. + required: true + + password: + description: + - The Jenkins password (or API token) to log-in with. + required: true + + operation: + description: + - Operation to perform + required: false + default: 'create' + choices: [ create, delete, enable, disable ] + + name: + description: + - Node name + required: true + + executors: + description: + - Number of executors in node + required: false + default: 2 + + description: + description: + - Description of the node + required: false + default: null + + labels: + description: + - Labels to associate with a node, like "amd64" or "python" + required: false + default: null + + exclusive: + description: + - Mark this node for tied jobs only + required: false + default: 'no' + choices: ['no', 'yes'] + + launcher: + description: + - Launcher method for a remote node (only needed for 'create' operations) + required: false + default: 'hudson.plugins.sshslaves.SSHLauncher' + + remoteFS: + description: + - Path to the directory used for builds + required: false + + credentialsId: + description: + - the ID of the user needed for authentication. Usually found in + credentials.xml or via the url + {host}/credential-store/domain/_/credential/{id}. By default this is an + SSH user account and key (see "launcher" above). + + host: + description: + - hostname or IP for the host to connect to the slave + +requirements: ['python-jenkins'] +author: + - "Alfredo Deza" + +""" + +EXAMPLES = """ +# Create new node +- name: Create new node + jenkins_node: uri={{ jenkins_uri }} username={{ user }} password={{ password }} + name={{ node_name }} operation=create + +# Delete an existing node +- name: Delete a node + jenkins_node: uri={{ jenkins_uri }} username={{ user }} password={{ password }} + name={{ node_name }} operation=delete +""" + +HAS_JENKINS_API = True +try: + import jenkins +except ImportError: + HAS_JENKINS_API = False + + +def _jenkins(uri, username, password): + return jenkins.Jenkins(uri, username, password) + + +def translate_params(params): + sanitized = {} + mapping = { + 'executors': 'numExecutors', + 'description': 'nodeDescription', + } + for k, v in params.items(): + key = mapping.get(k, k) + sanitized[key] = v + return sanitized + + +def create(uri, user, password, name, **kw): + launcher_params = {} + launcher_params['credentialsId'] = kw.pop('credentialsId', None) + launcher_params['host'] = kw.pop('host', None) + if all(launcher_params.values()) is False: + launcher_params = {} + params = translate_params(kw) + j = _jenkins(uri, user, password) + if j.node_exists(name): + return False, "Failed to create node '%s' - already exists." % name + j.create_node(name, launcher_params=launcher_params, **params) + if not j.node_exists(name): + return False, "Failed to create node '%s'." % name + return True, None + + +def delete(uri, user, password, name, **kw): + j = _jenkins(uri, user, password) + if not j.node_exists(name): + return False, "Could not delete '%s' - unknown node." % name + j.delete_node(name) + if j.node_exists(name): + return False, "Failed to delete node '%s'." % name + return True, None + + +def enable(uri, user, password, name, **kw): + j = _jenkins(uri, user, password) + if not j.node_exists(name): + return False, "Could not enable '%s' - unknown node." % name + j.enable_node(name) + return True, None + + +def disable(uri, user, password, name, **kw): + j = _jenkins(uri, user, password) + if not j.node_exists(name): + return False, "Could not disable '%s' - unknown node." % name + j.disable_node(name) + return True, None + + +def main(): + module = AnsibleModule( + argument_spec=dict( + uri=dict(required=True), + username=dict(required=True), + password=dict(required=True), + operation=dict(default='create', choices=['create', 'delete', 'enable', 'disable']), + name=dict(required=True), + executors=dict(required=False, default=2), + description=dict(required=False, default=None), + labels=dict(required=False, default=None), + host=dict(required=False, default=None), + credentialsId=dict(required=False, default=None), + launcher=dict(required=False, default='hudson.plugins.sshslaves.SSHLauncher'), + remoteFS=dict(required=False, default=None), + exclusive=dict(required=False, default='no', type='bool'), + ), + supports_check_mode=False + ) + + if not HAS_JENKINS_API: + module.fail_json(msg="Could not import python module: jenkins. Please install the python-jenkins package.") + + uri = module.params['uri'] + username = module.params['username'] + password = module.params['password'] + operation = module.params.get('operation', 'create') + name = module.params['name'] + executors = module.params['executors'] + description = module.params.get('description') + labels = module.params.get('labels') + exclusive = module.params.get('exclusive', False) + host = module.params.get('host') + remoteFS = module.params.get('remoteFS') + credentialsId = module.params.get('credentialsId') + launcher = module.params.get('launcher', 'hudson.plugins.sshslaves.SSHLauncher') + + api_calls = { + 'create': create, + 'delete': delete, + 'enable': enable, + 'disable': disable + } + + try: + func = api_calls[operation] + except KeyError: + return module.fail_json( + msg="operation: %s is not supported. Choose one of: %s'" % ( + operation, str(api_calls.keys())) + ) + + try: + changed, msg = func( + uri, + username, + password, + name, + executors=executors, + description=description, + labels=labels, + exclusive=exclusive, + host=host, + credentialsId=credentialsId, + launcher=launcher, + remoteFS=remoteFS, + ) + except Exception as ex: + # Ensure that errors going out to Jenkins, specifically the network + # requests, can be properly translated into meaningful errors so that + # Ansible can report those back. + if ex.__class__.__name__ == 'HTTPError': + msg = "HTTPError %s: %s" % (ex.code, ex.url) + else: + message = getattr(ex, 'message', None) + msg = getattr(ex, 'msg', message) + msg = "%s: %s" % (ex.__class__.__name__, msg) + return module.fail_json(msg=msg) + + args = {'changed': changed} + if msg: + args['msg'] = msg + module.exit_json(**args) + + +# yep, everything: https://docs.ansible.com/developing_modules.html#common-module-boilerplate +from ansible.module_utils.basic import * +if __name__ == '__main__': + main()