upload-to-squad.sh: add retry to help success rate for uploading (#543)

when the uploading fails.

Signed-off-by: Yongqin Liu <yongqin.liu@linaro.org>
diff --git a/automated/utils/upload-to-squad.sh b/automated/utils/upload-to-squad.sh
index df9d2fb..4f3ad8d 100755
--- a/automated/utils/upload-to-squad.sh
+++ b/automated/utils/upload-to-squad.sh
@@ -4,13 +4,17 @@
 ARTIFACTORIAL_URL=""
 CURL_VERBOSE_FLAG=""
 FAILURE_RETURN_VALUE=0
+RETRY_COUNT=5
+RETRY_INTERVAL=30
 
 usage() {
-    echo "Usage: $0 [-a <attachment>] [-u <artifactorial_url>] [-v] [-r]" 1>&2
+    echo "Usage: $0 [-a <attachment>] [-u <artifactorial_url>] [-c <retry_count>] [-i <retry_interval>] [-v] [-r]" 1>&2
     echo "  -a attachment           Path to the file to upload" 1>&2
     echo "  -u squad_url            SQUAD_URL where the attachment will be uploaded to" 1>&2
     echo "                          This script will try to fetch the SQUAD_ARCHIVE_SUBMIT_TOKEN" 1>&2
     echo "                          token from (lava_test_dir)/secrets or environments for the upload." 1>&2
+    echo "  -c retry_count          How many times to try when the uploading failed" 1>&2
+    echo "  -i retry_interval       The interval seconds between the re-tries." 1>&2
     echo "  -v      Pass -v (verbose) flag to curl for debugging." 1>&2
     echo "  -r      Report failure. If the upload fails and this flag is set, the script will exit" 1>&2
     echo "          with return value 1. If the upload is skipped (no URL or no token found)," 1>&2
@@ -18,10 +22,12 @@
     exit 1
 }
 
-while getopts ":a:u:vr" opt; do
+while getopts ":a:u:c:i:vr" opt; do
     case "${opt}" in
         a) ATTACHMENT="${OPTARG}" ;;
         u) ARTIFACTORIAL_URL="${OPTARG}" ;;
+        c) RETRY_COUNT="${OPTARG}" ;;
+        i) RETRY_INTERVAL="${OPTARG}" ;;
         v) CURL_VERBOSE_FLAG="-v" ;;
         r) FAILURE_RETURN_VALUE=1 ;;
         *) usage ;;
@@ -50,24 +56,39 @@
         echo "test-attachment skip"
         command -v lava-test-case > /dev/null 2>&1 && lava-test-case "test-attachment" --result "skip"
         exit 0
-    else
-        # return is the squad testrun id
-        return=$(curl ${CURL_VERBOSE_FLAG} --header "Auth-Token: ${SQUAD_ARCHIVE_SUBMIT_TOKEN}" --form "attachment=@${ATTACHMENT}" "${ARTIFACTORIAL_URL}")
     fi
 
     attachmentBasename="$(basename "${ATTACHMENT}")"
-    if echo "${return}" | grep -E "^[0-9]+$"; then
-        # ARTIFACTORIAL_URL will be in the format like this:
-        #    https://qa-reports.linaro.org/api/submit/squad_group/squad_project/squad_build/environment
-        url_squad=$(echo "${ARTIFACTORIAL_URL}"|sed 's|/api/submit/.*||')
-        url_uploaded="${url_squad}/api/testruns/${return}/attachments/?filename=${attachmentBasename}"
-        lava-test-reference "test-attachment" --result "pass" --reference "${url_uploaded}"
-    else
-        echo "test-attachment fail"
-        echo "Expected one SQUAD testrun id returend, but curl returned \"${return}\"."
-        command -v lava-test-case > /dev/null 2>&1 && lava-test-case "test-attachment" --result "fail"
-        exit "${FAILURE_RETURN_VALUE}"
-    fi
+    # Re-run the upload for ${RETRY_COUNT} times with the interval of ${RETRY_INTERVAL} seconds when it fails
+    i=1
+    while [ $i -le "${RETRY_COUNT}" ]; do
+        # response is the squad testrun id when succeed
+        response=$(curl ${CURL_VERBOSE_FLAG} --header "Auth-Token: ${SQUAD_ARCHIVE_SUBMIT_TOKEN}" --form "attachment=@${ATTACHMENT}" "${ARTIFACTORIAL_URL}")
+
+        # generate the SQUAD url for download and report pass when uploading succeed
+        if echo "${response}" | grep -E "^[0-9]+$"; then
+            # ARTIFACTORIAL_URL will be in the format like this:
+            #    https://qa-reports.linaro.org/api/submit/squad_group/squad_project/squad_build/environment
+            url_squad=$(echo "${ARTIFACTORIAL_URL}"|sed 's|/api/submit/.*||')
+            url_uploaded="${url_squad}/api/testruns/${response}/attachments/?filename=${attachmentBasename}"
+            lava-test-reference "test-attachment" --result "pass" --reference "${url_uploaded}"
+            break
+        fi
+
+        # still print the output every time for investigation purpose
+        echo "Expected one SQUAD testrun id returend, but curl returned \"${response}\"."
+
+        # report fail if the uploading failed for ${RETRY_COUNT} times
+        if [ $i -eq "${RETRY_COUNT}" ]; then
+            echo "test-attachment fail"
+            command -v lava-test-case > /dev/null 2>&1 && lava-test-case "test-attachment" --result "fail"
+            exit "${FAILURE_RETURN_VALUE}"
+        fi
+
+        # try again in ${RETRY_INTERVAL} seconds
+        sleep "${RETRY_INTERVAL}"
+        i=$((i + 1))
+    done
 else
     echo "test-attachment skip"
     command -v lava-test-case > /dev/null 2>&1 && lava-test-case "test-attachment" --result "skip"