diff options
author | Sam Doran <sdoran@redhat.com> | 2020-12-07 12:40:28 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-07 11:40:28 -0600 |
commit | cc47d9cb4128c9a7481b7aa61ed666b2fa222164 (patch) | |
tree | 9ae99a18dd0f061ee932e4bf1d123f0e686d1eac | |
parent | d12e82b94c517953b740395e8082c1ed007bc1d5 (diff) | |
download | ansible-cc47d9cb4128c9a7481b7aa61ed666b2fa222164.tar.gz |
[stable-2.9] wait_for - ignore psutil related errors (#72401) (#72407)
When enumerating connections with psutil, catch and ignore errors to avoid returning a stack trace.
Co-authored-by: Matt Martz <matt@sivel.net>
(cherry picked from commit fb09fd2a23)
-rw-r--r-- | changelogs/fragments/72322-wait-for-handle-errors.yml | 2 | ||||
-rw-r--r-- | lib/ansible/modules/utilities/logic/wait_for.py | 12 | ||||
-rw-r--r-- | test/integration/targets/wait_for/files/zombie.py | 13 | ||||
-rw-r--r-- | test/integration/targets/wait_for/tasks/main.yml | 10 |
4 files changed, 33 insertions, 4 deletions
diff --git a/changelogs/fragments/72322-wait-for-handle-errors.yml b/changelogs/fragments/72322-wait-for-handle-errors.yml new file mode 100644 index 0000000000..d32940fa23 --- /dev/null +++ b/changelogs/fragments/72322-wait-for-handle-errors.yml @@ -0,0 +1,2 @@ +bugfixes: + - wait_for - catch and ignore errors when getting active connections with psutil (https://github.com/ansible/ansible/issues/72322) diff --git a/lib/ansible/modules/utilities/logic/wait_for.py b/lib/ansible/modules/utilities/logic/wait_for.py index 7939066c4f..f5a8642967 100644 --- a/lib/ansible/modules/utilities/logic/wait_for.py +++ b/lib/ansible/modules/utilities/logic/wait_for.py @@ -289,10 +289,14 @@ class TCPConnectionInfo(object): def get_active_connections_count(self): active_connections = 0 for p in psutil.process_iter(): - if hasattr(p, 'get_connections'): - connections = p.get_connections(kind='inet') - else: - connections = p.connections(kind='inet') + try: + if hasattr(p, 'get_connections'): + connections = p.get_connections(kind='inet') + else: + connections = p.connections(kind='inet') + except psutil.Error: + # Process is Zombie or other error state + continue for conn in connections: if conn.status not in self.module.params['active_connection_states']: continue diff --git a/test/integration/targets/wait_for/files/zombie.py b/test/integration/targets/wait_for/files/zombie.py new file mode 100644 index 0000000000..913074eb90 --- /dev/null +++ b/test/integration/targets/wait_for/files/zombie.py @@ -0,0 +1,13 @@ +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +import os +import sys +import time + +child_pid = os.fork() + +if child_pid > 0: + time.sleep(60) +else: + sys.exit() diff --git a/test/integration/targets/wait_for/tasks/main.yml b/test/integration/targets/wait_for/tasks/main.yml index 4d1c9f319d..1898fd1253 100644 --- a/test/integration/targets/wait_for/tasks/main.yml +++ b/test/integration/targets/wait_for/tasks/main.yml @@ -142,6 +142,16 @@ name: psutil when: ansible_system != 'Linux' +- name: Copy zombie.py + copy: + src: zombie.py + dest: "{{ output_dir }}" + +- name: Create zombie process + shell: "{{ ansible_python.executable }} {{ output_dir }}/zombie" + async: 90 + poll: 0 + - name: test wait for port drained wait_for: port: "{{ http_port }}" |