2018-06-26 22:56:29 -07:00
#!/bin/bash
2018-06-27 11:19:09 -07:00
ip_addr_file = $1
2018-06-26 22:56:29 -07:00
remote_user = $2
ssh_keys = $3
2018-06-27 11:19:09 -07:00
usage( ) {
2018-06-27 11:39:23 -07:00
echo -e " \\tUsage: $0 <IP Address array> <username> [path to ssh keys]\\n "
echo -e "\\t <IP Address array>: A bash script that exports an array of IP addresses, ip_addr_array. Elements of the array are public IP address of remote nodes."
echo -e "\\t <username>: The username for logging into remote nodes."
echo -e "\\t [path to ssh keys]: The public/private key pair that remote nodes can use to perform rsync and ssh among themselves. Must contain pub, priv and authorized_keys.\\n"
2018-07-02 18:09:01 -07:00
exit 1
2018-06-27 11:19:09 -07:00
}
2018-06-27 07:07:08 -07:00
2018-06-27 11:19:09 -07:00
# Sample IP Address array file contents
# ip_addr_array=(192.168.1.1 192.168.1.5 192.168.2.2)
if [ [ -z " $ip_addr_file " ] ] ; then
usage
fi
if [ [ -z " $remote_user " ] ] ; then
usage
fi
2018-07-03 10:40:11 -07:00
echo " Build started at $( date) "
SECONDS = 0
2018-06-27 11:19:09 -07:00
# Build and install locally
PATH = " $HOME " /.cargo/bin:" $PATH "
cargo install --force
2018-07-16 16:21:32 -07:00
build_time = $SECONDS
2018-07-03 10:40:11 -07:00
echo " Build took $SECONDS seconds "
2018-06-27 11:49:43 -07:00
ip_addr_array = ( )
2018-06-27 11:19:09 -07:00
# Get IP address array
2018-06-27 11:39:23 -07:00
# shellcheck source=/dev/null
2018-06-27 11:19:09 -07:00
source " $ip_addr_file "
2018-07-03 10:40:11 -07:00
echo " Deployment started at $( date) "
SECONDS = 0
2018-06-26 22:56:29 -07:00
count = 0
2018-07-04 04:25:45 -07:00
leader_ip =
2018-07-16 16:21:32 -07:00
leader_time =
mkdir -p log
2018-06-27 07:07:08 -07:00
2018-07-04 04:25:45 -07:00
common_setup( ) {
ip_addr = $1
2018-07-02 18:09:01 -07:00
# Killing sshguard for now. TODO: Find a better solution
# sshguard is blacklisting IP address after ssh-keyscan and ssh login attempts
2018-07-16 16:21:32 -07:00
ssh -n -f " $remote_user @ $ip_addr " "
set -ex; \
sudo service sshguard stop; \
sudo apt-get --assume-yes install rsync libssl-dev; \
pkill -9 solana-; \
pkill -9 validator; \
pkill -9 leader; \
" >log/" $ip_addr " .log
2018-07-02 18:09:01 -07:00
2018-06-27 11:19:09 -07:00
# If provided, deploy SSH keys
2018-07-16 16:21:32 -07:00
if [ [ -n $ssh_keys ] ] ; then
{
rsync -vPrz " $ssh_keys " /id_rsa " $remote_user @ $ip_addr " :~/.ssh/
rsync -vPrz " $ssh_keys " /id_rsa.pub " $remote_user @ $ip_addr " :~/.ssh/
rsync -vPrz " $ssh_keys " /id_rsa.pub " $remote_user @ $ip_addr " :~/.ssh/authorized_keys
} >>log/" $ip_addr " .log
2018-06-26 22:56:29 -07:00
fi
2018-07-04 04:25:45 -07:00
}
2018-07-02 18:09:01 -07:00
2018-07-04 04:25:45 -07:00
leader( ) {
common_setup " $1 "
2018-07-03 06:28:12 -07:00
2018-07-16 16:21:32 -07:00
{
rsync -vPrz ~/.cargo/bin/solana* " $remote_user @ $ip_addr " :~/.cargo/bin/
rsync -vPrz ./multinode-demo " $remote_user @ $ip_addr " :~/solana/
rsync -vPrz ./fetch-perf-libs.sh " $remote_user @ $ip_addr " :~/solana/
ssh -n -f " $remote_user @ $ip_addr " 'cd solana; FORCE=1 ./multinode-demo/remote_leader.sh'
} >>log/" $1 " .log
2018-06-27 11:49:43 -07:00
2018-07-16 16:21:32 -07:00
leader_ip = $1
leader_time = $SECONDS
SECONDS = 0
2018-07-04 04:25:45 -07:00
}
validator( ) {
common_setup " $1 "
2018-07-16 16:21:32 -07:00
ssh " $remote_user @ $ip_addr " "rsync -vPrz " " $remote_user @ $leader_ip " ":~/solana/multinode-demo ~/solana/" >>log/" $1 " .log
ssh -n -f " $remote_user @ $ip_addr " " cd solana; FORCE=1 ./multinode-demo/remote_validator.sh $leader_ip " >>log/" $1 " .log
2018-07-04 04:25:45 -07:00
}
for ip_addr in " ${ ip_addr_array [@] } " ; do
2018-07-16 16:21:32 -07:00
ssh-keygen -R " $ip_addr " >log/local.log
ssh-keyscan " $ip_addr " >>~/.ssh/known_hosts 2>/dev/null
2018-07-04 04:25:45 -07:00
2018-07-02 18:09:01 -07:00
if ( ( !count) ) ; then
2018-06-26 22:56:29 -07:00
# Start the leader on the first node
2018-07-16 16:21:32 -07:00
echo " Leader node $ip_addr , killing previous instance and restarting "
2018-07-04 04:25:45 -07:00
leader " $ip_addr "
2018-06-26 22:56:29 -07:00
else
# Start validator on all other nodes
2018-07-16 16:21:32 -07:00
echo " Validator[ $count ] node $ip_addr , killing previous instance and restarting "
2018-07-04 04:25:45 -07:00
validator " $ip_addr " &
# TBD: Remove the sleep or reduce time once GCP login quota is increased
sleep 2
2018-06-26 22:56:29 -07:00
fi
2018-07-02 18:09:01 -07:00
( ( count++) )
2018-06-26 22:56:29 -07:00
done
2018-07-03 10:40:11 -07:00
2018-07-04 04:25:45 -07:00
wait
2018-07-16 16:21:32 -07:00
( ( validator_count = count - 1) )
2018-07-03 10:40:11 -07:00
echo " Deployment finished at $( date) "
2018-07-16 16:21:32 -07:00
echo " Build took $build_time seconds "
echo " Leader deployment too $leader_time seconds "
echo " $validator_count Validator deployment took $SECONDS seconds "