| #!/bin/bash -e | |
| # | |
| # Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. | |
| # | |
| # This program and the accompanying materials are made available under the | |
| # terms of the Eclipse Public License v. 2.0, which is available at | |
| # http://www.eclipse.org/legal/epl-2.0. | |
| # | |
| # This Source Code may also be made available under the following Secondary | |
| # Licenses when the conditions for such availability set forth in the | |
| # Eclipse Public License v. 2.0 are satisfied: GNU General Public License, | |
| # version 2 with the GNU Classpath Exception, which is available at | |
| # https://www.gnu.org/software/classpath/license.html. | |
| # | |
| # SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 | |
| # | |
| ################################## Constants ################################## | |
| declare -r USAGE=$(cat <<'EOF' | |
| Prerequites: User must specify CTS_REMOTE_QUEUE_URL before running this script. | |
| This URL must point to the upstream hudson job of CTS Remote Queue. | |
| Usage: | |
| 1. ctsrq.sh -l ---> List all the available CTS test identifiers | |
| (both top-level and inner-level) without running them | |
| 2. ctsrq.sh -s ---> List all the available top-level CTS test identifiers | |
| without running them | |
| 3. ctsrq.sh -i ---> List the inner-level CTS test identifiers for a given | |
| top-level CTS test identifier without running them | |
| 4. ctsrq.sh -b <Glassfish_Branch> -a [-e "<email-id1> <email-id2> .."] | |
| ---> Run all the available top-level CTS test identifiers | |
| against the specified local Glassfish branch and email | |
| the results to the specified email-ids | |
| 5. ctsrq.sh -b <Glassfish_Branch> -t "<test_id1> <test_id2> <test_id3>" | |
| [-e "email-id1 email-id2 .."] | |
| ---> Run the specified CTS test identifiers against the | |
| specified local Glassfish branch and email the results | |
| to the specified email-ids. Note that double quotes are | |
| necessary if providing multiple test-ids. | |
| 6. ctsrq.sh -b <Glassfish_Branch> -a|-t | |
| -c "</net/<Host_name>/<cts_bundle_location>/*.zip" | |
| ---> Run the specified CTS test identifiers against specified | |
| branch using the locally built CTS bundle. Note that CTS | |
| bundle location should be network accessible. | |
| 7. ctsrq.sh -u <glassfish binary url> -a|-t | |
| ---> For running all tests or specified tests with GlassFish | |
| binary provided in the http url. Note that -u option | |
| works with -a and -t options as well. | |
| 8. ctsrq.sh [-h]---> Show this message | |
| EOF | |
| ) | |
| ################################## Variables ################################## | |
| # Array to hold the valid CTS test identifiers | |
| declare -a valid_test_ids | |
| ################################## Functions ################################## | |
| main() { | |
| # Make sure that CTS_REMOTE_QUEUE_URL env variable is set | |
| [[ -n "${CTS_REMOTE_QUEUE_URL}" ]] || { echo "CTS_REMOTE_QUEUE_URL environment variable must be set"; exit 1; } | |
| # Print the usage and exit if no arguments given | |
| [[ $# -eq 0 ]] && { echo -e "${USAGE}"; exit 0; } | |
| valid_test_ids=`list_test_ids` | |
| cts_bundle_location="remote" | |
| # Process the input arguments | |
| while getopts ":b:t:i:e:c:u:alsh" opt; do | |
| case "$opt" in | |
| b) gfs_branch=$OPTARG;; | |
| t) test_ids=($OPTARG);; | |
| c) cts_bundle_location=$OPTARG;; | |
| a) test_ids=(`list_top_level_test_ids`);; | |
| l) print_test_ids "${valid_test_ids}";; | |
| s) print_test_ids "$(list_top_level_test_ids)";; | |
| i) print_test_ids "$(list_inner_level_test_ids $OPTARG)";; | |
| e) email_ids=$OPTARG;; | |
| u) gfs_url=$OPTARG;; | |
| h) echo -e "${USAGE}"; exit 0;; | |
| \?) echo "Invalid option -$OPTARG is specified"; exit 1;; | |
| :) case "$OPTARG" in | |
| b) echo -e "Branch must be specified for the option -$OPTARG"; exit 1;; | |
| t) echo -e "Test Ids must be specified for the option -$OPTARG"; exit 1;; | |
| i) echo -e "Top level test id must be specified for the option -$OPTARG"; exit 1;; | |
| e) echo -e "Comma separated email-ids must be specified for the option -$OPTARG"; exit 1;; | |
| esac | |
| esac | |
| done | |
| shift "$((OPTIND-1))" | |
| [[ -n "${gfs_branch}" ]] || [[ -n "${gfs_url}" ]] || { echo "Branch or glassfish binary url must be specified"; exit 1; } | |
| [[ -n "${test_ids}" ]] || { echo "Test ids must be specified using -t option"; exit 1; } | |
| validate_given_test_ids ${test_ids[@]} | |
| fork_origin=`git config --get remote.origin.url` | |
| test_ids_encoded=`echo ${test_ids[@]} | tr ' ' '+'` | |
| email_ids_encoded=`echo ${email_ids} | tr ' ' '+'` | |
| # Generate a unique id for the job which will be used for identifying the job id later | |
| unique_id=$RANDOM | |
| params="BRANCH=${gfs_branch}&TEST_IDS=${test_ids_encoded}&FORK_ORIGIN=${fork_origin}&UNIQUE_ID=${unique_id}&EMAIL_IDS=${email_ids_encoded}&CTS_BUNDLE_LOCATION=${cts_bundle_location}&GLASSFISH_URL=${gfs_url}" | |
| last_build=`get_last_build_number` | |
| # Trigger the build | |
| curl -g -X POST "${CTS_REMOTE_QUEUE_URL}/buildWithParameters?${params}&delay=0sec" 2> /dev/null | |
| # Get the build number | |
| build_number=`find_job_id ${last_build} ${unique_id}` | |
| print_result ${build_number} | |
| } | |
| # Lists all the available CTS test identifiers | |
| list_test_ids() { | |
| local test_ids_location=${CTS_TEST_IDS_LOCATION} | |
| local default_test_ids_location_xpath="${CTS_REMOTE_QUEUE_URL}/api/xml?xpath=//action/parameterDefinition[name='"'CTS_TEST_IDS_LOCATION'"']/defaultParameterValue/value/text()" | |
| [ ${test_ids_location} ] || test_ids_location=$(curl -g "${default_test_ids_location_xpath}" 2> /dev/null) | |
| echo $(curl -g "${test_ids_location}" 2> /dev/null) | |
| } | |
| print_test_ids() { | |
| echo "${1}" | tr " " "\n"; exit 0; | |
| } | |
| # Lists all the available top-level CTS test identifiers | |
| list_top_level_test_ids() { | |
| local idx=0 | |
| for test_id in ${valid_test_ids[@]}; do | |
| [[ ${test_id} == */* ]] || { top_level_test_ids[$idx]=${test_id}; let idx++; } | |
| done | |
| echo ${top_level_test_ids[@]} | |
| } | |
| # Lists the inner-level CTS test identifiers for a given top-level CTS test identifier | |
| list_inner_level_test_ids() { | |
| local top_level_test_id=${1} | |
| local idx=0 | |
| for test_id in ${valid_test_ids[@]}; do | |
| [[ ${test_id} =~ ^"${top_level_test_id}/"* ]] && { inner_level_test_ids[$idx]=${test_id}; let idx++; } | |
| done | |
| echo ${inner_level_test_ids[@]} | |
| } | |
| # Validates the given test ids against the valid list | |
| validate_given_test_ids() { | |
| local given_test_ids=${1} | |
| for given_test_id in ${given_test_ids[@]}; do | |
| [[ $(is_test_id_valid $given_test_id) = true ]] || { echo "Invalid test id '${given_test_id}' is specified"; exit 1; } | |
| done | |
| } | |
| # Checks whether the given test id is a valid one (or) not | |
| is_test_id_valid() { | |
| local given_test_id=${1} | |
| for valid_test_id in ${valid_test_ids[@]}; do | |
| [[ "$given_test_id" = "$valid_test_id" ]] && { echo true; return 0; } | |
| done | |
| echo false | |
| } | |
| # Find the job id using the unique id that is generated while submitting the job | |
| find_job_id(){ | |
| local last_build=${1} | |
| local given_unique_id=${2} | |
| local latest_last_build=(`get_last_build_number`) | |
| # nothing running and nothing new completed | |
| [[ "${last_build}" = "${latest_last_build}" ]] && { echo ${last_build}; return 1; } | |
| # look into the newly completed run | |
| local i=$((last_build+1)) | |
| while [ ${i} -le ${latest_last_build} ]; do | |
| local unique_id_location="${CTS_REMOTE_QUEUE_URL}/${i}/api/xml?xpath=//action/parameter[name='"'UNIQUE_ID'"']/value/text()" | |
| local unique_id=$(curl -g ${unique_id_location} 2> /dev/null) | |
| [[ "${unique_id}" == "${given_unique_id}" ]] && { echo ${i}; return 0; } | |
| let i++ | |
| done | |
| # not found | |
| return 1 | |
| } | |
| # Gets the build number of the last cts remote queue job which includes the currently on-going runs too | |
| get_last_build_number(){ | |
| local url="${CTS_REMOTE_QUEUE_URL}/api/xml?xpath=//lastBuild/number/text()" | |
| curl -g "${url}" 2> /dev/null | |
| [[ ${?} -eq 0 ]] || exit 1 | |
| } | |
| print_result() { | |
| local build_number=${1} | |
| echo "----------------------------------------------------------------------" | |
| [[ ! -z ${build_number} ]] \ | |
| && { echo "CTS RQ triggered successfully. Please find the RQ link below."; echo "${CTS_REMOTE_QUEUE_URL}/${build_number}"; } \ | |
| || { echo "Issue in CTS RQ client. Please check your git settings."; } | |
| echo "----------------------------------------------------------------------" | |
| } | |
| ############################ Execution starts from here ############################ | |
| main "$@" |