ea23e686 |
#!/usr/bin/env bash
# |
0d4bd7e6 |
# Copyright 2012, Cisco Systems
# Copyright 2012, VMware, Inc.
# Copyright 2012, NTT MCL, Inc.
#
# Please direct any questions to dedutta@cisco.com, dwendlandt@vmware.com, nachi@nttmcl.com
# |
b05c8769 |
# **neutron-adv-test.sh** |
ea23e686 |
|
b05c8769 |
# Perform integration testing of Nova and other components with Neutron. |
ea23e686 |
echo "*********************************************************************"
echo "Begin DevStack Exercise: $0"
echo "*********************************************************************"
# This script exits on an error so that errors don't compound and you see |
4640026c |
# only the first error that occurred. |
ea23e686 |
set -o errtrace |
6d04fd7b |
|
ea23e686 |
# Print the commands being run so that we can see the command that triggers |
01acdabb |
# an error. It is also useful for following as the install occurs. |
ea23e686 |
set -o xtrace
# Environment |
6d04fd7b |
# ----------- |
ea23e686 |
# Keep track of the current directory
EXERCISE_DIR=$(cd $(dirname "$0") && pwd)
TOP_DIR=$(cd $EXERCISE_DIR/..; pwd)
# Import common functions
source $TOP_DIR/functions
# Import configuration
source $TOP_DIR/openrc
|
b05c8769 |
# Import neutron functions |
2a242519 |
source $TOP_DIR/lib/neutron |
5a9739a4 |
source $TOP_DIR/lib/neutron-legacy |
5db5bfa2 |
|
b05c8769 |
# If neutron is not enabled we exit with exitcode 55, which means exercise is skipped.
neutron_plugin_check_adv_test_requirements || exit 55 |
7c025fed |
|
5db5bfa2 |
# Import exercise configuration
source $TOP_DIR/exerciserc
|
b05c8769 |
# Neutron Settings |
6d04fd7b |
# ---------------- |
ea23e686 |
|
7580a0c3 |
PROJECTS="DEMO1" |
ea23e686 |
# TODO (nati)_Test public network |
7580a0c3 |
#PROJECTS="DEMO1,DEMO2" |
ea23e686 |
PUBLIC_NAME="admin"
DEMO1_NAME="demo1"
DEMO2_NAME="demo2"
PUBLIC_NUM_NET=1
DEMO1_NUM_NET=1
DEMO2_NUM_NET=2
PUBLIC_NET1_CIDR="200.0.0.0/24" |
5db5bfa2 |
DEMO1_NET1_CIDR="10.10.0.0/24"
DEMO2_NET1_CIDR="10.20.0.0/24"
DEMO2_NET2_CIDR="10.20.1.0/24" |
ea23e686 |
PUBLIC_NET1_GATEWAY="200.0.0.1" |
5db5bfa2 |
DEMO1_NET1_GATEWAY="10.10.0.1"
DEMO2_NET1_GATEWAY="10.20.0.1"
DEMO2_NET2_GATEWAY="10.20.1.1" |
ea23e686 |
PUBLIC_NUM_VM=1
DEMO1_NUM_VM=1
DEMO2_NUM_VM=2
PUBLIC_VM1_NET='admin-net1'
DEMO1_VM1_NET='demo1-net1'
# Multinic settings. But this is fail without nic setting in OS image
DEMO2_VM1_NET='demo2-net1'
DEMO2_VM2_NET='demo2-net2'
PUBLIC_NUM_ROUTER=1
DEMO1_NUM_ROUTER=1
DEMO2_NUM_ROUTER=1
PUBLIC_ROUTER1_NET="admin-net1"
DEMO1_ROUTER1_NET="demo1-net1"
DEMO2_ROUTER1_NET="demo2-net1"
|
6d04fd7b |
# Various functions
# -----------------
|
7580a0c3 |
function foreach_project { |
ea23e686 |
COMMAND=$1 |
7580a0c3 |
for PROJECT in ${PROJECTS//,/ };do
eval ${COMMAND//%PROJECT%/$PROJECT} |
ea23e686 |
done
}
|
7580a0c3 |
function foreach_project_resource { |
ea23e686 |
COMMAND=$1
RESOURCE=$2 |
7580a0c3 |
for PROJECT in ${PROJECTS//,/ };do
eval 'NUM=$'"${PROJECT}_NUM_$RESOURCE" |
ea23e686 |
for i in `seq $NUM`;do |
7580a0c3 |
local COMMAND_LOCAL=${COMMAND//%PROJECT%/$PROJECT} |
ea23e686 |
COMMAND_LOCAL=${COMMAND_LOCAL//%NUM%/$i}
eval $COMMAND_LOCAL
done
done
}
|
7580a0c3 |
function foreach_project_vm { |
ea23e686 |
COMMAND=$1 |
7580a0c3 |
foreach_project_resource "$COMMAND" 'VM' |
ea23e686 |
}
|
7580a0c3 |
function foreach_project_net { |
ea23e686 |
COMMAND=$1 |
7580a0c3 |
foreach_project_resource "$COMMAND" 'NET' |
ea23e686 |
}
function get_image_id { |
ada886dd |
local IMAGE_ID
IMAGE_ID=$(openstack image list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1) |
23178a99 |
die_if_not_set $LINENO IMAGE_ID "Failure retrieving IMAGE_ID" |
ea23e686 |
echo "$IMAGE_ID"
}
|
7580a0c3 |
function get_project_id {
local PROJECT_NAME=$1
local PROJECT_ID
PROJECT_ID=`openstack project list | grep " $PROJECT_NAME " | head -n 1 | get_field 1`
die_if_not_set $LINENO PROJECT_ID "Failure retrieving PROJECT_ID for $PROJECT_NAME"
echo "$PROJECT_ID" |
ea23e686 |
}
function get_user_id {
local USER_NAME=$1 |
ada886dd |
local USER_ID
USER_ID=`openstack user list | grep $USER_NAME | awk '{print $2}'` |
23178a99 |
die_if_not_set $LINENO USER_ID "Failure retrieving USER_ID for $USER_NAME" |
ea23e686 |
echo "$USER_ID"
}
function get_role_id {
local ROLE_NAME=$1 |
ada886dd |
local ROLE_ID |
c271b3ea |
ROLE_ID=`openstack role assignment list | grep $ROLE_NAME | awk '{print $2}'` |
23178a99 |
die_if_not_set $LINENO ROLE_ID "Failure retrieving ROLE_ID for $ROLE_NAME" |
ea23e686 |
echo "$ROLE_ID"
}
function get_network_id {
local NETWORK_NAME="$1" |
ada886dd |
local NETWORK_ID |
d038b60e |
NETWORK_ID=`openstack network show -f value -c id $NETWORK_NAME` |
ea23e686 |
echo $NETWORK_ID
}
function get_flavor_id {
local INSTANCE_TYPE=$1 |
ada886dd |
local FLAVOR_ID
FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'` |
23178a99 |
die_if_not_set $LINENO FLAVOR_ID "Failure retrieving FLAVOR_ID for $INSTANCE_TYPE" |
ea23e686 |
echo "$FLAVOR_ID"
}
function confirm_server_active {
local VM_UUID=$1 |
5db5bfa2 |
if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova show $VM_UUID | grep status | grep -q ACTIVE; do sleep 1; done"; then |
6d04fd7b |
echo "server '$VM_UUID' did not become active!"
false
fi |
ea23e686 |
}
|
52a7b6ec |
function neutron_debug_admin {
local os_username=$OS_USERNAME |
7580a0c3 |
local os_project_id=$OS_PROJECT_ID |
52a7b6ec |
source $TOP_DIR/openrc admin admin
neutron-debug $@ |
7580a0c3 |
source $TOP_DIR/openrc $os_username $os_project_id |
52a7b6ec |
}
|
7580a0c3 |
function add_project { |
2a09d0c6 |
openstack project create $1
openstack user create $2 --password ${ADMIN_PASSWORD} --project $1
openstack role add Member --project $1 --user $2 |
ea23e686 |
}
|
7580a0c3 |
function remove_project {
local PROJECT=$1
local PROJECT_ID
PROJECT_ID=$(get_project_id $PROJECT)
openstack project delete $PROJECT_ID |
ea23e686 |
}
function remove_user {
local USER=$1 |
ada886dd |
local USER_ID
USER_ID=$(get_user_id $USER) |
2a09d0c6 |
openstack user delete $USER_ID |
ea23e686 |
}
|
7580a0c3 |
function create_projects { |
ea23e686 |
source $TOP_DIR/openrc admin admin |
7580a0c3 |
add_project demo1 demo1 demo1
add_project demo2 demo2 demo2 |
5db5bfa2 |
source $TOP_DIR/openrc demo demo |
ea23e686 |
}
|
7580a0c3 |
function delete_projects_and_users { |
ea23e686 |
source $TOP_DIR/openrc admin admin
remove_user demo1 |
7580a0c3 |
remove_project demo1 |
ea23e686 |
remove_user demo2 |
7580a0c3 |
remove_project demo2
echo "removed all projects" |
5db5bfa2 |
source $TOP_DIR/openrc demo demo |
ea23e686 |
}
function create_network { |
7580a0c3 |
local PROJECT=$1 |
ea23e686 |
local GATEWAY=$2
local CIDR=$3
local NUM=$4
local EXTRA=$5 |
7580a0c3 |
local NET_NAME="${PROJECT}-net$NUM"
local ROUTER_NAME="${PROJECT}-router${NUM}" |
ea23e686 |
source $TOP_DIR/openrc admin admin |
7580a0c3 |
local PROJECT_ID
PROJECT_ID=$(get_project_id $PROJECT)
source $TOP_DIR/openrc $PROJECT $PROJECT |
ada886dd |
local NET_ID |
4f11ff30 |
NET_ID=$(openstack network create --project $PROJECT_ID $NET_NAME $EXTRA| grep ' id ' | awk '{print $4}' ) |
7580a0c3 |
die_if_not_set $LINENO NET_ID "Failure creating NET_ID for $PROJECT_ID $NET_NAME $EXTRA" |
4f11ff30 |
openstack subnet create --ip-version 4 --project $PROJECT_ID --gateway $GATEWAY --subnet-pool None --network $NET_ID --subnet-range $CIDR "${NET_NAME}_subnet" |
52a7b6ec |
neutron_debug_admin probe-create --device-owner compute $NET_ID |
5db5bfa2 |
source $TOP_DIR/openrc demo demo |
ea23e686 |
}
function create_networks { |
7580a0c3 |
foreach_project_net 'create_network ${%PROJECT%_NAME} ${%PROJECT%_NET%NUM%_GATEWAY} ${%PROJECT%_NET%NUM%_CIDR} %NUM% ${%PROJECT%_NET%NUM%_EXTRA}' |
ea23e686 |
#TODO(nati) test security group function |
7580a0c3 |
# allow ICMP for both project's security groups |
ea23e686 |
#source $TOP_DIR/openrc demo1 demo1
#$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
#source $TOP_DIR/openrc demo2 demo2
#$NOVA secgroup-add-rule default icmp -1 -1 0.0.0.0/0
}
function create_vm { |
7580a0c3 |
local PROJECT=$1 |
ea23e686 |
local NUM=$2
local NET_NAMES=$3 |
7580a0c3 |
source $TOP_DIR/openrc $PROJECT $PROJECT |
ea23e686 |
local NIC=""
for NET_NAME in ${NET_NAMES//,/ };do
NIC="$NIC --nic net-id="`get_network_id $NET_NAME`
done
#TODO (nati) Add multi-nic test
#TODO (nati) Add public-net test |
ada886dd |
local VM_UUID
VM_UUID=`nova boot --flavor $(get_flavor_id m1.tiny) \ |
ea23e686 |
--image $(get_image_id) \
$NIC \ |
7580a0c3 |
$PROJECT-server$NUM | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
die_if_not_set $LINENO VM_UUID "Failure launching $PROJECT-server$NUM" |
ea23e686 |
confirm_server_active $VM_UUID
}
function create_vms { |
7580a0c3 |
foreach_project_vm 'create_vm ${%PROJECT%_NAME} %NUM% ${%PROJECT%_VM%NUM%_NET}' |
ea23e686 |
}
function ping_ip { |
922c8ae6 |
# Test agent connection. Assumes namespaces are disabled, and
# that DHCP is in use, but not L3
local VM_NAME=$1
local NET_NAME=$2
IP=$(get_instance_ip $VM_NAME $NET_NAME) |
af9bf866 |
ping_check $IP $BOOT_TIMEOUT $NET_NAME |
ea23e686 |
}
function check_vm { |
7580a0c3 |
local PROJECT=$1 |
ea23e686 |
local NUM=$2 |
7580a0c3 |
local VM_NAME="$PROJECT-server$NUM" |
5db5bfa2 |
local NET_NAME=$3 |
7580a0c3 |
source $TOP_DIR/openrc $PROJECT $PROJECT |
5db5bfa2 |
ping_ip $VM_NAME $NET_NAME |
ea23e686 |
# TODO (nati) test ssh connection
# TODO (nati) test inter connection between vm
# TODO (nati) test dhcp host routes
# TODO (nati) test multi-nic
}
function check_vms { |
7580a0c3 |
foreach_project_vm 'check_vm ${%PROJECT%_NAME} %NUM% ${%PROJECT%_VM%NUM%_NET}' |
ea23e686 |
}
function shutdown_vm { |
7580a0c3 |
local PROJECT=$1 |
ea23e686 |
local NUM=$2 |
7580a0c3 |
source $TOP_DIR/openrc $PROJECT $PROJECT
VM_NAME=${PROJECT}-server$NUM |
5db5bfa2 |
nova delete $VM_NAME |
ea23e686 |
}
function shutdown_vms { |
7580a0c3 |
foreach_project_vm 'shutdown_vm ${%PROJECT%_NAME} %NUM%' |
5db5bfa2 |
if ! timeout $TERMINATE_TIMEOUT sh -c "while nova list | grep -q ACTIVE; do sleep 1; done"; then |
07115eb5 |
die $LINENO "Some VMs failed to shutdown" |
ea23e686 |
fi
}
function delete_network { |
7580a0c3 |
local PROJECT=$1 |
5db5bfa2 |
local NUM=$2 |
7580a0c3 |
local NET_NAME="${PROJECT}-net$NUM" |
ea23e686 |
source $TOP_DIR/openrc admin admin |
7580a0c3 |
local PROJECT_ID
PROJECT_ID=$(get_project_id $PROJECT) |
ea23e686 |
#TODO(nati) comment out until l3-agent merged
#for res in port subnet net router;do |
4f11ff30 |
for net_id in `openstack network list -c ID -c Name | grep $NET_NAME | awk '{print $2}'`;do |
5db5bfa2 |
delete_probe $net_id |
4f11ff30 |
openstack subnet list | grep $net_id | awk '{print $2}' | xargs -I% openstack subnet delete %
openstack network delete $net_id |
ea23e686 |
done |
5db5bfa2 |
source $TOP_DIR/openrc demo demo |
ea23e686 |
}
function delete_networks { |
7580a0c3 |
foreach_project_net 'delete_network ${%PROJECT%_NAME} %NUM%' |
922c8ae6 |
# TODO(nati) add secuirty group check after it is implemented
# source $TOP_DIR/openrc demo1 demo1
# nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0
# source $TOP_DIR/openrc demo2 demo2
# nova secgroup-delete-rule default icmp -1 -1 0.0.0.0/0 |
ea23e686 |
}
function create_all { |
7580a0c3 |
create_projects |
ea23e686 |
create_networks
create_vms
}
function delete_all {
shutdown_vms
delete_networks |
7580a0c3 |
delete_projects_and_users |
ea23e686 |
}
function all {
create_all
check_vms
delete_all
}
|
6d04fd7b |
# Test functions
# --------------
|
ea23e686 |
function test_functions {
IMAGE=$(get_image_id)
echo $IMAGE
|
7580a0c3 |
PROJECT_ID=$(get_project_id demo)
echo $PROJECT_ID |
ea23e686 |
FLAVOR_ID=$(get_flavor_id m1.tiny)
echo $FLAVOR_ID
NETWORK_ID=$(get_network_id admin)
echo $NETWORK_ID
}
|
6d04fd7b |
# Usage and main
# --------------
|
aee18c74 |
function usage { |
ea23e686 |
echo "$0: [-h]"
echo " -h, --help Display help message" |
7580a0c3 |
echo " -t, --project Create projects" |
ea23e686 |
echo " -n, --net Create networks"
echo " -v, --vm Create vms"
echo " -c, --check Check connection" |
7580a0c3 |
echo " -x, --delete-projects Delete projects" |
ea23e686 |
echo " -y, --delete-nets Delete networks"
echo " -z, --delete-vms Delete vms"
echo " -T, --test Test functions"
}
|
aee18c74 |
function main { |
ea23e686 |
echo Description
if [ $# -eq 0 ] ; then
# if no args are provided, run all tests
all
else
while [ "$1" != "" ]; do
case $1 in
-h | --help ) usage
exit
;;
-n | --net ) create_networks
exit
;;
-v | --vm ) create_vms
exit
;; |
7580a0c3 |
-t | --project ) create_projects |
ea23e686 |
exit
;;
-c | --check ) check_vms
exit
;;
-T | --test ) test_functions
exit
;; |
7580a0c3 |
-x | --delete-projects ) delete_projects_and_users |
ea23e686 |
exit
;;
-y | --delete-nets ) delete_networks
exit
;;
-z | --delete-vms ) shutdown_vms
exit
;;
-a | --all ) all
exit
;;
* ) usage
exit 1
esac
shift
done
fi
}
|
04c0f0be |
trap failed ERR
function failed {
local r=$?
set +o errtrace
set +o xtrace
echo "Failed to execute"
echo "Starting cleanup..."
delete_all
echo "Finished cleanup"
exit $r
}
|
6d04fd7b |
# Kick off script
# --------------- |
ea23e686 |
echo $*
main $*
set +o xtrace
echo "*********************************************************************"
echo "SUCCESS: End DevStack Exercise: $0"
echo "*********************************************************************" |