bugfix: fix ssh issue between puppet master and agents
[bottlenecks.git] / testsuites / rubbos / puppet_manifests / internal / run_rubbos_internal.sh
1 #!/bin/bash
2 ##############################################################################
3 # Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.
4 #
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10
11
12 ## run_rubbos_interlnal.sh is executed in rubbos-controller
13 ## Usage: run_rubbos_internal.sh rubbos.conf local_result_dir
14 if [ $# -ne 2 ];then
15   echo "Need Two argument!"
16   exit 1
17 fi
18 local_cfg_path=$1
19 local_results_dir=$2
20 controller_host=`hostname`
21
22 REMOTE_GIT_REPO=git://git.opnfv.org/bottlenecks
23 REMOTE_ARTIFACTS_REPO=http://artifacts.opnfv.org/bottlenecks/rubbos/rubbos_files.tar.gz
24 LOCAL_GIT_REPO=/home/ubuntu/btnks-git
25 LOCAL_ARTIFACTS_REPO=/home/ubuntu/btnks-artifacts
26 LOCAL_RUBBOS_MANIFESTS_HOME=/home/ubuntu/btnks-git/bottlenecks/testsuites/rubbos/puppet_manifests
27 LOCAL_ARTIFACTS_RUBBOS_HOME=/home/ubuntu/btnks-artifacts/rubbos_files
28
29 SSH_ARGS="-o StrictHostKeyChecking=no -o BatchMode=yes -i /home/ubuntu/.ssh/id_rsa"
30
31 # conf properties from the input config file
32 client_servers=
33 web_servers=
34 app_servers=
35 cjdbc_controller=
36 database_servers=
37 database_port=3306
38 db_username=rubbos
39 db_password=rubbos
40 clients_per_node=
41 rubbos_app=
42 rubbos_app_tools=
43 rubbos_home=
44
45 # conf info used in this script
46 bench_client=
47 clients_arr=
48 remote_client_arr=
49 remote_client_servers=
50 clients_per_node_arr=
51 webservers_arr=
52 appservers_arr=
53 dbservers_arr=
54 all_agents_arr=
55 hostname_arr=
56 hostip_arr=
57
58 # Other variables used in this script
59 class_nodes=
60
61 read_conf() {
62   while read line
63   do
64     if [ ${#line} -gt 0 ] && [ ${line:0:1} != "#" ] && [ ${line:0:1} != "[" ];then
65       line=(${line//=/ })
66       case ${line[0]} in
67         "controller" )
68           e_arr=(${line[1]//:/ })
69           controller_host=${e_arr[0]}
70           controller_ip=${e_arr[2]}
71           hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}")
72           hostip_arr=("${hostip_arr[@]}" "${e_arr[2]}");;
73         "client_servers" )
74           elems=(${line[1]//,/ })
75           for e in "${elems[@]}";do
76             e_arr=(${e//:/ })
77             client_servers=${client_servers}${e_arr[0]}","
78             hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}")
79             hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}")
80           done
81           client_servers=${client_servers%,};;
82         "web_servers" )
83           e_arr=(${line[1]//:/ })
84           web_servers=${web_servers}${e_arr[0]}","
85           hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}")
86           hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}")
87           web_servers=${e_arr[0]};;
88         "app_servers" )
89           elems=(${line[1]//,/ })
90           for e in "${elems[@]}";do
91             e_arr=(${e//:/ })
92             app_servers=${app_servers}${e_arr[0]}","
93             hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}")
94             hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}")
95           done
96           app_servers=${app_servers%,};;
97         "cjdbc_controller" )
98           if [ "x"${line[1]} != "x" ]; then
99             e_arr=(${line[1]//:/ })
100             hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}")
101             hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}")
102             cjdbc_controller=${e_arr[0]}
103           fi
104           ;;
105         "db_servers" )
106           elems=(${line[1]//,/ })
107           for e in "${elems[@]}";do
108             e_arr=(${e//:/ })
109             database_servers=${database_servers}${e_arr[0]}","
110             hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}")
111             hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}")
112           done
113           database_servers=${database_servers%,};;
114         "database_port" )
115           database_port=${line[1]};;
116         "db_username" )
117           db_username=${line[1]};;
118         "db_password" )
119           db_password=${line[1]};;
120         "clients_per_node" )
121           clients_per_node=${line[@]:1:${#line[@]-1}};;
122         "rubbos_app" )
123           rubbos_app=${line[1]};;
124         "rubbos_app_tools" )
125           rubbos_app_tools=${line[1]};;
126         "rubbos_home" )
127           rubbos_home=${line[1]};;
128       esac
129     fi
130   done < $local_cfg_path
131
132   clients_arr=(${client_servers//,/ })
133   clients_per_node_arr=(${clients_per_node})
134   webservers_arr=(${web_servers//,/ })
135   appservers_arr=(${app_servers//,/ })
136   dbservers_arr=(${database_servers//,/ })
137   all_agents_arr=("${clients_arr[@]}" "${webservers_arr[@]}" "${appservers_arr[@]}" "${dbservers_arr[@]}")
138   bench_client=${clients_arr[0]}
139   len=${#clients_arr[@]}
140   if [ $len -gt 1 ]; then
141     remote_clients_arr=(${clients_arr[@]:1:$len-1})
142     remote_client_servers=${client_servers#*,}
143   fi
144
145   echo "-------------Main conf info:----------"
146   i=1
147   while [ $i -lt ${#hostname_arr[@]} ]; do
148     echo ${hostip_arr[$i]}" "${hostname_arr[$i]}
149     let i=i+1
150   done
151   echo "clients_arr:           "${clients_arr[@]}
152   echo "bench_client:          "$bench_client
153   echo "remote_client_servers: "$remote_client_servers
154   echo "remote_clients_arr:    "${remote_clients_arr[@]}
155   echo "clients_per_node_arr:  "${clients_per_node_arr[@]}
156   echo "webservers_arr:        "${webservers_arr[@]}
157   echo "appservers_arr:        "${appservers_arr[@]}
158   echo "dbservers_arr:         "${dbservers_arr[@]}
159   echo "all agents:            "${all_agents_arr[@]}
160 }
161
162 fetch_remote_resources() {
163   if [ -d $LOCAL_GIT_REPO ];then
164     rm -rf $LOCAL_GIT_REPO
165   fi
166   mkdir -p $LOCAL_GIT_REPO
167   sudo apt-get install -y git
168   cd $LOCAL_GIT_REPO
169   git clone ${REMOTE_GIT_REPO}
170
171   if [ -d $LOCAL_ARTIFACTS_REPO ];then
172     rm -rf $LOCAL_ARTIFACTS_REPO
173   fi
174   mkdir -p $LOCAL_ARTIFACTS_REPO
175   cd $LOCAL_ARTIFACTS_REPO
176   wget -nv ${REMOTE_ARTIFACTS_REPO}
177   tar xvzf rubbos_files.tar.gz
178
179   if [ -d $local_results_dir ];then
180     rm -rf $local_results_dir
181   fi
182   mkdir -p $local_results_dir
183 }
184
185 # ssh all vms/instances once only after first creation
186 direct_ssh() {
187   echo "127.0.0.1 $(hostname)" >> /etc/hosts
188   echo "write hosts file: 127.0.0.1 $(hostname)"
189   cp ${LOCAL_GIT_REPO}/bottlenecks/utils/infra_setup/bottlenecks_key/bottlenecks_key /home/ubuntu/.ssh/id_rsa
190   sudo chmod 0600 /home/ubuntu/.ssh/id_rsa
191   echo 'StrictHostKeyChecking no' > /home/ubuntu/.ssh/config
192   sudo chown -R ubuntu:ubuntu /home/ubuntu/.ssh
193   i=1
194   while [ $i -lt ${#hostip_arr[@]} ]; do
195     echo ${hostip_arr[$i]}" "${hostname_arr[$i]} >> /etc/hosts
196     let i=i+1
197   done
198   echo "Done controller."
199
200   i=1
201   while [ $i -lt ${#hostip_arr[@]} ]; do
202     if [ ${hostname_arr[$i]} == ${controller_host} ];then
203       let i=i+1
204       continue
205     fi
206     echo "Processing: "${hostip_arr[$i]}" "${hostname_arr[$i]}
207     echo "ssh *sudo hostname* test:"
208     ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "sudo hostname"
209
210     ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "sudo cp /etc/hosts /home/ubuntu/ && sudo chmod 646 /home/ubuntu/hosts"
211     ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "echo 127.0.0.1 ${hostname_arr[$i]} >> /home/ubuntu/hosts"
212     j=1
213     while [ $j -lt ${#hostip_arr[@]} ];do
214       local host_item=${hostip_arr[$j]}" "${hostname_arr[$j]}
215       ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "echo ${host_item} >> /home/ubuntu/hosts"
216       let j=j+1
217     done
218     ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "sudo chmod 644 /home/ubuntu/hosts && sudo cp /home/ubuntu/hosts /etc/ && sudo rm -rf /home/ubuntu/hosts"
219     echo "done hosts"
220
221     sudo ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "echo 'StrictHostKeyChecking no' > /home/ubuntu/.ssh/config"
222     sudo scp ${SSH_ARGS} /home/ubuntu/.ssh/id_rsa ubuntu@${hostip_arr[$i]}:/home/ubuntu/.ssh/
223
224     let i=i+1
225   done
226 }
227
228 start_puppet_service() {
229   # Start puppetserver
230   sudo service puppetserver stop
231   sudo service puppetserver start
232   sudo service puppetserver status
233   # Start all puppet agents
234   for host in "${all_agents_arr[@]}";do
235     echo "start puppet agent on:"${host}
236     ssh ${SSH_ARGS} ubuntu@${host} "sudo service puppet status"
237     ssh ${SSH_ARGS} ubuntu@${host} "sudo service puppet stop"
238     ssh ${SSH_ARGS} ubuntu@${host} "sudo service puppet start --no-client"
239     ssh ${SSH_ARGS} ubuntu@${host} "sudo service puppet status"
240   done
241
242   sudo puppet cert list --all
243   sudo puppet cert sign --all
244   sudo puppet cert list --all
245 }
246
247 # inline function
248 # It requires one local file path which needs to be replaced
249 _replace_text() {
250   echo "_replace file: "$1
251   sed -i 's#REPLACED_RUBBOS_APP_TOOLS#'${rubbos_app_tools}'#g' $1
252   sed -i 's#REPLACED_RUBBOS_APP#'${rubbos_app}'#g' $1
253   sed -i 's#REPLACED_RUBBOS_HOME#'${rubbos_home}'#g' $1
254   local mysql_jdbc_url="jdbc:mysql://"${database_servers}":"${database_port}"/rubbos"
255   sed -i 's#REPLACED_MYSQL_JDBC_DB_URL#'${mysql_jdbc_url}'#g' $1
256   sed -i 's/REPLACED_MYSQL_USERNAME/'${db_username}'/g' $1
257   sed -i 's/REPLACED_MYSQL_PASSWORD/'${db_password}'/g' $1
258   handler_details=
259   handlers=
260   i=0
261   while [ $i -lt ${#appservers_arr} ];do
262     handler_name="s"$i
263     handlers=${handlers}${handler_name}","
264     handler_details=${handler_details}"worker."${handler_name}".port=8009\n"
265     handler_details=${handler_details}"worker."${handler_name}".host="${appservers_arr[$i]}"\n"
266     handler_details=${handler_details}"worker."${handler_name}".type=ajp13\n"
267     handler_details=${handler_details}"worker."${handler_name}".lbfactor=1\n"
268     let i=i+1
269   done
270   handlers=${handlers%,}
271   sed -i 's/REPLACED_HANDLERS_DETAILS/'${handler_details}'/g' $1
272   sed -i 's/REPLACED_HANDLERS/'${handlers}'/g' $1
273
274   sed -i 's/REPLACED_WEB_SERVER/'${web_servers}'/g' $1
275   sed -i 's/REPLACED_APPLICATION_SERVER/'${app_servers}'/g' $1
276   sed -i 's/REPLACED_DB_SERVER/'${database_servers}'/g' $1
277   sed -i 's/REPLACED_CLIENT_SERVERS/'${remote_client_servers}'/g' $1
278 }
279
280 # inline function
281 # it requires one input string
282 _to_puppet_class_nodes() {
283   echo "_to_puppet_class_nodes "$1
284   class_nodes=
285   nodes_arr=(${1//,/ })
286   i=0
287   while [ $i -lt ${#nodes_arr[@]} ];do
288     class_nodes=${class_nodes}"'"${nodes_arr[$i]}"',"
289     let i=i+1
290   done
291   class_nodes=${class_nodes%,}
292 }
293
294 # inline function
295 _execute_catalog() {
296   for host in "${clients_arr[@]}"; do
297     ssh ${SSH_ARGS} ubuntu@${host} 'sudo puppet agent -t' &
298   done
299   for host in "${webservers_arr[@]}"; do
300     ssh ${SSH_ARGS} ubuntu@${host} 'sudo puppet agent -t'
301   done
302   for host in "${appservers_arr[@]}"; do
303     ssh ${SSH_ARGS} ubuntu@${host} 'sudo puppet agent -t'
304   done
305   for host in "${dbservers_arr[@]}"; do
306     ssh ${SSH_ARGS} ubuntu@${host} 'sudo puppet agent -t'
307   done
308 }
309
310 prepare_manifests() {
311   # copy manifests
312   sudo cp -r ${LOCAL_RUBBOS_MANIFESTS_HOME}/modules/* /etc/puppet/modules/
313
314   # copy rubbos_files
315   sudo cp -r ${LOCAL_ARTIFACTS_RUBBOS_HOME}/modules/* /etc/puppet/modules/
316
317   # adjust corresponding configuration files (pre-catalog)
318   _replace_text /etc/puppet/modules/rubbos_tomcat/files/tomcat_sl/build.properties
319   _replace_text /etc/puppet/modules/rubbos_tomcat/files/tomcat_sl/Config.java
320   _replace_text /etc/puppet/modules/rubbos_tomcat/files/tomcat_sl/mysql.properties
321   _replace_text /etc/puppet/modules/rubbos_httpd/files/apache_conf/workers.properties
322   _replace_text /etc/puppet/modules/rubbos_httpd/files/apache_conf/httpd.conf
323   _replace_text /etc/puppet/modules/rubbos_client/files/build.properties
324   _replace_text /etc/puppet/modules/rubbos_client/files/rubbos.properties.template
325   _replace_text /etc/puppet/modules/rubbos_client/files/run_emulator.sh
326 }
327
328 execute_catalog() {
329   # start all (exec catalog)
330   if [ "x"$1 == "xstart" ];then
331     echo "--> Start to execute catalogs in all agents..."
332     sudo cp ${LOCAL_RUBBOS_MANIFESTS_HOME}/site_on.pp /etc/puppet/manifests/site.pp
333     _execute_catalog
334     echo "--> Finish to execute catalogs in all agents."
335   elif [ "x"$1 == "xclean" ];then
336     echo "--> Cleanup all agents..."
337     sudo cp ${LOCAL_RUBBOS_MANIFESTS_HOME}/site_off.pp /etc/puppet/manifests/site.pp
338     _execute_catalog
339    echo "--> Finish to cleanup all agents."
340   fi
341 }
342
343 run_emulator() {
344   # prepare data in db servers
345   for host in "${dbservers_arr[@]}"; do
346     ssh ${SSH_ARGS} ubuntu@${host} 'sudo scp ubuntu@'${controller_host}':/etc/puppet/modules/rubbos_mysql/files/rubbos_data_sql.tar.gz '${rubbos_home}''
347     ssh ${SSH_ARGS} ubuntu@${host} 'cd '${rubbos_home}' && sudo ./prepare_rubbos_mysql_db.sh ./rubbos_data_sql.tar.gz ./rubbos_data_sql_dir'
348   done
349
350   # run emulator.sh ( Modify rubbos.properties file first)
351   ssh ${SSH_ARGS} ubuntu@${bench_client} 'sudo rm -rf '${rubbos_home}'/bench/bench'
352   for x in "${clients_per_node_arr[@]}";do
353     echo "run emulator with clients_per_node="$x
354     for host in "${clients_arr[@]}";do
355       ssh ${SSH_ARGS} ubuntu@${host} "sed -e 's/REPLACED_NUMBER_OF_CLIENTS_PER_NODE/'${x}'/g' '${rubbos_home}'/Client/rubbos.properties.template > '${rubbos_home}'/Client/rubbos.properties "
356     done
357     ssh ${SSH_ARGS} ubuntu@${bench_client} 'cd '${rubbos_home}'/bench && ./run_emulator.sh'
358   done
359 }
360
361 collect_results() {
362   # collect results, from bench_host to controller
363   scp ${SSH_ARGS} -r ubuntu@${bench_client}:${rubbos_home}/bench/bench/* ${local_results_dir}
364 }
365
366 process_results() {
367   # post-process results and push to the database of dashboard
368   python ${LOCAL_GIT_REPO}/bottlenecks/utils/dashboard/process_data.py -i ${local_results_dir} \
369         -c ${LOCAL_GIT_REPO}/bottlenecks/utils/dashboard/dashboard.yaml \
370         -s rubbos \
371         -o ${local_results_dir}/rubbos.out \
372         -u no
373 }
374
375 main() {
376   echo "==> read_conf:"
377   read_conf
378   echo "==> fetch_remote_resources:"
379   fetch_remote_resources
380   echo "==> direct_ssh:"
381   direct_ssh
382   echo "==> start_puppet_service:"
383   start_puppet_service
384   echo "==> prepare_manifests:"
385   prepare_manifests
386   echo "==> execute_catalog start:"
387   execute_catalog start
388   echo "==> run_emulator:"
389   run_emulator
390   echo "==> collect_results (to controller:${local_results_dir}):"
391   collect_results
392   echo "==> process_results:"
393   process_results
394   echo "==> execute_catalog clean:"
395   execute_catalog clean
396 }
397
398 main