-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbatch-vm.sh
231 lines (171 loc) · 4.56 KB
/
batch-vm.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#!/bin/sh
. ./params
#------------------------------------------------------------------------------------
#if [ $# -lt 5 ]
#then
# echo "Usage : ./batch-vm.sh vm-count image flavor net-id zabbix-server [vm-name] "
# exit 1
#fi
#vm_count=$1
#image=$2
#flavor=$3
#net=$4
#zb_server=$5
#name_prefix=$6
#if [ x$name_prefix == x ]
#then
# name_prefix='batch'
#fi
#vol_size=10
#------------------------------------------------------------------------------------
# three parameters
# $1 vm uuid
# $2 vm ip addr
# $3 zabbix server addr
function create_vm_monitor()
{
local templates='{"templateid":"10002"}'
vm_uuid=$1
ip=$2
zabbix_api_server_ip=$3
res=`curl -s -X POST http://${zabbix_api_server_ip}:8090/zabbix/api_jsonrpc.php -H "Accept: application/json" -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","method": "user.login","params":{"user":"Admin","password": "zabbix"},"id": 1}'`
token=`echo $res | awk -F '"' '{print $8}'`
data='{"jsonrpc":"2.0","method":"host.create","params":{"host":"'${vm_uuid}'","interfaces":[{"type":1,"main":1,"useip":1,"ip":"'${ip}'","dns":"","port":"10053"}],"groups":[{"groupid":"2"}],"templates":['$templates']},"auth":"'${token}'","id":1}'
curl -s -X POST http://${zabbix_api_server_ip}:8090/zabbix/api_jsonrpc.php -H "Accept: application/json" -H "Content-Type: application/json" -d "${data}" >> /dev/null
}
vms=()
vols=()
pre_ip=""
i=1
while true;do
if ((i > vm_count))
then
if [[ $keep_running != "true" ]]
then
echo "finished!!"
break
fi
fi
next_vm=$((i%vm_count))
#check whether it's the next round
if ((i > vm_count ))
then
echo "remove the vm in previous cycle..."
nova delete ${vms[$next_vm]} >> /dev/null
sleep 5
cinder delete ${vols[$next_vm]} >> /dev/null
fi
vm_name=$name_prefix'-'$i
echo -n 'create vm '$vm_name
vm_id=$(nova boot --flavor $flavor --image $image --nic net-id=$net $vm_name |awk '{print $2 " " $4}'|grep -w id|awk '{print $2}')
# progress bar
for j in $(seq 5)
do
echo -n "."
sleep 1
done
for j in $(seq 40)
do
s=$(nova show $vm_id |grep OS-EXT-STS:vm_state |awk '{print $4}')
if [ "$s" = "active" ]
then
echo 'sucessed!!'
break
fi
for m in $(seq 5)
do
echo -n "."
sleep 1
done
done
if [ "$s" != "active" ]
then
echo 'failed'
exit 1
fi
vms[$next_vm]=$vm_id
vm_ip=$(nova show $vm_id |grep network |awk '{print $5}')
echo "create monitor...."
create_vm_monitor $vm_id $vm_ip $zb_server
echo -n "waiting for the ssh to be availale"
ssh_failed="true"
for j in $(seq 60)
do
echo -n "."
ip netns exec qdhcp-$net nmap $vm_ip -PN -p ssh 2>&1 | grep open >> /dev/null
result=$?
if [[ $result -eq 0 ]]; then
echo
echo "SSH OK"
ssh_failed="false"
break
fi
sleep 1
done
if [[ $ssh_failed == "true" ]]; then
echo "SSH Failed"
exit 1
fi
#create volume
vol_name='vol-'$vm_name
echo -n 'create volume '$vol_name
vol_id=$(cinder create --name $vol_name $vol_size |grep -w id |awk '{print $4}')
# progress bar
for j in $(seq 3)
do
echo -n "."
sleep 1
done
for j in $(seq 20)
do
s=$(cinder show $vol_id |awk '{print $2$4}' |grep '^status')
if [ "$s" = "statusavailable" ]
then
echo 'sucessed!!'
break
fi
for m in $(seq 3)
do
echo -n "."
sleep 1
done
done
if [ "$s" != "statusavailable" ]
then
echo 'failed'
exit 1
fi
vols[$next_vm]=$vol_id
echo 'attaching volume....'
nova volume-attach $vm_id $vol_id >>/dev/null
echo 'mounting volume.....'
sed -i /$vm_ip/d /root/.ssh/known_hosts
./set_trust.sh $vm_ip $net $vm_password >> /dev/null
echo $pre_ip > addons/ips.txt
ip netns exec qdhcp-$net scp addons/* root@$vm_ip:/root/ >>/dev/null
ip netns exec qdhcp-$net ssh root@$vm_ip 'sh mount-vol.sh' >>/dev/null
ip netns exec qdhcp-$net ssh root@$vm_ip 'rpm -ivh stress-1.0.2-1.el6.rf.x86_64.rpm' >>/dev/null
ip netns exec qdhcp-$net ssh root@$vm_ip 'bash async_job.sh' >>/dev/null
echo
pre_ip=$vm_ip
((i++))
if [[ $slow_down > 0 ]]
then
sl=$slow_down
if [[ $randomly_slow_down == "true" ]]
then
sl=$(($RANDOM%slow_down))
fi
if [[ $sl > 0 ]]
then
echo -n "slow down the process("$sl"s)"
for m in $(seq $sl)
do
echo -n "."
sleep 1
done
echo
echo
fi
fi
done