Change order
[anna.git] / example / diameter / launcher / resources / scripts / clone.sh
1 #!/bin/bash
2
3 #############
4 # VARIABLES #
5 #############
6 CLONE_WKDIR=$(mktemp -d)
7 MAX_NUMBER_GROUPS=400
8 # (depends on the machine)
9
10 #############
11 # FUNCTIONS #
12 #############
13 _exit (){
14   echo
15   echo $1
16   echo
17
18   # Cleanup:
19   rm -rf $CLONE_WKDIR
20
21   rc=1
22   [ -n "$2" ] && rc=$2
23   exit $rc
24 }
25
26 sig_handler() {
27   _exit "Script interrupted. Cleanup & exit ..."
28 }
29
30 usage() {
31   echo "Usage: $0 <ADML directory> <testcase variable file> <initial sequence> <final sequence> [number of groups]"
32   echo
33   echo "          ADML directory:         path to the ADML directory where 'operation.sh' script is used to load the test cases."
34   echo "          testcase variable file: path to the testcase file with parseable variables, for example '<directory>/testcase.txt.msk'."
35   echo "                                  xml files within this test case, must exist with aditional .msk extension in the same directory."
36   echo "                                  Currently, 9 variables are supported to be replaced:"
37   echo "                                    __TESTID__ : sequence number. For example if you provide 1 to 20 for this script, it will be 1 .. 20"
38   echo "                                    __SEQ8__   : 8-digit number corresponding to the sequence number (00000001 for 1, and so on)"
39   echo "                                    __MSISDN9__: 9-digit msisdn"
40   echo "                                    __IPV4HEX__: hexadecimal IPv4 address, for example: 00000001"
41   echo "                                    __IPV4__   : IPv4 address, for example: 0.0.0.1"
42   echo "                                    __SGX1_SUFFIX__: 1<8-digit sequence>"
43   echo "                                    __SRX1_SUFFIX__: \""
44   echo "                                    __SGX2_SUFFIX__: 2<8-digit sequence>"
45   echo "                                    __SRX2_SUFFIX__: \""
46   echo
47   echo "          initial sequence:       initial sequence number to parse over variables."
48   echo "          final sequence:         final sequence number to parse over variables."
49   echo "          number of groups:       number of background group jobs to clone the provided sequence range."
50   echo "                                  By default, it will be the number of items divided by 25, with a maximum of $MAX_NUMBER_GROUPS."
51   echo
52   echo
53   _exit
54 }
55
56 children () {
57   bash_pid=$$
58   children=`ps -eo ppid | grep -w $bash_pid`
59   echo $children | wc -w
60 }
61
62 # $1: sequence number; $2: file to parse(will be updated); $3: result file
63 parse_file() {
64   local vars=$(egrep -o '__((_*[A-Z]*[0-9]*)*)__' $2 | cut -d: -f2 | sort -u)
65   local file=$2
66   cp $2 $3
67   file=$3
68   for pvar in $vars
69   do
70     eval pvalue=\$$pvar
71     sed -i 's/'$pvar'/'$pvalue'/g' $file
72   done
73 }
74
75 # $1: sequence number; $2: working directory
76 clone() {
77   local sequence=$1
78   local wkdir=$2
79   mkdir -p $wkdir
80
81   # Values:
82   testid=$sequence
83   seq8=$(printf "%08d" $testid)
84   msisdn9=6${seq8}
85   ipv4hex=$seq8
86   #ipv4=$(for i in $(echo $seq8 | sed 's/\(..\)/0x\1 /g'); do printf "%d." $i; done | sed 's/\.$/\n/')
87   # Numbers beginning with "0" are treated as octal (i.e. base-8): we would have 'invalid octal number with 08 and 09'
88   # Solution: convert to base-10 in this way: $((10#$i))
89   ipv4=$(for i in $(echo $seq8 | sed 's/\(..\)/ \1 /g'); do printf "%d." $((10#$i)); done | sed 's/\.$/\n/')
90   # Sessions
91   sgx1_suffix=1$seq8
92   srx1_suffix=1$seq8
93   sgx2_suffix=2$seq8
94   srx2_suffix=2$seq8
95
96   local target=$wkdir/values.${1}
97   echo "__TESTID__=$testid" > $target
98   echo "__SEQ8__=$seq8" >> $target
99   echo "__MSISDN9__=$msisdn9" >> $target
100   echo "__IPV4HEX__=$ipv4hex" >> $target
101   echo "__IPV4__=$ipv4" >> $target
102   echo "__SGX1_SUFFIX__=$sgx1_suffix" >> $target
103   echo "__SRX1_SUFFIX__=$srx1_suffix" >> $target
104   echo "__SGX2_SUFFIX__=$sgx2_suffix" >> $target
105   echo "__SRX2_SUFFIX__=$srx2_suffix" >> $target
106   source $target
107   #rm $target
108
109   # Parse template files:
110   parse_file $sequence $TESTCASE_TEMPLATE $wkdir/testcase.txt.$sequence
111   for file in $(grep sendxml $TESTCASE_TEMPLATE | cut -d\| -f4 | sed 's/\.xml$/.xml.msk/')
112   do
113     xml=`basename $file .msk`
114     parse_file $sequence $TESTCASE_TEMPLATE_DIR/$file $wkdir/${xml}.${sequence}
115     new_file=`readlink -f $wkdir/${xml}.${sequence}`
116     sed -i 's|'$xml'|'$new_file'|g' $wkdir/testcase.txt.$sequence
117   done
118   cat $wkdir/testcase.txt.$sequence >> $wkdir/testcase.txt
119   rm $wkdir/testcase.txt.$sequence
120 }
121
122 # $1: group number; $2: initial subrange value; $3: final subrange value
123 clone_group() {
124   for i in `seq $2 $3`
125   do
126     clone $i $CLONE_WKDIR/$1
127     #sleep 0.01
128   done
129 }
130
131 #############
132 # EXECUTION #
133 #############
134 trap sig_handler SIGINT
135 trap sig_handler SIGTERM
136
137 ADML_DIR=$1
138 TESTCASE_TEMPLATE=`readlink -f $2`
139 CLONE_SEQ_BEGIN=$3
140 CLONE_SEQ_END=$4
141 N_GROUPS=$5
142
143 [ "$4" = "" ] && usage
144
145 # Auxiliary:
146 OPERATION=$ADML_DIR/operation.sh
147 [ ! -f $OPERATION ] && _exit "Missing '$OPERATION' file !!"
148 [ ! -f $TESTCASE_TEMPLATE ] && _exit "Missing '$TESTCASE_TEMPLATE' testcase template file !!"
149
150 TESTCASE_TEMPLATE_DIR=`dirname $TESTCASE_TEMPLATE`
151 N_ITEMS=$((CLONE_SEQ_END - CLONE_SEQ_BEGIN + 1))
152 if [ -z "$N_GROUPS" ]
153 then
154   N_GROUPS=$((N_ITEMS/25))
155   [ $N_GROUPS -gt $MAX_NUMBER_GROUPS ] && N_GROUPS=$MAX_NUMBER_GROUPS
156   [ $N_GROUPS -eq 0 ] && N_GROUPS=1
157 fi
158 GROUPS_SIZE=$((N_ITEMS/N_GROUPS))
159 if [ "$GROUPS_SIZE" -eq 0 ]
160 then
161   echo "Assuming minimum allowed number of groups: $N_ITEMS"
162   GROUPS_SIZE=1
163   N_GROUPS=$N_ITEMS
164 fi
165
166 # Start cloning:
167 timestamp_begin=$(echo "scale=3 ; $(date '+%s') + $(date '+%N') / 1000000000" | bc)
168 children_before=$(children)
169 offset=0
170 $OPERATION "test|clear"
171 echo "Please be patient, this may take a while ..."
172 for group in `seq 1 $((N_GROUPS+1))`
173 do
174   n_begin=$((CLONE_SEQ_BEGIN + offset))
175   n_end=$((n_begin + GROUPS_SIZE - 1))
176   [ $n_end -gt $CLONE_SEQ_END ] && n_end=$CLONE_SEQ_END
177   [ $n_end -lt $n_begin ] && break
178   clone_group $group $n_begin $n_end &
179   offset=$((group * GROUPS_SIZE))
180 done
181 children_now=$(children)
182
183 # Wait background jobs to finish:
184 while true
185 do
186   sleep 1 
187   [ $(children) -eq $children_before ] && break
188 done
189
190 # Programming:
191 echo -n "Programming .."
192 for file in $(ls $CLONE_WKDIR/*/testcase.txt)
193 do
194   echo -n .
195   r_file=`readlink -f $file`
196   dn_r_file=`dirname $r_file`
197   #bn_dn_r_file=`basename $dn_r_file`
198   #echo "Programming group $bn_dn_r_file ..."
199   $OPERATION -f $r_file >/dev/null
200   #$OPERATION -f $r_file > $dn_r_file/result.txt
201   rm -rf $dn_r_file &
202 done
203
204 timestamp_end=$(echo "scale=3 ; $(date '+%s') + $(date '+%N') / 1000000000" | bc)
205 echo
206 lasted=$(echo "scale=3 ; $timestamp_end - $timestamp_begin" | bc)
207 echo "Total Lasted $lasted seconds"
208 echo "Programming speed: $(echo "$N_ITEMS/$lasted" | bc) tests per second"
209
210 # Finish:
211 _exit "Done!" 0
212