From 186b672e4f6f4cf864ffc361586d23a75a822a32 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Wed, 15 Feb 2017 12:07:30 -0500 Subject: [PATCH] move service definition into settings --- awx/main/tasks.py | 43 ++++++++++++++---------- awx/main/tests/unit/utils/test_reload.py | 13 +++++++ awx/settings/development.py | 12 +++++++ awx/settings/production.py | 12 +++++++ 4 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 awx/main/tests/unit/utils/test_reload.py diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 458a4a022e..937a247b10 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -98,11 +98,7 @@ def _uwsgi_reload(): # http://uwsgi-docs.readthedocs.io/en/latest/MasterFIFO.html#available-commands logger.warn('Initiating uWSGI chain reload of server') TRIGGER_CHAIN_RELOAD = 'c' - if settings.DEBUG: - uWSGI_FIFO_LOCATION = '/awxfifo' - else: - uWSGI_FIFO_LOCATION = '/var/lib/awx/awxfifo' - with open(uWSGI_FIFO_LOCATION, 'w') as awxfifo: + with open(settings.uWSGI_FIFO_LOCATION, 'w') as awxfifo: awxfifo.write(TRIGGER_CHAIN_RELOAD) @@ -113,29 +109,42 @@ def _reset_celery_thread_pool(): destination=['celery@{}'.format(settings.CLUSTER_HOST_ID)], reply=False) -def _supervisor_service_restart(): +def _supervisor_service_restart(service_internal_names): ''' + Service internal name options: + - beat - celery - callback - channels - uwsgi - daphne + - fact - nginx example use pattern of supervisorctl: # supervisorctl restart tower-processes:receiver tower-processes:factcacher ''' group_name = 'tower-processes' args = ['supervisorctl'] - if settings.DEBUG is True: + if settings.DEBUG: args.extend(['-c', '/supervisor.conf']) - programs = "receiver,factcacher".split(",") - else: - programs = "awx-celeryd-beat,awx-callback-receiver,awx-fact-cache-receiver".split(",") + programs = [] + name_translation_dict = settings.SERVICE_NAME_DICT + for n in service_internal_names: + if n in name_translation_dict: + programs.append('{}:{}'.format(group_name, name_translation_dict[n])) args.extend(['restart']) - args.extend(['{}:{}'.format(group_name, p) for p in programs]) + args.extend(programs) logger.debug('Issuing command to restart services, args={}'.format(args)) subprocess.Popen(args) -def restart_local_services(): - logger.warn('Restarting services on this node in response to user action') - _uwsgi_reload() - _supervisor_service_restart() - _reset_celery_thread_pool() +def restart_local_services(service_internal_names): + logger.warn('Restarting services {} on this node in response to user action'.format(service_internal_names)) + if 'uwsgi' in service_internal_names: + _uwsgi_reload() + service_internal_names.pop('uwsgi') + restart_celery = False + if 'celery' in service_internal_names: + restart_celery = True + service_internal_names.pop('celery') + _supervisor_service_restart(service_internal_names) + if restart_celery: + # Celery restarted last because this probably includes current process + _reset_celery_thread_pool() def _clear_cache_keys(set_of_keys): @@ -151,7 +160,7 @@ def process_cache_changes(cache_keys): _clear_cache_keys(set_of_keys) for setting_key in set_of_keys: if setting_key.startswith('LOG_AGGREGATOR_'): - restart_local_services() + restart_local_services(['uwsgi', 'celery', 'beat', 'callback', 'fact']) break diff --git a/awx/main/tests/unit/utils/test_reload.py b/awx/main/tests/unit/utils/test_reload.py new file mode 100644 index 0000000000..555f09eec5 --- /dev/null +++ b/awx/main/tests/unit/utils/test_reload.py @@ -0,0 +1,13 @@ +# from django.conf import LazySettings +import pytest + +# awx.main.utils.reload +from awx.main.main.tasks import _supervisor_service_restart, subprocess + + +def test_produce_supervisor_command(mocker): + with mocker.patch.object(subprocess, 'Popen'): + _supervisor_service_restart(['beat', 'callback', 'fact']) + subprocess.Popen.assert_called_once_with( + ['supervisorctl', 'restart', 'tower-processes:receiver', 'tower-processes:factcacher']) + diff --git a/awx/settings/development.py b/awx/settings/development.py index 1326c12814..23f79f7c60 100644 --- a/awx/settings/development.py +++ b/awx/settings/development.py @@ -112,3 +112,15 @@ except ImportError: CLUSTER_HOST_ID = socket.gethostname() CELERY_ROUTES['awx.main.tasks.cluster_node_heartbeat'] = {'queue': CLUSTER_HOST_ID, 'routing_key': CLUSTER_HOST_ID} +# Supervisor service name dictionary used for programatic restart +SERVICE_NAME_DICT = { + "celery": "celeryd", + "callback": "receiver", + "runworker": "channels", + "uwsgi": "uwsgi", + "daphne": "daphne", + "fact": "factcacher", + "nginx": "nginx"} +# Used for sending commands in automatic restart +uWSGI_FIFO_LOCATION = '/awxfifo' + diff --git a/awx/settings/production.py b/awx/settings/production.py index f056a4ea31..92e5e6e81e 100644 --- a/awx/settings/production.py +++ b/awx/settings/production.py @@ -57,6 +57,18 @@ LOGGING['handlers']['fact_receiver']['filename'] = '/var/log/tower/fact_receiver LOGGING['handlers']['system_tracking_migrations']['filename'] = '/var/log/tower/tower_system_tracking_migrations.log' LOGGING['handlers']['rbac_migrations']['filename'] = '/var/log/tower/tower_rbac_migrations.log' +# Supervisor service name dictionary used for programatic restart +SERVICE_NAME_DICT = { + "beat": "awx-celeryd-beat", + "celery": "awx-celeryd", + "callback": "awx-callback-receiver", + "channels": "awx-channels-worker", + "uwsgi": "awx-uwsgi", + "daphne": "awx-daphne", + "fact": "awx-fact-cache-receiver"} +# Used for sending commands in automatic restart +uWSGI_FIFO_LOCATION = '/var/lib/awx/awxfifo' + # Store a snapshot of default settings at this point before loading any # customizable config files. DEFAULTS_SNAPSHOT = {}