blob: b32ce1bb8ff971ce21ea33a52028691ed3426f2f [file] [log] [blame]
#!/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 "$@"