Updated CI test script
Debo~ Dutta@Cisco, Dave Lapsley@Nicira
* original at https://review.openstack.org/#change,3682
* Allow this exercise to be skipped if quantum is not enabled
Change-Id: I8463f654fb85394d78dd01c93c7f7b2706511030
diff --git a/exercises/quantum.sh b/exercises/quantum.sh
new file mode 100755
index 0000000..943a07d
--- /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 "*********************************************************************"