| #!/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 "$@" |