blob: 6679670aeefdbc618408638554bfb7c05d460e0a [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
Ian Wienandaee18c72014-02-21 15:35:08 +110023function failed {
Dan Wendlandtea23e682012-08-22 05:53:17 -070024 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
Dean Troyer6d04fd72012-12-21 11:03:37 -0600103# Various functions
104# -----------------
105
Dan Wendlandtea23e682012-08-22 05:53:17 -0700106function foreach_tenant {
107 COMMAND=$1
108 for TENANT in ${TENANTS//,/ };do
109 eval ${COMMAND//%TENANT%/$TENANT}
110 done
111}
112
113function foreach_tenant_resource {
114 COMMAND=$1
115 RESOURCE=$2
116 for TENANT in ${TENANTS//,/ };do
117 eval 'NUM=$'"${TENANT}_NUM_$RESOURCE"
118 for i in `seq $NUM`;do
119 local COMMAND_LOCAL=${COMMAND//%TENANT%/$TENANT}
120 COMMAND_LOCAL=${COMMAND_LOCAL//%NUM%/$i}
121 eval $COMMAND_LOCAL
122 done
123 done
124}
125
126function foreach_tenant_vm {
127 COMMAND=$1
128 foreach_tenant_resource "$COMMAND" 'VM'
129}
130
131function foreach_tenant_net {
132 COMMAND=$1
133 foreach_tenant_resource "$COMMAND" 'NET'
134}
135
136function get_image_id {
137 local IMAGE_ID=$(glance image-list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1)
DennyZhang23178a92013-10-22 17:07:32 -0500138 die_if_not_set $LINENO IMAGE_ID "Failure retrieving IMAGE_ID"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700139 echo "$IMAGE_ID"
140}
141
142function get_tenant_id {
143 local TENANT_NAME=$1
Steve Martinelli2a09d0c2014-03-14 00:33:58 -0500144 local TENANT_ID=`openstack project list | grep " $TENANT_NAME " | head -n 1 | get_field 1`
DennyZhang23178a92013-10-22 17:07:32 -0500145 die_if_not_set $LINENO TENANT_ID "Failure retrieving TENANT_ID for $TENANT_NAME"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700146 echo "$TENANT_ID"
147}
148
149function get_user_id {
150 local USER_NAME=$1
Steve Martinelli2a09d0c2014-03-14 00:33:58 -0500151 local USER_ID=`openstack user list | grep $USER_NAME | awk '{print $2}'`
DennyZhang23178a92013-10-22 17:07:32 -0500152 die_if_not_set $LINENO USER_ID "Failure retrieving USER_ID for $USER_NAME"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700153 echo "$USER_ID"
154}
155
156function get_role_id {
157 local ROLE_NAME=$1
Steve Martinelli2a09d0c2014-03-14 00:33:58 -0500158 local ROLE_ID=`openstack role list | grep $ROLE_NAME | awk '{print $2}'`
DennyZhang23178a92013-10-22 17:07:32 -0500159 die_if_not_set $LINENO ROLE_ID "Failure retrieving ROLE_ID for $ROLE_NAME"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700160 echo "$ROLE_ID"
161}
162
163function get_network_id {
164 local NETWORK_NAME="$1"
Mark McClainb05c8762013-07-06 23:29:39 -0400165 local NETWORK_ID=`neutron net-list -F id -- --name=$NETWORK_NAME | awk "NR==4" | awk '{print $2}'`
Dan Wendlandtea23e682012-08-22 05:53:17 -0700166 echo $NETWORK_ID
167}
168
169function get_flavor_id {
170 local INSTANCE_TYPE=$1
171 local FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'`
DennyZhang23178a92013-10-22 17:07:32 -0500172 die_if_not_set $LINENO FLAVOR_ID "Failure retrieving FLAVOR_ID for $INSTANCE_TYPE"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700173 echo "$FLAVOR_ID"
174}
175
176function confirm_server_active {
177 local VM_UUID=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700178 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 -0600179 echo "server '$VM_UUID' did not become active!"
180 false
181 fi
Dan Wendlandtea23e682012-08-22 05:53:17 -0700182}
183
Jakub Libosvar52a7b6e2014-01-14 18:52:51 +0100184function neutron_debug_admin {
185 local os_username=$OS_USERNAME
186 local os_tenant_id=$OS_TENANT_ID
187 source $TOP_DIR/openrc admin admin
188 neutron-debug $@
189 source $TOP_DIR/openrc $os_username $os_tenant_id
190}
191
Dan Wendlandtea23e682012-08-22 05:53:17 -0700192function add_tenant {
Steve Martinelli2a09d0c2014-03-14 00:33:58 -0500193 openstack project create $1
194 openstack user create $2 --password ${ADMIN_PASSWORD} --project $1
195 openstack role add Member --project $1 --user $2
Dan Wendlandtea23e682012-08-22 05:53:17 -0700196}
197
198function remove_tenant {
199 local TENANT=$1
200 local TENANT_ID=$(get_tenant_id $TENANT)
Steve Martinelli2a09d0c2014-03-14 00:33:58 -0500201 openstack project delete $TENANT_ID
Dan Wendlandtea23e682012-08-22 05:53:17 -0700202}
203
204function remove_user {
205 local USER=$1
206 local USER_ID=$(get_user_id $USER)
Steve Martinelli2a09d0c2014-03-14 00:33:58 -0500207 openstack user delete $USER_ID
Dan Wendlandtea23e682012-08-22 05:53:17 -0700208}
209
Dan Wendlandtea23e682012-08-22 05:53:17 -0700210function create_tenants {
211 source $TOP_DIR/openrc admin admin
212 add_tenant demo1 demo1 demo1
213 add_tenant demo2 demo2 demo2
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700214 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700215}
216
217function delete_tenants_and_users {
218 source $TOP_DIR/openrc admin admin
219 remove_user demo1
220 remove_tenant demo1
221 remove_user demo2
222 remove_tenant demo2
223 echo "removed all tenants"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700224 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700225}
226
227function create_network {
228 local TENANT=$1
229 local GATEWAY=$2
230 local CIDR=$3
231 local NUM=$4
232 local EXTRA=$5
233 local NET_NAME="${TENANT}-net$NUM"
234 local ROUTER_NAME="${TENANT}-router${NUM}"
235 source $TOP_DIR/openrc admin admin
236 local TENANT_ID=$(get_tenant_id $TENANT)
237 source $TOP_DIR/openrc $TENANT $TENANT
Dean Troyer526b79f2013-11-22 11:30:44 -0600238 local NET_ID=$(neutron net-create --tenant-id $TENANT_ID $NET_NAME $EXTRA| grep ' id ' | awk '{print $4}' )
DennyZhang23178a92013-10-22 17:07:32 -0500239 die_if_not_set $LINENO NET_ID "Failure creating NET_ID for $TENANT_ID $NET_NAME $EXTRA"
Dean Troyer526b79f2013-11-22 11:30:44 -0600240 neutron subnet-create --ip-version 4 --tenant-id $TENANT_ID --gateway $GATEWAY $NET_ID $CIDR
Jakub Libosvar52a7b6e2014-01-14 18:52:51 +0100241 neutron_debug_admin probe-create --device-owner compute $NET_ID
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700242 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700243}
244
245function create_networks {
246 foreach_tenant_net 'create_network ${%TENANT%_NAME} ${%TENANT%_NET%NUM%_GATEWAY} ${%TENANT%_NET%NUM%_CIDR} %NUM% ${%TENANT%_NET%NUM%_EXTRA}'
247 #TODO(nati) test security group function
248 # allow ICMP for both tenant's security groups
249 #source $TOP_DIR/openrc demo1 demo1
250 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
251 #source $TOP_DIR/openrc demo2 demo2
252 #$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
253}
254
255function create_vm {
256 local TENANT=$1
257 local NUM=$2
258 local NET_NAMES=$3
259 source $TOP_DIR/openrc $TENANT $TENANT
260 local NIC=""
261 for NET_NAME in ${NET_NAMES//,/ };do
262 NIC="$NIC --nic net-id="`get_network_id $NET_NAME`
263 done
264 #TODO (nati) Add multi-nic test
265 #TODO (nati) Add public-net test
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700266 local VM_UUID=`nova boot --flavor $(get_flavor_id m1.tiny) \
Dan Wendlandtea23e682012-08-22 05:53:17 -0700267 --image $(get_image_id) \
268 $NIC \
269 $TENANT-server$NUM | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
Nachi Ueno07115eb2013-02-26 12:38:18 -0800270 die_if_not_set $LINENO VM_UUID "Failure launching $TENANT-server$NUM"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700271 confirm_server_active $VM_UUID
272}
273
274function create_vms {
275 foreach_tenant_vm 'create_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
276}
277
278function ping_ip {
Sean Dague922c8ae2013-10-22 10:06:06 -0400279 # Test agent connection. Assumes namespaces are disabled, and
280 # that DHCP is in use, but not L3
281 local VM_NAME=$1
282 local NET_NAME=$2
283 IP=$(get_instance_ip $VM_NAME $NET_NAME)
284 ping_check $NET_NAME $IP $BOOT_TIMEOUT
Dan Wendlandtea23e682012-08-22 05:53:17 -0700285}
286
287function check_vm {
288 local TENANT=$1
289 local NUM=$2
290 local VM_NAME="$TENANT-server$NUM"
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700291 local NET_NAME=$3
Dan Wendlandtea23e682012-08-22 05:53:17 -0700292 source $TOP_DIR/openrc $TENANT $TENANT
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700293 ping_ip $VM_NAME $NET_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700294 # TODO (nati) test ssh connection
295 # TODO (nati) test inter connection between vm
Dan Wendlandtea23e682012-08-22 05:53:17 -0700296 # TODO (nati) test dhcp host routes
297 # TODO (nati) test multi-nic
Dan Wendlandtea23e682012-08-22 05:53:17 -0700298}
299
300function check_vms {
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700301 foreach_tenant_vm 'check_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}'
Dan Wendlandtea23e682012-08-22 05:53:17 -0700302}
303
304function shutdown_vm {
305 local TENANT=$1
306 local NUM=$2
307 source $TOP_DIR/openrc $TENANT $TENANT
308 VM_NAME=${TENANT}-server$NUM
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700309 nova delete $VM_NAME
Dan Wendlandtea23e682012-08-22 05:53:17 -0700310}
311
312function shutdown_vms {
313 foreach_tenant_vm 'shutdown_vm ${%TENANT%_NAME} %NUM%'
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700314 if ! timeout $TERMINATE_TIMEOUT sh -c "while nova list | grep -q ACTIVE; do sleep 1; done"; then
Nachi Ueno07115eb2013-02-26 12:38:18 -0800315 die $LINENO "Some VMs failed to shutdown"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700316 fi
317}
318
319function delete_network {
320 local TENANT=$1
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700321 local NUM=$2
322 local NET_NAME="${TENANT}-net$NUM"
Dan Wendlandtea23e682012-08-22 05:53:17 -0700323 source $TOP_DIR/openrc admin admin
324 local TENANT_ID=$(get_tenant_id $TENANT)
325 #TODO(nati) comment out until l3-agent merged
326 #for res in port subnet net router;do
Mark McClainb05c8762013-07-06 23:29:39 -0400327 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 -0700328 delete_probe $net_id
Mark McClainb05c8762013-07-06 23:29:39 -0400329 neutron subnet-list | grep $net_id | awk '{print $2}' | xargs -I% neutron subnet-delete %
330 neutron net-delete $net_id
Dan Wendlandtea23e682012-08-22 05:53:17 -0700331 done
Nachi Ueno5db5bfa2012-10-29 11:25:29 -0700332 source $TOP_DIR/openrc demo demo
Dan Wendlandtea23e682012-08-22 05:53:17 -0700333}
334
335function delete_networks {
Sean Dague922c8ae2013-10-22 10:06:06 -0400336 foreach_tenant_net 'delete_network ${%TENANT%_NAME} %NUM%'
337 # TODO(nati) add secuirty group check after it is implemented
338 # source $TOP_DIR/openrc demo1 demo1
339 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
340 # source $TOP_DIR/openrc demo2 demo2
341 # nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
Dan Wendlandtea23e682012-08-22 05:53:17 -0700342}
343
344function create_all {
345 create_tenants
346 create_networks
347 create_vms
348}
349
350function delete_all {
351 shutdown_vms
352 delete_networks
353 delete_tenants_and_users
354}
355
356function all {
357 create_all
358 check_vms
359 delete_all
360}
361
Dean Troyer6d04fd72012-12-21 11:03:37 -0600362# Test functions
363# --------------
364
Dan Wendlandtea23e682012-08-22 05:53:17 -0700365function test_functions {
366 IMAGE=$(get_image_id)
367 echo $IMAGE
368
369 TENANT_ID=$(get_tenant_id demo)
370 echo $TENANT_ID
371
372 FLAVOR_ID=$(get_flavor_id m1.tiny)
373 echo $FLAVOR_ID
374
375 NETWORK_ID=$(get_network_id admin)
376 echo $NETWORK_ID
377}
378
Dean Troyer6d04fd72012-12-21 11:03:37 -0600379# Usage and main
380# --------------
381
Ian Wienandaee18c72014-02-21 15:35:08 +1100382function usage {
Dan Wendlandtea23e682012-08-22 05:53:17 -0700383 echo "$0: [-h]"
384 echo " -h, --help Display help message"
385 echo " -t, --tenant Create tenants"
386 echo " -n, --net Create networks"
387 echo " -v, --vm Create vms"
388 echo " -c, --check Check connection"
389 echo " -x, --delete-tenants Delete tenants"
390 echo " -y, --delete-nets Delete networks"
391 echo " -z, --delete-vms Delete vms"
392 echo " -T, --test Test functions"
393}
394
Ian Wienandaee18c72014-02-21 15:35:08 +1100395function main {
Dan Wendlandtea23e682012-08-22 05:53:17 -0700396
397 echo Description
Dan Wendlandtea23e682012-08-22 05:53:17 -0700398
399 if [ $# -eq 0 ] ; then
400 # if no args are provided, run all tests
401 all
402 else
403
404 while [ "$1" != "" ]; do
405 case $1 in
406 -h | --help ) usage
407 exit
408 ;;
409 -n | --net ) create_networks
410 exit
411 ;;
412 -v | --vm ) create_vms
413 exit
414 ;;
415 -t | --tenant ) create_tenants
416 exit
417 ;;
418 -c | --check ) check_vms
419 exit
420 ;;
421 -T | --test ) test_functions
422 exit
423 ;;
424 -x | --delete-tenants ) delete_tenants_and_users
425 exit
426 ;;
427 -y | --delete-nets ) delete_networks
428 exit
429 ;;
430 -z | --delete-vms ) shutdown_vms
431 exit
432 ;;
433 -a | --all ) all
434 exit
435 ;;
436 * ) usage
437 exit 1
438 esac
439 shift
440 done
441 fi
442}
443
Dean Troyer6d04fd72012-12-21 11:03:37 -0600444# Kick off script
445# ---------------
Dan Wendlandtea23e682012-08-22 05:53:17 -0700446
Dan Wendlandtea23e682012-08-22 05:53:17 -0700447echo $*
448main $*
449
450set +o xtrace
451echo "*********************************************************************"
452echo "SUCCESS: End DevStack Exercise: $0"
453echo "*********************************************************************"