|
| 1 | +--- |
| 2 | +# Serial coda: serially run the ordered coda list after the main batch suite |
| 3 | +# (Machine leak cluster, egressIP / prometheus, then topology AZ check |
| 4 | +# before enable_topology=false mutator). |
| 5 | +# Expects openstack_test_leak_cluster_path to already list the ordered tests. |
| 6 | +- name: Stat machines leak-cluster serial list |
| 7 | + ansible.builtin.stat: |
| 8 | + path: "{{ openstack_test_leak_cluster_path }}" |
| 9 | + register: openstack_test_leak_cluster_stat |
| 10 | + |
| 11 | +- name: Count machines leak-cluster serial tests |
| 12 | + ansible.builtin.command: |
| 13 | + argv: |
| 14 | + - bash |
| 15 | + - -c |
| 16 | + - "grep -cve '^[[:space:]]*$' '{{ openstack_test_leak_cluster_path }}' || true" |
| 17 | + register: openstack_test_leak_cluster_count |
| 18 | + changed_when: false |
| 19 | + when: openstack_test_leak_cluster_stat.stat.exists | default(false) |
| 20 | + |
| 21 | +- name: Skip machines leak-cluster serial coda when empty |
| 22 | + ansible.builtin.debug: |
| 23 | + msg: >- |
| 24 | + No machines leak-cluster tests matched the filtered list; skipping serial coda. |
| 25 | + when: > |
| 26 | + (not (openstack_test_leak_cluster_stat.stat.exists | default(false))) |
| 27 | + or ((openstack_test_leak_cluster_count.stdout | default('0') | trim | int) == 0) |
| 28 | +
|
| 29 | +- name: Run machines leak-cluster tests serially and merge into suite log/junit |
| 30 | + when: |
| 31 | + - openstack_test_leak_cluster_stat.stat.exists | default(false) |
| 32 | + - (openstack_test_leak_cluster_count.stdout | default('0') | trim | int) > 0 |
| 33 | + block: |
| 34 | + - name: Execute machines leak-cluster run-test loop |
| 35 | + ansible.builtin.shell: | |
| 36 | + set -o pipefail |
| 37 | + suite_exit=0 |
| 38 | + py_exit=0 |
| 39 | + resolve="{{ openstack_test_ote_resolve_script }}" |
| 40 | + leak_log="{{ openstack_test_results_dir }}/machines_leak_cluster.log" |
| 41 | + leak_list="{{ openstack_test_leak_cluster_path }}" |
| 42 | + # Pre-count from the list file (do not increment in-loop; avoids |
| 43 | + # false UNSTABLE when resolvable!=expected after a successful coda). |
| 44 | + expected="$(grep -cve '^[[:space:]]*$' "$leak_list" || true)" |
| 45 | + : > "$leak_log" |
| 46 | + while IFS= read -r tname || [ -n "${tname:-}" ]; do |
| 47 | + [ -z "${tname// }" ] && continue |
| 48 | + tmp=$(mktemp) |
| 49 | + rc=0 |
| 50 | + {{ openstack_test_executable }} run-test --output=json -c 1 "$tname" \ |
| 51 | + > "$tmp" 2>&1 || rc=$? |
| 52 | + cat "$tmp" >> "$leak_log" |
| 53 | + cat "$tmp" >> {{ openstack_test_log_path }} |
| 54 | + if [ "$rc" -ne 0 ]; then |
| 55 | + failed=$(python3 "$resolve" count "$tmp" failed || echo 1) |
| 56 | + skipped=$(python3 "$resolve" count "$tmp" skipped || echo 0) |
| 57 | + passed=$(python3 "$resolve" count "$tmp" passed || echo 0) |
| 58 | + unknown=$(python3 "$resolve" count "$tmp" unknown || echo 0) |
| 59 | + if [ "$failed" -gt 0 ] || [ "$unknown" -gt 0 ]; then |
| 60 | + suite_exit=1 |
| 61 | + elif [ $((failed + skipped + passed + unknown)) -eq 0 ]; then |
| 62 | + if grep -q 'FAIL!' "$tmp" 2>/dev/null; then |
| 63 | + suite_exit=1 |
| 64 | + elif ! grep -qE 'SUCCESS!|SKIP' "$tmp" 2>/dev/null; then |
| 65 | + suite_exit=1 |
| 66 | + fi |
| 67 | + fi |
| 68 | + fi |
| 69 | + rm -f "$tmp" |
| 70 | + done < "$leak_list" |
| 71 | + python3 "$resolve" junit \ |
| 72 | + "{{ openstack_test_log_path }}" "{{ openstack_test_junit_path }}" || py_exit=$? |
| 73 | + failed_count=$(python3 "$resolve" count "$leak_log" failed || echo 0) |
| 74 | + skipped_count=$(python3 "$resolve" count "$leak_log" skipped || echo 0) |
| 75 | + passed_count=$(python3 "$resolve" count "$leak_log" passed || echo 0) |
| 76 | + unknown_count=$(python3 "$resolve" count "$leak_log" unknown || echo 0) |
| 77 | + resolvable=$(( ${passed_count:-0} + ${skipped_count:-0} + ${failed_count:-0} )) |
| 78 | + echo "machines_leak_cluster counts: passed=${passed_count} failed=${failed_count} skipped=${skipped_count} unknown=${unknown_count} expected=${expected} resolvable=${resolvable}" |
| 79 | + if [ "$suite_exit" -ne 0 ] || [ "$py_exit" -ne 0 ] \ |
| 80 | + || [ "${failed_count:-0}" -gt 0 ] || [ "${unknown_count:-0}" -gt 0 ] \ |
| 81 | + || [ "$resolvable" -ne "$expected" ]; then |
| 82 | + exit 1 |
| 83 | + fi |
| 84 | + exit 0 |
| 85 | + environment: |
| 86 | + OS_CLOUD: "{{ user_cloud }}" |
| 87 | + KUBECONFIG: "{{ kubeconfig }}" |
| 88 | + RHOSO_KUBECONFIG: "{{ rhoso_kubeconfig }}" |
| 89 | + SHIFTSTACK_PASS_FILE: "{{ kubeadmin_password }}" |
| 90 | + changed_when: true |
| 91 | + register: openstack_test_leak_cluster_run |
| 92 | + |
| 93 | + rescue: |
| 94 | + - name: Mark openstack-test UNSTABLE after machines leak-cluster serial failure |
| 95 | + ansible.builtin.include_role: |
| 96 | + name: tools_stage_results |
| 97 | + tasks_from: mark_test_stage_unstable.yml |
| 98 | + vars: |
| 99 | + unstable_msg: >- |
| 100 | + openstack_test serial coda failed (Machine leak cluster, egressIP / |
| 101 | + prometheus resize, and/or topology enable_topology pair). |
0 commit comments