mistserver/scripts/loadTest

263 lines
6.6 KiB
Bash
Executable file

#!/bin/bash
#starting with define of stream getter functions
#for all funcions: $1 = stream, $2 = time to download
function genericGetter {
echo filesize `curl -s -m $2 $1| wc -c` 1>&2
}
function flvGetter {
curl -s -m $2 $1 2> /dev/null | ../MistAnalyserFLV -m validate 2> /dev/null
}
function hlsGetter {
../MistAnalyserHLS -m validate -a $2 $1 2>/dev/null
}
function oggGetter {
curl -s -m $2 $1 | ../MistAnalyserOGG -m validate
}
function dashGetter {
../MistAnalyserDASH -m validate -a $2 $1 2>/dev/null
}
function rtmpGetter {
#$rtmpGetter ignores $2, because rtmpdump has no time setting
#rtmpdump is ended with killall in parent function
rtmpdump -qRr $1 -o - 2> /dev/null | ../MistAnalyserFLV -m validate 2> /dev/null
}
function serverTest {
rm /tmp/res*_*
#this functions creates a csv file with all statistics during the tests
#$1 = number of stream batches
#$2 = amount of streams per batch (amount of streams = $! * $2)
#$3 = current stream test
#$4 = ssh access to server where our log file is located
#$5 = duration of test in seconds
#$6 = location of log file on server
#$7 = getter used for stream testing
#$8 = Extra comments added to .csv file
#$9 = Output basename
echo "Test variables:" > $9.info
echo "Start time: `date`" >> $9.info
echo "Client count: `echo "$1 * $2" | bc`" >> $9.info
echo "Batch Size: $2" >> $9.info
echo "Stream URL: $3" >> $9.info
echo "Duration: $5 seconds" >> $9.info
val="none"
logdir="$6"
if [ -n "$7" ] ; then
echo "Validator: $7" >> $9.info
val="$7"
fi
ssh $4 sudo systemctl restart capa_service
#sleeping, so service can properly start
sleep 2
getter="${val}Getter"
#starting all tests
prefix="res"`date +%s`_
for x in `seq 1 1 $1`; do
for y in `seq 1 1 $2`; do
eval "$getter $3 $5" >& /tmp/$prefix`echo "$x * $2 + $y" | bc`.txt &
done
sleep 1
done
start=`date +%s`
f=$(( `date +%s` - $start ))
while [ $f -lt $5 ]; do
sleep 2
f=$(( `date +%s` - $start ))
done
if [ "$val" == "rtmp" ] ; then
killall rtmpdump
fi
#wait 20 seconds after terminating
start=`date +%s`
f=$(( `date +%s` - $start ))
while [ $f -lt 20 ]; do
sleep 2
f=$(( `date +%s` - $start ))
done
cat /tmp/$prefix* > $9.times
ssh $4 sudo systemctl stop capa_service
ssh $4 "cat $logdir/log.csv" > $9.csv
wait
}
function rebootHost {
nowtime=`ssh $1 uptime -s`
timeOut=$(( `date +%s` + 3600 ))
echo "Rebooting host $1..."
ssh $1 sudo shutdown -r 3
echo "Waiting for host to come back..."
sleep 3
while [ true ]; do
sleep 5
#ping for connection
ping -c1 $1 > /dev/null
if [ `echo $?` == 0 ]; then
#check ssh
if [ "`ssh -o 'ConnectTimeout 5' $1 echo DDVtesting`" == "DDVtesting" ]; then
#check uptime
if [ "`ssh -o 'ConnectTimeout 5' $1 uptime -s`" != "$nowtime" ]; then
echo host succesfully rebooted
return 0
fi
fi
fi
if [ $timeOut -lt `date +%s` ]; then
echo timeout
return 1
fi
done
}
function checkService {
echo "doing runcheck"
echo "ssh $1 systemctl status $2 | grep Active\:"
status="`ssh $1 systemctl status $2 | grep Active\:`"
if [ "${status:11:6}" != "active" ]; then
echo starting ${2}...
ssh $1 sudo systemctl stop wowza
ssh $1 sudo systemctl stop wowza4
ssh $1 sudo systemctl stop nginx
ssh $1 sudo systemctl stop mistserver
ssh $1 sudo systemctl stop adobe
ssh $1 sudo systemctl disable wowza
ssh $1 sudo systemctl disable wowza4
ssh $1 sudo systemctl disable nginx
ssh $1 sudo systemctl disable mistserver
ssh $1 sudo systemctl disable adobe
ssh $1 sudo systemctl enable $2
ssh $1 sudo systemctl start $2
else
echo $2 is running...
fi
}
#setting default values
server="localhost"
comment=""
logdir="`pwd`"
freshBoot="y"
product="mistserver"
declare -a timegroup
declare -a request
declare -a stream
#parsing arguments
red=1
while [ $red -le $# ]; do
case ${!red} in
"-s") #defines server
red=$(( $red + 1 ))
server=${!red}
;;
"-l") #defines directory on the server with the capabilities log
red=$(( $red + 1 ))
logdir=${!red}
;;
"-t") #defines timelengths for tests
red=$(( $red + 1 ))
timegroup+=( ${!red} )
;;
"-b") #defines user batches for tests (must be in format "batchamount batchsize")
red=$(( $red + 1 ))
request+=( "${!red}" )
;;
"-c") #add a comment
red=$(( $red + 1 ))
comment=${!red}
;;
"-m") #defines a media stream and validator
red=$(( $red + 1 ))
stream+=( "${!red}" )
;;
"-p") #defines the product to be tested, default is mistserver
red=$(( $red + 1 ))
product=${!red}
;;
"-fresh")
freshBoot="x"
;;
*)
comment=`echo $comment ${!red}`
esac
red=$(( $red + 1 ))
done
#determining validators
for (( i=0; i<${#stream[@]}; i++ )) ; do
if [ "${stream[$i]:0:4}" == "rtmp" ]; then
validator[$i]="rtmp"
else
tempFile=$(basename "${stream[$i]}")
tempExt="${tempFile##*.}"
case $tempExt in
"flv")
validator[$i]="flv"
;;
"ogg")
validator[$i]="ogg"
;;
"m3u8")
validator[$i]="hls"
;;
"m3u")
validator[$i]="hls"
;;
"mpd")
validator[$i]="dash"
;;
*)
validator[$i]="generic"
esac
fi
done
if [ ${#request[@]} == 0 ]; then
request=( "1 1000" )
fi
if [ ${#timegroup[@]} == 0 ]; then
timegroup=( 60 )
fi
#checking if the right product is enabled on the server is
checkService $server $product
#making directory for test
temp="$product"`date +%y%m%d%H%M%S`
mkdir $temp
#starting test
for (( i=0; i<${#stream[@]}; i++ )) ; do
for (( p=0; p<${#timegroup[@]}; p++ )) ; do
for (( o=0; o<${#request[@]}; o++ )) ; do
if [ $freshBoot == "x" ]; then
rebootHost $server
if [ $? -ne 0 ] ; then
echo lost host in reboot process, exiting...
exit $?;
fi
checkService $server $product
fi
tnr=` echo "$i * ${#timegroup[@]} * ${#request[@]} + $o * ${#timegroup[@]} + $p" | bc `
name=$temp"/run"
if [ $tnr -lt 100 ] ; then
name="${name}0"
fi
if [ $tnr -lt 10 ] ; then
name="${name}0"
fi
amount=`echo ${request[$o]} | sed -e 's/ /*/g' | bc`
name="${name}${tnr}_${amount}_${validator[$i]}_${timegroup[$p]}"
echo "$name ${request[$o]} ${stream[$i]} $server ${timegroup[$p]} ${validator[$i]}"
serverTest ${request[$o]} ${stream[$i]} $server ${timegroup[$p]} $logdir ${validator[$i]} "$comment" $name
done
done
done