diff --git a/exercises/quantum.sh b/exercises/quantum.sh new file mode 100755 index 0000000000..943a07d7ee --- /dev/null +++ b/exercises/quantum.sh @@ -0,0 +1,393 @@ +#!/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 errexit + +# 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 + +# Import exercise configuration +source $TOP_DIR/exerciserc + +# If quantum is not enabled we exit with exitcode 55 which mean +# exercise is skipped. +is_service_enabled quantum || exit 55 + +#------------------------------------------------------------------------------ +# Various default parameters. +#------------------------------------------------------------------------------ + +# Max time to wait while vm goes from build to active state +ACTIVE_TIMEOUT=${ACTIVE_TIMEOUT:-30} + +# Max time till the vm is bootable +BOOT_TIMEOUT=${BOOT_TIMEOUT:-60} + +# Max time to wait for proper association and dis-association. +ASSOCIATE_TIMEOUT=${ASSOCIATE_TIMEOUT:-15} + +# Max time to wait before delete VMs and delete Networks +VM_NET_DELETE_TIMEOUT=${VM_NET_TIMEOUT:-10} + +# Instance type to create +DEFAULT_INSTANCE_TYPE=${DEFAULT_INSTANCE_TYPE:-m1.tiny} + +# Boot this image, use first AMi image if unset +DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-ami} + +# OVS Hosts +OVS_HOSTS=${DEFAULT_OVS_HOSTS:-"localhost"} + +#------------------------------------------------------------------------------ +# Nova settings. +#------------------------------------------------------------------------------ +NOVA_MANAGE=/opt/stack/nova/bin/nova-manage +NOVA=/usr/local/bin/nova +NOVA_CONF=/etc/nova/nova.conf + +#------------------------------------------------------------------------------ +# Mysql settings. +#------------------------------------------------------------------------------ +MYSQL="/usr/bin/mysql --skip-column-name --host=$MYSQL_HOST" + +#------------------------------------------------------------------------------ +# 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 get_image_id { + local IMAGE_ID=`glance -f -A $TOKEN index | egrep $DEFAULT_IMAGE_NAME | head -1 | cut -d" " -f1` + echo "$IMAGE_ID" +} + +function get_tenant_id { + local TENANT_NAME=$1 + local TENANT_ID=`keystone tenant-list | grep $TENANT_NAME | awk '{print $2}'` + 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" +} + +# TODO: (Debo) Change Quantum client CLI and then remove the MYSQL stuff. +function get_network_id { + local NETWORK_NAME=$1 + local QUERY="select uuid from networks where label='$NETWORK_NAME'" + local NETWORK_ID=`echo $QUERY | $MYSQL -u root -p$MYSQL_PASSWORD nova` + 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 add_tenant { + local TENANT=$1 + local USER=$3 + local PASSWORD=$2 + + $KEYSTONE tenant-create --name=$TENANT + $KEYSTONE user-create --name=$USER --pass=${PASSWORD} + + local USER_ID=$(get_user_id $USER) + local TENANT_ID=$(get_tenant_id $TENANT) + + $KEYSTONE user-role-add --user $USER_ID --role $(get_role_id Member) --tenant_id $TENANT_ID + $KEYSTONE user-role-add --user $USER_ID --role $(get_role_id admin) --tenant_id $TENANT_ID + $KEYSTONE user-role-add --user $USER_ID --role $(get_role_id anotherrole) --tenant_id $TENANT_ID + #$KEYSTONE user-role-add --user $USER_ID --role $(get_role_id sysadmin) --tenant_id $TENANT_ID + #$KEYSTONE user-role-add --user $USER_ID --role $(get_role_id netadmin) --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 { + add_tenant demo1 nova demo1 + add_tenant demo2 nova demo2 +} + +function delete_tenants_and_users { + remove_tenant demo1 + remove_tenant demo2 + remove_user demo1 + remove_user demo2 +} + +function create_networks { + $NOVA_MANAGE --flagfile=$NOVA_CONF network create \ + --label=public-net1 \ + --fixed_range_v4=11.0.0.0/24 + + $NOVA_MANAGE --flagfile=$NOVA_CONF network create \ + --label=demo1-net1 \ + --fixed_range_v4=12.0.0.0/24 \ + --project_id=$(get_tenant_id demo1) \ + --priority=1 + + $NOVA_MANAGE --flagfile=$NOVA_CONF network create \ + --label=demo2-net1 \ + --fixed_range_v4=13.0.0.0/24 \ + --project_id=$(get_tenant_id demo2) \ + --priority=1 +} + +function create_vms { + PUBLIC_NET1_ID=$(get_network_id public-net1) + DEMO1_NET1_ID=$(get_network_id demo1-net1) + DEMO2_NET1_ID=$(get_network_id demo2-net1) + + export OS_TENANT_NAME=demo1 + export OS_USERNAME=demo1 + export OS_PASSWORD=nova + VM_UUID1=`$NOVA boot --flavor $(get_flavor_id m1.tiny) \ + --image $(get_image_id) \ + --nic net-id=$PUBLIC_NET1_ID \ + --nic net-id=$DEMO1_NET1_ID \ + demo1-server1 | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'` + die_if_not_set VM_UUID1 "Failure launching demo1-server1" + + export OS_TENANT_NAME=demo2 + export OS_USERNAME=demo2 + export OS_PASSWORD=nova + VM_UUID2=`$NOVA boot --flavor $(get_flavor_id m1.tiny) \ + --image $(get_image_id) \ + --nic net-id=$PUBLIC_NET1_ID \ + --nic net-id=$DEMO2_NET1_ID \ + demo2-server1 | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'` + die_if_not_set VM_UUID2 "Failure launching demo2-server1" + + VM_UUID3=`$NOVA boot --flavor $(get_flavor_id m1.tiny) \ + --image $(get_image_id) \ + --nic net-id=$PUBLIC_NET1_ID \ + --nic net-id=$DEMO2_NET1_ID \ + demo2-server2 | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'` + die_if_not_set VM_UUID3 "Failure launching demo2-server2" + +} + +function ping_vms { + + echo "Sleeping a bit let the VMs come up" + sleep $ACTIVE_TIMEOUT + + export OS_TENANT_NAME=demo1 + export OS_USERNAME=demo1 + export OS_PASSWORD=nova + # get the IP of the servers + PUBLIC_IP1=`nova show $VM_UUID1 | grep public-net1 | awk '{print $5}'` + export OS_TENANT_NAME=demo2 + export OS_USERNAME=demo2 + export OS_PASSWORD=nova + PUBLIC_IP2=`nova show $VM_UUID2 | grep public-net1 | awk '{print $5}'` + + MULTI_HOST=${MULTI_HOST:-0} + if [ "$MULTI_HOST" = "0" ]; then + # sometimes the first ping fails (10 seconds isn't enough time for the VM's + # network to respond?), so let's ping for a default of 15 seconds with a + # timeout of a second for each ping. + if ! timeout $BOOT_TIMEOUT sh -c "while ! ping -c1 -w1 $PUBLIC_IP1; do sleep 1; done"; then + echo "Couldn't ping server" + exit 1 + fi + if ! timeout $BOOT_TIMEOUT sh -c "while ! ping -c1 -w1 $PUBLIC_IP2; do sleep 1; done"; then + echo "Couldn't ping server" + exit 1 + fi + else + # On a multi-host system, without vm net access, do a sleep to wait for the boot + sleep $BOOT_TIMEOUT + fi +} + +function shutdown_vms { + export OS_TENANT_NAME=demo1 + export OS_USERNAME=demo1 + export OS_PASSWORD=nova + nova delete $VM_UUID1 + + export OS_TENANT_NAME=demo2 + export OS_USERNAME=demo2 + export OS_PASSWORD=nova + nova delete $VM_UUID2 + nova delete $VM_UUID3 + +} + +function delete_networks { + PUBLIC_NET1_ID=$(get_network_id public-net1) + DEMO1_NET1_ID=$(get_network_id demo1-net1) + DEMO2_NET1_ID=$(get_network_id demo2-net1) + nova-manage network delete --uuid=$PUBLIC_NET1_ID + nova-manage network delete --uuid=$DEMO1_NET1_ID + nova-manage network delete --uuid=$DEMO2_NET1_ID +} + +function all { + create_tenants + create_networks + create_vms + ping_vms + shutdown_vms + delete_networks + delete_tenants_and_users +} + +#------------------------------------------------------------------------------ +# 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 private) + echo $NETWORK_ID +} + +#------------------------------------------------------------------------------ +# Usage and main. +#------------------------------------------------------------------------------ +usage() { + echo "$0: [-h]" + echo " -h, --help Display help message" + echo " -n, --net Create networks" + echo " -v, --vm Create vms" + echo " -t, --tenant Create tenants" + echo " -T, --test Test functions" +} + +main() { + if [ $# -eq 0 ] ; then + usage + exit + fi + + echo Description + echo + echo Copyright 2012, Cisco Systems + echo Copyright 2012, Nicira Networks, Inc. + echo + echo Please direct any questions to dedutta@cisco.com, dlapsley@nicira.com + echo + + 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 + ;; + -p | --ping ) ping_vms + exit + ;; + -T | --test ) test_functions + exit + ;; + -a | --all ) all + exit + ;; + * ) usage + exit 1 + esac + shift + done +} + + +#------------------------------------------------------------------------------- +# Kick off script. +#------------------------------------------------------------------------------- +echo $* +main -a + +set +o xtrace +echo "*********************************************************************" +echo "SUCCESS: End DevStack Exercise: $0" +echo "*********************************************************************"