#################################################################### # WARNING: These are designed specifically for Ansible tests # # and should not be used as examples of how to write Ansible roles # #################################################################### # Test code for the pids module # Copyright: (c) 2019, Saranya Sridharan # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - name: Attempt installation of latest 'psutil' version pip: name: psutil ignore_errors: true register: psutil_latest_install - name: Install greatest 'psutil' version which will work with all pip versions pip: name: psutil < 5.7.0 when: psutil_latest_install is failed - name: "Checking the empty result" pids: name: "blahblah" register: emptypids - name: "Verify that the list of Process IDs (PIDs) returned is empty" assert: that: - emptypids is not changed - emptypids.pids == [] - name: "Picking a random process name" set_fact: random_name: some-random-long-name-{{ 99999999 | random }} - name: "finding the 'sleep' binary" command: which sleep register: find_sleep - name: "Copying 'sleep' binary" command: cp {{ find_sleep.stdout }} {{ remote_tmp_dir }}/{{ random_name }} # The following does not work on macOS 11.1 (it uses shutil.copystat, and that will die with a PermissionError): # copy: # src: "{{ find_sleep.stdout }}" # dest: "{{ remote_tmp_dir }}/{{ random_name }}" # mode: "0777" # remote_src: true - name: Copy helper script copy: src: obtainpid.sh dest: "{{ remote_tmp_dir }}/obtainpid.sh" - name: "Running the copy of 'sleep' binary" command: "sh {{ remote_tmp_dir }}/obtainpid.sh '{{ remote_tmp_dir }}/{{ random_name }}' '{{ remote_tmp_dir }}/obtainpid.txt'" async: 100 poll: 0 - name: "Wait for one second to make sure that the sleep copy has actually been started" pause: seconds: 1 - name: "Checking the process IDs (PIDs) of sleep binary" pids: name: "{{ random_name }}" register: pids - name: "Checking that exact non-substring matches are required" pids: name: "{{ random_name[0:5] }}" register: exactpidmatch - name: "Checking that patterns can be used with the pattern option" pids: pattern: "{{ random_name[0:5] }}" register: pattern_pid_match - name: "Checking that case-insensitive patterns can be used with the pattern option" pids: pattern: "{{ random_name[0:5] | upper }}" ignore_case: true register: caseinsensitive_pattern_pid_match - name: "Checking that .* includes test pid" pids: pattern: .* register: match_all - name: "Reading pid from the file" slurp: src: "{{ remote_tmp_dir }}/obtainpid.txt" register: newpid - name: "Verify that the Process IDs (PIDs) returned is not empty and also equal to the PIDs obtained in console" assert: that: - "pids.pids | join(' ') == newpid.content | b64decode | trim" - "pids.pids | length > 0" - "exactpidmatch.pids == []" - "pattern_pid_match.pids | join(' ') == newpid.content | b64decode | trim" - "caseinsensitive_pattern_pid_match.pids | join(' ') == newpid.content | b64decode | trim" - newpid.content | b64decode | trim | int in match_all.pids - name: "Register output of bad input pattern" pids: pattern: (unterminated register: bad_pattern_result ignore_errors: true - name: "Verify that bad input pattern result is failed" assert: that: - bad_pattern_result is failed