| #!/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=`trueorfalse False $MULTI_HOST` |
| if [ "$MULTI_HOST" = "False" ]; 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 "*********************************************************************" |