exercises/neutron-adv-test.sh
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 "*********************************************************************"