diff --git a/ansible/module_utils/kolla_docker_worker.py b/ansible/module_utils/kolla_docker_worker.py index 72400ea202..2741b006d4 100644 --- a/ansible/module_utils/kolla_docker_worker.py +++ b/ansible/module_utils/kolla_docker_worker.py @@ -446,11 +446,10 @@ class DockerWorker(ContainerWorker): msg="No such container: {} to stop".format(name)) elif not container['Status'].startswith('Exited '): self.changed = True - if self.params.get('restart_policy') != 'no': - self.systemd.create_unit_file() - self.systemd.stop() - else: + if not self.systemd.check_unit_file(): self.dc.stop(name, timeout=graceful_timeout) + else: + self.systemd.stop() def stop_and_remove_container(self): container = self.check_container() diff --git a/ansible/module_utils/kolla_systemd_worker.py b/ansible/module_utils/kolla_systemd_worker.py index 2d8a59d1cb..72c50b3164 100644 --- a/ansible/module_utils/kolla_systemd_worker.py +++ b/ansible/module_utils/kolla_systemd_worker.py @@ -106,11 +106,16 @@ class SystemdWorker(object): return False def stop(self): - return self.perform_action( + if self.perform_action( 'StopUnit', self.container_dict['service_name'], self.job_mode - ) + ): + return self.wait_for_unit( + self.container_dict['restart_timeout'], + state='dead' + ) + return False def reload(self): return self.perform_action( @@ -190,12 +195,12 @@ class SystemdWorker(object): return None - def wait_for_unit(self, timeout): + def wait_for_unit(self, timeout, state='running'): delay = 5 elapsed = 0 while True: - if self.get_unit_state() == 'running': + if self.get_unit_state() == state: return True elif elapsed > timeout: return False diff --git a/tests/check-logs.sh b/tests/check-logs.sh index 42a8a4541e..2da6b55967 100755 --- a/tests/check-logs.sh +++ b/tests/check-logs.sh @@ -22,6 +22,10 @@ function check_fluentd_log_file_for_level { sudo egrep "\[$2\]:" $1 } +function check_docker_log_file_for_sigkill { + sudo journalctl --no-pager -u ${CONTAINER_ENGINE}.service | grep "signal 9" +} + function filter_out_expected_critical { # $1: file # Filter out expected critical log messages that we do not want to fail the @@ -79,6 +83,10 @@ if check_fluentd_log_file_for_level $fluentd_log_file error >/dev/null; then echo >> $fluentd_error_summary_file fi +if check_docker_log_file_for_sigkill >/dev/null; then + any_critical=1 + echo "(critical) Found containers killed using signal 9 (SIGKILL) in docker logs." +fi if [[ $any_critical -eq 1 ]]; then echo "Found critical log messages - failing job." diff --git a/tests/kolla_docker_tests/test_docker_worker.py b/tests/kolla_docker_tests/test_docker_worker.py index 2c5efd716a..d85c2255d8 100644 --- a/tests/kolla_docker_tests/test_docker_worker.py +++ b/tests/kolla_docker_tests/test_docker_worker.py @@ -536,6 +536,7 @@ class TestContainer(base.BaseTestCase): 'action': 'stop_container', 'restart_policy': 'no'}) self.dw.dc.containers.return_value = self.fake_data['containers'] + self.dw.systemd.check_unit_file.return_value = False self.dw.stop_container() self.assertTrue(self.dw.changed)