#! /bin/bash
. acsstartupAcsPorts
#--------------------------------------
CL_RHOST=

# These options can be recognized (longopts comma-separated. colon means argument is required)
LONGOPTS=help,rhost:
SHORTOPTS=h

# Usage info. Be nice and keep this up-to-date!
function printUsage {
   echo "Runs component performance tests"
   echo ""
	echo "Usage: `basename $0` [OPTIONS] "
	echo "Options: "
	echo "   -rhost remote_host        remote host"
   echo "   -h | -help                     prints this help and exits"
}

# Run getopt (posixly_correct needed). We run twice:
# First run is simply to check the commandline for correctness
# Second run is the real deal which replaces the command line args with getopt's output
export POSIXLY_CORRECT=1

getopt -n `basename $0` -Q -u -a -l $LONGOPTS $SHORTOPTS "$@" || {
   printUsage
	exit 43;
}

set -- `getopt -u -a -l $LONGOPTS $SHORTOPTS "$@"`

# Iterate over getopt's output and set CL_XXX variables accordingly
while : 
do
	case "$1" in
	--rhost)            CL_RHOST=$2 ; shift ;;
	--help)             CL_HELP=true ;; 
	-h)                 CL_HELP=true ;; 
	--) break ;;
	esac
	shift
done
shift

# must be unset! otherwise our custom export() function
# that is defined below doesn't get used by the shell
export POSIXLY_CORRECT=
unset POSIXLY_CORRECT

if [ "$CL_HELP" ] ; then
   printUsage
   exit 0
fi
#--------------------------------------
rm -rf $ACS_TMP
mkdir $ACS_TMP

if [ ! $CL_RHOST ]
then
    export DATABASE=../doc/compEvent.dbm
    export OUT_HTML=../doc/ComponentEventPerf.html
else
    export DATABASE=../doc/remoteCompEvent.dbm
    export OUT_HTML=../doc/RemoteComponentEventPerf.html
fi


#Startup services/manager
acsutilTATPrologue

export ACS_INSTANCE=`cat $ACS_TMP/acs_instance` 

#Startup containers
if [ ! $CL_RHOST ]
then
    acsStartContainer -cpp  bilboContainer >& $ACS_TMP/bilboContainer.log&
    sleep 15

    acsStartContainer -java  frodoContainer >& $ACS_TMP/frodoContainer.log&
    sleep 15

    acsStartContainer -py  aragornContainer >& $ACS_TMP/aragornContainer.log&
    sleep 15
else
    export MANAGER_REFERENCE=corbaloc::`getIP`:`getManagerPort`/Manager


    echo "Starting remote containers on '$CL_RHOST'. It may be necessary to enter a password here..."
    (ssh -f $USER@$CL_RHOST acsStartContainer -cpp -m $MANAGER_REFERENCE  bilboContainer) >& $ACS_TMP/bilboContainer.log
    sleep 15

    (ssh -f $USER@$CL_RHOST acsStartContainer -java -m $MANAGER_REFERENCE frodoContainer) >& $ACS_TMP/frodoContainer.log
    sleep 15

    (ssh -f $USER@$CL_RHOST acsStartContainer -py -m $MANAGER_REFERENCE aragornContainer) >& $ACS_TMP/aragornContainer.log
    sleep 15
fi

#--Component Tests-------------------------------------------------
#--The peformance data for the proceeding tests is retrieved from -
#--the container output. It does not matter what programming language
#--the client is written in.
echo "C++ Notification channel suppliers"
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUP01 setup\(100L,5L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUP01 setup\(100L,10L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUP01 setup\(100L,25L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUP01 setup\(100L,100L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUP01 setup\(100L,1000L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUP01 setup\(100L,5000L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUP01 setup\(100L,50000L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
echo "Python Notification channel suppliers"
componentsGenericTestPy SUPPY01 setup\(100L,5L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPPY01 setup\(100L,10L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPPY01 setup\(100L,25L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPPY01 setup\(100L,100L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPPY01 setup\(100L,1000L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPPY01 setup\(100L,5000L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPPY01 setup\(100L,50000L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
echo "Java Notification channel suppliers"
componentsGenericTestPy SUPJAVA01 setup\(100L,5L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPJAVA01 setup\(100L,10L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPJAVA01 setup\(100L,25L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPJAVA01 setup\(100L,100L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPJAVA01 setup\(100L,1000L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPJAVA01 setup\(100L,5000L,0L\) method\(\)
componentsClientEventConsumer 100&
sleep 2
componentsGenericTestPy SUPJAVA01 setup\(100L,50000L,0L\) method\(\)
#-------------------------------------------------------
#Stop containers/manager/services
acsStopContainer aragornContainer >& /dev/null
acsStopContainer frodoContainer >& /dev/null
acsStopContainer bilboContainer >& /dev/null
sleep 10
acsutilTATEpilogue

#Give everything time to finish...
sleep 5

#Load the data into the database
ACSPerfAnalyzer $DATABASE $ACS_TMP/bilboContainer.log
ACSPerfAnalyzer $DATABASE $ACS_TMP/frodoContainer.log
ACSPerfAnalyzer $DATABASE $ACS_TMP/aragornContainer.log

#Generate HTML report
ACSPerfReportGen $DATABASE > $OUT_HTML
