summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Doran <sdoran@redhat.com>2020-12-07 12:40:28 -0500
committerGitHub <noreply@github.com>2020-12-07 11:40:28 -0600
commitcc47d9cb4128c9a7481b7aa61ed666b2fa222164 (patch)
tree9ae99a18dd0f061ee932e4bf1d123f0e686d1eac
parentd12e82b94c517953b740395e8082c1ed007bc1d5 (diff)
downloadansible-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.yml2
-rw-r--r--lib/ansible/modules/utilities/logic/wait_for.py12
-rw-r--r--test/integration/targets/wait_for/files/zombie.py13
-rw-r--r--test/integration/targets/wait_for/tasks/main.yml10
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 }}"