256 lines
6.8 KiB
Bash
Executable File
256 lines
6.8 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# set constants
|
|
TIMESTAMP=$(date +%s)
|
|
TEST_FOLDER=$(pwd)
|
|
|
|
function printHelp {
|
|
YELLOW="\\033[93;1m"
|
|
WHITE="\\033[0;1m"
|
|
GREEN="\\033[32;1m"
|
|
NC="\\033[0m" # No Color
|
|
|
|
echo -e "${YELLOW}$(basename "$0") ${WHITE}[-u <username>] [-n <number-of-users>] [-p <passwd>] [-r <url>] [-f <folder>] [-t <workspace_starts>]"
|
|
echo -e "\n${NC}Script for running load tests against Che 7."
|
|
echo -e "${GREEN}where:${WHITE}"
|
|
echo -e "-u base username"
|
|
echo -e "-p common password"
|
|
echo -e "-n number of users ${NC} usernames will be set in format <username>1, <username>2, ..."${WHITE}
|
|
echo -e "-i image with test"
|
|
echo -e "-r URL of Che"
|
|
echo -e "-f full path to folder ${NC} all reports will be saved in this folder"${WHITE}
|
|
echo -e "-c credential file ${NC} with usernames and passwords in *.csv format: \`user,pass\`"${WHITE}
|
|
echo -e "-t count on how many times one user should run a workspace"${NC}
|
|
}
|
|
|
|
oc whoami 1>/dev/null
|
|
if [ $? -gt 0 ] ; then
|
|
echo "ERROR: You are not logged! Please login to oc before running this script again."
|
|
exit 1
|
|
fi
|
|
|
|
echo "You are logged in OC: $(oc whoami -c)"
|
|
|
|
while getopts "hu:p:r:n:f:i:c:t:" opt; do
|
|
case $opt in
|
|
h) printHelp
|
|
exit 0
|
|
;;
|
|
c) export CRED_FILE=$OPTARG
|
|
;;
|
|
f) export FOLDER=$OPTARG
|
|
;;
|
|
i) export TEST_IMAGE=$OPTARG
|
|
;;
|
|
n) export USER_COUNT=$OPTARG
|
|
;;
|
|
p) export PASSWORD=$OPTARG
|
|
;;
|
|
r) export URL=$OPTARG
|
|
;;
|
|
t) export COMPLETITIONS_COUNT=$OPTARG
|
|
;;
|
|
u) export USERNAME=$OPTARG
|
|
;;
|
|
\?) # invalid option
|
|
exit 1
|
|
;;
|
|
:)
|
|
echo "Option \"$opt\" needs an argument."
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
function exists {
|
|
resource=$1
|
|
name=$2
|
|
if ( oc get $1 $2 > /dev/null 2>&1 ); then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# check that all parameters are set
|
|
if [ -z $CRED_FILE ]; then
|
|
if [ -z $USERNAME ] || [ -z $PASSWORD ] || [ -z $USER_COUNT ]; then
|
|
echo "ERROR: No credentials given! You need to set username, password and user count or set credentials file."
|
|
printHelp
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ -z $URL ] || [ -z $FOLDER ] || [ -z $TEST_IMAGE ]; then
|
|
echo "Some parameters are not set! Exitting load tests."
|
|
printHelp
|
|
exit 1
|
|
else
|
|
echo "Running load tests, result will be stored in $FOLDER in $TIMESTAMP subfolder."
|
|
fi
|
|
|
|
if [ -z $COMPLETITIONS_COUNT ]; then
|
|
echo "Parameter -t wasn't set, setting completitions count to 1."
|
|
COMPLETITIONS_COUNT=1
|
|
fi
|
|
|
|
# ----------- PREPARE ENVIRONMENT ----------- #
|
|
echo "-- Preparing environment."
|
|
# create pvc
|
|
clean_pvc=false
|
|
if ( exists pvc load-test-pvc ); then
|
|
echo "PVC load-test-pvc already exists. Reusing and cleaning PVC."
|
|
clean_pvc=true
|
|
else
|
|
oc create -f pvc.yaml
|
|
fi
|
|
|
|
# create ftp server
|
|
if ( exists pod ftp-server ); then
|
|
echo "Pod ftp-server already exists. Skipping creation."
|
|
else
|
|
oc create -f ftp-server.yaml
|
|
fi
|
|
|
|
# create service
|
|
if ( exists service load-tests-ftp-service ); then
|
|
echo "Service load-tests-ftp-service already exists. Skipping creation."
|
|
else
|
|
oc create -f ftp-service.yaml
|
|
fi
|
|
|
|
# load users if credential file was provided
|
|
if [ ! -z $CRED_FILE ]; then
|
|
cred_file_size=$(wc -l $CRED_FILE)
|
|
fi
|
|
|
|
# wait for ftp-server to be running
|
|
if [[ $clean_pvc == true ]]; then
|
|
while [ true ]
|
|
do
|
|
status=$(oc get pod ftp-server | awk '{print $3}' | tail -n 1)
|
|
if [[ $status == "Running" ]]; then
|
|
oc exec ftp-server -it -- rm -rf /home/vsftpd/user/*
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# set common variables to template.yaml
|
|
cp pod.yaml template.yaml
|
|
parsed_url=$(echo $URL | sed 's/\//\\\//g')
|
|
parsed_image=$(echo $TEST_IMAGE | sed 's/\//\\\//g')
|
|
|
|
sed -i "s/REPLACE_COMPLETITIONS/$COMPLETITIONS_COUNT/g" template.yaml
|
|
sed -i "s/REPLACE_URL/\"$parsed_url\"/g" template.yaml
|
|
sed -i "s/REPLACE_TIMESTAMP/\"$TIMESTAMP\"/g" template.yaml
|
|
sed -i "s/REPLACE_IMAGE/\"$parsed_image\"/g" template.yaml
|
|
|
|
# ----------- RUNNING TEST ----------- #
|
|
echo "-- Running pods with tests."
|
|
|
|
echo "Searching for already created jobs..."
|
|
jobs=$(oc get jobs -l group=load-tests)
|
|
if [[ ! -z $jobs ]]; then
|
|
echo "[WARNING] There are some jobs already running. Removing all jobs with label \"load-tests\" and creating new ones."
|
|
oc delete jobs -l group=load-tests
|
|
oc delete pods -l group=load-tests
|
|
fi
|
|
|
|
# set variables specific for each pod and create pods
|
|
users_assigned=0
|
|
if [ ! -z $USER_COUNT ]; then
|
|
while [ $users_assigned -lt $USER_COUNT ]
|
|
do
|
|
users_assigned=$((users_assigned+1))
|
|
cp template.yaml final.yaml
|
|
sed -i "s/REPLACE_NAME/load-test-$users_assigned/g" final.yaml
|
|
sed -i "s/REPLACE_USERNAME/$USERNAME$users_assigned/g" final.yaml
|
|
sed -i "s/REPLACE_PASSWORD/$PASSWORD/g" final.yaml
|
|
oc create -f final.yaml
|
|
done
|
|
fi
|
|
if [ ! -z $CRED_FILE ]; then
|
|
oldifs=$IFS
|
|
while IFS=, read -r cred_file_username cred_file_pass
|
|
do
|
|
users_assigned=$((users_assigned+1))
|
|
cp template.yaml final.yaml
|
|
sed -i "s/REPLACE_NAME/load-test-$users_assigned/g" final.yaml
|
|
sed -i "s/REPLACE_USERNAME/$cred_file_username/g" final.yaml
|
|
sed -i "s/REPLACE_PASSWORD/$cred_file_pass/g" final.yaml
|
|
oc create -f final.yaml
|
|
done < $CRED_FILE
|
|
IFS=$oldifs
|
|
fi
|
|
|
|
echo "-- Waiting for all pods to be completed."
|
|
|
|
#waiting for jobs to be completed
|
|
all_completed=false
|
|
while [ $all_completed == false ]
|
|
do
|
|
sleep 20
|
|
all_completed=true
|
|
for job_name in $(oc get jobs -o name )
|
|
do
|
|
if [ $(oc get $job_name -o json | jq .status.completionTime) == null ]; then
|
|
echo "Some jobs are still not completed. Waiting for 20 seconds."
|
|
all_completed=false
|
|
break
|
|
fi
|
|
done
|
|
done
|
|
|
|
echo "All jobs are completed!"
|
|
|
|
statuses=""
|
|
for p in $(oc get pods -l group=load-tests -o name)
|
|
do
|
|
status=$(oc get $p | awk '{print $3}' | tail -n 1)
|
|
statuses="$statuses $status"
|
|
done
|
|
echo "Pods ended with those statuses: $statuses"
|
|
|
|
# ----------- GATHERING LOGS ----------- #
|
|
echo "-- Gathering logs."
|
|
|
|
echo "Syncing files from PVC to local folder."
|
|
mkdir $FOLDER/$TIMESTAMP
|
|
cd $FOLDER/$TIMESTAMP
|
|
oc rsync --no-perms --include "*.tar" ftp-server:/home/vsftpd/user/ $FOLDER/$TIMESTAMP
|
|
echo "Tar files rsynced, untarring..."
|
|
for filename in *.tar; do
|
|
tar xf $filename;
|
|
done
|
|
rm *.tar
|
|
cd ..
|
|
|
|
# gather logs from pods
|
|
echo "Gathering logs from pods."
|
|
for p in $(oc get pods -l group=load-tests -o name)
|
|
do
|
|
IFS='-'
|
|
read -a strarr <<< "$p"
|
|
unset IFS
|
|
number=${strarr[2]}
|
|
path_to_logs="$FOLDER/$TIMESTAMP"
|
|
file="$path_to_logs/pod-$number-console-logs.txt"
|
|
touch $file
|
|
oc logs $p > $file
|
|
done
|
|
|
|
# ----------- CLEANING ENVIRONMENT ----------- #
|
|
echo "-- Cleaning environment."
|
|
|
|
oc delete jobs -l group=load-tests
|
|
oc delete pods -l group=load-tests
|
|
|
|
oc delete pod ftp-server
|
|
oc delete service load-tests-ftp-service
|
|
oc delete pvc load-test-pvc
|
|
|
|
# ----------- PROCESSING TEST RESULTS ----------- #
|
|
$TEST_FOLDER/process-logs.sh -t $TIMESTAMP -f $FOLDER -c $((users_assigned*COMPLETITIONS_COUNT))
|