Improvs.
[anna.git] / example / diameter / launcher / deployments / st-client / configure.sh
index 383c21a..ef733a8 100755 (executable)
@@ -9,6 +9,9 @@ ADML_INSTANCES__ST_CONF_FILE=.st_conf_adml_instances
 ADML_CONNECTIONS__ST_CONF_FILE=.st_conf_adml_connections
 CYCLE_REPEATS__ST_CONF_FILE=.st_conf_cycle_repeats
 N_TESTCASES__ST_CONF_FILE=.st_conf_n_testcases
+ADML_RATE_PER_INSTANCE__ST_CONF_FILE=.st_conf_rate_per_instance
+ADML_DESIRED_RATE__ST_CONF_FILE=.st_conf_desired_rate
+N_TESTCASES_PROGRAM_LAYOUT__ST_CONF_FILE=.st_conf_n_testcases_program_layout
 
 #############
 # FUNCTIONS #
@@ -22,7 +25,10 @@ _exit () {
 
 # ceil of division $1/$2
 ceil() {
-  echo "$1 $2" | awk '{print int( ($1/$2) + 1 )}'
+  #echo "$1 $2" | awk '{print int( ($1/$2) + 1 )}'
+  awk -vnumber="$1" -vdiv="$2" '
+  function ceiling(x){return x%1 ? int(x)+1 : x}
+  BEGIN{ print ceiling(number/div) }'
 }
 
 # Calculates the number of ADML instances and their client connections
@@ -31,7 +37,7 @@ calculate_deployment_layout() {
   read max_server_accepted_connections
   [ "$max_server_accepted_connections" = "" ] && max_server_accepted_connections=5000
 
-  echo "Input the maximum test case rate per second:"
+  echo "Input the maximum desired test case rate per second:"
   read desired_rate
   while [ -z "$desired_rate" ]; do read desired_rate; done
 
@@ -41,38 +47,48 @@ calculate_deployment_layout() {
     G_ADML_CONNECTIONS=1
     G_ADML_INSTANCES=1
     return
-  fi
-  max_adml_instances=$((max_server_accepted_connections/MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE))
-  if [ $max_connections -gt $max_server_accepted_connections ]
+  elif [ $max_connections -gt $max_server_accepted_connections ]
   then
-    echo
-    echo "Maximum rate reached for $max_server_accepted_connections server connections:"
-    G_ADML_CONNECTIONS=$MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE
-    G_ADML_INSTANCES=$max_adml_instances
-    return
+    _exit "Not enough server connections to fit the desired rate (requires $max_connections connections)."
   fi
 
   echo
   echo "==========================================================================================================="
   echo "Orientative table"
   echo "-----------------------------------------------------------------------------------------------------------"
-  echo -e "Connects per instance:\t1\t2\t3\t4\t5\t6\t7\t8\t9\t10"
   echo -n "Number of instances:  "
-  for conn in `seq 1 $MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE`
+  for conn in `seq 1 $MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE | tac`
   do
     instances=$(ceil $max_connections $conn)
     echo -n -e "\t$instances"
   done
   echo
+  echo -e "Connects per instance:\t10\t9\t8\t7\t6\t5\t4\t3\t2\t1"
   echo "==========================================================================================================="
   echo
-  echo "Input selection (connections per instance 1..$MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE) [1]:"
-  read G_ADML_CONNECTIONS
-  [ -z "$G_ADML_CONNECTIONS" ] && G_ADML_CONNECTIONS=1
-  [ $G_ADML_CONNECTIONS -lt 1 ] && G_ADML_CONNECTIONS=1
-  [ $G_ADML_CONNECTIONS -gt $MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE ] && G_ADML_CONNECTIONS=$MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE
-  
-  G_ADML_INSTANCES=$((max_connections/G_ADML_CONNECTIONS))
+  #echo "Input selection (connections per instance 1..$MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE) [1]:"
+  instances__dflt=$(ceil $max_connections $MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE)
+  echo "Input the desired number of ADML instances [$instances__dflt]:"
+  read G_ADML_INSTANCES
+  [ -z "$G_ADML_INSTANCES" ] && G_ADML_INSTANCES=$instances__dflt
+  [ $G_ADML_INSTANCES -lt 1 ] && G_ADML_INSTANCES=1
+  G_ADML_CONNECTIONS=$(ceil $max_connections $G_ADML_INSTANCES)
+  if [ $G_ADML_CONNECTIONS -gt $MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE ]
+  then
+    echo "Warning: the number of connections per ADML instance ($G_ADML_CONNECTIONS) is greater"
+    echo "         than the maximum suggested: $MAXIMUM_SUGGESTED_CLIENT_CONNECTION_PER_ADML_INSTANCE"
+    echo
+    echo "Press ENTER to continue, CTRL-C to abort ..."
+    read dummy
+  fi
+  client_connections=$((G_ADML_INSTANCES*G_ADML_CONNECTIONS))
+  if [ $client_connections -gt $max_server_accepted_connections ]
+  then
+    echo
+    echo "Insufficient server connections available ($max_server_accepted_connections) to accept"
+    echo " launcher client connections: $G_ADML_INSTANCES x $G_ADML_CONNECTIONS = $client_connections."
+    _exit "Configuration error"
+  fi
 }
 
 #############
@@ -86,6 +102,8 @@ echo "====================================="
 echo "ADML SYSTEM TEST CONFIGURATION WIZARD"
 echo "====================================="
 echo
+[ -d ADMLS ] && _exit "ADMLS directory still exists. Please move/remove it to continue (you may have to 'pkill ADML' before) !"
+[ ! -d services ] && _exit "Missing services configuration (expecting '$PWD/services' directory) !"
 
 calculate_deployment_layout
 
@@ -93,28 +111,51 @@ calculate_deployment_layout
 echo $G_ADML_INSTANCES > $ADML_INSTANCES__ST_CONF_FILE
 echo $G_ADML_CONNECTIONS > $ADML_CONNECTIONS__ST_CONF_FILE
 
+# Rate per instance:
+#rate_per_instance=$(ceil $desired_rate $G_ADML_INSTANCES)
+rate_per_instance=$((desired_rate/$G_ADML_INSTANCES))
+[ $rate_per_instance -lt 1 ] && rate_per_instance=1
+echo $rate_per_instance > $ADML_RATE_PER_INSTANCE__ST_CONF_FILE
+echo $desired_rate > $ADML_DESIRED_RATE__ST_CONF_FILE
+
 echo
 echo "Suggested layout:"
 echo " - $G_ADML_INSTANCES ADML instances"
 echo " - $G_ADML_CONNECTIONS client connections per ADML instance"
 maximum_rate=$((G_ADML_INSTANCES*G_ADML_CONNECTIONS*MAXIMUM_ADML_ASYNC_RATE))
 echo " - Maximum rate: $maximum_rate test cases per second"
+echo " - Desired rate: $desired_rate test cases per second"
 echo
-echo "Usually, you will program a test case per subscriber. Input the number of test cases to program:"
+echo "Usually, you will program a test case per subscriber."
+echo "Input the number of test cases to program:"
 read N_TESTCASES
 while [ -z "$N_TESTCASES" ]; do read N_TESTCASES; done
 echo $N_TESTCASES > $N_TESTCASES__ST_CONF_FILE
+testcase_per_adml_instance=$N_TESTCASES
+echo "Input the first test id to program [1]:"
+read first_value
+[ "$first_value" = "" ] && first_value=1
+[ $first_value -lt 1 ] && first_value=1
 echo
-time_covered_1=$(ceil $N_TESTCASES $maximum_rate)
-time_covered=$(ceil $N_TESTCASES $((maximum_rate*G_ADML_INSTANCES)))
+time_covered_1=$(ceil $N_TESTCASES $desired_rate)
+time_covered=$(ceil $N_TESTCASES $((desired_rate*G_ADML_INSTANCES)))
 echo "That amount covers $time_covered_1 seconds for one running ADML instance."
 if [ $G_ADML_INSTANCES -gt 1 ]
 then
   echo "But you will have $G_ADML_INSTANCES instances running in parallel, then the total covered time is: $time_covered seconds"
-  testcase_per_adml_instance=$(ceil $N_TESTCASES $G_ADML_INSTANCES)
+  testcase_per_adml_instance=$((N_TESTCASES/G_ADML_INSTANCES))
   echo "(aproximately, $testcase_per_adml_instance test cases will be programmed on each ADML instance)"
 fi
 
+0>$N_TESTCASES_PROGRAM_LAYOUT__ST_CONF_FILE
+for instance in `seq 1 $G_ADML_INSTANCES`
+do
+  offset=$((testcase_per_adml_instance * (instance-1)))
+  ini=$((offset + first_value))
+  fin=$((offset + first_value + testcase_per_adml_instance - 1))
+  echo "$instance $ini $fin" >> $N_TESTCASES_PROGRAM_LAYOUT__ST_CONF_FILE
+done
+
 echo
 if [ $time_covered -lt 300 ]
 then
@@ -130,28 +171,39 @@ while [ -z "$minutes" ]; do read minutes; done
 seconds=$((minutes*60))
 repeats=$(ceil $seconds $time_covered)
 echo $repeats > $CYCLE_REPEATS__ST_CONF_FILE
-[ $repeats -gt 0 ] && echo "Configured $repeats cycle repeats ($repeats x $time_covered seconds = $seconds seconds (desired $minutes minutes)"
+[ $repeats -gt 0 ] && echo "Configured $repeats cycle repeats ($repeats x $time_covered seconds ~ $seconds seconds (desired $minutes minutes)"
 echo
 echo "System test configuration completed."
 echo
 echo "Ready to clone/start the ADML instances: press ENTER to continue, CTRL+C to abort ..."
 read dummy
-[ ! -d realms ] && _exit "Missing realms configuration (expecting '$PWD/realms' directory). Try with 'realms.example' and see README inside it !"
 
 # Update services.xml regarding the number of client connections:
-cp realms/services.msk realms/services.xml
-sed -i 's/__CLIENT_CONNECTIONS__/'$G_ADML_CONNECTIONS'/g' realms/services.xml
+cd services 
+cp services.msk services.xml
+sed -i 's/__CLIENT_CONNECTIONS__/'$G_ADML_CONNECTIONS'/g' services.xml
+cd - >/dev/null
+
 
-rm -rf ADMLS
 for instance in `seq 1 $G_ADML_INSTANCES`
 do
-  mkdir -p ADMLS/$instance
-  cd ADMLS/$instance
+  echo "Creating ADML instance $instance ..."
+  mkdir -p ADMLS/ADML-$instance
+  cd ADMLS/ADML-$instance
+  mkdir counters
+  mkdir test-reports
   # Create resources:
-  ln -s ../../ADML-launcher
-  ln -s ../../operation.sh
-  ln -s ../../realms/services.xml
-  for cer in `ls ../../realms/cer*xml`; do ln -s $cer; done
+  ln -s ../../.operation-one.sh operation.sh
+  ln -s ../../pre-start.sh
+  cp ../../.run-one.sh run.sh
+  sed -i 's/^EXE=.*/EXE=ADML-'$instance'/' run.sh
+  ln -s ../../ADML-launcher ADML-$instance
+  for xml in `ls ../../services/*xml`; do ln -s $xml; done
   cd - >/dev/null
 done
 
+echo
+echo "Now you can run all the instances deployed: ./run.sh"
+echo
+echo "Done!"
+