Support run rubbos test mult times
[bottlenecks.git] / utils / infra_setup / heat_template / HOT_create_instance.sh
1 #!/bin/bash
2
3 set -x
4
5 GERRIT_REFSPEC_DEBUG=$1
6
7 bottlenecks_env_prepare()
8 {
9     echo "Bottlenecks env prepare start $(date)"
10
11     if [ -d $BOTTLENECKS_REPO_DIR ]; then
12         rm -rf ${BOTTLENECKS_REPO_DIR}
13     fi
14
15     mkdir -p ${BOTTLENECKS_REPO_DIR}
16     git config --global http.sslVerify false
17     git clone ${BOTTLENECKS_REPO} ${BOTTLENECKS_REPO_DIR}
18     if [ x"$GERRIT_REFSPEC_DEBUG" != x ]; then
19         cd ${BOTTLENECKS_REPO_DIR}
20         git fetch $BOTTLENECKS_REPO $GERRIT_REFSPEC_DEBUG && git checkout FETCH_HEAD
21         cd -
22     fi
23
24     source $BOTTLENECKS_REPO_DIR/rubbos/rubbos_scripts/1-1-1/scripts/env_preparation.sh
25     chmod 600 $KEY_PATH/bottlenecks_key
26
27     echo "Bottlenecks env prepare end $(date)"
28 }
29
30 wait_heat_stack_complete() {
31     retry=0
32     while true
33     do
34         status=$(heat stack-list | grep bottlenecks | awk '{print $6}')
35         if [ x$status = x"CREATE_COMPLETE" ]; then
36             echo "bottlenecks stacke create complete"
37             heat stack-show bottlenecks
38             nova list | grep rubbos_
39             break;
40         elif [ x$status = x"CREATE_FAILED" ]; then
41             echo "bottlenecks stacke create failed !!!"
42             heat stack-show bottlenecks
43             exit 1
44         fi
45
46         #if [ $BOTTLENECKS_DEBUG = True ]; then
47         if false; then
48             heat stack-show bottlenecks
49             nova list | grep rubbos_
50             for i in $(nova list | grep rubbos_ | grep ERROR | awk '{print $2}')
51             do
52                  nova show $i
53             done
54         fi
55         sleep 1
56         let retry+=1
57         if [[ $retry -ge $1 ]];then
58             echo "Heat stack create timeout, status $status !!!"
59             exit 1
60         fi
61     done
62 }
63
64 wait_rubbos_control_ok() {
65     control_ip=$(nova list | grep rubbos_control | awk '{print $13}')
66
67     retry=0
68     until timeout 3s ssh $ssh_args ec2-user@$control_ip "exit" >/dev/null 2>&1
69     do
70         echo "retry connect rubbos control $retry"
71         sleep 1
72         let retry+=1
73         if [[ $retry -ge $1 ]];then
74             echo "rubbos control start timeout !!!"
75             exit 1
76         fi
77     done
78     ssh $ssh_args ec2-user@$control_ip "uname -a"
79 }
80
81 bottlenecks_check_instance_ok()
82 {
83     echo "Bottlenecks check instance ok start $(date)"
84
85     wait_heat_stack_complete 120
86     wait_rubbos_control_ok 300
87     nova list | grep rubbos_
88     if [ $BOTTLENECKS_DEBUG = True ]; then
89         date
90         while true
91         do
92             for i in rubbos_benchmark rubbos_client1 rubbos_client2 rubbos_client3 \
93                      rubbos_client4 rubbos_control rubbos_httpd rubbos_mysql1 rubbos_tomcat1
94             do
95                echo "logging $i"
96                nova console-log $i | tail -n 2 | grep Cloud-init | grep finished
97                if [ $? != 0 ]; then
98                    break
99                fi
100                if [ $i = rubbos_tomcat1 ]; then
101                    echo "all vm Cloud-init finished!"
102                    date
103                    return
104                fi
105             done
106             sleep 10
107         done
108     fi
109
110     echo "Bottlenecks check instance ok end $(date)"
111 }
112
113 bottlenecks_create_instance()
114 {
115     echo "Bottlenecks create instance using heat template start $(date)"
116
117     echo "upload keypair"
118     nova keypair-add --pub_key $KEY_PATH/bottlenecks_key.pub $KEY_NAME
119
120     echo "create flavor"
121     nova flavor-create $FLAVOR_NAME 200 4096 20 4
122
123     echo "use heat template to create stack"
124     cd $HOT_PATH
125     heat stack-create bottlenecks -f ${TEMPLATE_NAME} \
126          -P "image=$IMAGE_NAME;key_name=$KEY_NAME;public_net=$PUBLIC_NET_NAME;flavor=$FLAVOR_NAME"
127
128     echo "Bottlenecks create instance using heat template end $(date)"
129 }
130
131 bottlenecks_rubbos_wait_finish()
132 {
133     echo "Start checking rubbos running status..."
134     retry=0
135     while true
136     do
137         ssh $ssh_args ec2-user@$control_ip "FILE=/tmp/rubbos_finished; if [ -f \$FILE ]; then exit 0; else exit 1; fi"
138         if [ $? = 0 ]; then
139             echo "Rubbos test case successfully finished :)"
140             return 0
141         fi
142         echo "Rubbos running $retry ..."
143         sleep 30
144         let retry+=1
145         if [[ $retry -ge $1 ]]; then
146             echo "Rubbos test case timeout :("
147             return 1
148         fi
149     done
150 }
151
152 bottlenecks_rubbos_run()
153 {
154     echo "Run Rubbos"
155     control_ip=$(nova list | grep rubbos_control | awk '{print $13}')
156     for i in rubbos_benchmark rubbos_client1 rubbos_client2 rubbos_client3 \
157              rubbos_client4 rubbos_control rubbos_httpd rubbos_mysql1 \
158              rubbos_tomcat1
159     do
160           ip=$(nova list | grep $i | awk '{print $12}' | awk -F [=,] '{print $2}')
161           echo "$i=$ip" >> $BOTTLENECKS_REPO_DIR/utils/infra_setup/vm_dev_setup/hosts.conf
162     done
163
164     nameserver_ip=$(grep -m 1 '^nameserver' \
165         /etc/resolv.conf | awk '{ print $2 '})
166     echo "nameserver_ip=$nameserver_ip" >> $BOTTLENECKS_REPO_DIR/utils/infra_setup/vm_dev_setup/hosts.conf
167
168     echo "GERRIT_REFSPEC_DEBUG=$GERRIT_REFSPEC_DEBUG" >> $BOTTLENECKS_REPO_DIR/utils/infra_setup/vm_dev_setup/hosts.conf
169
170     scp $ssh_args -r \
171         $BOTTLENECKS_REPO_DIR/utils/infra_setup/vm_dev_setup \
172         ec2-user@$control_ip:/tmp
173     ssh $ssh_args \
174         ec2-user@$control_ip "bash /tmp/vm_dev_setup/setup_env.sh" &
175
176     bottlenecks_rubbos_wait_finish 200
177
178     rm -rf $BOTTLENECKS_REPO_DIR/utils/infra_setup/vm_dev_setup/hosts.conf
179 }
180
181 bottlenecks_cleanup()
182 {
183     echo "Bottlenecks cleanup start $(date)"
184
185     if heat stack-list; then
186         for stack in $(heat stack-list | grep -e bottlenecks | awk '{print $2}'); do
187             echo "clean up stack $stack"
188             heat stack-delete $stack || true
189             sleep 30
190         done
191     fi
192
193     if glance image-list; then
194         for image in $(glance image-list | grep -e $IMAGE_NAME | awk '{print $2}'); do
195             echo "clean up image $image"
196             glance image-delete $image || true
197         done
198     fi
199
200     if nova keypair-list; then
201         for key in $(nova keypair-list | grep -e $KEY_NAME | awk '{print $2}'); do
202             echo "clean up key $key"
203             nova keypair-delete $key || true
204         done
205     fi
206
207     if nova flavor-list; then
208         for flavor in $(nova flavor-list | grep -e $FLAVOR_NAME | awk '{print $2}'); do
209             echo "clean up flavor $flavor"
210             nova flavor-delete $flavor || true
211         done
212     fi
213
214     echo "Bottlenecks cleanup end $(date)"
215 }
216
217 bottlenecks_load_bottlenecks_image()
218 {
219     echo "Bottlenecks load image start $(date)"
220
221     curl --connect-timeout 10 -o /tmp/bottlenecks-trusty-server.img $IMAGE_URL -v
222
223     result=$(glance image-create \
224         --name $IMAGE_NAME \
225         --disk-format qcow2 \
226         --container-format bare \
227         --file /tmp/bottlenecks-trusty-server.img)
228     echo "$result"
229
230     rm -rf /tmp/bottlenecks-trusty-server.img
231
232     IMAGE_ID_BOTTLENECKS=$(echo "$result" | grep " id " | awk '{print $(NF-1)}')
233     if [ -z "$IMAGE_ID_BOTTLENECKS" ]; then
234          echo 'failed to upload bottlenecks image to openstack'
235          exit 1
236     fi
237
238     echo "bottlenecks image end id: $IMAGE_ID_BOTTLENECKS $(date)"
239 }
240
241 main()
242 {
243     echo "main start $(date)"
244
245     BOTTLENECKS_DEBUG=True
246     BOTTLENECKS_REPO=https://gerrit.opnfv.org/gerrit/bottlenecks
247     BOTTLENECKS_REPO_DIR=/tmp/opnfvrepo/bottlenecks
248     IMAGE_URL=http://artifacts.opnfv.org/bottlenecks/rubbos/bottlenecks-trusty-server.img
249     #IMAGE_URL=https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
250     IMAGE_NAME=bottlenecks-trusty-server
251     KEY_PATH=$BOTTLENECKS_REPO_DIR/utils/infra_setup/bottlenecks_key
252     HOT_PATH=$BOTTLENECKS_REPO_DIR/utils/infra_setup/heat_template
253     KEY_NAME=bottlenecks-key
254     FLAVOR_NAME=bottlenecks-flavor
255     TEMPLATE_NAME=bottlenecks_rubbos_hot.yaml
256     PUBLIC_NET_NAME=net04_ext
257     ssh_args="-o StrictHostKeyChecking=no -o BatchMode=yes -i $KEY_PATH/bottlenecks_key"
258
259     bottlenecks_env_prepare
260     set -x
261     bottlenecks_cleanup
262     bottlenecks_load_bottlenecks_image
263     bottlenecks_create_instance
264     bottlenecks_check_instance_ok
265     bottlenecks_rubbos_run
266     bottlenecks_cleanup
267     echo "main end $(date)"
268 }
269
270 main
271 set +x
272