mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-03 04:12:31 +01:00
2) When domR is executed in parallel thread, make sure that the thread "exit 0" after the restart is done
334 lines
9.2 KiB
Bash
Executable File
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
|