cloudstack/setup/bindir/cloud-sysvmadm.in
alena 6dfd2f280b 1) More logging to cloud-sysvmadm script - to give the user better details on which domR is being restarted at the moment
2) When domR is executed in parallel thread, make sure that the thread "exit 0" after the restart is done
2011-09-06 16:11:17 -07:00

334 lines
9.2 KiB
Bash
Executable File

#!/bin/bash
. /etc/rc.d/init.d/functions
#set -x
usage() {
printf "\nThe tool stopping/starting running system vms and domain routers \n\nUsage: %s: [-d] [-u] [-p] [-m] [-s] [-r] [-a] [-t] [-e]\n\n -d - cloud DB server ip address, defaulted to localhost if not specified \n -u - user name to access cloud DB, defaulted to "root" if not specified \n -p - cloud DB user password, defaulted to no password if not specified \n\n -m - the ip address of management server, defaulted to localhost if not specified\n\n -s - stop then start all running SSVMs and Console Proxies \n -r - stop then start all running Virtual Routers\n -a - stop then start all running SSVMs, Console Proxies, and Virtual Routers \n -e - restart all Guest networks \n -t - number of parallel threads used for stopping Domain Routers. Default is 10.\n -l - log file location. Default is cloud.log under current directory.\n\n" $(basename $0) >&2
}
system=
router=
all=
db=localhost
ms=localhost
user=root
password=
help=
maxthreads=10
LOGFILE=cloud.log
while getopts 'sarhnd:m:u:p:t:l:' OPTION
do
case $OPTION in
s) system=1
;;
r) router=1
;;
n) redundant=1
;;
a) all=1
;;
d) db="$OPTARG"
;;
u) user="$OPTARG"
;;
p) password="$OPTARG"
;;
h) help=1
;;
m) ms="$OPTARG"
;;
t) maxthreads="$OPTARG"
;;
l) LOGFILE="$OPTARG"
esac
done
stop_start_system() {
secondary=(`mysql -h $db --user=$user --password=$password --skip-column-names -U cloud -e "select id from vm_instance where state=\"Running\" and type=\"SecondaryStorageVm\""`)
console=(`mysql -h $db --user=$user --password=$password --skip-column-names -U cloud -e "select id from vm_instance where state=\"Running\" and type=\"ConsoleProxy\""`)
length_secondary=(${#secondary[@]})
length_console=(${#console[@]})
echo -e "\nStopping and starting $length_secondary secondary storage vm(s)..."
echo -e "Stopping and starting $length_secondary secondary storage vm(s)..." >>$LOGFILE
for d in "${secondary[@]}"; do
echo "INFO: Stopping secondary storage vm with id $d" >>$LOGFILE
jobresult=$(send_request stopSystemVm $d)
if [ "$jobresult" != "1" ]; then
echo "ERROR: Failed to stop secondary storage vm with id $d" >>$LOGFILE
else
echo "INFO: Starting secondary storage vm with id $d" >>$LOGFILE
jobresult=$(send_request startSystemVm $d SSVM)
if [ "$jobresult" != "1" ]; then
echo "ERROR: Failed to start secondary storage vm with id $d" >>$LOGFILE
fi
fi
done
if [ "$length_secondary" == "0" ];then
echo -e "No running secondary storage vms found \n"
else
echo -e "Done stopping and starting secondary storage vm(s)"
echo -e "Done stopping and starting secondary storage vm(s)." >>$LOGFILE
fi
echo -e "\nStopping and starting $length_console console proxy vm(s)..."
echo -e "Stopping and starting $length_console console proxy vm(s)..." >>$LOGFILE
for d in "${console[@]}"; do
echo "INFO: Stopping console proxy with id $d" >>$LOGFILE
jobresult=$(send_request stopSystemVm $d)
if [ "$jobresult" != "1" ]; then
echo "ERROR: Failed to stop console proxy vm with id $d" >>$LOGFILE
else
echo "INFO: Starting console proxy vm with id $d" >>$LOGFILE
jobresult=$(send_request startSystemVm $d consoleProxy)
if [ "$jobresult" != "1" ]; then
echo "ERROR: Failed to start console proxy vm with id $d" >>$LOGFILE
fi
fi
done
if [ "$length_console" == "0" ];then
echo -e "No running console proxy vms found \n"
else
echo "Done stopping and starting console proxy vm(s)."
echo "Done stopping and starting console proxy vm(s)." >>$LOGFILE
fi
}
stop_start_router() {
router=(`mysql -h $db --user=$user --password=$password --skip-column-names -U cloud -e "select id from vm_instance where state=\"Running\" and type=\"DomainRouter\""`)
length_router=(${#router[@]})
echo -e "\nStopping and starting $length_router running routing vm(s)... "
echo -e "Stopping and starting $length_router running routing vm(s)... " >>$LOGFILE
#Spawn reboot router in parallel - run commands in <n> chunks - number of threads is configurable
pids=()
for d in "${router[@]}"; do
reboot_router $d &
pids=( "${pids[@]}" $! )
length_pids=(${#pids[@]})
unfinishedPids=(${#pids[@]})
if [ $maxthreads -gt $length_router ]; then
maxthreads=$length_router
fi
if [ $length_pids -ge $maxthreads ]; then
while [ $unfinishedPids -gt 0 ]; do
sleep 10
count=0
for (( i = 0 ; i < $length_pids; i++ )); do
if ! ps ax | grep -v grep | grep ${pids[$i]} > /dev/null; then
count=`expr $count + 1`
fi
done
if [ $count -eq $unfinishedPids ]; then
unfinishedPids=0
fi
done
#remove all elements from pids
if [ $unfinishedPids -eq 0 ]; then
pids=()
length_pids=(${#pids[@]})
fi
fi
done
if [ "$length_router" == "0" ];then
echo -e "No running router vms found \n" >>$LOGFILE
else
while [ $unfinishedPids -gt 0 ]; do
sleep 10
done
echo -e "Done restarting router(s). \n"
echo -e "Done restarting router(s). \n" >>$LOGFILE
fi
}
stop_start_all() {
stop_start_system
stop_start_router
}
send_request(){
jobid=`curl -sS "http://$ms:8096/?command=$1&id=$2&response=json" | sed 's/\"//g' | sed 's/ //g' | sed 's/{//g' | sed 's/}//g' | awk -F: {'print $3'}`
if [ "$jobid" == "" ]; then
echo 2
return
fi
jobresult=$(query_async_job_result $jobid)
echo $jobresult
}
reboot_router(){
echo "INFO: Restarting router with id $1" >>$LOGFILE
jobid=`curl -sS "http://$ms:8096/?command=rebootRouter&id=$1&response=json" | sed 's/\"//g' | sed 's/ //g' | sed 's/{//g' | sed 's/}//g' | awk -F: {'print $3'}`
if [ "$jobid" == "" ]; then
echo "ERROR: Failed to restart domainRouter with id $1" >>$LOGFILE
echo 2
return
fi
jobresult=$(query_async_job_result $jobid)
if [ "$jobresult" != "1" ]; then
echo "ERROR: Failed to restart domainRouter with id $1" >>$LOGFILE
exit 0
else
echo "INFO: Successfully restarted domainRouter with id $1" >>$LOGFILE
exit 0
fi
}
restart_networks(){
networks=(`mysql -h $db --user=$user --password=$password --skip-column-names -U cloud -e "select n.id from networks n, network_offerings no where n.network_offering_id = no.id and no.system_only = 0 and n.removed is null"`)
length_networks=(${#networks[@]})
echo -e "\nRestarting networks... "
echo -e "Restarting networks... " >>$LOGFILE
#Spawn restart network in parallel - run commands in <n> chunks - number of threads is configurable
pids=()
for d in "${networks[@]}"; do
restart_network $d &
pids=( "${pids[@]}" $! )
length_pids=(${#pids[@]})
unfinishedPids=(${#pids[@]})
if [ $maxthreads -gt $length_networks ]; then
maxthreads=$length_networks
fi
if [ $length_pids -ge $maxthreads ]; then
while [ $unfinishedPids -gt 0 ]; do
sleep 10
count=0
for (( i = 0 ; i < $length_pids; i++ )); do
if ! ps ax | grep -v grep | grep ${pids[$i]} > /dev/null; then
count=`expr $count + 1`
fi
done
if [ $count -eq $unfinishedPids ]; then
unfinishedPids=0
fi
done
#remove all elements from pids
if [ $unfinishedPids -eq 0 ]; then
pids=()
length_pids=(${#pids[@]})
fi
fi
done
if [ "$length_networks" == "0" ];then
echo -e "No networks found \n" >>$LOGFILE
else
while [ $unfinishedPids -gt 0 ]; do
sleep 10
done
echo -e "Done restarting networks. \n"
echo -e "Done restarting networks. \n" >>$LOGFILE
fi
}
restart_network(){
jobid=`curl -sS "http://$ms:8096/?command=restartNetwork&id=$1&response=json" | sed 's/\"//g' | sed 's/ //g' | sed 's/{//g' | sed 's/}//g' | awk -F: {'print $3'}`
if [ "$jobid" == "" ]; then
echo "ERROR: Failed to restart network with id $1" >>$LOGFILE
echo 2
return
fi
jobresult=$(query_async_job_result $jobid)
if [ "$jobresult" != "1" ]; then
echo "ERROR: Failed to restart network with id $1" >>$LOGFILE
else
echo "INFO: Successfully restarted network with id $1" >>$LOGFILE
fi
}
query_async_job_result() {
while [ 1 ]
do
jobstatus=`curl -sS "http://$ms:8096/?command=queryAsyncJobResult&jobId=$1&response=json" | sed 's/\"//g' | sed 's/ //g' | sed 's/{//g' | sed 's/}//g' | awk -F, {'print $2'} | awk -F: {'print $2'}`
if [ "$jobstatus" != "0" ]; then
echo $jobstatus
break
fi
sleep 5
done
}
if [ "$system$router$all$help$redundant" == "" ]
then
usage
exit
fi
if [ "$help" == "1" ]
then
usage
exit
fi
if [ "$all" == "1" ]
then
stop_start_all
exit
fi
if [ "$system" == "1" ]
then
stop_start_system
fi
if [ "$router" == "1" ]
then
stop_start_router
fi
if [ "$redundant" == "1" ]
then
restart_networks
fi