mirror of
https://github.com/ansible/awx.git
synced 2026-01-13 19:10:07 -03:30
This commit includes all the changes involved in converting the old Ansible Tower modules from commits in Ansible core into the AWX collection that replaces it. Also includes work needed to integrate it into the AWX processes like tests, docs, and the Makefile. Apply changes from content_collector tool Add integrated module tests operate via run_module fixture add makefile target for them Add flake8 target and fix flake8 errors Update README Make consolidated target for testing modules
168 lines
4.6 KiB
Python
168 lines
4.6 KiB
Python
#!/usr/bin/python
|
|
# coding: utf-8 -*-
|
|
|
|
# (c) 2017, John Westcott IV <john.westcott.iv@redhat.com>
|
|
# 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_send
|
|
author: "John Westcott IV (@john-westcott-iv)"
|
|
version_added: "2.8"
|
|
short_description: Send assets to Ansible Tower.
|
|
description:
|
|
- Send assets to Ansible Tower. See
|
|
U(https://www.ansible.com/tower) for an overview.
|
|
options:
|
|
assets:
|
|
description:
|
|
- The assets to import.
|
|
- This can be the output of tower_receive or loaded from a file
|
|
required: False
|
|
files:
|
|
description:
|
|
- List of files to import.
|
|
required: False
|
|
default: []
|
|
prevent:
|
|
description:
|
|
- A list of asset types to prevent import for
|
|
required: false
|
|
default: []
|
|
password_management:
|
|
description:
|
|
- The password management option to use.
|
|
- The prompt option is not supported.
|
|
required: false
|
|
default: 'default'
|
|
choices: ["default", "random"]
|
|
|
|
notes:
|
|
- One of assets or files needs to be passed in
|
|
|
|
requirements:
|
|
- "ansible-tower-cli >= 3.3.0"
|
|
- six.moves.StringIO
|
|
- sys
|
|
|
|
extends_documentation_fragment: tower
|
|
'''
|
|
|
|
EXAMPLES = '''
|
|
- name: Import all tower assets
|
|
tower_send:
|
|
assets: "{{ export_output.assets }}"
|
|
tower_config_file: "~/tower_cli.cfg"
|
|
'''
|
|
|
|
RETURN = '''
|
|
output:
|
|
description: The import messages
|
|
returned: success, fail
|
|
type: list
|
|
sample: [ 'Message 1', 'Message 2' ]
|
|
'''
|
|
|
|
import os
|
|
import sys
|
|
|
|
from ansible.module_utils.six.moves import StringIO
|
|
from ..module_utils.ansible_tower import TowerModule, tower_auth_config, HAS_TOWER_CLI
|
|
|
|
from tempfile import mkstemp
|
|
|
|
try:
|
|
from tower_cli.cli.transfer.send import Sender
|
|
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(
|
|
assets=dict(required=False),
|
|
files=dict(required=False, default=[], type='list'),
|
|
prevent=dict(required=False, default=[], type='list'),
|
|
password_management=dict(required=False, default='default', choices=['default', 'random']),
|
|
)
|
|
|
|
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')
|
|
|
|
assets = module.params.get('assets')
|
|
prevent = module.params.get('prevent')
|
|
password_management = module.params.get('password_management')
|
|
files = module.params.get('files')
|
|
|
|
result = dict(
|
|
changed=False,
|
|
msg='',
|
|
output='',
|
|
)
|
|
|
|
if not assets and not files:
|
|
result['msg'] = "Assets or files must be specified"
|
|
module.fail_json(**result)
|
|
|
|
path = None
|
|
if assets:
|
|
# We got assets so we need to dump this out to a temp file and append that to files
|
|
handle, path = mkstemp(prefix='', suffix='', dir='')
|
|
with open(path, 'w') as f:
|
|
f.write(assets)
|
|
files.append(path)
|
|
|
|
tower_auth = tower_auth_config(module)
|
|
failed = False
|
|
with settings.runtime_values(**tower_auth):
|
|
try:
|
|
sender = Sender(no_color=False)
|
|
old_stdout = sys.stdout
|
|
sys.stdout = captured_stdout = StringIO()
|
|
try:
|
|
sender.send(files, prevent, password_management)
|
|
except TypeError:
|
|
# Newer versions of TowerCLI require 4 parameters
|
|
sender.send(files, prevent, [], password_management)
|
|
|
|
if sender.error_messages > 0:
|
|
failed = True
|
|
result['msg'] = "Transfer Failed with %d errors" % sender.error_messages
|
|
if sender.changed_messages > 0:
|
|
result['changed'] = True
|
|
except TowerCLIError as e:
|
|
result['msg'] = e.message
|
|
failed = True
|
|
finally:
|
|
if path is not None:
|
|
os.remove(path)
|
|
result['output'] = captured_stdout.getvalue().split("\n")
|
|
sys.stdout = old_stdout
|
|
|
|
# Return stdout so that module returns will work
|
|
if failed:
|
|
module.fail_json(**result)
|
|
else:
|
|
module.exit_json(**result)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|