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