From 0ce9593986278f2e1a4f479594de5fc6cbea7255 Mon Sep 17 00:00:00 2001 From: John Westcott IV <32551173+john-westcott-iv@users.noreply.github.com> Date: Fri, 18 Jan 2019 06:11:17 -0500 Subject: [PATCH] Adding TowerCLI receive module (#51023) --- .../ansible_tower/tower_receive.py | 172 ++++++++++++++++++ .../integration/targets/tower_receive/aliases | 2 + .../targets/tower_receive/tasks/main.yml | 17 ++ 3 files changed, 191 insertions(+) create mode 100644 lib/ansible/modules/web_infrastructure/ansible_tower/tower_receive.py create mode 100644 test/integration/targets/tower_receive/aliases create mode 100644 test/integration/targets/tower_receive/tasks/main.yml diff --git a/lib/ansible/modules/web_infrastructure/ansible_tower/tower_receive.py b/lib/ansible/modules/web_infrastructure/ansible_tower/tower_receive.py new file mode 100644 index 00000000000..1bbb0067373 --- /dev/null +++ b/lib/ansible/modules/web_infrastructure/ansible_tower/tower_receive.py @@ -0,0 +1,172 @@ +#!/usr/bin/python +# coding: utf-8 -*- + +# (c) 2017, John Westcott IV +# 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: tower_receive +author: "John Westcott IV (@john-westcott-iv)" +version_added: "2.8" +short_description: Receive assets from Ansible Tower. +description: + - Receive assets from Ansible Tower. See + U(https://www.ansible.com/tower) for an overview. +options: + all: + description: + - Export all assets + type: bool + default: 'False' + organization: + description: + - List of organization names to export + default: [] + user: + description: + - List of user names to export + default: [] + team: + description: + - List of team names to export + default: [] + credential_type: + description: + - List of credential type names to export + default: [] + credential: + description: + - List of credential names to export + default: [] + notification_template: + description: + - List of notification template names to export + default: [] + inventory_script: + description: + - List of inventory script names to export + default: [] + inventory: + description: + - List of inventory names to export + default: [] + project: + description: + - List of project names to export + default: [] + job_template: + description: + - List of job template names to export + default: [] + workflow: + description: + - List of workflow names to export + default: [] + +requirements: + - "ansible-tower-cli >= 3.3.0" + +notes: + - Specifying a name of "all" for any asset type will export all items of that asset type. + +extends_documentation_fragment: tower +''' + +EXAMPLES = ''' +- name: Export all tower assets + tower_receive: + all: True + tower_config_file: "~/tower_cli.cfg" + +- name: Export all inventories + tower_receive: + inventory: + - all + +- name: Export a job template named "My Template" and all Credentials + tower_receive: + job_template: + - "My Template" + credential: + - all +''' + +RETURN = ''' +assets: + description: The exported assets + returned: success + type: dict + sample: [ {}, {} ] +''' + +from ansible.module_utils.ansible_tower import TowerModule, tower_auth_config, HAS_TOWER_CLI + +try: + from tower_cli.cli.transfer.receive import Receiver + from tower_cli.cli.transfer.common import SEND_ORDER + from tower_cli.utils.exceptions import TowerCLIError + + from tower_cli.conf import settings + TOWER_CLI_HAS_EXPORT = True +except ImportError: + TOWER_CLI_HAS_EXPORT = False + + +def main(): + argument_spec = dict( + all=dict(type='bool', default=False), + credential=dict(type='list', default=[]), + credential_type=dict(type='list', default=[]), + inventory=dict(type='list', default=[]), + inventory_script=dict(type='list', default=[]), + job_template=dict(type='list', default=[]), + notification_template=dict(type='list', default=[]), + organization=dict(type='list', default=[]), + project=dict(type='list', default=[]), + team=dict(type='list', default=[]), + user=dict(type='list', default=[]), + workflow=dict(type='list', default=[]), + ) + + module = TowerModule(argument_spec=argument_spec, supports_check_mode=False) + + if not HAS_TOWER_CLI: + module.fail_json(msg='ansible-tower-cli required for this module') + + if not TOWER_CLI_HAS_EXPORT: + module.fail_json(msg='ansible-tower-cli version does not support export') + + export_all = module.params.get('all') + assets_to_export = {} + for asset_type in SEND_ORDER: + assets_to_export[asset_type] = module.params.get(asset_type) + + result = dict( + assets=None, + changed=False, + message='', + ) + + tower_auth = tower_auth_config(module) + with settings.runtime_values(**tower_auth): + try: + receiver = Receiver() + result['assets'] = receiver.export_assets(all=export_all, asset_input=assets_to_export) + module.exit_json(**result) + except TowerCLIError as e: + result['message'] = e + module.fail_json(msg='Receive Failed', **result) + + +if __name__ == '__main__': + main() diff --git a/test/integration/targets/tower_receive/aliases b/test/integration/targets/tower_receive/aliases new file mode 100644 index 00000000000..229eebe6c9b --- /dev/null +++ b/test/integration/targets/tower_receive/aliases @@ -0,0 +1,2 @@ +cloud/tower +shippable/tower/group1 diff --git a/test/integration/targets/tower_receive/tasks/main.yml b/test/integration/targets/tower_receive/tasks/main.yml new file mode 100644 index 00000000000..9c22e6f7a73 --- /dev/null +++ b/test/integration/targets/tower_receive/tasks/main.yml @@ -0,0 +1,17 @@ +- name: Export all Tower assets + tower_receive: + all: True + register: result + +- assert: + that: + - "result is successful" + +- name: Extract names from output + set_fact: + object_names: "{{ result.assets | map(attribute='name') | list }}" + +- assert: + that: + - "result is successful" + - "'Default' in object_names"