blob: 493e22393ccc34480cf952fe8f726591669f9025 [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
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070061
62# Import exercise configuration
63source $TOP_DIR/exerciserc
64
Dan Wendlandtea23e682012-08-22 05:53:17 -070065#------------------------------------------------------------------------------
66# Test settings for quantum
67#------------------------------------------------------------------------------
68
69TENANTS="DEMO1"
70# TODO (nati)_Test public network
71#TENANTS="DEMO1,DEMO2"
72
73PUBLIC_NAME="admin"
74DEMO1_NAME="demo1"
75DEMO2_NAME="demo2"
76
77PUBLIC_NUM_NET=1
78DEMO1_NUM_NET=1
79DEMO2_NUM_NET=2
80
81PUBLIC_NET1_CIDR="200.0.0.0/24"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070082DEMO1_NET1_CIDR="10.10.0.0/24"
83DEMO2_NET1_CIDR="10.20.0.0/24"
84DEMO2_NET2_CIDR="10.20.1.0/24"
Dan Wendlandtea23e682012-08-22 05:53:17 -070085
86PUBLIC_NET1_GATEWAY="200.0.0.1"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070087DEMO1_NET1_GATEWAY="10.10.0.1"
88DEMO2_NET1_GATEWAY="10.20.0.1"
89DEMO2_NET2_GATEWAY="10.20.1.1"
Dan Wendlandtea23e682012-08-22 05:53:17 -070090
91PUBLIC_NUM_VM=1
92DEMO1_NUM_VM=1
93DEMO2_NUM_VM=2
94
95PUBLIC_VM1_NET='admin-net1'
96DEMO1_VM1_NET='demo1-net1'
97# Multinic settings. But this is fail without nic setting in OS image
98DEMO2_VM1_NET='demo2-net1'
99DEMO2_VM2_NET='demo2-net2'
100
101PUBLIC_NUM_ROUTER=1
102DEMO1_NUM_ROUTER=1
103DEMO2_NUM_ROUTER=1
104
105PUBLIC_ROUTER1_NET="admin-net1"
106DEMO1_ROUTER1_NET="demo1-net1"
107DEMO2_ROUTER1_NET="demo2-net1"
108
109#------------------------------------------------------------------------------
110# Keystone settings.
111#------------------------------------------------------------------------------
112KEYSTONE="keystone"
113
114#------------------------------------------------------------------------------
115# Get a token for clients that don't support service catalog
116#------------------------------------------------------------------------------
117
118# manually create a token by querying keystone (sending JSON data). Keystone
119# returns a token and catalog of endpoints. We use python to parse the token
120# and save it.
121
122TOKEN=`keystone token-get | grep ' id ' | awk '{print $4}'`
123
124#------------------------------------------------------------------------------
125# Various functions.
126#------------------------------------------------------------------------------
127function foreach_tenant {
128 COMMAND=$1
129 for TENANT in ${TENANTS//,/ };do
130 eval ${COMMAND//%TENANT%/$TENANT}
131 done
132}
133
134function foreach_tenant_resource {
135 COMMAND=$1
136 RESOURCE=$2
137 for TENANT in ${TENANTS//,/ };do
138 eval 'NUM=$'"${TENANT}_NUM_$RESOURCE"
139 for i in `seq $NUM`;do
140 local COMMAND_LOCAL=${COMMAND//%TENANT%/$TENANT}
141 COMMAND_LOCAL=${COMMAND_LOCAL//%NUM%/$i}
142 eval $COMMAND_LOCAL
143 done
144 done
145}
146
147function foreach_tenant_vm {
148 COMMAND=$1
149 foreach_tenant_resource "$COMMAND" 'VM'
150}
151
152function foreach_tenant_net {
153 COMMAND=$1
154 foreach_tenant_resource "$COMMAND" 'NET'
155}
156
157function get_image_id {
158 local IMAGE_ID=$(glance image-list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1)
159 echo "$IMAGE_ID"
160}
161
162function get_tenant_id {
163 local TENANT_NAME=$1
164 local TENANT_ID=`keystone tenant-list | grep " $TENANT_NAME " | head -n 1 | get_field 1`
165 echo "$TENANT_ID"
166}
167
168function get_user_id {
169 local USER_NAME=$1
170 local USER_ID=`keystone user-list | grep $USER_NAME | awk '{print $2}'`
171 echo "$USER_ID"
172}
173
174function get_role_id {
175 local ROLE_NAME=$1
176 local ROLE_ID=`keystone role-list | grep $ROLE_NAME | awk '{print $2}'`
177 echo "$ROLE_ID"
178}
179
180function get_network_id {
181 local NETWORK_NAME="$1"
182 local NETWORK_ID=`quantum net-list -F id -- --name=$NETWORK_NAME | awk "NR==4" | awk '{print $2}'`
183 echo $NETWORK_ID
184}
185
186function get_flavor_id {
187 local INSTANCE_TYPE=$1
188 local FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'`
189 echo "$FLAVOR_ID"
190}
191
192function confirm_server_active {
193 local VM_UUID=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700194 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 -0700195 echo "server '$VM_UUID' did not become active!"
196 false
197fi
198
199}
200
201function add_tenant {
202 local TENANT=$1
203 local USER=$2
204
205 $KEYSTONE tenant-create --name=$TENANT
206 $KEYSTONE user-create --name=$USER --pass=${ADMIN_PASSWORD}
207
208 local USER_ID=$(get_user_id $USER)
209 local TENANT_ID=$(get_tenant_id $TENANT)
210
211 $KEYSTONE user-role-add --user-id $USER_ID --role-id $(get_role_id Member) --tenant-id $TENANT_ID
212}
213
214function remove_tenant {
215 local TENANT=$1
216 local TENANT_ID=$(get_tenant_id $TENANT)
217
218 $KEYSTONE tenant-delete $TENANT_ID
219}
220
221function remove_user {
222 local USER=$1
223 local USER_ID=$(get_user_id $USER)
224
225 $KEYSTONE user-delete $USER_ID
226}
227
228
229
230#------------------------------------------------------------------------------
231# "Create" functions
232#------------------------------------------------------------------------------
233
234function create_tenants {
235 source $TOP_DIR/openrc admin admin
236 add_tenant demo1 demo1 demo1
237 add_tenant demo2 demo2 demo2
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700238 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700239}
240
241function delete_tenants_and_users {
242 source $TOP_DIR/openrc admin admin
243 remove_user demo1
244 remove_tenant demo1
245 remove_user demo2
246 remove_tenant demo2
247 echo "removed all tenants"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700248 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700249}
250
251function create_network {
252 local TENANT=$1
253 local GATEWAY=$2
254 local CIDR=$3
255 local NUM=$4
256 local EXTRA=$5
257 local NET_NAME="${TENANT}-net$NUM"
258 local ROUTER_NAME="${TENANT}-router${NUM}"
259 source $TOP_DIR/openrc admin admin
260 local TENANT_ID=$(get_tenant_id $TENANT)
261 source $TOP_DIR/openrc $TENANT $TENANT
262 local NET_ID=$(quantum net-create --tenant_id $TENANT_ID $NET_NAME $EXTRA| grep ' id ' | awk '{print $4}' )
263 quantum subnet-create --ip_version 4 --tenant_id $TENANT_ID --gateway $GATEWAY $NET_ID $CIDR
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700264 quantum-debug probe-create $NET_ID
265 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700266}
267
268function create_networks {
269 foreach_tenant_net 'create_network ${%TENANT%_NAME} ${%TENANT%_NET%NUM%_GATEWAY} ${%TENANT%_NET%NUM%_CIDR} %NUM% ${%TENANT%_NET%NUM%_EXTRA}'
270 #TODO(nati) test security group function
271 # allow ICMP for both tenant's security groups
272 #source $TOP_DIR/openrc demo1 demo1
273 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
274 #source $TOP_DIR/openrc demo2 demo2
275 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
276}
277
278function create_vm {
279 local TENANT=$1
280 local NUM=$2
281 local NET_NAMES=$3
282 source $TOP_DIR/openrc $TENANT $TENANT
283 local NIC=""
284 for NET_NAME in ${NET_NAMES//,/ };do
285 NIC="$NIC --nic net-id="`get_network_id $NET_NAME`
286 done
287 #TODO (nati) Add multi-nic test
288 #TODO (nati) Add public-net test
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700289 local VM_UUID=`nova boot --flavor $(get_flavor_id m1.tiny) \
Dan Wendlandtea23e682012-08-22 05:53:17 -0700290 --image $(get_image_id) \
291 $NIC \
292 $TENANT-server$NUM | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
293 die_if_not_set VM_UUID "Failure launching $TENANT-server$NUM" VM_UUID
294 confirm_server_active $VM_UUID
295}
296
297function create_vms {
298 foreach_tenant_vm 'create_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
299}
300
301function ping_ip {
302 # Test agent connection. Assumes namespaces are disabled, and
303 # that DHCP is in use, but not L3
304 local VM_NAME=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700305 local NET_NAME=$2
306 IP=`nova show $VM_NAME | grep 'network' | awk '{print $5}'`
307 ping_check $NET_NAME $IP $BOOT_TIMEOUT
Dan Wendlandtea23e682012-08-22 05:53:17 -0700308}
309
310function check_vm {
311 local TENANT=$1
312 local NUM=$2
313 local VM_NAME="$TENANT-server$NUM"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700314 local NET_NAME=$3
Dan Wendlandtea23e682012-08-22 05:53:17 -0700315 source $TOP_DIR/openrc $TENANT $TENANT
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700316 ping_ip $VM_NAME $NET_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700317 # TODO (nati) test ssh connection
318 # TODO (nati) test inter connection between vm
Dan Wendlandtea23e682012-08-22 05:53:17 -0700319 # TODO (nati) test dhcp host routes
320 # TODO (nati) test multi-nic
Dan Wendlandtea23e682012-08-22 05:53:17 -0700321}
322
323function check_vms {
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700324 foreach_tenant_vm 'check_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
Dan Wendlandtea23e682012-08-22 05:53:17 -0700325}
326
327function shutdown_vm {
328 local TENANT=$1
329 local NUM=$2
330 source $TOP_DIR/openrc $TENANT $TENANT
331 VM_NAME=${TENANT}-server$NUM
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700332 nova delete $VM_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700333}
334
335function shutdown_vms {
336 foreach_tenant_vm 'shutdown_vm ${%TENANT%_NAME} %NUM%'
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700337 if ! timeout $TERMINATE_TIMEOUT sh -c "while nova list | grep -q ACTIVE; do sleep 1; done"; then
Dan Wendlandtea23e682012-08-22 05:53:17 -0700338 echo "Some VMs failed to shutdown"
339 false
340 fi
341}
342
343function delete_network {
344 local TENANT=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700345 local NUM=$2
346 local NET_NAME="${TENANT}-net$NUM"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700347 source $TOP_DIR/openrc admin admin
348 local TENANT_ID=$(get_tenant_id $TENANT)
349 #TODO(nati) comment out until l3-agent merged
350 #for res in port subnet net router;do
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700351 for net_id in `quantum net-list -c id -c name | grep $NET_NAME | awk '{print $2}'`;do
352 delete_probe $net_id
353 quantum subnet-list | grep $net_id | awk '{print $2}' | xargs -I% quantum subnet-delete %
354 quantum net-delete $net_id
Dan Wendlandtea23e682012-08-22 05:53:17 -0700355 done
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700356 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700357}
358
359function delete_networks {
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700360 foreach_tenant_net 'delete_network ${%TENANT%_NAME} ${%NUM%}'
Dan Wendlandtea23e682012-08-22 05:53:17 -0700361 #TODO(nati) add secuirty group check after it is implemented
362 # source $TOP_DIR/openrc demo1 demo1
363 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
364 # source $TOP_DIR/openrc demo2 demo2
365 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
366}
367
368function create_all {
369 create_tenants
370 create_networks
371 create_vms
372}
373
374function delete_all {
375 shutdown_vms
376 delete_networks
377 delete_tenants_and_users
378}
379
380function all {
381 create_all
382 check_vms
383 delete_all
384}
385
386#------------------------------------------------------------------------------
387# Test functions.
388#------------------------------------------------------------------------------
389function test_functions {
390 IMAGE=$(get_image_id)
391 echo $IMAGE
392
393 TENANT_ID=$(get_tenant_id demo)
394 echo $TENANT_ID
395
396 FLAVOR_ID=$(get_flavor_id m1.tiny)
397 echo $FLAVOR_ID
398
399 NETWORK_ID=$(get_network_id admin)
400 echo $NETWORK_ID
401}
402
403#------------------------------------------------------------------------------
404# Usage and main.
405#------------------------------------------------------------------------------
406usage() {
407 echo "$0: [-h]"
408 echo " -h, --help Display help message"
409 echo " -t, --tenant Create tenants"
410 echo " -n, --net Create networks"
411 echo " -v, --vm Create vms"
412 echo " -c, --check Check connection"
413 echo " -x, --delete-tenants Delete tenants"
414 echo " -y, --delete-nets Delete networks"
415 echo " -z, --delete-vms Delete vms"
416 echo " -T, --test Test functions"
417}
418
419main() {
420
421 echo Description
422 echo
423 echo Copyright 2012, Cisco Systems
424 echo Copyright 2012, Nicira Networks, Inc.
425 echo Copyright 2012, NTT MCL, Inc.
426 echo
427 echo Please direct any questions to dedutta@cisco.com, dan@nicira.com, nachi@nttmcl.com
428 echo
429
430
431 if [ $# -eq 0 ] ; then
432 # if no args are provided, run all tests
433 all
434 else
435
436 while [ "$1" != "" ]; do
437 case $1 in
438 -h | --help ) usage
439 exit
440 ;;
441 -n | --net ) create_networks
442 exit
443 ;;
444 -v | --vm ) create_vms
445 exit
446 ;;
447 -t | --tenant ) create_tenants
448 exit
449 ;;
450 -c | --check ) check_vms
451 exit
452 ;;
453 -T | --test ) test_functions
454 exit
455 ;;
456 -x | --delete-tenants ) delete_tenants_and_users
457 exit
458 ;;
459 -y | --delete-nets ) delete_networks
460 exit
461 ;;
462 -z | --delete-vms ) shutdown_vms
463 exit
464 ;;
465 -a | --all ) all
466 exit
467 ;;
468 * ) usage
469 exit 1
470 esac
471 shift
472 done
473 fi
474}
475
476
Dan Wendlandtea23e682012-08-22 05:53:17 -0700477#-------------------------------------------------------------------------------
478# Kick off script.
479#-------------------------------------------------------------------------------
480echo $*
481main $*
482
483set +o xtrace
484echo "*********************************************************************"
485echo "SUCCESS: End DevStack Exercise: $0"
486echo "*********************************************************************"