1+ #! /bin/bash
2+
3+ if [ -z " $1 " ]; then
4+ echo " Usage: $0 <log_file>"
5+ exit 1
6+ fi
7+
8+ LOG_FILE=$1
9+ if [ ! -f " $LOG_FILE " ]; then
10+ echo " File not found: $LOG_FILE "
11+ exit 1
12+ fi
13+
14+ CLEAN_LOG=$( mktemp)
15+ RERUN_LOG=$( mktemp)
16+ CLEAN_RERUN=$( mktemp)
17+ trap ' rm -f "$CLEAN_LOG" "$RERUN_LOG" "$CLEAN_RERUN"' EXIT
18+
19+ if ! command -v go & > /dev/null; then
20+ echo " Go is required."
21+ exit 1
22+ fi
23+
24+ go mod tidy > /dev/null 2>&1
25+ go mod download > /dev/null 2>&1
26+ go mod vendor > /dev/null 2>&1
27+
28+ # Strip colors for processing
29+ sed ' s/\x1b\[[0-9;]*m//g' " $LOG_FILE " > " $CLEAN_LOG "
30+
31+ PARSE_AWK='
32+ /\[FAIL\]/ {
33+ s="[Unknown]"
34+ if ($0 ~ /Sequential/) s="[Sequential]"
35+ if ($0 ~ /Parallel/) s="[Parallel]"
36+ match($0, /[0-9]-[0-9]{3}[-_][a-zA-Z0-9_-]+/);
37+ if (RLENGTH > 0) {
38+ val = substr($0, RSTART, RLENGTH);
39+ sub(/_test$/, "", val);
40+ print s " " val;
41+ }
42+ }'
43+
44+ FAILURES=$( awk " $PARSE_AWK " " $CLEAN_LOG " | sort | uniq)
45+ SUITE_FAILED=$( grep -c " A BeforeSuite node failed" " $CLEAN_LOG " || true)
46+
47+ if [ -z " $FAILURES " ] && [ " $SUITE_FAILED " -eq 0 ]; then
48+ echo " No test failures found."
49+ exit 0
50+ fi
51+
52+ echo " Tests to rerun:"
53+ [ -n " $FAILURES " ] && echo " $FAILURES " | sed ' s/^/ /'
54+ echo " "
55+
56+ GINKGO=" ./bin/ginkgo"
57+ [ ! -x " $GINKGO " ] && GINKGO=" ginkgo"
58+
59+ export OPERATOR_NAMESPACE=" ${OPERATOR_NAMESPACE:- openshift-gitops-operator} "
60+ SEQ_DIR=" ./test/openshift/e2e/ginkgo/sequential"
61+ PAR_DIR=" ./test/openshift/e2e/ginkgo/parallel"
62+
63+ echo " ⏳ Executing reruns in strict isolation..."
64+ echo " ----------------------------------------------------------------"
65+
66+ > " $RERUN_LOG "
67+
68+ if [ -n " $FAILURES " ]; then
69+ echo " $FAILURES " | while read -r line; do
70+ SUITE_TYPE=$( echo " $line " | awk ' {print $1}' )
71+ TEST_ID=$( echo " $line " | awk ' {print $2}' )
72+
73+ if [ " $SUITE_TYPE " = " [Sequential]" ]; then
74+ SUITE_DIR=" $SEQ_DIR "
75+ else
76+ SUITE_DIR=" $PAR_DIR "
77+ fi
78+
79+ echo -n " 🏃 Running $TEST_ID ... "
80+
81+ TEST_OUTPUT=$( mktemp)
82+ " $GINKGO " -v -focus=" $TEST_ID " -r " $SUITE_DIR " > " $TEST_OUTPUT " 2>&1
83+
84+ sed ' s/\x1b\[[0-9;]*m//g' " $TEST_OUTPUT " > " ${TEST_OUTPUT} _clean"
85+ cat " ${TEST_OUTPUT} _clean" >> " $CLEAN_RERUN "
86+
87+ if grep -q " ^FAIL!" " ${TEST_OUTPUT} _clean" ; then
88+ echo " ❌ FAILED"
89+ elif grep -q " ^SUCCESS!" " ${TEST_OUTPUT} _clean" || grep -q " 0 Failed" " ${TEST_OUTPUT} _clean" ; then
90+ TIME_TAKEN=$( grep -o " Ran [0-9]* of [0-9]* Specs in .*" " ${TEST_OUTPUT} _clean" | sed ' s/.* in //' )
91+ if [ -z " $TIME_TAKEN " ]; then
92+ echo " ⚠️ SKIPPED (Test did not execute)"
93+ else
94+ echo " ✅ PASSED (Took: $TIME_TAKEN )"
95+ fi
96+ else
97+ echo " ⚠️ UNKNOWN STATE (Check logs)"
98+ fi
99+
100+ rm -f " $TEST_OUTPUT " " ${TEST_OUTPUT} _clean"
101+ done
102+ fi
103+
104+ STILL_FAILING=$( awk " $PARSE_AWK " " $CLEAN_RERUN " | sort | uniq)
105+
106+ echo " ----------------------------------------------------------------"
107+ echo " Rerun Detailed Error Logs:"
108+ echo " ----------------------------------------------------------------"
109+
110+ if [ -z " $STILL_FAILING " ]; then
111+ echo " All tests passed on rerun."
112+ else
113+ echo " $STILL_FAILING " | while read -r line; do
114+ TEST_ID=$( echo " $line " | awk ' {print $2}' )
115+ echo " FAILED: $line "
116+
117+ awk -v tid=" $TEST_ID " '
118+ BEGIN { in_err=0; buf="" }
119+ /^[ \t]*•?[ \t]*\[(FAILED|PANICKED|FAIL)\]/ {
120+ in_err=1
121+ buf=$0
122+ next
123+ }
124+ in_err {
125+ buf = buf "\n" $0
126+ if ($0 ~ /^------------------------------/ || $0 ~ /^SSS/) {
127+ if (buf ~ tid) {
128+ n = split(buf, lines, "\n")
129+ valid_count = 0
130+
131+ # First, collect all valid lines
132+ for (i=1; i<=n; i++) {
133+ line = lines[i]
134+ sub(/^[ \t]+/, "", line)
135+ if (line != "" && line !~ /^------------------------------/ && line !~ /^SSS/) {
136+ valid_count++
137+ cleaned[valid_count] = line
138+ }
139+ }
140+
141+ # Print logic with truncation
142+ if (valid_count <= 25) {
143+ for (i=1; i<=valid_count; i++) print " > " cleaned[i]
144+ } else {
145+ for (i=1; i<=15; i++) print " > " cleaned[i]
146+ print " >"
147+ print " > ... [TRUNCATED: " (valid_count - 20) " lines omitted for readability] ..."
148+ print " >"
149+ for (i=valid_count-4; i<=valid_count; i++) print " > " cleaned[i]
150+ }
151+ exit
152+ }
153+ in_err=0
154+ buf=""
155+ }
156+ }
157+ ' " $CLEAN_RERUN "
158+ echo " "
159+ done
160+ fi
161+
162+ echo " ----------------------------------------------------------------"
163+ echo " Summary of tests still failing:"
164+ if [ -z " $STILL_FAILING " ]; then
165+ echo " None."
166+ else
167+ echo " $STILL_FAILING " | sed ' s/^/- /'
168+ fi
0 commit comments