File: //lib/python3.9/site-packages/ansible_collections/awx/awx/plugins/modules/ad_hoc_command_cancel.py
# coding: utf-8 -*-
# (c) 2017, Wayne Witzel III <[email protected]>
# 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: ad_hoc_command_cancel
author: "John Westcott IV (@john-westcott-iv)"
short_description: Cancel an Ad Hoc Command.
description:
- Cancel ad hoc command. See
U(https://www.ansible.com/tower) for an overview.
options:
command_id:
description:
- ID of the command to cancel
required: True
type: int
fail_if_not_running:
description:
- Fail loudly if the I(command_id) can not be canceled
default: False
type: bool
interval:
description:
- The interval in seconds, to request an update from .
required: False
default: 1
type: float
timeout:
description:
- Maximum time in seconds to wait for a job to finish.
- Not specifying means the task will wait until the controller cancels the command.
type: int
default: 0
extends_documentation_fragment: awx.awx.auth
'''
EXAMPLES = '''
- name: Cancel command
ad_hoc_command_cancel:
command_id: command.id
'''
RETURN = '''
id:
description: command id requesting to cancel
returned: success
type: int
sample: 94
'''
import time
from ..module_utils.controller_api import ControllerAPIModule
def main():
# Any additional arguments that are not fields of the item can be added here
argument_spec = dict(
command_id=dict(type='int', required=True),
fail_if_not_running=dict(type='bool', default=False),
interval=dict(type='float', default=1.0),
timeout=dict(type='int', default=0),
)
# Create a module for ourselves
module = ControllerAPIModule(argument_spec=argument_spec)
# Extract our parameters
command_id = module.params.get('command_id')
fail_if_not_running = module.params.get('fail_if_not_running')
interval = module.params.get('interval')
timeout = module.params.get('timeout')
# Attempt to look up the command based on the provided name
command = module.get_one(
'ad_hoc_commands',
**{
'data': {
'id': command_id,
}
}
)
if command is None:
module.fail_json(msg="Unable to find command with id {0}".format(command_id))
cancel_page = module.get_endpoint(command['related']['cancel'])
if 'json' not in cancel_page or 'can_cancel' not in cancel_page['json']:
module.fail_json(msg="Failed to cancel command, got unexpected response", **{'response': cancel_page})
if not cancel_page['json']['can_cancel']:
if fail_if_not_running:
module.fail_json(msg="Ad Hoc Command is not running")
else:
module.exit_json(**{'changed': False})
results = module.post_endpoint(command['related']['cancel'], **{'data': {}})
if results['status_code'] != 202:
module.fail_json(msg="Failed to cancel command, see response for details", **{'response': results})
result = module.get_endpoint(command['related']['cancel'])
start = time.time()
while result['json']['can_cancel']:
# If we are past our time out fail with a message
if timeout and timeout < time.time() - start:
# Account for Legacy messages
module.json_output['msg'] = 'Monitoring of ad hoc command aborted due to timeout'
module.fail_json(**module.json_output)
# Put the process to sleep for our interval
time.sleep(interval)
result = module.get_endpoint(command['related']['cancel'])
module.exit_json(**{'changed': True})
if __name__ == '__main__':
main()