#!/usr/bin/env bash # # **quantum.sh** # We will use this test to perform integration testing of nova and # other components with Quantum. echo "*********************************************************************" echo "Begin DevStack Exercise: $0" echo "*********************************************************************" # This script exits on an error so that errors don't compound and you see # only the first error that occured. set -o errtrace trap failed ERR failed() { local r=$? set +o errtrace set +o xtrace echo "Failed to execute" echo "Starting cleanup..." delete_all echo "Finished cleanup" exit $r } # Print the commands being run so that we can see the command that triggers # an error. It is also useful for following allowing as the install occurs. set -o xtrace #------------------------------------------------------------------------------ # Quantum config check #------------------------------------------------------------------------------ # Warn if quantum is not enabled if [[ ! "$ENABLED_SERVICES" =~ "q-svc" ]]; then echo "WARNING: Running quantum test without enabling quantum" fi #------------------------------------------------------------------------------ # Environment #------------------------------------------------------------------------------ # 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 # If quantum is not enabled we exit with exitcode 55 which mean # exercise is skipped. is_service_enabled quantum && is_service_enabled q-agt && is_service_enabled q-dhcp || exit 55 # Import quantum fucntions source $TOP_DIR/lib/quantum setup_quantum # Import exercise configuration source $TOP_DIR/exerciserc #------------------------------------------------------------------------------ # Test settings for quantum #------------------------------------------------------------------------------ TENANTS="DEMO1" # TODO (nati)_Test public network #TENANTS="DEMO1,DEMO2" 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" DEMO1_NET1_CIDR="10.10.0.0/24" DEMO2_NET1_CIDR="10.20.0.0/24" DEMO2_NET2_CIDR="10.20.1.0/24" PUBLIC_NET1_GATEWAY="200.0.0.1" DEMO1_NET1_GATEWAY="10.10.0.1" DEMO2_NET1_GATEWAY="10.20.0.1" DEMO2_NET2_GATEWAY="10.20.1.1" 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" #------------------------------------------------------------------------------ # Keystone settings. #------------------------------------------------------------------------------ KEYSTONE="keystone" #------------------------------------------------------------------------------ # Get a token for clients that don't support service catalog #------------------------------------------------------------------------------ # manually create a token by querying keystone (sending JSON data). Keystone # returns a token and catalog of endpoints. We use python to parse the token # and save it. TOKEN=`keystone token-get | grep ' id ' | awk '{print $4}'` #------------------------------------------------------------------------------ # Various functions. #------------------------------------------------------------------------------ function foreach_tenant { COMMAND=$1 for TENANT in ${TENANTS//,/ };do eval ${COMMAND//%TENANT%/$TENANT} done } function foreach_tenant_resource { COMMAND=$1 RESOURCE=$2 for TENANT in ${TENANTS//,/ };do eval 'NUM=$'"${TENANT}_NUM_$RESOURCE" for i in `seq $NUM`;do local COMMAND_LOCAL=${COMMAND//%TENANT%/$TENANT} COMMAND_LOCAL=${COMMAND_LOCAL//%NUM%/$i} eval $COMMAND_LOCAL done done } function foreach_tenant_vm { COMMAND=$1 foreach_tenant_resource "$COMMAND" 'VM' } function foreach_tenant_net { COMMAND=$1 foreach_tenant_resource "$COMMAND" 'NET' } function get_image_id { local IMAGE_ID=$(glance image-list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1) echo "$IMAGE_ID" } function get_tenant_id { local TENANT_NAME=$1 local TENANT_ID=`keystone tenant-list | grep " $TENANT_NAME " | head -n 1 | get_field 1` echo "$TENANT_ID" } function get_user_id { local USER_NAME=$1 local USER_ID=`keystone user-list | grep $USER_NAME | awk '{print $2}'` echo "$USER_ID" } function get_role_id { local ROLE_NAME=$1 local ROLE_ID=`keystone role-list | grep $ROLE_NAME | awk '{print $2}'` echo "$ROLE_ID" } function get_network_id { local NETWORK_NAME="$1" local NETWORK_ID=`quantum net-list -F id -- --name=$NETWORK_NAME | awk "NR==4" | awk '{print $2}'` echo $NETWORK_ID } function get_flavor_id { local INSTANCE_TYPE=$1 local FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'` echo "$FLAVOR_ID" } function confirm_server_active { local VM_UUID=$1 if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova show $VM_UUID | grep status | grep -q ACTIVE; do sleep 1; done"; then echo "server '$VM_UUID' did not become active!" false fi } function add_tenant { local TENANT=$1 local USER=$2 $KEYSTONE tenant-create --name=$TENANT $KEYSTONE user-create --name=$USER --pass=${ADMIN_PASSWORD} local USER_ID=$(get_user_id $USER) local TENANT_ID=$(get_tenant_id $TENANT) $KEYSTONE user-role-add --user-id $USER_ID --role-id $(get_role_id Member) --tenant-id $TENANT_ID } function remove_tenant { local TENANT=$1 local TENANT_ID=$(get_tenant_id $TENANT) $KEYSTONE tenant-delete $TENANT_ID } function remove_user { local USER=$1 local USER_ID=$(get_user_id $USER) $KEYSTONE user-delete $USER_ID } #------------------------------------------------------------------------------ # "Create" functions #------------------------------------------------------------------------------ function create_tenants { source $TOP_DIR/openrc admin admin add_tenant demo1 demo1 demo1 add_tenant demo2 demo2 demo2 source $TOP_DIR/openrc demo demo } function delete_tenants_and_users { source $TOP_DIR/openrc admin admin remove_user demo1 remove_tenant demo1 remove_user demo2 remove_tenant demo2 echo "removed all tenants" source $TOP_DIR/openrc demo demo } function create_network { local TENANT=$1 local GATEWAY=$2 local CIDR=$3 local NUM=$4 local EXTRA=$5 local NET_NAME="${TENANT}-net$NUM" local ROUTER_NAME="${TENANT}-router${NUM}" source $TOP_DIR/openrc admin admin local TENANT_ID=$(get_tenant_id $TENANT) source $TOP_DIR/openrc $TENANT $TENANT local NET_ID=$(quantum net-create --tenant_id $TENANT_ID $NET_NAME $EXTRA| grep ' id ' | awk '{print $4}' ) quantum subnet-create --ip_version 4 --tenant_id $TENANT_ID --gateway $GATEWAY $NET_ID $CIDR quantum-debug probe-create $NET_ID source $TOP_DIR/openrc demo demo } function create_networks { foreach_tenant_net 'create_network ${%TENANT%_NAME} ${%TENANT%_NET%NUM%_GATEWAY} ${%TENANT%_NET%NUM%_CIDR} %NUM% ${%TENANT%_NET%NUM%_EXTRA}' #TODO(nati) test security group function # allow ICMP for both tenant's security groups #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 { local TENANT=$1 local NUM=$2 local NET_NAMES=$3 source $TOP_DIR/openrc $TENANT $TENANT 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 local VM_UUID=`nova boot --flavor $(get_flavor_id m1.tiny) \ --image $(get_image_id) \ $NIC \ $TENANT-server$NUM | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'` die_if_not_set VM_UUID "Failure launching $TENANT-server$NUM" VM_UUID confirm_server_active $VM_UUID } function create_vms { foreach_tenant_vm 'create_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}' } function ping_ip { # 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=`nova show $VM_NAME | grep 'network' | awk '{print $5}'` ping_check $NET_NAME $IP $BOOT_TIMEOUT } function check_vm { local TENANT=$1 local NUM=$2 local VM_NAME="$TENANT-server$NUM" local NET_NAME=$3 source $TOP_DIR/openrc $TENANT $TENANT ping_ip $VM_NAME $NET_NAME # 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 { foreach_tenant_vm 'check_vm ${%TENANT%_NAME} %NUM% ${%TENANT%_VM%NUM%_NET}' } function shutdown_vm { local TENANT=$1 local NUM=$2 source $TOP_DIR/openrc $TENANT $TENANT VM_NAME=${TENANT}-server$NUM nova delete $VM_NAME } function shutdown_vms { foreach_tenant_vm 'shutdown_vm ${%TENANT%_NAME} %NUM%' if ! timeout $TERMINATE_TIMEOUT sh -c "while nova list | grep -q ACTIVE; do sleep 1; done"; then echo "Some VMs failed to shutdown" false fi } function delete_network { local TENANT=$1 local NUM=$2 local NET_NAME="${TENANT}-net$NUM" source $TOP_DIR/openrc admin admin local TENANT_ID=$(get_tenant_id $TENANT) #TODO(nati) comment out until l3-agent merged #for res in port subnet net router;do for net_id in `quantum net-list -c id -c name | grep $NET_NAME | awk '{print $2}'`;do delete_probe $net_id quantum subnet-list | grep $net_id | awk '{print $2}' | xargs -I% quantum subnet-delete % quantum net-delete $net_id done source $TOP_DIR/openrc demo demo } function delete_networks { foreach_tenant_net 'delete_network ${%TENANT%_NAME} ${%NUM%}' #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 } function create_all { create_tenants create_networks create_vms } function delete_all { shutdown_vms delete_networks delete_tenants_and_users } function all { create_all check_vms delete_all } #------------------------------------------------------------------------------ # Test functions. #------------------------------------------------------------------------------ function test_functions { IMAGE=$(get_image_id) echo $IMAGE TENANT_ID=$(get_tenant_id demo) echo $TENANT_ID FLAVOR_ID=$(get_flavor_id m1.tiny) echo $FLAVOR_ID NETWORK_ID=$(get_network_id admin) echo $NETWORK_ID } #------------------------------------------------------------------------------ # Usage and main. #------------------------------------------------------------------------------ usage() { echo "$0: [-h]" echo " -h, --help Display help message" echo " -t, --tenant Create tenants" echo " -n, --net Create networks" echo " -v, --vm Create vms" echo " -c, --check Check connection" echo " -x, --delete-tenants Delete tenants" echo " -y, --delete-nets Delete networks" echo " -z, --delete-vms Delete vms" echo " -T, --test Test functions" } main() { echo Description echo echo Copyright 2012, Cisco Systems echo Copyright 2012, Nicira Networks, Inc. echo Copyright 2012, NTT MCL, Inc. echo echo Please direct any questions to dedutta@cisco.com, dan@nicira.com, nachi@nttmcl.com echo 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 ;; -t | --tenant ) create_tenants exit ;; -c | --check ) check_vms exit ;; -T | --test ) test_functions exit ;; -x | --delete-tenants ) delete_tenants_and_users exit ;; -y | --delete-nets ) delete_networks exit ;; -z | --delete-vms ) shutdown_vms exit ;; -a | --all ) all exit ;; * ) usage exit 1 esac shift done fi } teardown_quantum #------------------------------------------------------------------------------- # Kick off script. #------------------------------------------------------------------------------- echo $* main $* set +o xtrace echo "*********************************************************************" echo "SUCCESS: End DevStack Exercise: $0" echo "*********************************************************************"