diff --git a/test/vm-cluster/.gitignore b/test/vm-cluster/.gitignore index ae791b63..9d47e632 100644 --- a/test/vm-cluster/.gitignore +++ b/test/vm-cluster/.gitignore @@ -1,4 +1,5 @@ cfg vmpass.txt -iplist.txt +vmlist.txt +vmresgroup.txt hpfiles \ No newline at end of file diff --git a/test/vm-cluster/cluster.sh b/test/vm-cluster/cluster.sh index df42c7fa..bd5fc34b 100755 --- a/test/vm-cluster/cluster.sh +++ b/test/vm-cluster/cluster.sh @@ -9,21 +9,24 @@ # VM login password must exist in vmpass.txt # All VMs must use same SSH password with username 'geveo' vmpass=$(cat vmpass.txt) -# List of vm IP addresses/domain names of the cluster must exist in iplist.txt -# (This list will be treated as the node numbers 1,2.3... from topmost IP to the bottom) -readarray -t vmips < iplist.txt +# List of vm domain names of the cluster must exist in vmlist.txt +# (This list will be treated as the node numbers 1,2.3... from topmost address to the bottom) +readarray -t vmaddrs < vmlist.txt -vmcount=${#vmips[@]} +vmcount=${#vmaddrs[@]} mode=$1 hpcore=$(realpath ../..) -if [ "$mode" = "new" ] || [ "$mode" = "update" ] || [ "$mode" = "reconfig" ] || [ "$mode" = "run" ] || \ - [ "$mode" = "check" ] || [ "$mode" = "monitor" ] || [ "$mode" = "kill" ] || [ "$mode" = "reboot" ] || \ +if [ "$mode" = "new" ] || [ "$mode" = "update" ] || [ "$mode" = "reconfig" ] || \ + [ "$mode" = "vminfo" ] || [ "$mode" = "vmresize" ] || [ "$mode" = "vmstop" ] || [ "$mode" = "vmstart" ] || \ + [ "$mode" = "run" ] || [ "$mode" = "check" ] || [ "$mode" = "monitor" ] || [ "$mode" = "kill" ] || [ "$mode" = "reboot" ] || \ [ "$mode" = "ssh" ] || [ "$mode" = "dns" ] || [ "$mode" = "ssl" ]; then echo "mode: $mode" else - echo "Invalid command. [ new | update | reconfig | run | check | monitor | kill | reboot | ssh | dns | ssl ] expected." + echo "Invalid command. [ new | update | reconfig | vmresize | vmstop | vmstart" \ + " | run | check | monitor | kill | reboot | ssh " \ + " | dns | ssl ] expected." exit 1 fi @@ -42,47 +45,47 @@ fi if [ $mode = "run" ]; then let nodeid=$2-1 - vmip=${vmips[$nodeid]} - sshpass -f vmpass.txt ssh geveo@$vmip 'nohup sudo ~/hpfiles/bin/hpcore run ~/contract' - sshpass -f vmpass.txt ssh geveo@$vmip 'tail -f nohup.out' + vmaddr=${vmaddrs[$nodeid]} + sshpass -f vmpass.txt ssh geveo@$vmaddr 'nohup sudo ~/hpfiles/bin/hpcore run ~/contract' + sshpass -f vmpass.txt ssh geveo@$vmaddr 'tail -f nohup.out' exit 0 fi if [ $mode = "check" ]; then let nodeid=$2-1 - vmip=${vmips[$nodeid]} - sshpass -f vmpass.txt ssh geveo@$vmip 'echo hpcore pid:$(pidof hpcore) hpfs pid:$(pidof hpfs) websocketd pid:$(pidof websocketd) websocat pid:$(pidof websocat)' + vmaddr=${vmaddrs[$nodeid]} + sshpass -f vmpass.txt ssh geveo@$vmaddr 'echo hpcore pid:$(pidof hpcore) hpfs pid:$(pidof hpfs) websocketd pid:$(pidof websocketd) websocat pid:$(pidof websocat)' exit 0 fi if [ $mode = "monitor" ]; then let nodeid=$2-1 - vmip=${vmips[$nodeid]} - sshpass -f vmpass.txt ssh geveo@$vmip 'tail -f nohup.out' + vmaddr=${vmaddrs[$nodeid]} + sshpass -f vmpass.txt ssh geveo@$vmaddr 'tail -f nohup.out' exit 0 fi if [ $mode = "kill" ]; then let nodeid=$2-1 - vmip=${vmips[$nodeid]} - sshpass -f vmpass.txt ssh geveo@$vmip 'sudo kill $(pidof hpcore) > /dev/null 2>&1' - sshpass -f vmpass.txt ssh geveo@$vmip 'sudo kill $(pidof hpfs) > /dev/null 2>&1' - sshpass -f vmpass.txt ssh geveo@$vmip 'sudo kill $(pidof websocketd) > /dev/null 2>&1' - sshpass -f vmpass.txt ssh geveo@$vmip 'sudo kill $(pidof websocat) > /dev/null 2>&1' + vmaddr=${vmaddrs[$nodeid]} + sshpass -f vmpass.txt ssh geveo@$vmaddr 'sudo kill $(pidof hpcore) > /dev/null 2>&1' + sshpass -f vmpass.txt ssh geveo@$vmaddr 'sudo kill $(pidof hpfs) > /dev/null 2>&1' + sshpass -f vmpass.txt ssh geveo@$vmaddr 'sudo kill $(pidof websocketd) > /dev/null 2>&1' + sshpass -f vmpass.txt ssh geveo@$vmaddr 'sudo kill $(pidof websocat) > /dev/null 2>&1' exit 0 fi if [ $mode = "reboot" ]; then let nodeid=$2-1 - vmip=${vmips[$nodeid]} - sshpass -f vmpass.txt ssh geveo@$vmip 'sudo reboot' + vmaddr=${vmaddrs[$nodeid]} + sshpass -f vmpass.txt ssh geveo@$vmaddr 'sudo reboot' exit 0 fi if [ $mode = "ssh" ]; then let nodeid=$2-1 - vmip=${vmips[$nodeid]} - sshpass -f vmpass.txt ssh geveo@$vmip $3 + vmaddr=${vmaddrs[$nodeid]} + sshpass -f vmpass.txt ssh geveo@$vmaddr $3 exit 0 fi @@ -92,39 +95,56 @@ if [ $mode = "dns" ]; then exit 1 fi let nodeid=$2-1 - vmip=${vmips[$nodeid]} - sshpass -f vmpass.txt ssh geveo@$vmip 'mkdir -p ~/web80/.well-known/pki-validation' - sshpass -f vmpass.txt scp $3 geveo@$vmip:~/web80/.well-known/pki-validation/ - sshpass -f vmpass.txt ssh geveo@$vmip -t 'cd ~/web80 && sudo python -m SimpleHTTPServer 80' + vmaddr=${vmaddrs[$nodeid]} + sshpass -f vmpass.txt ssh geveo@$vmaddr 'mkdir -p ~/web80/.well-known/pki-validation' + sshpass -f vmpass.txt scp $3 geveo@$vmaddr:~/web80/.well-known/pki-validation/ + sshpass -f vmpass.txt ssh geveo@$vmaddr -t 'cd ~/web80 && sudo python -m SimpleHTTPServer 80' exit 0 fi if [ $mode = "ssl" ]; then let nodeid=$2-1 - vmip=${vmips[$nodeid]} + vmaddr=${vmaddrs[$nodeid]} - unzip -d ~/Downloads/$vmip/ ~/Downloads/$vmip.zip || exit 1; - pushd ~/Downloads/$vmip > /dev/null 2>&1 + unzip -d ~/Downloads/$vmaddr/ ~/Downloads/$vmaddr.zip || exit 1; + pushd ~/Downloads/$vmaddr > /dev/null 2>&1 mkdir certs cat certificate.crt <(echo) ca_bundle.crt > certs/tlscert.pem mv private.key certs/tlskey.pem popd > /dev/null 2>&1 echo "Sending tls certs to the contract..." - sshpass -f vmpass.txt scp ~/Downloads/$vmip/certs/* geveo@$vmip:~/contract/cfg/ + sshpass -f vmpass.txt scp ~/Downloads/$vmaddr/certs/* geveo@$vmaddr:~/contract/cfg/ - rm -r ~/Downloads/$vmip + rm -r ~/Downloads/$vmaddr echo "Done" exit 0 fi +# Run vm cli script if any vm cluster commands have been specified. +if [ $mode = "vminfo" ] || [ $mode = "vmresize" ] || [ $mode = "vmstop" ] || [ $mode = "vmstart" ]; then + for (( i=0; i<$vmcount; i++ )) + do + vmaddr=${vmaddrs[i]} + # vm name is the first part of the DNS address (eg: hp1.australiaeast.cloudapp.azure.com) + vmname=${vmaddr%%.*} + # Strip out "vm" prefix from the command. + vmcommand=${mode##*vm} + /bin/bash ./vmcli.sh $vmname $vmcommand $2 & + done + + wait + exit 0 +fi + + # Run binary file setup for entire cluster. if [ $mode = "new" ] || [ $mode = "update" ]; then for (( i=0; i<$vmcount; i++ )) do - vmip=${vmips[i]} + vmaddr=${vmaddrs[i]} let n=$i+1 - /bin/bash ./setup-vm.sh $mode $n $vmpass $vmip $hpcore & + /bin/bash ./setup-vm.sh $mode $n $vmpass $vmaddr $hpcore & done fi @@ -142,10 +162,10 @@ if [ $mode = "reconfig" ]; then for (( i=0; i<$vmcount; i++ )) do # Run hp setup script on the VM and download the generated hp.cfg - vmip=${vmips[i]} + vmaddr=${vmaddrs[i]} let nodeid=$i+1 - sshpass -f vmpass.txt ssh geveo@$vmip '~/hpfiles/setup-hp.sh' - sshpass -f vmpass.txt scp geveo@$vmip:~/contract/cfg/hp.cfg ./cfg/node$nodeid.json + sshpass -f vmpass.txt ssh geveo@$vmaddr '~/hpfiles/setup-hp.sh' + sshpass -f vmpass.txt scp geveo@$vmaddr:~/contract/cfg/hp.cfg ./cfg/node$nodeid.json done fi @@ -153,12 +173,12 @@ fi for (( i=0; i<$vmcount; i++ )) do - vmip=${vmips[i]} + vmaddr=${vmaddrs[i]} let n=$i+1 # Collect each node's pub key and peer address. pubkeys[i]=$(node -p "require('./cfg/node$n.json').pubkeyhex") - peers[i]="$vmip:22860" + peers[i]="$vmaddr:22860" done # Function to generate JSON array string while skiping a given index. @@ -206,7 +226,7 @@ do }, null, 2)" > ./cfg/node$n.cfg # Upload local hp.cfg file back to remote vm. - vmip=${vmips[j]} - sshpass -f vmpass.txt scp ./cfg/node$n.cfg geveo@$vmip:~/contract/cfg/hp.cfg + vmaddr=${vmaddrs[j]} + sshpass -f vmpass.txt scp ./cfg/node$n.cfg geveo@$vmaddr:~/contract/cfg/hp.cfg done rm -r ./cfg \ No newline at end of file diff --git a/test/vm-cluster/setup-vm.sh b/test/vm-cluster/setup-vm.sh index 41431f45..606e3e3e 100755 --- a/test/vm-cluster/setup-vm.sh +++ b/test/vm-cluster/setup-vm.sh @@ -3,10 +3,10 @@ mode=$1 nodeid=$2 vmpass=$3 -vmip=$4 +vmaddr=$4 hpcore=$5 -echo $nodeid. $vmip +echo $nodeid. $vmaddr # Copy required files to hpfiles dir. mkdir -p hpfiles/{bin,nodejs_contract} @@ -20,15 +20,15 @@ if [ $mode = "new" ]; then fi echo "Uploading hp files..." -sshpass -f vmpass.txt scp -rp hpfiles geveo@$vmip:~/ +sshpass -f vmpass.txt scp -rp hpfiles geveo@$vmaddr:~/ echo "Upload finished." if [ $mode = "new" ]; then # Run hp setup script on the VM and download the generated hp.cfg - sshpass -f vmpass.txt ssh geveo@$vmip '~/hpfiles/setup-hp.sh && cd ~/hpfiles/nodejs_contract && npm install' - sshpass -f vmpass.txt ssh geveo@$vmip 'echo sudo ~/hpfiles/bin/hpcore run ~/contract > ~/run.sh && sudo chmod +x ~/run.sh' + sshpass -f vmpass.txt ssh geveo@$vmaddr '~/hpfiles/setup-hp.sh && cd ~/hpfiles/nodejs_contract && npm install' + sshpass -f vmpass.txt ssh geveo@$vmaddr 'echo sudo ~/hpfiles/bin/hpcore run ~/contract > ~/run.sh && sudo chmod +x ~/run.sh' mkdir ./cfg > /dev/null 2>&1 - sshpass -f vmpass.txt scp geveo@$vmip:~/contract/cfg/hp.cfg ./cfg/node$nodeid.json + sshpass -f vmpass.txt scp geveo@$vmaddr:~/contract/cfg/hp.cfg ./cfg/node$nodeid.json fi rm -r hpfiles \ No newline at end of file diff --git a/test/vm-cluster/test.sh b/test/vm-cluster/test.sh new file mode 100755 index 00000000..62dc02fd --- /dev/null +++ b/test/vm-cluster/test.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +string="azure.com" +#name=${string%%.*} +name=${string##*azure} + +echo [$name] \ No newline at end of file diff --git a/test/vm-cluster/vm-clustercreate.sh b/test/vm-cluster/vm-clustercreate.sh deleted file mode 100755 index 5ce8e222..00000000 --- a/test/vm-cluster/vm-clustercreate.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -name=temp -locs=(ukwest eastus) -loccount=${#locs[@]} - -for (( i=0; i<$loccount; i++ )) -do - loc=${locs[i]} - let n=$i+1 - /bin/bash ./vmcreate.sh $name$n $loc -done \ No newline at end of file diff --git a/test/vm-cluster/vmcli.sh b/test/vm-cluster/vmcli.sh new file mode 100755 index 00000000..6c73378a --- /dev/null +++ b/test/vm-cluster/vmcli.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Usage: +# ./vmcli.sh + +vmname=$1 +mode=$2 +resgroup=$(cat vmresgroup.txt) + +set -e # exit on error + +if [ $mode = "info" ]; then + az vm show --show-details -g $resgroup --name $vmname \ + --query "{name:name, size: hardwareProfile.vmSize, location:location, status:powerState}" -o json + +elif [ $mode = "resize" ]; then + az vm resize -g $resgroup --name $vmname --size Standard_$3 + +elif [ $mode = "stop" ]; then + # Gracefully shutdown and then deallocate. + az vm stop -g $resgroup --name $vmname > /dev/null 2>&1 + az vm deallocate -g $resgroup --name $vmname + +elif [ $mode = "start" ]; then + az vm start -g $resgroup --name $vmname + +elif [ $mode = "delete" ]; then + + echo Deleting vm $vmname... + az resource delete -g ${resgroup} -n $vmname --resource-type "Microsoft.Compute/virtualMachines" + + # Get list of resources with specific tag + reslist=`az resource list --tag $vmname` + rescount=`echo $reslist | jq length` + + # Delete resources + for((i=0; i<$rescount; i++)); do + # Get $i th resource name and type + resname=`echo $reslist | jq .[$i].name | tr -d '"'` + restype=`echo $reslist | jq .[$i].type | tr -d '"'` + + echo Deleting $resname... + az resource delete -g ${resgroup} -n ${resname} --resource-type ${restype} + done +fi \ No newline at end of file diff --git a/test/vm-cluster/vmcreate.sh b/test/vm-cluster/vmcreate.sh index 41581c49..1ea217a8 100755 --- a/test/vm-cluster/vmcreate.sh +++ b/test/vm-cluster/vmcreate.sh @@ -8,26 +8,38 @@ # az account set --subscription '' # az account list-locations -name=$1 +vmname=$1 loc=$2 vmsize=Standard_B1s vmpass=$(cat vmpass.txt) -resgroup=HotPocket-ResGroup +resgroup=$(cat vmresgroup.txt) set -e # exit on error -az vm create --name $name --resource-group $resgroup --size $vmsize \ +az vm create --name $vmname --resource-group $resgroup --size $vmsize \ --admin-username geveo --admin-password $vmpass --image UbuntuLTS --location $loc --generate-ssh-keys \ ---public-ip-address-dns-name $name +--public-ip-address-dns-name $vmname --tags $vmname # HP peer port -az vm open-port --resource-group $resgroup --name $name --port 22860 --priority 900 +az vm open-port --resource-group $resgroup --name $vmname --port 22860 --priority 900 # HP user port -az vm open-port --resource-group $resgroup --name $name --port 8080 --priority 901 +az vm open-port --resource-group $resgroup --name $vmname --port 8080 --priority 901 # For DNS verification web server -az vm open-port --resource-group $resgroup --name $name --port 80 --priority 902 +az vm open-port --resource-group $resgroup --name $vmname --port 80 --priority 902 -vmip=$(az vm show -d -g $resgroup -n $name --query publicIps -o tsv) -vmdns=$name.australiaeast.cloudapp.azure.com -echo $vmdns >> iplist.txt -echo $vmdns "("$vmip") created and added to iplist.txt" \ No newline at end of file +vmdns=$vmname.$loc.cloudapp.azure.com +echo $vmdns >> vmlist.txt +echo $vmdns " created and added to vmlist.txt" + +# Stop the VM and downgrade disk storage to Standard SSD. +echo Downgrading OS disk... +az vm stop -g $resgroup --name $vmname +az vm deallocate -g $resgroup --name $vmname + +diskid=$(az vm show -n $vmname -g $resgroup --query storageProfile.osDisk.managedDisk.id -o tsv) +az disk update --sku StandardSSD_LRS --ids $diskid + +az vm start -g $resgroup --name $vmname + +ssh-keyscan -H $vmdns >> ~/.ssh/known_hosts +echo Done. \ No newline at end of file