mirror of
https://github.com/ZwareBear/awx.git
synced 2026-03-31 05:03:35 -05:00
this commit implements the bulk of `awx-manage run_dispatcher`, a new command that binds to RabbitMQ via kombu and balances messages across a pool of workers that are similar to celeryd workers in spirit. Specifically, this includes: - a new decorator, `awx.main.dispatch.task`, which can be used to decorate functions or classes so that they can be designated as "Tasks" - support for fanout/broadcast tasks (at this point in time, only `conf.Setting` memcached flushes use this functionality) - support for job reaping - support for success/failure hooks for job runs (i.e., `handle_work_success` and `handle_work_error`) - support for auto scaling worker pool that scale processes up and down on demand - minimal support for RPC, such as status checks and pool recycle/reload
45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
# Copyright (c) 2017 Ansible by Red Hat
|
|
# All Rights Reserved.
|
|
|
|
# Python
|
|
import subprocess
|
|
import logging
|
|
|
|
# Django
|
|
from django.conf import settings
|
|
|
|
logger = logging.getLogger('awx.main.utils.reload')
|
|
|
|
|
|
def _supervisor_service_command(command, communicate=True):
|
|
'''
|
|
example use pattern of supervisorctl:
|
|
# supervisorctl restart tower-processes:receiver tower-processes:factcacher
|
|
'''
|
|
group_name = 'tower-processes'
|
|
if settings.DEBUG:
|
|
group_name = 'awx-processes'
|
|
args = ['supervisorctl']
|
|
if settings.DEBUG:
|
|
args.extend(['-c', '/supervisor.conf'])
|
|
args.extend([command, '{}:*'.format(group_name)])
|
|
logger.debug('Issuing command to {} services, args={}'.format(command, args))
|
|
supervisor_process = subprocess.Popen(args, stdin=subprocess.PIPE,
|
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
if communicate:
|
|
restart_stdout, restart_err = supervisor_process.communicate()
|
|
restart_code = supervisor_process.returncode
|
|
if restart_code or restart_err:
|
|
logger.error('supervisorctl {} errored with exit code `{}`, stdout:\n{}stderr:\n{}'.format(
|
|
command, restart_code, restart_stdout.strip(), restart_err.strip()))
|
|
else:
|
|
logger.info('supervisorctl {} finished, stdout:\n{}'.format(
|
|
command, restart_stdout.strip()))
|
|
else:
|
|
logger.info('Submitted supervisorctl {} command, not waiting for result'.format(command))
|
|
|
|
|
|
def stop_local_services(communicate=True):
|
|
logger.warn('Stopping services on this node in response to user action')
|
|
_supervisor_service_command(command='stop', communicate=communicate)
|