diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d8e43df6..e6f6aa12 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: python --version pytest --version - run: | - sudo apt-get install cpanminus + sudo apt-get install cpanminus html-xml-utils sudo cpanm -n -M https://cpan.metacpan.org --installdeps . - name: unit- and integration tests run: | diff --git a/openqa-label-known-issues b/openqa-label-known-issues index a0a621af..306fa886 100755 --- a/openqa-label-known-issues +++ b/openqa-label-known-issues @@ -29,14 +29,19 @@ client_args=(api --header 'User-Agent: openqa-label-known-issues (https://github out="${REPORT_FILE:-$(mktemp -t openqa-label-known-issues--output-XXXX)}" trap 'error-handler "$LINENO"' ERR -trap 'test "$KEEP_REPORT_FILE" == "1" || rm "$out"' EXIT +trap '_cleanup' EXIT + +_cleanup() { + test "$KEEP_REPORT_FILE" == "1" || rm "$out" + test "$KEEP_JOB_HTML_FILE" == "1" || rm -f "$html_out" +} echoerr() { echo "$@" >&2; } handle_unreachable() { local testurl=$1 - local out=$2 - + local timeago + html_out=${JOB_HTML_FILE:-$(mktemp -t openqa-label-known-issues--job-details-XXXX)} if ! curl "${curl_args[@]}" -s --head "$testurl" -o /dev/null; then # the page might be gone, try the scheme+host we configured (might be different one though) if ! grep -q "$host_url" <<< "$testurl"; then @@ -51,18 +56,27 @@ handle_unreachable() { return 1 fi # resorting to downloading the job details page instead of the - # log, overwrites $out - if ! curl "${curl_args[@]}" -s "$testurl" -o "$out"; then + # log + if ! curl "${curl_args[@]}" -s "$testurl" -o "${html_out}"; then echoerr "'$testurl' can be reached but not downloaded, bailing out" curl "${curl_args[@]}" "$testurl" exit 2 fi - if hxnormalize -x "$out" | hxselect -s '\n' -c '.links_a .resborder' | grep -qPzo '(?s)Gru job failed.*connection error.*Inactivity timeout'; then + if hxnormalize -x "${html_out}" | hxselect -s '\n' -c '.links_a .resborder' | grep -qPzo '(?s)Gru job failed.*connection error.*Inactivity timeout'; then "${client_call[@]}" -X POST jobs/"$id"/comments text='poo#62456 test incompletes after failing in GRU download task on "Inactivity timeout" with no logs' "${client_call[@]}" -X POST jobs/"$id"/restart return 1 fi + + # Checking timestamp given by job details page + timeago=$(grep timeago "$html_out" | hxselect -s '\n' -c '.timeago::attr(title)') + if [[ $(date -uIs -d '-14days') > $timeago ]]; then + # if the page is there but not even an autoinst-log.txt exists + # then the job might be too old and logs are already deleted. + echoerr "'$testurl' job#${id} without autoinst-log.txt older than 14 days. Do not label" + return 1 + fi } label_on_issues_from_issue_tracker() { @@ -116,7 +130,8 @@ label_on_issues_without_tickets() { } investigate_issue() { - local id="${1##*/}" + local testurl=$1 + local id="${testurl##*/}" local reason local curl_output echo "Requesting jobs/${id} via openqa-cli" @@ -136,15 +151,9 @@ investigate_issue() { echo "$reason" >> "$out" if [[ "$curl_output" != "200" ]] && [[ "$curl_output" != "301" ]]; then # if we can not even access the page it is something more critical - handle_unreachable "$testurl" "$out" || return + handle_unreachable "$testurl" "$out" || return 0 + [[ $curl_output != 404 ]] && return - # Checking timestamp - if [[ $(date -uIs -d '-14days') > $(grep timeago "$out" | hxselect -s '\n' -c '.timeago::attr(title)') ]]; then - # if the page is there but not even an autoinst-log.txt exists - # then the job might be too old and logs are already deleted. - echoerr "'$testurl' job#${id} without autoinst-log.txt older than 14 days. Do not label" - return - fi # not unreachable, no log, no reason, not too old if [[ -z $reason ]] || [[ $reason = null ]]; then echoerr "'$testurl' does not have autoinst-log.txt or reason, cannot label" @@ -166,7 +175,7 @@ investigate_issue() { } label_issue() { - testurl="${1:?"Need 'testurl'"}" + local testurl="${1:?"Need 'testurl'"}" [[ "$dry_run" = "1" ]] && client_prefix="echo" if [[ -z "$client_call" ]]; then client_call=(openqa-cli "${client_args[@]}") diff --git a/test/07-openqa-label-known-issues.t b/test/07-openqa-label-known-issues.t index 9500a3e7..a06cf741 100644 --- a/test/07-openqa-label-known-issues.t +++ b/test/07-openqa-label-known-issues.t @@ -9,6 +9,7 @@ source openqa-label-known-issues client_args=(api --host "$host_url") export KEEP_REPORT_FILE=1 +export KEEP_JOB_HTML_FILE=1 client_output='' mock-client-output() { @@ -39,14 +40,8 @@ comment_on_job() { echo "$comment" } out='' -hxnormalize() { - cat "$2" -} -hxselect() { - cat - -} -try investigate_issue +try investigate_issue || true is "$rc" 1 'id required' # error in tap output is from here @@ -60,61 +55,64 @@ action Job incompletes with reason auto_review:\"(?m)api failure$\" (and no further details) action" +tmplog=$(mktemp) +out=$tmplog +tmpjobpage=$(mktemp) + +setup() { + id=$1 + testurl="https://openqa.opensuse.org/tests/${id}" +} + # test data with reason but 404 in curl respond -id=404 -testurl="https://openqa.opensuse.org/tests/${id}" -try-client-output investigate_issue $id -is "$rc" 0 'investigate_issue with missing autoinst-log and with reason in job_data' +setup 404 +older40d_date=$(date -uIs -d '-40days') +echo -n "Result:incompletefinished" > $tmpjobpage +export JOB_HTML_FILE=$tmpjobpage +try-client-output investigate_issue $testurl +is "$rc" 0 'investigate_issue with missing autoinst-log and with reason in job_data' #ok 3 has "$got" "without autoinst-log.txt older than 14 days. Do not label" "exits succefully when is old job without autoinst-log.txt" # all assets are missing -id=101 -testurl="https://openqa.opensuse.org/tests/${id}" -# `cur_date` is used on the following 4 test cases -cur_date=$(date +%F) -sed -i "s/yyyy-mm-dd/${cur_date}/" "$dir/data/${id}.json" -+fs:mktemp -tmplog=$temp -echo -n "Result: incomplete, finished >" > $tmplog -out=$tmplog -try-client-output investigate_issue $id -is "$rc" 0 'investigate_issue with missing autoinst-log but with reason in job_data' +setup 101 +# `older1d_date` is used on the following 4 test cases +older1d_date=$(date -uIs -d '-1days') +sed -i "s/yyyy-mm-dd/${older1d_date}/" "$dir/data/${id}.json" +echo -n "Result:incompletefinished" > $tmpjobpage +html_out=$tmpjobpage +export JOB_HTML_FILE=$tmpjobpage +echo > $tmplog +try-client-output investigate_issue $testurl +is "$rc" 0 'investigate_issue with missing autoinst-log but with reason in job_data' # ok 4 has "$got" "does not have autoinst-log.txt or reason, cannot label" "investigation exits when no reason and autoinst-log" # Cleanup 404.json -sed -i "s/${cur_date}/yyyy-mm-dd/" "$dir/data/${id}.json" +sed -i "s/${older1d_date}/yyyy-mm-dd/" "$dir/data/${id}.json" # Unknown reason - not included in issues -id=102 -testurl="https://openqa.opensuse.org/tests/${id}" -echo -n "Result: incomplete, finished >" > $tmplog +setup 102 echo -n "\nthe reason is whatever" >> $tmplog -out=$tmplog -try-client-output investigate_issue $id +try-client-output investigate_issue $testurl is "$rc" 0 'investigate no old issue with missing autoinst-log and unknown reason in job_data' has "$got" "Unknown test issue, to be reviewed" "investigation still label Unknown reason" -id=414 -testurl="https://openqa.opensuse.org/tests/${id}" -try-client-output investigate_issue $id +setup 414 +try-client-output investigate_issue $testurl is "$rc" 0 'investigate_issue with missing old autoinst-log and without reason in job_data' has "$got" "does not have autoinst-log.txt or reason, cannot label" "investigation exits successfully when no reason and no autoinst-log" -id=200 -testurl="https://openqa.opensuse.org/tests/${id}" +setup 200 cp $autoinst_log $tmplog -out=$tmplog -try-client-output investigate_issue $id +try-client-output investigate_issue $testurl is "$rc" 0 'investigate_issue with autoinst-log and without reason' has "$got" "test fails in network_peering" "investigation label job with matched autoinst-log context" # handle_unreview branch echo > "$tmplog" -out=$tmplog -try-client-output investigate_issue $id +try-client-output investigate_issue $testurl is "$rc" 0 'job with empty autoinst-log checks unknown issue' has "$got" "Unknown test issue, to be reviewed" "investigation still label Unknown issue" echo -n "[error] Failed to download" > $out -try-client-output investigate_issue $id +try-client-output investigate_issue $testurl is "$rc" 0 'job label without tickets' has "$got" "label:download_error potentially out-of-space worker?" "investistigation label correctly job without ticket"