#!/usr/bin/env bash
# $Id$
#
# Thomas Dreibholz's PlanetLab Script Collection
# Copyright (C) 2005-2023 by Thomas Dreibholz
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact: thomas.dreibholz@gmail.com

. ./planetlab-config

SSH_USER=$PLANETLAB_USER
SSH_KEY=$PLANETLAB_KEY
SERVICE_DIRECTORY="bin"
SERVICE_PRE_PROGRAM="sudo"

# SSH_USER="dreibh"
# SSH_KEY="/home/dreibh/.ssh/test-key"
# SERVICE_DIRECTORY="src/rsplib2/rsplib"
# SERVICE_PRE_PROGRAM=""

PRs=5
PEs=25
PUs=25


# Get list of n nodes
# $1 = Node list
# $2 = n
get_nodes ()
{
   n=0
   NodeList=""
   CandidateList=$1
   if [ "$CandidateList" = "" ] ; then
      echo "ERROR: Empty node list $1!"
      exit 1
   fi

   while [ $n -lt $2 ] ; do
      for node in $CandidateList ; do
         NodeList="$NodeList $node "
         let n=$n+1
         if [ $n -ge $2 ] ; then
            return
         fi
      done
   done
}


# UsefulNodes1="`(grep ".de$" great-planetlab.hosts ; grep ".edu$" great-planetlab.hosts) | sort -u`"
# UsefulNodes2="`(grep ".de$" great-planetlab.hosts ; grep ".edu$" great-planetlab.hosts) | sort -ru`"
# echo $UsefulNodes

UsefulNodes1="`cat working.hosts`"
UsefulNodes2="`cat working.hosts`"

get_nodes "$UsefulNodes1" 3 ; PRList=$NodeList
get_nodes "$UsefulNodes2" 3 ; PEList=$NodeList
get_nodes "$UsefulNodes2" 4 ; PUList=$NodeList


MasterPR="`echo $PRList | head -n1`"


PR_PROpt=""
PE_PROpt=""
PU_PROpt=""
for pr in $PRList ; do
   PR_PROpt="$PR_PROpt -peer=$pr:9901 "
   PE_PROpt="$PE_PROpt -registrar=$pr:3863 "
   PU_PROpt="$PU_PROpt -registrar=$pr:3863 "
done

echo PR_PROpt=$PR_PROpt
echo PE_PROpt=$PE_PROpt
echo PU_PROpt=$PU_PROpt


echo "###### Starting PRs ###################################################"
id=1
for pr in $PRList ; do
   ./servicecontrol "ssh" restart $pr  $SSH_NODE $SSH_USER $SSH_KEY   $id $SERVICE_DIRECTORY registrar \
      "-loglevel=9 -asap=[::]:3863 -enrp=[::]:9901 -asapannounce=off -enrpannounce=off -maxbadpereports=999999 $OPT_CSP $PR_PROpt"   "$SERVICE_PRE_PROGRAM" &
   let id=$id+1
done
wait


echo "###### Starting PEs ###################################################"
id=1
for pe in $PEList ; do
   ./servicecontrol "ssh" restart $pe  $SSH_NODE $SSH_USER $SSH_KEY   $id $SERVICE_DIRECTORY server \
      "-loglevel=5 -calcapp -capcapacity=1000000 "-capobject=scenario.calcAppPoolElement[$id]" -capscalar=pe-$id.sca $PE_PROpt $OPT_CSP"   "$SERVICE_PRE_PROGRAM" &
   let id=$id+1
done
wait


echo "###### Starting PUs ###################################################"
id=1
for pu in $PUList ; do
   ./servicecontrol "ssh" restart $pu  $SSH_NODE $SSH_USER $SSH_KEY   $id $SERVICE_DIRECTORY calcappclient \
      "-loglevel=5 -jobsize=10000000 -jobinterval=30 "-object=scenario.calcAppPoolUser[$id]" -scalar=pu-$id.sca $PE_PROpt $OPT_CSP"   "$SERVICE_PRE_PROGRAM" &
   let id=$id+1
done
wait


sleep 60


echo "###### Stopping PUs ###################################################"
id=1
for pu in $PUList ; do
   ./servicecontrol "ssh" stop $pu  $SSH_NODE $SSH_USER $SSH_KEY   $id $SERVICE_DIRECTORY calcappclient ""   "$SERVICE_PRE_PROGRAM" &
   let id=$id+1
done
wait


echo "###### Stopping PEs ###################################################"
id=1
for pe in $PEList ; do
   ./servicecontrol "ssh" stop $pe  $SSH_NODE $SSH_USER $SSH_KEY   $id $SERVICE_DIRECTORY server ""   "$SERVICE_PRE_PROGRAM" &
   let id=$id+1
done
wait


echo "###### Stopping PRs ###################################################"
id=1
for pr in $PRList ; do
   ./servicecontrol "ssh" stop $pr  $SSH_NODE $SSH_USER $SSH_KEY   $id $SERVICE_DIRECTORY registrar ""   "$SERVICE_PRE_PROGRAM" &
   let id=$id+1
done
wait


echo "###### Downloading results ############################################"
allNodes="`
(
   for pr in $PRList ; do
      echo $pr
   done
   for pe in $PEList ; do
      echo $pe
   done
   for pu in $PUList ; do
      echo $pu
   done
) | sort -u`"

for node in $allNodes ; do
   ./get "$node:$SERVICE_DIRECTORY/*.sca" . &
done
wait
