blob: 2ee82ff21627c5fc3cf62267fa5cdb72cf9c0338 [file] [log] [blame]
Dan Wendlandtea23e682012-08-22 05:53:17 -07001#!/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.
15
16set -o errtrace
17trap failed ERR
18failed() {
19 local r=$?
20 set +o errtrace
21 set +o xtrace
22 echo "Failed to execute"
23 echo "Starting cleanup..."
24 delete_all
25 echo "Finished cleanup"
26 exit $r
27}
28
29# Print the commands being run so that we can see the command that triggers
30# an error. It is also useful for following allowing as the install occurs.
31set -o xtrace
32
33#------------------------------------------------------------------------------
34# Quantum config check
35#------------------------------------------------------------------------------
36# Warn if quantum is not enabled
37if [[ ! "$ENABLED_SERVICES" =~ "q-svc" ]]; then
38 echo "WARNING: Running quantum test without enabling quantum"
39fi
40
41#------------------------------------------------------------------------------
42# Environment
43#------------------------------------------------------------------------------
44
45# Keep track of the current directory
46EXERCISE_DIR=$(cd $(dirname "$0") && pwd)
47TOP_DIR=$(cd $EXERCISE_DIR/..; pwd)
48
49# Import common functions
50source $TOP_DIR/functions
51
52# Import configuration
53source $TOP_DIR/openrc
54
Dan Wendlandtea23e682012-08-22 05:53:17 -070055# If quantum is not enabled we exit with exitcode 55 which mean
56# exercise is skipped.
57is_service_enabled quantum && is_service_enabled q-agt && is_service_enabled q-dhcp || exit 55
58
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070059# Import quantum fucntions
60source $TOP_DIR/lib/quantum
61setup_quantum
62
63# Import exercise configuration
64source $TOP_DIR/exerciserc
65
Dan Wendlandtea23e682012-08-22 05:53:17 -070066#------------------------------------------------------------------------------
67# Test settings for quantum
68#------------------------------------------------------------------------------
69
70TENANTS="DEMO1"
71# TODO (nati)_Test public network
72#TENANTS="DEMO1,DEMO2"
73
74PUBLIC_NAME="admin"
75DEMO1_NAME="demo1"
76DEMO2_NAME="demo2"
77
78PUBLIC_NUM_NET=1
79DEMO1_NUM_NET=1
80DEMO2_NUM_NET=2
81
82PUBLIC_NET1_CIDR="200.0.0.0/24"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070083DEMO1_NET1_CIDR="10.10.0.0/24"
84DEMO2_NET1_CIDR="10.20.0.0/24"
85DEMO2_NET2_CIDR="10.20.1.0/24"
Dan Wendlandtea23e682012-08-22 05:53:17 -070086
87PUBLIC_NET1_GATEWAY="200.0.0.1"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070088DEMO1_NET1_GATEWAY="10.10.0.1"
89DEMO2_NET1_GATEWAY="10.20.0.1"
90DEMO2_NET2_GATEWAY="10.20.1.1"
Dan Wendlandtea23e682012-08-22 05:53:17 -070091
92PUBLIC_NUM_VM=1
93DEMO1_NUM_VM=1
94DEMO2_NUM_VM=2
95
96PUBLIC_VM1_NET='admin-net1'
97DEMO1_VM1_NET='demo1-net1'
98# Multinic settings. But this is fail without nic setting in OS image
99DEMO2_VM1_NET='demo2-net1'
100DEMO2_VM2_NET='demo2-net2'
101
102PUBLIC_NUM_ROUTER=1
103DEMO1_NUM_ROUTER=1
104DEMO2_NUM_ROUTER=1
105
106PUBLIC_ROUTER1_NET="admin-net1"
107DEMO1_ROUTER1_NET="demo1-net1"
108DEMO2_ROUTER1_NET="demo2-net1"
109
110#------------------------------------------------------------------------------
111# Keystone settings.
112#------------------------------------------------------------------------------
113KEYSTONE="keystone"
114
115#------------------------------------------------------------------------------
116# Get a token for clients that don't support service catalog
117#------------------------------------------------------------------------------
118
119# manually create a token by querying keystone (sending JSON data). Keystone
120# returns a token and catalog of endpoints. We use python to parse the token
121# and save it.
122
123TOKEN=`keystone token-get | grep ' id ' | awk '{print $4}'`
124
125#------------------------------------------------------------------------------
126# Various functions.
127#------------------------------------------------------------------------------
128function foreach_tenant {
129 COMMAND=$1
130 for TENANT in ${TENANTS//,/ };do
131 eval ${COMMAND//%TENANT%/$TENANT}
132 done
133}
134
135function foreach_tenant_resource {
136 COMMAND=$1
137 RESOURCE=$2
138 for TENANT in ${TENANTS//,/ };do
139 eval 'NUM=$'"${TENANT}_NUM_$RESOURCE"
140 for i in `seq $NUM`;do
141 local COMMAND_LOCAL=${COMMAND//%TENANT%/$TENANT}
142 COMMAND_LOCAL=${COMMAND_LOCAL//%NUM%/$i}
143 eval $COMMAND_LOCAL
144 done
145 done
146}
147
148function foreach_tenant_vm {
149 COMMAND=$1
150 foreach_tenant_resource "$COMMAND" 'VM'
151}
152
153function foreach_tenant_net {
154 COMMAND=$1
155 foreach_tenant_resource "$COMMAND" 'NET'
156}
157
158function get_image_id {
159 local IMAGE_ID=$(glance image-list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1)
160 echo "$IMAGE_ID"
161}
162
163function get_tenant_id {
164 local TENANT_NAME=$1
165 local TENANT_ID=`keystone tenant-list | grep " $TENANT_NAME " | head -n 1 | get_field 1`
166 echo "$TENANT_ID"
167}
168
169function get_user_id {
170 local USER_NAME=$1
171 local USER_ID=`keystone user-list | grep $USER_NAME | awk '{print $2}'`
172 echo "$USER_ID"
173}
174
175function get_role_id {
176 local ROLE_NAME=$1
177 local ROLE_ID=`keystone role-list | grep $ROLE_NAME | awk '{print $2}'`
178 echo "$ROLE_ID"
179}
180
181function get_network_id {
182 local NETWORK_NAME="$1"
183 local NETWORK_ID=`quantum net-list -F id -- --name=$NETWORK_NAME | awk "NR==4" | awk '{print $2}'`
184 echo $NETWORK_ID
185}
186
187function get_flavor_id {
188 local INSTANCE_TYPE=$1
189 local FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'`
190 echo "$FLAVOR_ID"
191}
192
193function confirm_server_active {
194 local VM_UUID=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700195 if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova show $VM_UUID | grep status | grep -q ACTIVE; do sleep 1; done"; then
Dan Wendlandtea23e682012-08-22 05:53:17 -0700196 echo "server '$VM_UUID' did not become active!"
197 false
198fi
199
200}
201
202function add_tenant {
203 local TENANT=$1
204 local USER=$2
205
206 $KEYSTONE tenant-create --name=$TENANT
207 $KEYSTONE user-create --name=$USER --pass=${ADMIN_PASSWORD}
208
209 local USER_ID=$(get_user_id $USER)
210 local TENANT_ID=$(get_tenant_id $TENANT)
211
212 $KEYSTONE user-role-add --user-id $USER_ID --role-id $(get_role_id Member) --tenant-id $TENANT_ID
213}
214
215function remove_tenant {
216 local TENANT=$1
217 local TENANT_ID=$(get_tenant_id $TENANT)
218
219 $KEYSTONE tenant-delete $TENANT_ID
220}
221
222function remove_user {
223 local USER=$1
224 local USER_ID=$(get_user_id $USER)
225
226 $KEYSTONE user-delete $USER_ID
227}
228
229
230
231#------------------------------------------------------------------------------
232# "Create" functions
233#------------------------------------------------------------------------------
234
235function create_tenants {
236 source $TOP_DIR/openrc admin admin
237 add_tenant demo1 demo1 demo1
238 add_tenant demo2 demo2 demo2
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700239 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700240}
241
242function delete_tenants_and_users {
243 source $TOP_DIR/openrc admin admin
244 remove_user demo1
245 remove_tenant demo1
246 remove_user demo2
247 remove_tenant demo2
248 echo "removed all tenants"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700249 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700250}
251
252function create_network {
253 local TENANT=$1
254 local GATEWAY=$2
255 local CIDR=$3
256 local NUM=$4
257 local EXTRA=$5
258 local NET_NAME="${TENANT}-net$NUM"
259 local ROUTER_NAME="${TENANT}-router${NUM}"
260 source $TOP_DIR/openrc admin admin
261 local TENANT_ID=$(get_tenant_id $TENANT)
262 source $TOP_DIR/openrc $TENANT $TENANT
263 local NET_ID=$(quantum net-create --tenant_id $TENANT_ID $NET_NAME $EXTRA| grep ' id ' | awk '{print $4}' )
264 quantum subnet-create --ip_version 4 --tenant_id $TENANT_ID --gateway $GATEWAY $NET_ID $CIDR
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700265 quantum-debug probe-create $NET_ID
266 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700267}
268
269function create_networks {
270 foreach_tenant_net 'create_network ${%TENANT%_NAME} ${%TENANT%_NET%NUM%_GATEWAY} ${%TENANT%_NET%NUM%_CIDR} %NUM% ${%TENANT%_NET%NUM%_EXTRA}'
271 #TODO(nati) test security group function
272 # allow ICMP for both tenant's security groups
273 #source $TOP_DIR/openrc demo1 demo1
274 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
275 #source $TOP_DIR/openrc demo2 demo2
276 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
277}
278
279function create_vm {
280 local TENANT=$1
281 local NUM=$2
282 local NET_NAMES=$3
283 source $TOP_DIR/openrc $TENANT $TENANT
284 local NIC=""
285 for NET_NAME in ${NET_NAMES//,/ };do
286 NIC="$NIC --nic net-id="`get_network_id $NET_NAME`
287 done
288 #TODO (nati) Add multi-nic test
289 #TODO (nati) Add public-net test
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700290 local VM_UUID=`nova boot --flavor $(get_flavor_id m1.tiny) \
Dan Wendlandtea23e682012-08-22 05:53:17 -0700291 --image $(get_image_id) \
292 $NIC \
293 $TENANT-server$NUM | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
294 die_if_not_set VM_UUID "Failure launching $TENANT-server$NUM" VM_UUID
295 confirm_server_active $VM_UUID
296}
297
298function create_vms {
299 foreach_tenant_vm 'create_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
300}
301
302function ping_ip {
303 # Test agent connection. Assumes namespaces are disabled, and
304 # that DHCP is in use, but not L3
305 local VM_NAME=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700306 local NET_NAME=$2
307 IP=`nova show $VM_NAME | grep 'network' | awk '{print $5}'`
308 ping_check $NET_NAME $IP $BOOT_TIMEOUT
Dan Wendlandtea23e682012-08-22 05:53:17 -0700309}
310
311function check_vm {
312 local TENANT=$1
313 local NUM=$2
314 local VM_NAME="$TENANT-server$NUM"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700315 local NET_NAME=$3
Dan Wendlandtea23e682012-08-22 05:53:17 -0700316 source $TOP_DIR/openrc $TENANT $TENANT
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700317 ping_ip $VM_NAME $NET_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700318 # TODO (nati) test ssh connection
319 # TODO (nati) test inter connection between vm
Dan Wendlandtea23e682012-08-22 05:53:17 -0700320 # TODO (nati) test dhcp host routes
321 # TODO (nati) test multi-nic
Dan Wendlandtea23e682012-08-22 05:53:17 -0700322}
323
324function check_vms {
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700325 foreach_tenant_vm 'check_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
Dan Wendlandtea23e682012-08-22 05:53:17 -0700326}
327
328function shutdown_vm {
329 local TENANT=$1
330 local NUM=$2
331 source $TOP_DIR/openrc $TENANT $TENANT
332 VM_NAME=${TENANT}-server$NUM
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700333 nova delete $VM_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700334}
335
336function shutdown_vms {
337 foreach_tenant_vm 'shutdown_vm ${%TENANT%_NAME} %NUM%'
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700338 if ! timeout $TERMINATE_TIMEOUT sh -c "while nova list | grep -q ACTIVE; do sleep 1; done"; then
Dan Wendlandtea23e682012-08-22 05:53:17 -0700339 echo "Some VMs failed to shutdown"
340 false
341 fi
342}
343
344function delete_network {
345 local TENANT=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700346 local NUM=$2
347 local NET_NAME="${TENANT}-net$NUM"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700348 source $TOP_DIR/openrc admin admin
349 local TENANT_ID=$(get_tenant_id $TENANT)
350 #TODO(nati) comment out until l3-agent merged
351 #for res in port subnet net router;do
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700352 for net_id in `quantum net-list -c id -c name | grep $NET_NAME | awk '{print $2}'`;do
353 delete_probe $net_id
354 quantum subnet-list | grep $net_id | awk '{print $2}' | xargs -I% quantum subnet-delete %
355 quantum net-delete $net_id
Dan Wendlandtea23e682012-08-22 05:53:17 -0700356 done
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700357 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700358}
359
360function delete_networks {
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700361 foreach_tenant_net 'delete_network ${%TENANT%_NAME} ${%NUM%}'
Dan Wendlandtea23e682012-08-22 05:53:17 -0700362 #TODO(nati) add secuirty group check after it is implemented
363 # source $TOP_DIR/openrc demo1 demo1
364 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
365 # source $TOP_DIR/openrc demo2 demo2
366 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
367}
368
369function create_all {
370 create_tenants
371 create_networks
372 create_vms
373}
374
375function delete_all {
376 shutdown_vms
377 delete_networks
378 delete_tenants_and_users
379}
380
381function all {
382 create_all
383 check_vms
384 delete_all
385}
386
387#------------------------------------------------------------------------------
388# Test functions.
389#------------------------------------------------------------------------------
390function test_functions {
391 IMAGE=$(get_image_id)
392 echo $IMAGE
393
394 TENANT_ID=$(get_tenant_id demo)
395 echo $TENANT_ID
396
397 FLAVOR_ID=$(get_flavor_id m1.tiny)
398 echo $FLAVOR_ID
399
400 NETWORK_ID=$(get_network_id admin)
401 echo $NETWORK_ID
402}
403
404#------------------------------------------------------------------------------
405# Usage and main.
406#------------------------------------------------------------------------------
407usage() {
408 echo "$0: [-h]"
409 echo " -h, --help Display help message"
410 echo " -t, --tenant Create tenants"
411 echo " -n, --net Create networks"
412 echo " -v, --vm Create vms"
413 echo " -c, --check Check connection"
414 echo " -x, --delete-tenants Delete tenants"
415 echo " -y, --delete-nets Delete networks"
416 echo " -z, --delete-vms Delete vms"
417 echo " -T, --test Test functions"
418}
419
420main() {
421
422 echo Description
423 echo
424 echo Copyright 2012, Cisco Systems
425 echo Copyright 2012, Nicira Networks, Inc.
426 echo Copyright 2012, NTT MCL, Inc.
427 echo
428 echo Please direct any questions to dedutta@cisco.com, dan@nicira.com, nachi@nttmcl.com
429 echo
430
431
432 if [ $# -eq 0 ] ; then
433 # if no args are provided, run all tests
434 all
435 else
436
437 while [ "$1" != "" ]; do
438 case $1 in
439 -h | --help ) usage
440 exit
441 ;;
442 -n | --net ) create_networks
443 exit
444 ;;
445 -v | --vm ) create_vms
446 exit
447 ;;
448 -t | --tenant ) create_tenants
449 exit
450 ;;
451 -c | --check ) check_vms
452 exit
453 ;;
454 -T | --test ) test_functions
455 exit
456 ;;
457 -x | --delete-tenants ) delete_tenants_and_users
458 exit
459 ;;
460 -y | --delete-nets ) delete_networks
461 exit
462 ;;
463 -z | --delete-vms ) shutdown_vms
464 exit
465 ;;
466 -a | --all ) all
467 exit
468 ;;
469 * ) usage
470 exit 1
471 esac
472 shift
473 done
474 fi
475}
476
477
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700478teardown_quantum
Dan Wendlandtea23e682012-08-22 05:53:17 -0700479#-------------------------------------------------------------------------------
480# Kick off script.
481#-------------------------------------------------------------------------------
482echo $*
483main $*
484
485set +o xtrace
486echo "*********************************************************************"
487echo "SUCCESS: End DevStack Exercise: $0"
488echo "*********************************************************************"