mirror of
https://github.com/ansible/awx.git
synced 2026-01-23 07:28:02 -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
150 lines
4.0 KiB
Python
150 lines
4.0 KiB
Python
#!/usr/bin/python
|
|
# coding: utf-8 -*-
|
|
|
|
# (c) 2017, Wayne Witzel III <wayne@riotousliving.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_job_wait
|
|
version_added: "2.3"
|
|
author: "Wayne Witzel III (@wwitzel3)"
|
|
short_description: Wait for Ansible Tower job to finish.
|
|
description:
|
|
- Wait for Ansible Tower job to finish and report success or failure. See
|
|
U(https://www.ansible.com/tower) for an overview.
|
|
options:
|
|
job_id:
|
|
description:
|
|
- ID of the job to monitor.
|
|
required: True
|
|
min_interval:
|
|
description:
|
|
- Minimum interval in seconds, to request an update from Tower.
|
|
default: 1
|
|
max_interval:
|
|
description:
|
|
- Maximum interval in seconds, to request an update from Tower.
|
|
default: 30
|
|
timeout:
|
|
description:
|
|
- Maximum time in seconds to wait for a job to finish.
|
|
extends_documentation_fragment: tower
|
|
'''
|
|
|
|
EXAMPLES = '''
|
|
- name: Launch a job
|
|
tower_job_launch:
|
|
job_template: "My Job Template"
|
|
register: job
|
|
|
|
- name: Wait for job max 120s
|
|
tower_job_wait:
|
|
job_id: "{{ job.id }}"
|
|
timeout: 120
|
|
'''
|
|
|
|
RETURN = '''
|
|
id:
|
|
description: job id that is being waited on
|
|
returned: success
|
|
type: int
|
|
sample: 99
|
|
elapsed:
|
|
description: total time in seconds the job took to run
|
|
returned: success
|
|
type: float
|
|
sample: 10.879
|
|
started:
|
|
description: timestamp of when the job started running
|
|
returned: success
|
|
type: str
|
|
sample: "2017-03-01T17:03:53.200234Z"
|
|
finished:
|
|
description: timestamp of when the job finished running
|
|
returned: success
|
|
type: str
|
|
sample: "2017-03-01T17:04:04.078782Z"
|
|
status:
|
|
description: current status of job
|
|
returned: success
|
|
type: str
|
|
sample: successful
|
|
'''
|
|
|
|
|
|
from ..module_utils.ansible_tower import TowerModule, tower_auth_config, tower_check_mode
|
|
from ansible.module_utils.six.moves import cStringIO as StringIO
|
|
|
|
|
|
try:
|
|
import tower_cli
|
|
import tower_cli.exceptions as exc
|
|
|
|
from tower_cli.conf import settings
|
|
except ImportError:
|
|
pass
|
|
|
|
|
|
def main():
|
|
argument_spec = dict(
|
|
job_id=dict(type='int', required=True),
|
|
timeout=dict(type='int'),
|
|
min_interval=dict(type='float', default=1),
|
|
max_interval=dict(type='float', default=30),
|
|
)
|
|
|
|
module = TowerModule(
|
|
argument_spec,
|
|
supports_check_mode=True
|
|
)
|
|
|
|
json_output = {}
|
|
fail_json = None
|
|
|
|
tower_auth = tower_auth_config(module)
|
|
with settings.runtime_values(**tower_auth):
|
|
tower_check_mode(module)
|
|
job = tower_cli.get_resource('job')
|
|
params = module.params.copy()
|
|
|
|
# tower-cli gets very noisy when monitoring.
|
|
# We pass in our our outfile to suppress the out during our monitor call.
|
|
outfile = StringIO()
|
|
params['outfile'] = outfile
|
|
|
|
job_id = params.get('job_id')
|
|
try:
|
|
result = job.monitor(job_id, **params)
|
|
except exc.Timeout:
|
|
result = job.status(job_id)
|
|
result['id'] = job_id
|
|
json_output['msg'] = 'Timeout waiting for job to finish.'
|
|
json_output['timeout'] = True
|
|
except exc.NotFound as excinfo:
|
|
fail_json = dict(msg='Unable to wait, no job_id {0} found: {1}'.format(job_id, excinfo), changed=False)
|
|
except (exc.ConnectionError, exc.BadRequest, exc.AuthError) as excinfo:
|
|
fail_json = dict(msg='Unable to wait for job: {0}'.format(excinfo), changed=False)
|
|
|
|
if fail_json is not None:
|
|
module.fail_json(**fail_json)
|
|
|
|
json_output['success'] = True
|
|
for k in ('id', 'status', 'elapsed', 'started', 'finished'):
|
|
json_output[k] = result.get(k)
|
|
|
|
module.exit_json(**json_output)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|