blob: 33ae14ea920735d4f4c665f6c62e1470dca5e1a4 [file] [log] [blame]
debo8ad03512012-02-28 17:47:26 -08001#!/usr/bin/env bash
2#
3
4# **quantum.sh**
5
6# We will use this test to perform integration testing of nova and
7# other components with Quantum.
8
9echo "*********************************************************************"
10echo "Begin DevStack Exercise: $0"
11echo "*********************************************************************"
12
13# This script exits on an error so that errors don't compound and you see
14# only the first error that occured.
15set -o errexit
16
17# Print the commands being run so that we can see the command that triggers
18# an error. It is also useful for following allowing as the install occurs.
19set -o xtrace
20
21#------------------------------------------------------------------------------
22# Quantum config check
23#------------------------------------------------------------------------------
24# Warn if quantum is not enabled
25if [[ ! "$ENABLED_SERVICES" =~ "q-svc" ]]; then
26 echo "WARNING: Running quantum test without enabling quantum"
27fi
28
29#------------------------------------------------------------------------------
30# Environment
31#------------------------------------------------------------------------------
32
33# Keep track of the current directory
34EXERCISE_DIR=$(cd $(dirname "$0") && pwd)
35TOP_DIR=$(cd $EXERCISE_DIR/..; pwd)
36
37# Import common functions
38source $TOP_DIR/functions
39
40# Import configuration
41source $TOP_DIR/openrc
42
43# Import exercise configuration
44source $TOP_DIR/exerciserc
45
46# If quantum is not enabled we exit with exitcode 55 which mean
47# exercise is skipped.
48is_service_enabled quantum || exit 55
49
50#------------------------------------------------------------------------------
51# Various default parameters.
52#------------------------------------------------------------------------------
53
54# Max time to wait while vm goes from build to active state
55ACTIVE_TIMEOUT=${ACTIVE_TIMEOUT:-30}
56
57# Max time till the vm is bootable
58BOOT_TIMEOUT=${BOOT_TIMEOUT:-60}
59
60# Max time to wait for proper association and dis-association.
61ASSOCIATE_TIMEOUT=${ASSOCIATE_TIMEOUT:-15}
62
63# Max time to wait before delete VMs and delete Networks
64VM_NET_DELETE_TIMEOUT=${VM_NET_TIMEOUT:-10}
65
66# Instance type to create
67DEFAULT_INSTANCE_TYPE=${DEFAULT_INSTANCE_TYPE:-m1.tiny}
68
69# Boot this image, use first AMi image if unset
70DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-ami}
71
72# OVS Hosts
73OVS_HOSTS=${DEFAULT_OVS_HOSTS:-"localhost"}
74
75#------------------------------------------------------------------------------
76# Nova settings.
77#------------------------------------------------------------------------------
Monty Taylor9fbeedd2012-08-17 12:52:27 -040078if [ -f /opt/stack/nova/bin/nova-manage ] ; then
79 NOVA_MANAGE=/opt/stack/nova/bin/nova-manage
80else
81 NOVA_MANAGE=/usr/local/bin/nova-manage
debo8ad03512012-02-28 17:47:26 -080082NOVA=/usr/local/bin/nova
83NOVA_CONF=/etc/nova/nova.conf
84
85#------------------------------------------------------------------------------
86# Mysql settings.
87#------------------------------------------------------------------------------
88MYSQL="/usr/bin/mysql --skip-column-name --host=$MYSQL_HOST"
89
90#------------------------------------------------------------------------------
91# Keystone settings.
92#------------------------------------------------------------------------------
93KEYSTONE="keystone"
94
95#------------------------------------------------------------------------------
96# Get a token for clients that don't support service catalog
97#------------------------------------------------------------------------------
98
99# manually create a token by querying keystone (sending JSON data). Keystone
100# returns a token and catalog of endpoints. We use python to parse the token
101# and save it.
102
103TOKEN=`keystone token-get | grep ' id ' | awk '{print $4}'`
104
105#------------------------------------------------------------------------------
106# Various functions.
107#------------------------------------------------------------------------------
108function get_image_id {
Dean Troyer255db3d2012-04-27 15:29:14 -0500109 local IMAGE_ID=$(glance image-list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1)
debo8ad03512012-02-28 17:47:26 -0800110 echo "$IMAGE_ID"
111}
112
113function get_tenant_id {
114 local TENANT_NAME=$1
115 local TENANT_ID=`keystone tenant-list | grep $TENANT_NAME | awk '{print $2}'`
116 echo "$TENANT_ID"
117}
118
119function get_user_id {
120 local USER_NAME=$1
121 local USER_ID=`keystone user-list | grep $USER_NAME | awk '{print $2}'`
122 echo "$USER_ID"
123}
124
125function get_role_id {
126 local ROLE_NAME=$1
127 local ROLE_ID=`keystone role-list | grep $ROLE_NAME | awk '{print $2}'`
128 echo "$ROLE_ID"
129}
130
131# TODO: (Debo) Change Quantum client CLI and then remove the MYSQL stuff.
132function get_network_id {
133 local NETWORK_NAME=$1
134 local QUERY="select uuid from networks where label='$NETWORK_NAME'"
135 local NETWORK_ID=`echo $QUERY | $MYSQL -u root -p$MYSQL_PASSWORD nova`
136 echo "$NETWORK_ID"
137}
138
139function get_flavor_id {
140 local INSTANCE_TYPE=$1
141 local FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'`
142 echo "$FLAVOR_ID"
143}
144
145function add_tenant {
146 local TENANT=$1
147 local USER=$3
148 local PASSWORD=$2
149
150 $KEYSTONE tenant-create --name=$TENANT
151 $KEYSTONE user-create --name=$USER --pass=${PASSWORD}
152
153 local USER_ID=$(get_user_id $USER)
154 local TENANT_ID=$(get_tenant_id $TENANT)
155
156 $KEYSTONE user-role-add --user $USER_ID --role $(get_role_id Member) --tenant_id $TENANT_ID
157 $KEYSTONE user-role-add --user $USER_ID --role $(get_role_id admin) --tenant_id $TENANT_ID
158 $KEYSTONE user-role-add --user $USER_ID --role $(get_role_id anotherrole) --tenant_id $TENANT_ID
159 #$KEYSTONE user-role-add --user $USER_ID --role $(get_role_id sysadmin) --tenant_id $TENANT_ID
160 #$KEYSTONE user-role-add --user $USER_ID --role $(get_role_id netadmin) --tenant_id $TENANT_ID
161}
162
163function remove_tenant {
164 local TENANT=$1
165 local TENANT_ID=$(get_tenant_id $TENANT)
166
167 $KEYSTONE tenant-delete $TENANT_ID
168}
169
170function remove_user {
171 local USER=$1
172 local USER_ID=$(get_user_id $USER)
173
174 $KEYSTONE user-delete $USER_ID
175}
176
177
178#------------------------------------------------------------------------------
179# "Create" functions
180#------------------------------------------------------------------------------
181
182function create_tenants {
183 add_tenant demo1 nova demo1
184 add_tenant demo2 nova demo2
185}
186
187function delete_tenants_and_users {
188 remove_tenant demo1
189 remove_tenant demo2
190 remove_user demo1
191 remove_user demo2
192}
193
194function create_networks {
195 $NOVA_MANAGE --flagfile=$NOVA_CONF network create \
196 --label=public-net1 \
197 --fixed_range_v4=11.0.0.0/24
198
199 $NOVA_MANAGE --flagfile=$NOVA_CONF network create \
200 --label=demo1-net1 \
201 --fixed_range_v4=12.0.0.0/24 \
202 --project_id=$(get_tenant_id demo1) \
203 --priority=1
204
205 $NOVA_MANAGE --flagfile=$NOVA_CONF network create \
206 --label=demo2-net1 \
207 --fixed_range_v4=13.0.0.0/24 \
208 --project_id=$(get_tenant_id demo2) \
209 --priority=1
210}
211
212function create_vms {
213 PUBLIC_NET1_ID=$(get_network_id public-net1)
214 DEMO1_NET1_ID=$(get_network_id demo1-net1)
215 DEMO2_NET1_ID=$(get_network_id demo2-net1)
216
217 export OS_TENANT_NAME=demo1
218 export OS_USERNAME=demo1
219 export OS_PASSWORD=nova
220 VM_UUID1=`$NOVA boot --flavor $(get_flavor_id m1.tiny) \
221 --image $(get_image_id) \
222 --nic net-id=$PUBLIC_NET1_ID \
223 --nic net-id=$DEMO1_NET1_ID \
224 demo1-server1 | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
225 die_if_not_set VM_UUID1 "Failure launching demo1-server1"
226
227 export OS_TENANT_NAME=demo2
228 export OS_USERNAME=demo2
229 export OS_PASSWORD=nova
230 VM_UUID2=`$NOVA boot --flavor $(get_flavor_id m1.tiny) \
231 --image $(get_image_id) \
232 --nic net-id=$PUBLIC_NET1_ID \
233 --nic net-id=$DEMO2_NET1_ID \
234 demo2-server1 | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
235 die_if_not_set VM_UUID2 "Failure launching demo2-server1"
236
237 VM_UUID3=`$NOVA boot --flavor $(get_flavor_id m1.tiny) \
238 --image $(get_image_id) \
239 --nic net-id=$PUBLIC_NET1_ID \
240 --nic net-id=$DEMO2_NET1_ID \
241 demo2-server2 | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
242 die_if_not_set VM_UUID3 "Failure launching demo2-server2"
243
244}
245
246function ping_vms {
247
248 echo "Sleeping a bit let the VMs come up"
249 sleep $ACTIVE_TIMEOUT
250
251 export OS_TENANT_NAME=demo1
252 export OS_USERNAME=demo1
253 export OS_PASSWORD=nova
254 # get the IP of the servers
255 PUBLIC_IP1=`nova show $VM_UUID1 | grep public-net1 | awk '{print $5}'`
256 export OS_TENANT_NAME=demo2
257 export OS_USERNAME=demo2
258 export OS_PASSWORD=nova
259 PUBLIC_IP2=`nova show $VM_UUID2 | grep public-net1 | awk '{print $5}'`
260
Armando Migliaccio7d13f302012-04-19 22:26:16 +0100261 MULTI_HOST=`trueorfalse False $MULTI_HOST`
262 if [ "$MULTI_HOST" = "False" ]; then
debo8ad03512012-02-28 17:47:26 -0800263 # sometimes the first ping fails (10 seconds isn't enough time for the VM's
264 # network to respond?), so let's ping for a default of 15 seconds with a
265 # timeout of a second for each ping.
266 if ! timeout $BOOT_TIMEOUT sh -c "while ! ping -c1 -w1 $PUBLIC_IP1; do sleep 1; done"; then
267 echo "Couldn't ping server"
268 exit 1
269 fi
270 if ! timeout $BOOT_TIMEOUT sh -c "while ! ping -c1 -w1 $PUBLIC_IP2; do sleep 1; done"; then
271 echo "Couldn't ping server"
272 exit 1
273 fi
274 else
275 # On a multi-host system, without vm net access, do a sleep to wait for the boot
276 sleep $BOOT_TIMEOUT
277 fi
278}
279
280function shutdown_vms {
281 export OS_TENANT_NAME=demo1
282 export OS_USERNAME=demo1
283 export OS_PASSWORD=nova
284 nova delete $VM_UUID1
285
286 export OS_TENANT_NAME=demo2
287 export OS_USERNAME=demo2
288 export OS_PASSWORD=nova
289 nova delete $VM_UUID2
290 nova delete $VM_UUID3
291
292}
293
294function delete_networks {
295 PUBLIC_NET1_ID=$(get_network_id public-net1)
296 DEMO1_NET1_ID=$(get_network_id demo1-net1)
297 DEMO2_NET1_ID=$(get_network_id demo2-net1)
298 nova-manage network delete --uuid=$PUBLIC_NET1_ID
299 nova-manage network delete --uuid=$DEMO1_NET1_ID
300 nova-manage network delete --uuid=$DEMO2_NET1_ID
301}
302
303function all {
304 create_tenants
305 create_networks
306 create_vms
307 ping_vms
308 shutdown_vms
309 delete_networks
310 delete_tenants_and_users
311}
312
313#------------------------------------------------------------------------------
314# Test functions.
315#------------------------------------------------------------------------------
316function test_functions {
317 IMAGE=$(get_image_id)
318 echo $IMAGE
319
320 TENANT_ID=$(get_tenant_id demo)
321 echo $TENANT_ID
322
323 FLAVOR_ID=$(get_flavor_id m1.tiny)
324 echo $FLAVOR_ID
325
326 NETWORK_ID=$(get_network_id private)
327 echo $NETWORK_ID
328}
329
330#------------------------------------------------------------------------------
331# Usage and main.
332#------------------------------------------------------------------------------
333usage() {
334 echo "$0: [-h]"
335 echo " -h, --help Display help message"
336 echo " -n, --net Create networks"
337 echo " -v, --vm Create vms"
338 echo " -t, --tenant Create tenants"
339 echo " -T, --test Test functions"
340}
341
342main() {
343 if [ $# -eq 0 ] ; then
344 usage
345 exit
346 fi
347
348 echo Description
349 echo
350 echo Copyright 2012, Cisco Systems
351 echo Copyright 2012, Nicira Networks, Inc.
352 echo
353 echo Please direct any questions to dedutta@cisco.com, dlapsley@nicira.com
354 echo
355
356 while [ "$1" != "" ]; do
357 case $1 in
358 -h | --help ) usage
359 exit
360 ;;
361 -n | --net ) create_networks
362 exit
363 ;;
364 -v | --vm ) create_vms
365 exit
366 ;;
367 -t | --tenant ) create_tenants
368 exit
369 ;;
370 -p | --ping ) ping_vms
371 exit
372 ;;
373 -T | --test ) test_functions
374 exit
375 ;;
376 -a | --all ) all
377 exit
378 ;;
379 * ) usage
380 exit 1
381 esac
382 shift
383 done
384}
385
386
387#-------------------------------------------------------------------------------
388# Kick off script.
389#-------------------------------------------------------------------------------
390echo $*
391main -a
392
393set +o xtrace
394echo "*********************************************************************"
395echo "SUCCESS: End DevStack Exercise: $0"
396echo "*********************************************************************"