mirror of
https://github.com/ansible/awx.git
synced 2026-02-12 23:24:48 -03:30
* fixed imports and addressed clusternode heartbeat test * took a chainsaw to task.py as well
57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
import inspect
|
|
import logging
|
|
import importlib
|
|
import time
|
|
|
|
from django_guid import set_guid
|
|
|
|
|
|
logger = logging.getLogger('awx.main.dispatch')
|
|
|
|
|
|
def resolve_callable(task):
|
|
"""
|
|
Transform a dotted notation task into an imported, callable function, e.g.,
|
|
awx.main.tasks.system.delete_inventory
|
|
awx.main.tasks.jobs.RunProjectUpdate
|
|
"""
|
|
if not task.startswith('awx.'):
|
|
raise ValueError('{} is not a valid awx task'.format(task))
|
|
module, target = task.rsplit('.', 1)
|
|
module = importlib.import_module(module)
|
|
_call = None
|
|
if hasattr(module, target):
|
|
_call = getattr(module, target, None)
|
|
if not (hasattr(_call, 'apply_async') and hasattr(_call, 'delay')):
|
|
raise ValueError('{} is not decorated with @task()'.format(task))
|
|
return _call
|
|
|
|
|
|
def run_callable(body):
|
|
"""
|
|
Given some AMQP message, import the correct Python code and run it.
|
|
"""
|
|
task = body['task']
|
|
uuid = body.get('uuid', '<unknown>')
|
|
args = body.get('args', [])
|
|
kwargs = body.get('kwargs', {})
|
|
if 'guid' in body:
|
|
set_guid(body.pop('guid'))
|
|
_call = resolve_callable(task)
|
|
if inspect.isclass(_call):
|
|
# the callable is a class, e.g., RunJob; instantiate and
|
|
# return its `run()` method
|
|
_call = _call().run
|
|
log_extra = ''
|
|
logger_method = logger.debug
|
|
if ('time_ack' in body) and ('time_pub' in body):
|
|
time_publish = body['time_ack'] - body['time_pub']
|
|
time_waiting = time.time() - body['time_ack']
|
|
if time_waiting > 5.0 or time_publish > 5.0:
|
|
# If task too a very long time to process, add this information to the log
|
|
log_extra = f' took {time_publish:.4f} to ack, {time_waiting:.4f} in local dispatcher'
|
|
logger_method = logger.info
|
|
# don't print kwargs, they often contain launch-time secrets
|
|
logger_method(f'task {uuid} starting {task}(*{args}){log_extra}')
|
|
return _call(*args, **kwargs)
|