From 6f0a8949a6197975d6224bb476854924e4aba232 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Wed, 12 Apr 2017 16:46:58 -0400 Subject: [PATCH] Add supervisorctl logs In some systems, the tower service process may not have sufficient permissions to communicate with the supervisorctl socket, in which case an automated restart will not be possible. --- awx/main/tests/unit/utils/test_reload.py | 9 +++++++-- awx/main/utils/reload.py | 10 +++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/awx/main/tests/unit/utils/test_reload.py b/awx/main/tests/unit/utils/test_reload.py index 83466c9cc8..26f2d42ece 100644 --- a/awx/main/tests/unit/utils/test_reload.py +++ b/awx/main/tests/unit/utils/test_reload.py @@ -3,10 +3,15 @@ from awx.main.utils import reload def test_produce_supervisor_command(mocker): - with mocker.patch.object(reload.subprocess, 'Popen'): + communicate_mock = mocker.MagicMock(return_value=('Everything is fine', '')) + mock_process = mocker.MagicMock() + mock_process.communicate = communicate_mock + Popen_mock = mocker.MagicMock(return_value=mock_process) + with mocker.patch.object(reload.subprocess, 'Popen', Popen_mock): reload._supervisor_service_command(['beat', 'callback', 'fact'], "restart") reload.subprocess.Popen.assert_called_once_with( - ['supervisorctl', 'restart', 'tower-processes:receiver', 'tower-processes:factcacher']) + ['supervisorctl', 'restart', 'tower-processes:receiver', 'tower-processes:factcacher'], + stderr=-1, stdin=-1, stdout=-1) def test_routing_of_service_restarts_works(mocker): diff --git a/awx/main/utils/reload.py b/awx/main/utils/reload.py index 6a88062ab5..25a4d17a57 100644 --- a/awx/main/utils/reload.py +++ b/awx/main/utils/reload.py @@ -49,7 +49,15 @@ def _supervisor_service_command(service_internal_names, command): args.extend([command]) args.extend(programs) logger.debug('Issuing command to restart services, args={}'.format(args)) - subprocess.Popen(args) + supervisor_process = subprocess.Popen(args, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + restart_stdout, restart_err = supervisor_process.communicate() + restart_code = supervisor_process.returncode + if restart_code or restart_err: + logger.error('supervisorctl restart errored with exit code `{}`, stdout:\n{}stderr:\n{}'.format( + restart_code, restart_stdout.strip(), restart_err.strip())) + else: + logger.info('supervisorctl restart finished, stdout:\n{}'.format(restart_stdout.strip())) def restart_local_services(service_internal_names):