blob: cff29d2e3e8d8786355effd0b10222f236251994 [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
55# Import exercise configuration
56source $TOP_DIR/exerciserc
57
58# If quantum is not enabled we exit with exitcode 55 which mean
59# exercise is skipped.
60is_service_enabled quantum && is_service_enabled q-agt && is_service_enabled q-dhcp || exit 55
61
62#------------------------------------------------------------------------------
63# Test settings for quantum
64#------------------------------------------------------------------------------
65
66TENANTS="DEMO1"
67# TODO (nati)_Test public network
68#TENANTS="DEMO1,DEMO2"
69
70PUBLIC_NAME="admin"
71DEMO1_NAME="demo1"
72DEMO2_NAME="demo2"
73
74PUBLIC_NUM_NET=1
75DEMO1_NUM_NET=1
76DEMO2_NUM_NET=2
77
78PUBLIC_NET1_CIDR="200.0.0.0/24"
79DEMO1_NET1_CIDR="190.0.0.0/24"
80DEMO2_NET1_CIDR="191.0.0.0/24"
81DEMO2_NET2_CIDR="191.0.1.0/24"
82
83PUBLIC_NET1_GATEWAY="200.0.0.1"
84DEMO1_NET1_GATEWAY="190.0.0.1"
85DEMO2_NET1_GATEWAY="191.0.0.1"
86DEMO2_NET2_GATEWAY="191.0.1.1"
87
88PUBLIC_NUM_VM=1
89DEMO1_NUM_VM=1
90DEMO2_NUM_VM=2
91
92PUBLIC_VM1_NET='admin-net1'
93DEMO1_VM1_NET='demo1-net1'
94# Multinic settings. But this is fail without nic setting in OS image
95DEMO2_VM1_NET='demo2-net1'
96DEMO2_VM2_NET='demo2-net2'
97
98PUBLIC_NUM_ROUTER=1
99DEMO1_NUM_ROUTER=1
100DEMO2_NUM_ROUTER=1
101
102PUBLIC_ROUTER1_NET="admin-net1"
103DEMO1_ROUTER1_NET="demo1-net1"
104DEMO2_ROUTER1_NET="demo2-net1"
105
106#------------------------------------------------------------------------------
107# Keystone settings.
108#------------------------------------------------------------------------------
109KEYSTONE="keystone"
110
111#------------------------------------------------------------------------------
112# Get a token for clients that don't support service catalog
113#------------------------------------------------------------------------------
114
115# manually create a token by querying keystone (sending JSON data). Keystone
116# returns a token and catalog of endpoints. We use python to parse the token
117# and save it.
118
119TOKEN=`keystone token-get | grep ' id ' | awk '{print $4}'`
120
121#------------------------------------------------------------------------------
122# Various functions.
123#------------------------------------------------------------------------------
124function foreach_tenant {
125 COMMAND=$1
126 for TENANT in ${TENANTS//,/ };do
127 eval ${COMMAND//%TENANT%/$TENANT}
128 done
129}
130
131function foreach_tenant_resource {
132 COMMAND=$1
133 RESOURCE=$2
134 for TENANT in ${TENANTS//,/ };do
135 eval 'NUM=$'"${TENANT}_NUM_$RESOURCE"
136 for i in `seq $NUM`;do
137 local COMMAND_LOCAL=${COMMAND//%TENANT%/$TENANT}
138 COMMAND_LOCAL=${COMMAND_LOCAL//%NUM%/$i}
139 eval $COMMAND_LOCAL
140 done
141 done
142}
143
144function foreach_tenant_vm {
145 COMMAND=$1
146 foreach_tenant_resource "$COMMAND" 'VM'
147}
148
149function foreach_tenant_net {
150 COMMAND=$1
151 foreach_tenant_resource "$COMMAND" 'NET'
152}
153
154function get_image_id {
155 local IMAGE_ID=$(glance image-list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1)
156 echo "$IMAGE_ID"
157}
158
159function get_tenant_id {
160 local TENANT_NAME=$1
161 local TENANT_ID=`keystone tenant-list | grep " $TENANT_NAME " | head -n 1 | get_field 1`
162 echo "$TENANT_ID"
163}
164
165function get_user_id {
166 local USER_NAME=$1
167 local USER_ID=`keystone user-list | grep $USER_NAME | awk '{print $2}'`
168 echo "$USER_ID"
169}
170
171function get_role_id {
172 local ROLE_NAME=$1
173 local ROLE_ID=`keystone role-list | grep $ROLE_NAME | awk '{print $2}'`
174 echo "$ROLE_ID"
175}
176
177function get_network_id {
178 local NETWORK_NAME="$1"
179 local NETWORK_ID=`quantum net-list -F id -- --name=$NETWORK_NAME | awk "NR==4" | awk '{print $2}'`
180 echo $NETWORK_ID
181}
182
183function get_flavor_id {
184 local INSTANCE_TYPE=$1
185 local FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'`
186 echo "$FLAVOR_ID"
187}
188
189function confirm_server_active {
190 local VM_UUID=$1
191 if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova --no_cache show $VM_UUID | grep status | grep -q ACTIVE; do sleep 1; done"; then
192 echo "server '$VM_UUID' did not become active!"
193 false
194fi
195
196}
197
198function add_tenant {
199 local TENANT=$1
200 local USER=$2
201
202 $KEYSTONE tenant-create --name=$TENANT
203 $KEYSTONE user-create --name=$USER --pass=${ADMIN_PASSWORD}
204
205 local USER_ID=$(get_user_id $USER)
206 local TENANT_ID=$(get_tenant_id $TENANT)
207
208 $KEYSTONE user-role-add --user-id $USER_ID --role-id $(get_role_id Member) --tenant-id $TENANT_ID
209}
210
211function remove_tenant {
212 local TENANT=$1
213 local TENANT_ID=$(get_tenant_id $TENANT)
214
215 $KEYSTONE tenant-delete $TENANT_ID
216}
217
218function remove_user {
219 local USER=$1
220 local USER_ID=$(get_user_id $USER)
221
222 $KEYSTONE user-delete $USER_ID
223}
224
225
226
227#------------------------------------------------------------------------------
228# "Create" functions
229#------------------------------------------------------------------------------
230
231function create_tenants {
232 source $TOP_DIR/openrc admin admin
233 add_tenant demo1 demo1 demo1
234 add_tenant demo2 demo2 demo2
235}
236
237function delete_tenants_and_users {
238 source $TOP_DIR/openrc admin admin
239 remove_user demo1
240 remove_tenant demo1
241 remove_user demo2
242 remove_tenant demo2
243 echo "removed all tenants"
244}
245
246function create_network {
247 local TENANT=$1
248 local GATEWAY=$2
249 local CIDR=$3
250 local NUM=$4
251 local EXTRA=$5
252 local NET_NAME="${TENANT}-net$NUM"
253 local ROUTER_NAME="${TENANT}-router${NUM}"
254 source $TOP_DIR/openrc admin admin
255 local TENANT_ID=$(get_tenant_id $TENANT)
256 source $TOP_DIR/openrc $TENANT $TENANT
257 local NET_ID=$(quantum net-create --tenant_id $TENANT_ID $NET_NAME $EXTRA| grep ' id ' | awk '{print $4}' )
258 quantum subnet-create --ip_version 4 --tenant_id $TENANT_ID --gateway $GATEWAY $NET_ID $CIDR
259 #T0DO(nati) comment out until l3-agent is merged
260 #local ROUTER_ID=$($QUANTUM router-create --tenant_id $TENANT_ID $ROUTER_NAME| grep ' id ' | awk '{print $4}' )
261 #for NET_NAME in ${NET_NAMES//,/ };do
262 # SUBNET_ID=`get_subnet_id $NET_NAME`
263 # $QUANTUM router-interface-create $NAME --subnet_id $SUBNET_ID
264 #done
265}
266
267function create_networks {
268 foreach_tenant_net 'create_network ${%TENANT%_NAME} ${%TENANT%_NET%NUM%_GATEWAY} ${%TENANT%_NET%NUM%_CIDR} %NUM% ${%TENANT%_NET%NUM%_EXTRA}'
269 #TODO(nati) test security group function
270 # allow ICMP for both tenant's security groups
271 #source $TOP_DIR/openrc demo1 demo1
272 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
273 #source $TOP_DIR/openrc demo2 demo2
274 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
275}
276
277function create_vm {
278 local TENANT=$1
279 local NUM=$2
280 local NET_NAMES=$3
281 source $TOP_DIR/openrc $TENANT $TENANT
282 local NIC=""
283 for NET_NAME in ${NET_NAMES//,/ };do
284 NIC="$NIC --nic net-id="`get_network_id $NET_NAME`
285 done
286 #TODO (nati) Add multi-nic test
287 #TODO (nati) Add public-net test
288 local VM_UUID=`nova --no_cache boot --flavor $(get_flavor_id m1.tiny) \
289 --image $(get_image_id) \
290 $NIC \
291 $TENANT-server$NUM | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
292 die_if_not_set VM_UUID "Failure launching $TENANT-server$NUM" VM_UUID
293 confirm_server_active $VM_UUID
294}
295
296function create_vms {
297 foreach_tenant_vm 'create_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
298}
299
300function ping_ip {
301 # Test agent connection. Assumes namespaces are disabled, and
302 # that DHCP is in use, but not L3
303 local VM_NAME=$1
304 IP=`nova --no_cache show $VM_NAME | grep 'network' | awk '{print $5}'`
305 if ! timeout $BOOT_TIMEOUT sh -c "while ! ping -c1 -w1 $IP; do sleep 1; done"; then
306 echo "Could not ping $VM_NAME"
307 false
308 fi
309}
310
311function check_vm {
312 local TENANT=$1
313 local NUM=$2
314 local VM_NAME="$TENANT-server$NUM"
315 source $TOP_DIR/openrc $TENANT $TENANT
316 ping_ip $VM_NAME
317 # TODO (nati) test ssh connection
318 # TODO (nati) test inter connection between vm
319 # TODO (nati) test namespace dhcp
320 # TODO (nati) test dhcp host routes
321 # TODO (nati) test multi-nic
322 # TODO (nati) use test-agent
323 # TODO (nati) test L3 forwarding
324 # TODO (nati) test floating ip
325 # TODO (nati) test security group
326}
327
328function check_vms {
329 foreach_tenant_vm 'check_vm ${%TENANT%_NAME} %NUM%'
330}
331
332function shutdown_vm {
333 local TENANT=$1
334 local NUM=$2
335 source $TOP_DIR/openrc $TENANT $TENANT
336 VM_NAME=${TENANT}-server$NUM
337 nova --no_cache delete $VM_NAME
338}
339
340function shutdown_vms {
341 foreach_tenant_vm 'shutdown_vm ${%TENANT%_NAME} %NUM%'
342 if ! timeout $TERMINATE_TIMEOUT sh -c "while nova --no_cache list | grep -q ACTIVE; do sleep 1; done"; then
343 echo "Some VMs failed to shutdown"
344 false
345 fi
346}
347
348function delete_network {
349 local TENANT=$1
350 source $TOP_DIR/openrc admin admin
351 local TENANT_ID=$(get_tenant_id $TENANT)
352 #TODO(nati) comment out until l3-agent merged
353 #for res in port subnet net router;do
354 for res in port subnet net;do
355 quantum ${res}-list -F id -F tenant_id | grep $TENANT_ID | awk '{print $2}' | xargs -I % quantum ${res}-delete %
356 done
357}
358
359function delete_networks {
360 foreach_tenant 'delete_network ${%TENANT%_NAME}'
361 #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
477#-------------------------------------------------------------------------------
478# Kick off script.
479#-------------------------------------------------------------------------------
480echo $*
481main $*
482
483set +o xtrace
484echo "*********************************************************************"
485echo "SUCCESS: End DevStack Exercise: $0"
486echo "*********************************************************************"