blob: 4367e2e3c117f02958a2e6d9311dfb618b54a269 [file] [log] [blame]
Dan Wendlandtea23e682012-08-22 05:53:17 -07001#!/usr/bin/env bash
2#
3
Mark McClainb05c8762013-07-06 23:29:39 -04004# **neutron-adv-test.sh**
Dan Wendlandtea23e682012-08-22 05:53:17 -07005
Mark McClainb05c8762013-07-06 23:29:39 -04006# Perform integration testing of Nova and other components with Neutron.
Dan Wendlandtea23e682012-08-22 05:53:17 -07007
8echo "*********************************************************************"
9echo "Begin DevStack Exercise: $0"
10echo "*********************************************************************"
11
12# This script exits on an error so that errors don't compound and you see
Joe Gordon46400262013-06-30 04:32:27 -070013# only the first error that occurred.
Dan Wendlandtea23e682012-08-22 05:53:17 -070014
15set -o errtrace
Dean Troyer6d04fd72012-12-21 11:03:37 -060016
Dan Wendlandtea23e682012-08-22 05:53:17 -070017trap 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
Dan Wendlandtea23e682012-08-22 05:53:17 -070033# Environment
Dean Troyer6d04fd72012-12-21 11:03:37 -060034# -----------
Dan Wendlandtea23e682012-08-22 05:53:17 -070035
36# Keep track of the current directory
37EXERCISE_DIR=$(cd $(dirname "$0") && pwd)
38TOP_DIR=$(cd $EXERCISE_DIR/..; pwd)
39
40# Import common functions
41source $TOP_DIR/functions
42
43# Import configuration
44source $TOP_DIR/openrc
45
Mark McClainb05c8762013-07-06 23:29:39 -040046# Import neutron functions
47source $TOP_DIR/lib/neutron
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070048
Mark McClainb05c8762013-07-06 23:29:39 -040049# If neutron is not enabled we exit with exitcode 55, which means exercise is skipped.
50neutron_plugin_check_adv_test_requirements || exit 55
armando-migliaccio7c025fe2013-05-08 11:33:07 -070051
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070052# Import exercise configuration
53source $TOP_DIR/exerciserc
54
Mark McClainb05c8762013-07-06 23:29:39 -040055# Neutron Settings
Dean Troyer6d04fd72012-12-21 11:03:37 -060056# ----------------
Dan Wendlandtea23e682012-08-22 05:53:17 -070057
58TENANTS="DEMO1"
59# TODO (nati)_Test public network
60#TENANTS="DEMO1,DEMO2"
61
62PUBLIC_NAME="admin"
63DEMO1_NAME="demo1"
64DEMO2_NAME="demo2"
65
66PUBLIC_NUM_NET=1
67DEMO1_NUM_NET=1
68DEMO2_NUM_NET=2
69
70PUBLIC_NET1_CIDR="200.0.0.0/24"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070071DEMO1_NET1_CIDR="10.10.0.0/24"
72DEMO2_NET1_CIDR="10.20.0.0/24"
73DEMO2_NET2_CIDR="10.20.1.0/24"
Dan Wendlandtea23e682012-08-22 05:53:17 -070074
75PUBLIC_NET1_GATEWAY="200.0.0.1"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -070076DEMO1_NET1_GATEWAY="10.10.0.1"
77DEMO2_NET1_GATEWAY="10.20.0.1"
78DEMO2_NET2_GATEWAY="10.20.1.1"
Dan Wendlandtea23e682012-08-22 05:53:17 -070079
80PUBLIC_NUM_VM=1
81DEMO1_NUM_VM=1
82DEMO2_NUM_VM=2
83
84PUBLIC_VM1_NET='admin-net1'
85DEMO1_VM1_NET='demo1-net1'
86# Multinic settings. But this is fail without nic setting in OS image
87DEMO2_VM1_NET='demo2-net1'
88DEMO2_VM2_NET='demo2-net2'
89
90PUBLIC_NUM_ROUTER=1
91DEMO1_NUM_ROUTER=1
92DEMO2_NUM_ROUTER=1
93
94PUBLIC_ROUTER1_NET="admin-net1"
95DEMO1_ROUTER1_NET="demo1-net1"
96DEMO2_ROUTER1_NET="demo2-net1"
97
Dan Wendlandtea23e682012-08-22 05:53:17 -070098KEYSTONE="keystone"
99
Dean Troyer6d04fd72012-12-21 11:03:37 -0600100# Manually create a token by querying keystone (sending JSON data). Keystone
Dan Wendlandtea23e682012-08-22 05:53:17 -0700101# returns a token and catalog of endpoints. We use python to parse the token
102# and save it.
103
104TOKEN=`keystone token-get | grep ' id ' | awk '{print $4}'`
105
Dean Troyer6d04fd72012-12-21 11:03:37 -0600106# Various functions
107# -----------------
108
Dan Wendlandtea23e682012-08-22 05:53:17 -0700109function foreach_tenant {
110 COMMAND=$1
111 for TENANT in ${TENANTS//,/ };do
112 eval ${COMMAND//%TENANT%/$TENANT}
113 done
114}
115
116function foreach_tenant_resource {
117 COMMAND=$1
118 RESOURCE=$2
119 for TENANT in ${TENANTS//,/ };do
120 eval 'NUM=$'"${TENANT}_NUM_$RESOURCE"
121 for i in `seq $NUM`;do
122 local COMMAND_LOCAL=${COMMAND//%TENANT%/$TENANT}
123 COMMAND_LOCAL=${COMMAND_LOCAL//%NUM%/$i}
124 eval $COMMAND_LOCAL
125 done
126 done
127}
128
129function foreach_tenant_vm {
130 COMMAND=$1
131 foreach_tenant_resource "$COMMAND" 'VM'
132}
133
134function foreach_tenant_net {
135 COMMAND=$1
136 foreach_tenant_resource "$COMMAND" 'NET'
137}
138
139function get_image_id {
140 local IMAGE_ID=$(glance image-list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1)
141 echo "$IMAGE_ID"
142}
143
144function get_tenant_id {
145 local TENANT_NAME=$1
146 local TENANT_ID=`keystone tenant-list | grep " $TENANT_NAME " | head -n 1 | get_field 1`
147 echo "$TENANT_ID"
148}
149
150function get_user_id {
151 local USER_NAME=$1
152 local USER_ID=`keystone user-list | grep $USER_NAME | awk '{print $2}'`
153 echo "$USER_ID"
154}
155
156function get_role_id {
157 local ROLE_NAME=$1
158 local ROLE_ID=`keystone role-list | grep $ROLE_NAME | awk '{print $2}'`
159 echo "$ROLE_ID"
160}
161
162function get_network_id {
163 local NETWORK_NAME="$1"
Mark McClainb05c8762013-07-06 23:29:39 -0400164 local NETWORK_ID=`neutron net-list -F id -- --name=$NETWORK_NAME | awk "NR==4" | awk '{print $2}'`
Dan Wendlandtea23e682012-08-22 05:53:17 -0700165 echo $NETWORK_ID
166}
167
168function get_flavor_id {
169 local INSTANCE_TYPE=$1
170 local FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'`
171 echo "$FLAVOR_ID"
172}
173
174function confirm_server_active {
175 local VM_UUID=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700176 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 -0600177 echo "server '$VM_UUID' did not become active!"
178 false
179 fi
Dan Wendlandtea23e682012-08-22 05:53:17 -0700180}
181
182function add_tenant {
183 local TENANT=$1
184 local USER=$2
185
186 $KEYSTONE tenant-create --name=$TENANT
187 $KEYSTONE user-create --name=$USER --pass=${ADMIN_PASSWORD}
188
189 local USER_ID=$(get_user_id $USER)
190 local TENANT_ID=$(get_tenant_id $TENANT)
191
192 $KEYSTONE user-role-add --user-id $USER_ID --role-id $(get_role_id Member) --tenant-id $TENANT_ID
193}
194
195function remove_tenant {
196 local TENANT=$1
197 local TENANT_ID=$(get_tenant_id $TENANT)
Dan Wendlandtea23e682012-08-22 05:53:17 -0700198 $KEYSTONE tenant-delete $TENANT_ID
199}
200
201function remove_user {
202 local USER=$1
203 local USER_ID=$(get_user_id $USER)
Dan Wendlandtea23e682012-08-22 05:53:17 -0700204 $KEYSTONE user-delete $USER_ID
205}
206
Dan Wendlandtea23e682012-08-22 05:53:17 -0700207function create_tenants {
208 source $TOP_DIR/openrc admin admin
209 add_tenant demo1 demo1 demo1
210 add_tenant demo2 demo2 demo2
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700211 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700212}
213
214function delete_tenants_and_users {
215 source $TOP_DIR/openrc admin admin
216 remove_user demo1
217 remove_tenant demo1
218 remove_user demo2
219 remove_tenant demo2
220 echo "removed all tenants"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700221 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700222}
223
224function create_network {
225 local TENANT=$1
226 local GATEWAY=$2
227 local CIDR=$3
228 local NUM=$4
229 local EXTRA=$5
230 local NET_NAME="${TENANT}-net$NUM"
231 local ROUTER_NAME="${TENANT}-router${NUM}"
232 source $TOP_DIR/openrc admin admin
233 local TENANT_ID=$(get_tenant_id $TENANT)
234 source $TOP_DIR/openrc $TENANT $TENANT
Mark McClainb05c8762013-07-06 23:29:39 -0400235 local NET_ID=$(neutron net-create --tenant_id $TENANT_ID $NET_NAME $EXTRA| grep ' id ' | awk '{print $4}' )
236 neutron subnet-create --ip_version 4 --tenant_id $TENANT_ID --gateway $GATEWAY $NET_ID $CIDR
237 neutron-debug probe-create --device-owner compute $NET_ID
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700238 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700239}
240
241function create_networks {
242 foreach_tenant_net 'create_network ${%TENANT%_NAME} ${%TENANT%_NET%NUM%_GATEWAY} ${%TENANT%_NET%NUM%_CIDR} %NUM% ${%TENANT%_NET%NUM%_EXTRA}'
243 #TODO(nati) test security group function
244 # allow ICMP for both tenant's security groups
245 #source $TOP_DIR/openrc demo1 demo1
246 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
247 #source $TOP_DIR/openrc demo2 demo2
248 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
249}
250
251function create_vm {
252 local TENANT=$1
253 local NUM=$2
254 local NET_NAMES=$3
255 source $TOP_DIR/openrc $TENANT $TENANT
256 local NIC=""
257 for NET_NAME in ${NET_NAMES//,/ };do
258 NIC="$NIC --nic net-id="`get_network_id $NET_NAME`
259 done
260 #TODO (nati) Add multi-nic test
261 #TODO (nati) Add public-net test
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700262 local VM_UUID=`nova boot --flavor $(get_flavor_id m1.tiny) \
Dan Wendlandtea23e682012-08-22 05:53:17 -0700263 --image $(get_image_id) \
264 $NIC \
265 $TENANT-server$NUM | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
Nachi Ueno07115eb2013-02-26 12:38:18 -0800266 die_if_not_set $LINENO VM_UUID "Failure launching $TENANT-server$NUM"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700267 confirm_server_active $VM_UUID
268}
269
270function create_vms {
271 foreach_tenant_vm 'create_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
272}
273
274function ping_ip {
275 # Test agent connection. Assumes namespaces are disabled, and
276 # that DHCP is in use, but not L3
277 local VM_NAME=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700278 local NET_NAME=$2
279 IP=`nova show $VM_NAME | grep 'network' | awk '{print $5}'`
280 ping_check $NET_NAME $IP $BOOT_TIMEOUT
Dan Wendlandtea23e682012-08-22 05:53:17 -0700281}
282
283function check_vm {
284 local TENANT=$1
285 local NUM=$2
286 local VM_NAME="$TENANT-server$NUM"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700287 local NET_NAME=$3
Dan Wendlandtea23e682012-08-22 05:53:17 -0700288 source $TOP_DIR/openrc $TENANT $TENANT
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700289 ping_ip $VM_NAME $NET_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700290 # TODO (nati) test ssh connection
291 # TODO (nati) test inter connection between vm
Dan Wendlandtea23e682012-08-22 05:53:17 -0700292 # TODO (nati) test dhcp host routes
293 # TODO (nati) test multi-nic
Dan Wendlandtea23e682012-08-22 05:53:17 -0700294}
295
296function check_vms {
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700297 foreach_tenant_vm 'check_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
Dan Wendlandtea23e682012-08-22 05:53:17 -0700298}
299
300function shutdown_vm {
301 local TENANT=$1
302 local NUM=$2
303 source $TOP_DIR/openrc $TENANT $TENANT
304 VM_NAME=${TENANT}-server$NUM
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700305 nova delete $VM_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700306}
307
308function shutdown_vms {
309 foreach_tenant_vm 'shutdown_vm ${%TENANT%_NAME} %NUM%'
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700310 if ! timeout $TERMINATE_TIMEOUT sh -c "while nova list | grep -q ACTIVE; do sleep 1; done"; then
Nachi Ueno07115eb2013-02-26 12:38:18 -0800311 die $LINENO "Some VMs failed to shutdown"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700312 fi
313}
314
315function delete_network {
316 local TENANT=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700317 local NUM=$2
318 local NET_NAME="${TENANT}-net$NUM"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700319 source $TOP_DIR/openrc admin admin
320 local TENANT_ID=$(get_tenant_id $TENANT)
321 #TODO(nati) comment out until l3-agent merged
322 #for res in port subnet net router;do
Mark McClainb05c8762013-07-06 23:29:39 -0400323 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 -0700324 delete_probe $net_id
Mark McClainb05c8762013-07-06 23:29:39 -0400325 neutron subnet-list | grep $net_id | awk '{print $2}' | xargs -I% neutron subnet-delete %
326 neutron net-delete $net_id
Dan Wendlandtea23e682012-08-22 05:53:17 -0700327 done
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700328 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700329}
330
331function delete_networks {
Armando Migliaccioaacb01d2013-04-03 09:31:20 -0700332 foreach_tenant_net 'delete_network ${%TENANT%_NAME} %NUM%'
Dan Wendlandtea23e682012-08-22 05:53:17 -0700333 #TODO(nati) add secuirty group check after it is implemented
334 # source $TOP_DIR/openrc demo1 demo1
335 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
336 # source $TOP_DIR/openrc demo2 demo2
337 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
338}
339
340function create_all {
341 create_tenants
342 create_networks
343 create_vms
344}
345
346function delete_all {
347 shutdown_vms
348 delete_networks
349 delete_tenants_and_users
350}
351
352function all {
353 create_all
354 check_vms
355 delete_all
356}
357
Dean Troyer6d04fd72012-12-21 11:03:37 -0600358# Test functions
359# --------------
360
Dan Wendlandtea23e682012-08-22 05:53:17 -0700361function test_functions {
362 IMAGE=$(get_image_id)
363 echo $IMAGE
364
365 TENANT_ID=$(get_tenant_id demo)
366 echo $TENANT_ID
367
368 FLAVOR_ID=$(get_flavor_id m1.tiny)
369 echo $FLAVOR_ID
370
371 NETWORK_ID=$(get_network_id admin)
372 echo $NETWORK_ID
373}
374
Dean Troyer6d04fd72012-12-21 11:03:37 -0600375# Usage and main
376# --------------
377
Dan Wendlandtea23e682012-08-22 05:53:17 -0700378usage() {
379 echo "$0: [-h]"
380 echo " -h, --help Display help message"
381 echo " -t, --tenant Create tenants"
382 echo " -n, --net Create networks"
383 echo " -v, --vm Create vms"
384 echo " -c, --check Check connection"
385 echo " -x, --delete-tenants Delete tenants"
386 echo " -y, --delete-nets Delete networks"
387 echo " -z, --delete-vms Delete vms"
388 echo " -T, --test Test functions"
389}
390
391main() {
392
393 echo Description
394 echo
395 echo Copyright 2012, Cisco Systems
396 echo Copyright 2012, Nicira Networks, Inc.
397 echo Copyright 2012, NTT MCL, Inc.
398 echo
399 echo Please direct any questions to dedutta@cisco.com, dan@nicira.com, nachi@nttmcl.com
400 echo
401
402
403 if [ $# -eq 0 ] ; then
404 # if no args are provided, run all tests
405 all
406 else
407
408 while [ "$1" != "" ]; do
409 case $1 in
410 -h | --help ) usage
411 exit
412 ;;
413 -n | --net ) create_networks
414 exit
415 ;;
416 -v | --vm ) create_vms
417 exit
418 ;;
419 -t | --tenant ) create_tenants
420 exit
421 ;;
422 -c | --check ) check_vms
423 exit
424 ;;
425 -T | --test ) test_functions
426 exit
427 ;;
428 -x | --delete-tenants ) delete_tenants_and_users
429 exit
430 ;;
431 -y | --delete-nets ) delete_networks
432 exit
433 ;;
434 -z | --delete-vms ) shutdown_vms
435 exit
436 ;;
437 -a | --all ) all
438 exit
439 ;;
440 * ) usage
441 exit 1
442 esac
443 shift
444 done
445 fi
446}
447
Dean Troyer6d04fd72012-12-21 11:03:37 -0600448# Kick off script
449# ---------------
Dan Wendlandtea23e682012-08-22 05:53:17 -0700450
Dan Wendlandtea23e682012-08-22 05:53:17 -0700451echo $*
452main $*
453
454set +o xtrace
455echo "*********************************************************************"
456echo "SUCCESS: End DevStack Exercise: $0"
457echo "*********************************************************************"