394 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			394 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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 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 | 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 "*********************************************************************"
 |