blob: a9199e62a67367d44f5adf59fe24eae5884afa8a [file] [log] [blame]
Dan Wendlandtea23e682012-08-22 05:53:17 -07001#!/usr/bin/env bash
2#
Anita Kuno0d4bd7e2014-02-02 14:59:39 -06003# Copyright 2012, Cisco Systems
4# Copyright 2012, VMware, Inc.
5# Copyright 2012, NTT MCL, Inc.
6#
7# Please direct any questions to dedutta@cisco.com, dwendlandt@vmware.com, nachi@nttmcl.com
8#
Mark McClainb05c8762013-07-06 23:29:39 -04009# **neutron-adv-test.sh**
Dan Wendlandtea23e682012-08-22 05:53:17 -070010
Mark McClainb05c8762013-07-06 23:29:39 -040011# Perform integration testing of Nova and other components with Neutron.
Dan Wendlandtea23e682012-08-22 05:53:17 -070012
13echo "*********************************************************************"
14echo "Begin DevStack Exercise: $0"
15echo "*********************************************************************"
16
17# This script exits on an error so that errors don't compound and you see
Joe Gordon46400262013-06-30 04:32:27 -070018# only the first error that occurred.
Dan Wendlandtea23e682012-08-22 05:53:17 -070019
20set -o errtrace
Dean Troyer6d04fd72012-12-21 11:03:37 -060021
Dan Wendlandtea23e682012-08-22 05:53:17 -070022trap failed ERR
23failed() {
24 local r=$?
25 set +o errtrace
26 set +o xtrace
27 echo "Failed to execute"
28 echo "Starting cleanup..."
29 delete_all
30 echo "Finished cleanup"
31 exit $r
32}
33
34# Print the commands being run so that we can see the command that triggers
35# an error. It is also useful for following allowing as the install occurs.
36set -o xtrace
37
Dan Wendlandtea23e682012-08-22 05:53:17 -070038# Environment
Dean Troyer6d04fd72012-12-21 11:03:37 -060039# -----------
Dan Wendlandtea23e682012-08-22 05:53:17 -070040
41# Keep track of the current directory
42EXERCISE_DIR=$(cd $(dirname "$0") && pwd)
43TOP_DIR=$(cd $EXERCISE_DIR/..; pwd)
44
45# Import common functions
46source $TOP_DIR/functions
47
48# Import configuration
49source $TOP_DIR/openrc
50
Mark McClainb05c8762013-07-06 23:29:39 -040051# Import neutron functions
52source $TOP_DIR/lib/neutron
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070053
Mark McClainb05c8762013-07-06 23:29:39 -040054# If neutron is not enabled we exit with exitcode 55, which means exercise is skipped.
55neutron_plugin_check_adv_test_requirements || exit 55
armando-migliaccio7c025fe2013-05-08 11:33:07 -070056
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070057# Import exercise configuration
58source $TOP_DIR/exerciserc
59
Mark McClainb05c8762013-07-06 23:29:39 -040060# Neutron Settings
Dean Troyer6d04fd72012-12-21 11:03:37 -060061# ----------------
Dan Wendlandtea23e682012-08-22 05:53:17 -070062
63TENANTS="DEMO1"
64# TODO (nati)_Test public network
65#TENANTS="DEMO1,DEMO2"
66
67PUBLIC_NAME="admin"
68DEMO1_NAME="demo1"
69DEMO2_NAME="demo2"
70
71PUBLIC_NUM_NET=1
72DEMO1_NUM_NET=1
73DEMO2_NUM_NET=2
74
75PUBLIC_NET1_CIDR="200.0.0.0/24"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070076DEMO1_NET1_CIDR="10.10.0.0/24"
77DEMO2_NET1_CIDR="10.20.0.0/24"
78DEMO2_NET2_CIDR="10.20.1.0/24"
Dan Wendlandtea23e682012-08-22 05:53:17 -070079
80PUBLIC_NET1_GATEWAY="200.0.0.1"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070081DEMO1_NET1_GATEWAY="10.10.0.1"
82DEMO2_NET1_GATEWAY="10.20.0.1"
83DEMO2_NET2_GATEWAY="10.20.1.1"
Dan Wendlandtea23e682012-08-22 05:53:17 -070084
85PUBLIC_NUM_VM=1
86DEMO1_NUM_VM=1
87DEMO2_NUM_VM=2
88
89PUBLIC_VM1_NET='admin-net1'
90DEMO1_VM1_NET='demo1-net1'
91# Multinic settings. But this is fail without nic setting in OS image
92DEMO2_VM1_NET='demo2-net1'
93DEMO2_VM2_NET='demo2-net2'
94
95PUBLIC_NUM_ROUTER=1
96DEMO1_NUM_ROUTER=1
97DEMO2_NUM_ROUTER=1
98
99PUBLIC_ROUTER1_NET="admin-net1"
100DEMO1_ROUTER1_NET="demo1-net1"
101DEMO2_ROUTER1_NET="demo2-net1"
102
Dan Wendlandtea23e682012-08-22 05:53:17 -0700103KEYSTONE="keystone"
104
Dean Troyer6d04fd72012-12-21 11:03:37 -0600105# Manually create a token by querying keystone (sending JSON data). Keystone
Dan Wendlandtea23e682012-08-22 05:53:17 -0700106# returns a token and catalog of endpoints. We use python to parse the token
107# and save it.
108
109TOKEN=`keystone token-get | grep ' id ' | awk '{print $4}'`
DennyZhangacb52e52013-10-11 00:08:29 -0500110die_if_not_set $LINENO TOKEN "Keystone fail to get token"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700111
Dean Troyer6d04fd72012-12-21 11:03:37 -0600112# Various functions
113# -----------------
114
Dan Wendlandtea23e682012-08-22 05:53:17 -0700115function foreach_tenant {
116 COMMAND=$1
117 for TENANT in ${TENANTS//,/ };do
118 eval ${COMMAND//%TENANT%/$TENANT}
119 done
120}
121
122function foreach_tenant_resource {
123 COMMAND=$1
124 RESOURCE=$2
125 for TENANT in ${TENANTS//,/ };do
126 eval 'NUM=$'"${TENANT}_NUM_$RESOURCE"
127 for i in `seq $NUM`;do
128 local COMMAND_LOCAL=${COMMAND//%TENANT%/$TENANT}
129 COMMAND_LOCAL=${COMMAND_LOCAL//%NUM%/$i}
130 eval $COMMAND_LOCAL
131 done
132 done
133}
134
135function foreach_tenant_vm {
136 COMMAND=$1
137 foreach_tenant_resource "$COMMAND" 'VM'
138}
139
140function foreach_tenant_net {
141 COMMAND=$1
142 foreach_tenant_resource "$COMMAND" 'NET'
143}
144
145function get_image_id {
146 local IMAGE_ID=$(glance image-list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1)
DennyZhang23178a92013-10-22 17:07:32 -0500147 die_if_not_set $LINENO IMAGE_ID "Failure retrieving IMAGE_ID"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700148 echo "$IMAGE_ID"
149}
150
151function get_tenant_id {
152 local TENANT_NAME=$1
153 local TENANT_ID=`keystone tenant-list | grep " $TENANT_NAME " | head -n 1 | get_field 1`
DennyZhang23178a92013-10-22 17:07:32 -0500154 die_if_not_set $LINENO TENANT_ID "Failure retrieving TENANT_ID for $TENANT_NAME"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700155 echo "$TENANT_ID"
156}
157
158function get_user_id {
159 local USER_NAME=$1
160 local USER_ID=`keystone user-list | grep $USER_NAME | awk '{print $2}'`
DennyZhang23178a92013-10-22 17:07:32 -0500161 die_if_not_set $LINENO USER_ID "Failure retrieving USER_ID for $USER_NAME"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700162 echo "$USER_ID"
163}
164
165function get_role_id {
166 local ROLE_NAME=$1
167 local ROLE_ID=`keystone role-list | grep $ROLE_NAME | awk '{print $2}'`
DennyZhang23178a92013-10-22 17:07:32 -0500168 die_if_not_set $LINENO ROLE_ID "Failure retrieving ROLE_ID for $ROLE_NAME"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700169 echo "$ROLE_ID"
170}
171
172function get_network_id {
173 local NETWORK_NAME="$1"
Mark McClainb05c8762013-07-06 23:29:39 -0400174 local NETWORK_ID=`neutron net-list -F id -- --name=$NETWORK_NAME | awk "NR==4" | awk '{print $2}'`
Dan Wendlandtea23e682012-08-22 05:53:17 -0700175 echo $NETWORK_ID
176}
177
178function get_flavor_id {
179 local INSTANCE_TYPE=$1
180 local FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'`
DennyZhang23178a92013-10-22 17:07:32 -0500181 die_if_not_set $LINENO FLAVOR_ID "Failure retrieving FLAVOR_ID for $INSTANCE_TYPE"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700182 echo "$FLAVOR_ID"
183}
184
185function confirm_server_active {
186 local VM_UUID=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700187 if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova show $VM_UUID | grep status | grep -q ACTIVE; do sleep 1; done"; then
Dean Troyer6d04fd72012-12-21 11:03:37 -0600188 echo "server '$VM_UUID' did not become active!"
189 false
190 fi
Dan Wendlandtea23e682012-08-22 05:53:17 -0700191}
192
Jakub Libosvar52a7b6e2014-01-14 18:52:51 +0100193function neutron_debug_admin {
194 local os_username=$OS_USERNAME
195 local os_tenant_id=$OS_TENANT_ID
196 source $TOP_DIR/openrc admin admin
197 neutron-debug $@
198 source $TOP_DIR/openrc $os_username $os_tenant_id
199}
200
Dan Wendlandtea23e682012-08-22 05:53:17 -0700201function 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)
Dan Wendlandtea23e682012-08-22 05:53:17 -0700217 $KEYSTONE tenant-delete $TENANT_ID
218}
219
220function remove_user {
221 local USER=$1
222 local USER_ID=$(get_user_id $USER)
Dan Wendlandtea23e682012-08-22 05:53:17 -0700223 $KEYSTONE user-delete $USER_ID
224}
225
Dan Wendlandtea23e682012-08-22 05:53:17 -0700226function create_tenants {
227 source $TOP_DIR/openrc admin admin
228 add_tenant demo1 demo1 demo1
229 add_tenant demo2 demo2 demo2
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700230 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700231}
232
233function delete_tenants_and_users {
234 source $TOP_DIR/openrc admin admin
235 remove_user demo1
236 remove_tenant demo1
237 remove_user demo2
238 remove_tenant demo2
239 echo "removed all tenants"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700240 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700241}
242
243function create_network {
244 local TENANT=$1
245 local GATEWAY=$2
246 local CIDR=$3
247 local NUM=$4
248 local EXTRA=$5
249 local NET_NAME="${TENANT}-net$NUM"
250 local ROUTER_NAME="${TENANT}-router${NUM}"
251 source $TOP_DIR/openrc admin admin
252 local TENANT_ID=$(get_tenant_id $TENANT)
253 source $TOP_DIR/openrc $TENANT $TENANT
Dean Troyer526b79f2013-11-22 11:30:44 -0600254 local NET_ID=$(neutron net-create --tenant-id $TENANT_ID $NET_NAME $EXTRA| grep ' id ' | awk '{print $4}' )
DennyZhang23178a92013-10-22 17:07:32 -0500255 die_if_not_set $LINENO NET_ID "Failure creating NET_ID for $TENANT_ID $NET_NAME $EXTRA"
Dean Troyer526b79f2013-11-22 11:30:44 -0600256 neutron subnet-create --ip-version 4 --tenant-id $TENANT_ID --gateway $GATEWAY $NET_ID $CIDR
Jakub Libosvar52a7b6e2014-01-14 18:52:51 +0100257 neutron_debug_admin probe-create --device-owner compute $NET_ID
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700258 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700259}
260
261function create_networks {
262 foreach_tenant_net 'create_network ${%TENANT%_NAME} ${%TENANT%_NET%NUM%_GATEWAY} ${%TENANT%_NET%NUM%_CIDR} %NUM% ${%TENANT%_NET%NUM%_EXTRA}'
263 #TODO(nati) test security group function
264 # allow ICMP for both tenant's security groups
265 #source $TOP_DIR/openrc demo1 demo1
266 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
267 #source $TOP_DIR/openrc demo2 demo2
268 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
269}
270
271function create_vm {
272 local TENANT=$1
273 local NUM=$2
274 local NET_NAMES=$3
275 source $TOP_DIR/openrc $TENANT $TENANT
276 local NIC=""
277 for NET_NAME in ${NET_NAMES//,/ };do
278 NIC="$NIC --nic net-id="`get_network_id $NET_NAME`
279 done
280 #TODO (nati) Add multi-nic test
281 #TODO (nati) Add public-net test
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700282 local VM_UUID=`nova boot --flavor $(get_flavor_id m1.tiny) \
Dan Wendlandtea23e682012-08-22 05:53:17 -0700283 --image $(get_image_id) \
284 $NIC \
285 $TENANT-server$NUM | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
Nachi Ueno07115eb2013-02-26 12:38:18 -0800286 die_if_not_set $LINENO VM_UUID "Failure launching $TENANT-server$NUM"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700287 confirm_server_active $VM_UUID
288}
289
290function create_vms {
291 foreach_tenant_vm 'create_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
292}
293
294function ping_ip {
Sean Dague922c8ae2013-10-22 10:06:06 -0400295 # Test agent connection. Assumes namespaces are disabled, and
296 # that DHCP is in use, but not L3
297 local VM_NAME=$1
298 local NET_NAME=$2
299 IP=$(get_instance_ip $VM_NAME $NET_NAME)
300 ping_check $NET_NAME $IP $BOOT_TIMEOUT
Dan Wendlandtea23e682012-08-22 05:53:17 -0700301}
302
303function check_vm {
304 local TENANT=$1
305 local NUM=$2
306 local VM_NAME="$TENANT-server$NUM"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700307 local NET_NAME=$3
Dan Wendlandtea23e682012-08-22 05:53:17 -0700308 source $TOP_DIR/openrc $TENANT $TENANT
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700309 ping_ip $VM_NAME $NET_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700310 # TODO (nati) test ssh connection
311 # TODO (nati) test inter connection between vm
Dan Wendlandtea23e682012-08-22 05:53:17 -0700312 # TODO (nati) test dhcp host routes
313 # TODO (nati) test multi-nic
Dan Wendlandtea23e682012-08-22 05:53:17 -0700314}
315
316function check_vms {
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700317 foreach_tenant_vm 'check_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
Dan Wendlandtea23e682012-08-22 05:53:17 -0700318}
319
320function shutdown_vm {
321 local TENANT=$1
322 local NUM=$2
323 source $TOP_DIR/openrc $TENANT $TENANT
324 VM_NAME=${TENANT}-server$NUM
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700325 nova delete $VM_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700326}
327
328function shutdown_vms {
329 foreach_tenant_vm 'shutdown_vm ${%TENANT%_NAME} %NUM%'
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700330 if ! timeout $TERMINATE_TIMEOUT sh -c "while nova list | grep -q ACTIVE; do sleep 1; done"; then
Nachi Ueno07115eb2013-02-26 12:38:18 -0800331 die $LINENO "Some VMs failed to shutdown"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700332 fi
333}
334
335function delete_network {
336 local TENANT=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700337 local NUM=$2
338 local NET_NAME="${TENANT}-net$NUM"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700339 source $TOP_DIR/openrc admin admin
340 local TENANT_ID=$(get_tenant_id $TENANT)
341 #TODO(nati) comment out until l3-agent merged
342 #for res in port subnet net router;do
Mark McClainb05c8762013-07-06 23:29:39 -0400343 for net_id in `neutron net-list -c id -c name | grep $NET_NAME | awk '{print $2}'`;do
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700344 delete_probe $net_id
Mark McClainb05c8762013-07-06 23:29:39 -0400345 neutron subnet-list | grep $net_id | awk '{print $2}' | xargs -I% neutron subnet-delete %
346 neutron net-delete $net_id
Dan Wendlandtea23e682012-08-22 05:53:17 -0700347 done
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700348 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700349}
350
351function delete_networks {
Sean Dague922c8ae2013-10-22 10:06:06 -0400352 foreach_tenant_net 'delete_network ${%TENANT%_NAME} %NUM%'
353 # TODO(nati) add secuirty group check after it is implemented
354 # source $TOP_DIR/openrc demo1 demo1
355 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
356 # source $TOP_DIR/openrc demo2 demo2
357 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
Dan Wendlandtea23e682012-08-22 05:53:17 -0700358}
359
360function create_all {
361 create_tenants
362 create_networks
363 create_vms
364}
365
366function delete_all {
367 shutdown_vms
368 delete_networks
369 delete_tenants_and_users
370}
371
372function all {
373 create_all
374 check_vms
375 delete_all
376}
377
Dean Troyer6d04fd72012-12-21 11:03:37 -0600378# Test functions
379# --------------
380
Dan Wendlandtea23e682012-08-22 05:53:17 -0700381function test_functions {
382 IMAGE=$(get_image_id)
383 echo $IMAGE
384
385 TENANT_ID=$(get_tenant_id demo)
386 echo $TENANT_ID
387
388 FLAVOR_ID=$(get_flavor_id m1.tiny)
389 echo $FLAVOR_ID
390
391 NETWORK_ID=$(get_network_id admin)
392 echo $NETWORK_ID
393}
394
Dean Troyer6d04fd72012-12-21 11:03:37 -0600395# Usage and main
396# --------------
397
Dan Wendlandtea23e682012-08-22 05:53:17 -0700398usage() {
399 echo "$0: [-h]"
400 echo " -h, --help Display help message"
401 echo " -t, --tenant Create tenants"
402 echo " -n, --net Create networks"
403 echo " -v, --vm Create vms"
404 echo " -c, --check Check connection"
405 echo " -x, --delete-tenants Delete tenants"
406 echo " -y, --delete-nets Delete networks"
407 echo " -z, --delete-vms Delete vms"
408 echo " -T, --test Test functions"
409}
410
411main() {
412
413 echo Description
Dan Wendlandtea23e682012-08-22 05:53:17 -0700414
415 if [ $# -eq 0 ] ; then
416 # if no args are provided, run all tests
417 all
418 else
419
420 while [ "$1" != "" ]; do
421 case $1 in
422 -h | --help ) usage
423 exit
424 ;;
425 -n | --net ) create_networks
426 exit
427 ;;
428 -v | --vm ) create_vms
429 exit
430 ;;
431 -t | --tenant ) create_tenants
432 exit
433 ;;
434 -c | --check ) check_vms
435 exit
436 ;;
437 -T | --test ) test_functions
438 exit
439 ;;
440 -x | --delete-tenants ) delete_tenants_and_users
441 exit
442 ;;
443 -y | --delete-nets ) delete_networks
444 exit
445 ;;
446 -z | --delete-vms ) shutdown_vms
447 exit
448 ;;
449 -a | --all ) all
450 exit
451 ;;
452 * ) usage
453 exit 1
454 esac
455 shift
456 done
457 fi
458}
459
Dean Troyer6d04fd72012-12-21 11:03:37 -0600460# Kick off script
461# ---------------
Dan Wendlandtea23e682012-08-22 05:53:17 -0700462
Dan Wendlandtea23e682012-08-22 05:53:17 -0700463echo $*
464main $*
465
466set +o xtrace
467echo "*********************************************************************"
468echo "SUCCESS: End DevStack Exercise: $0"
469echo "*********************************************************************"