2a242519f7
Background for this work can be read on the mailing list: http://lists.openstack.org/pipermail/openstack-dev/2016-May/094063.html Usage of the new Neutron is by setting the following in ENABLED_SERVICES: * neutron-api * neutron-l3 * neutron-agent * neutron-dhcp * neutron-metadata-agent For now, the new neutron library supports just the ML2 plugin, with the Open vSwitch and Linux Bridge agents supported. All other Neutron plugins should be creating their own DevStack plugin if they wish for DevStack to support them. Many of them already do. Other notable changes compared to neutron-legacy: * Rely on the Neutron defaults, and force Neutron to make sane defaults instead of all kinds of knobs in DevStack. * Default to rootwrap daemon support * Use the security group driver by default * interface_driver can now use NEUTRON_AGENT (linuxbridge, openvswitch), since they are entrypoints in neutron's setup.cfg * Use NEUTRON_AGENT variable to determine which agent to run Works with NEUTRON_AGENT set to either "linuxbridge" or "openvswitch" Default is openvswitch for the time being. * Set ML2 configuration for VXLAN support * Remove Xen hypervisor stuff - it should be a plugin * Move L3 crud into separate service file: There's a lot of L3 configuration that was in the main neutron file, but a lot of it is self contained and can be moved into its own file. The new l3 service file will contain all the previous L3 plumbing and configuration that the OpenStack Gate expects, while also eventually moving the whole l3 network creation step into a single hook that can be overridden by plugins. * Introduce a check for a function "neutron_plugin_create_initial_networks" which will become the mechanism through which different topologies, and networking plugins can create and wire the initial networks that are created during a stack.sh run. The new lib/neutron is considered experimental, and followup patches will build upon this one. Existing users of lib/neutron-legacy should remain unharmed. Co-Authored-By: Hirofumi Ichihara <ichihara.hirofumi@lab.ntt.co.jp> Co-Authored-By: Dean Troyer <dtroyer@gmail.com> Change-Id: I31b6362c6d9992f425f2dedbbeff2568390a93da
467 lines
13 KiB
Bash
Executable File
467 lines
13 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Copyright 2012, Cisco Systems
|
|
# Copyright 2012, VMware, Inc.
|
|
# Copyright 2012, NTT MCL, Inc.
|
|
#
|
|
# Please direct any questions to dedutta@cisco.com, dwendlandt@vmware.com, nachi@nttmcl.com
|
|
#
|
|
# **neutron-adv-test.sh**
|
|
|
|
# Perform integration testing of Nova and other components with Neutron.
|
|
|
|
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 occurred.
|
|
|
|
set -o errtrace
|
|
|
|
# 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
|
|
|
|
# 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 neutron functions
|
|
source $TOP_DIR/lib/neutron
|
|
source $TOP_DIR/lib/neutron-legacy
|
|
|
|
# If neutron is not enabled we exit with exitcode 55, which means exercise is skipped.
|
|
neutron_plugin_check_adv_test_requirements || exit 55
|
|
|
|
# Import exercise configuration
|
|
source $TOP_DIR/exerciserc
|
|
|
|
# Neutron Settings
|
|
# ----------------
|
|
|
|
PROJECTS="DEMO1"
|
|
# TODO (nati)_Test public network
|
|
#PROJECTS="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"
|
|
|
|
# Various functions
|
|
# -----------------
|
|
|
|
function foreach_project {
|
|
COMMAND=$1
|
|
for PROJECT in ${PROJECTS//,/ };do
|
|
eval ${COMMAND//%PROJECT%/$PROJECT}
|
|
done
|
|
}
|
|
|
|
function foreach_project_resource {
|
|
COMMAND=$1
|
|
RESOURCE=$2
|
|
for PROJECT in ${PROJECTS//,/ };do
|
|
eval 'NUM=$'"${PROJECT}_NUM_$RESOURCE"
|
|
for i in `seq $NUM`;do
|
|
local COMMAND_LOCAL=${COMMAND//%PROJECT%/$PROJECT}
|
|
COMMAND_LOCAL=${COMMAND_LOCAL//%NUM%/$i}
|
|
eval $COMMAND_LOCAL
|
|
done
|
|
done
|
|
}
|
|
|
|
function foreach_project_vm {
|
|
COMMAND=$1
|
|
foreach_project_resource "$COMMAND" 'VM'
|
|
}
|
|
|
|
function foreach_project_net {
|
|
COMMAND=$1
|
|
foreach_project_resource "$COMMAND" 'NET'
|
|
}
|
|
|
|
function get_image_id {
|
|
local IMAGE_ID
|
|
IMAGE_ID=$(openstack image list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1)
|
|
die_if_not_set $LINENO IMAGE_ID "Failure retrieving IMAGE_ID"
|
|
echo "$IMAGE_ID"
|
|
}
|
|
|
|
function get_project_id {
|
|
local PROJECT_NAME=$1
|
|
local PROJECT_ID
|
|
PROJECT_ID=`openstack project list | grep " $PROJECT_NAME " | head -n 1 | get_field 1`
|
|
die_if_not_set $LINENO PROJECT_ID "Failure retrieving PROJECT_ID for $PROJECT_NAME"
|
|
echo "$PROJECT_ID"
|
|
}
|
|
|
|
function get_user_id {
|
|
local USER_NAME=$1
|
|
local USER_ID
|
|
USER_ID=`openstack user list | grep $USER_NAME | awk '{print $2}'`
|
|
die_if_not_set $LINENO USER_ID "Failure retrieving USER_ID for $USER_NAME"
|
|
echo "$USER_ID"
|
|
}
|
|
|
|
function get_role_id {
|
|
local ROLE_NAME=$1
|
|
local ROLE_ID
|
|
ROLE_ID=`openstack role list | grep $ROLE_NAME | awk '{print $2}'`
|
|
die_if_not_set $LINENO ROLE_ID "Failure retrieving ROLE_ID for $ROLE_NAME"
|
|
echo "$ROLE_ID"
|
|
}
|
|
|
|
function get_network_id {
|
|
local NETWORK_NAME="$1"
|
|
local NETWORK_ID
|
|
NETWORK_ID=`neutron 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
|
|
FLAVOR_ID=`nova flavor-list | grep $INSTANCE_TYPE | awk '{print $2}'`
|
|
die_if_not_set $LINENO FLAVOR_ID "Failure retrieving FLAVOR_ID for $INSTANCE_TYPE"
|
|
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 neutron_debug_admin {
|
|
local os_username=$OS_USERNAME
|
|
local os_project_id=$OS_PROJECT_ID
|
|
source $TOP_DIR/openrc admin admin
|
|
neutron-debug $@
|
|
source $TOP_DIR/openrc $os_username $os_project_id
|
|
}
|
|
|
|
function add_project {
|
|
openstack project create $1
|
|
openstack user create $2 --password ${ADMIN_PASSWORD} --project $1
|
|
openstack role add Member --project $1 --user $2
|
|
}
|
|
|
|
function remove_project {
|
|
local PROJECT=$1
|
|
local PROJECT_ID
|
|
PROJECT_ID=$(get_project_id $PROJECT)
|
|
openstack project delete $PROJECT_ID
|
|
}
|
|
|
|
function remove_user {
|
|
local USER=$1
|
|
local USER_ID
|
|
USER_ID=$(get_user_id $USER)
|
|
openstack user delete $USER_ID
|
|
}
|
|
|
|
function create_projects {
|
|
source $TOP_DIR/openrc admin admin
|
|
add_project demo1 demo1 demo1
|
|
add_project demo2 demo2 demo2
|
|
source $TOP_DIR/openrc demo demo
|
|
}
|
|
|
|
function delete_projects_and_users {
|
|
source $TOP_DIR/openrc admin admin
|
|
remove_user demo1
|
|
remove_project demo1
|
|
remove_user demo2
|
|
remove_project demo2
|
|
echo "removed all projects"
|
|
source $TOP_DIR/openrc demo demo
|
|
}
|
|
|
|
function create_network {
|
|
local PROJECT=$1
|
|
local GATEWAY=$2
|
|
local CIDR=$3
|
|
local NUM=$4
|
|
local EXTRA=$5
|
|
local NET_NAME="${PROJECT}-net$NUM"
|
|
local ROUTER_NAME="${PROJECT}-router${NUM}"
|
|
source $TOP_DIR/openrc admin admin
|
|
local PROJECT_ID
|
|
PROJECT_ID=$(get_project_id $PROJECT)
|
|
source $TOP_DIR/openrc $PROJECT $PROJECT
|
|
local NET_ID
|
|
NET_ID=$(neutron net-create --project-id $PROJECT_ID $NET_NAME $EXTRA| grep ' id ' | awk '{print $4}' )
|
|
die_if_not_set $LINENO NET_ID "Failure creating NET_ID for $PROJECT_ID $NET_NAME $EXTRA"
|
|
neutron subnet-create --ip-version 4 --project-id $PROJECT_ID --gateway $GATEWAY --subnetpool None $NET_ID $CIDR
|
|
neutron_debug_admin probe-create --device-owner compute $NET_ID
|
|
source $TOP_DIR/openrc demo demo
|
|
}
|
|
|
|
function create_networks {
|
|
foreach_project_net 'create_network ${%PROJECT%_NAME} ${%PROJECT%_NET%NUM%_GATEWAY} ${%PROJECT%_NET%NUM%_CIDR} %NUM% ${%PROJECT%_NET%NUM%_EXTRA}'
|
|
#TODO(nati) test security group function
|
|
# allow ICMP for both project'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 PROJECT=$1
|
|
local NUM=$2
|
|
local NET_NAMES=$3
|
|
source $TOP_DIR/openrc $PROJECT $PROJECT
|
|
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
|
|
VM_UUID=`nova boot --flavor $(get_flavor_id m1.tiny) \
|
|
--image $(get_image_id) \
|
|
$NIC \
|
|
$PROJECT-server$NUM | grep ' id ' | cut -d"|" -f3 | sed 's/ //g'`
|
|
die_if_not_set $LINENO VM_UUID "Failure launching $PROJECT-server$NUM"
|
|
confirm_server_active $VM_UUID
|
|
}
|
|
|
|
function create_vms {
|
|
foreach_project_vm 'create_vm ${%PROJECT%_NAME} %NUM% ${%PROJECT%_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=$(get_instance_ip $VM_NAME $NET_NAME)
|
|
ping_check $IP $BOOT_TIMEOUT $NET_NAME
|
|
}
|
|
|
|
function check_vm {
|
|
local PROJECT=$1
|
|
local NUM=$2
|
|
local VM_NAME="$PROJECT-server$NUM"
|
|
local NET_NAME=$3
|
|
source $TOP_DIR/openrc $PROJECT $PROJECT
|
|
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_project_vm 'check_vm ${%PROJECT%_NAME} %NUM% ${%PROJECT%_VM%NUM%_NET}'
|
|
}
|
|
|
|
function shutdown_vm {
|
|
local PROJECT=$1
|
|
local NUM=$2
|
|
source $TOP_DIR/openrc $PROJECT $PROJECT
|
|
VM_NAME=${PROJECT}-server$NUM
|
|
nova delete $VM_NAME
|
|
}
|
|
|
|
function shutdown_vms {
|
|
foreach_project_vm 'shutdown_vm ${%PROJECT%_NAME} %NUM%'
|
|
if ! timeout $TERMINATE_TIMEOUT sh -c "while nova list | grep -q ACTIVE; do sleep 1; done"; then
|
|
die $LINENO "Some VMs failed to shutdown"
|
|
fi
|
|
}
|
|
|
|
function delete_network {
|
|
local PROJECT=$1
|
|
local NUM=$2
|
|
local NET_NAME="${PROJECT}-net$NUM"
|
|
source $TOP_DIR/openrc admin admin
|
|
local PROJECT_ID
|
|
PROJECT_ID=$(get_project_id $PROJECT)
|
|
#TODO(nati) comment out until l3-agent merged
|
|
#for res in port subnet net router;do
|
|
for net_id in `neutron net-list -c id -c name | grep $NET_NAME | awk '{print $2}'`;do
|
|
delete_probe $net_id
|
|
neutron subnet-list | grep $net_id | awk '{print $2}' | xargs -I% neutron subnet-delete %
|
|
neutron net-delete $net_id
|
|
done
|
|
source $TOP_DIR/openrc demo demo
|
|
}
|
|
|
|
function delete_networks {
|
|
foreach_project_net 'delete_network ${%PROJECT%_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_projects
|
|
create_networks
|
|
create_vms
|
|
}
|
|
|
|
function delete_all {
|
|
shutdown_vms
|
|
delete_networks
|
|
delete_projects_and_users
|
|
}
|
|
|
|
function all {
|
|
create_all
|
|
check_vms
|
|
delete_all
|
|
}
|
|
|
|
# Test functions
|
|
# --------------
|
|
|
|
function test_functions {
|
|
IMAGE=$(get_image_id)
|
|
echo $IMAGE
|
|
|
|
PROJECT_ID=$(get_project_id demo)
|
|
echo $PROJECT_ID
|
|
|
|
FLAVOR_ID=$(get_flavor_id m1.tiny)
|
|
echo $FLAVOR_ID
|
|
|
|
NETWORK_ID=$(get_network_id admin)
|
|
echo $NETWORK_ID
|
|
}
|
|
|
|
# Usage and main
|
|
# --------------
|
|
|
|
function usage {
|
|
echo "$0: [-h]"
|
|
echo " -h, --help Display help message"
|
|
echo " -t, --project Create projects"
|
|
echo " -n, --net Create networks"
|
|
echo " -v, --vm Create vms"
|
|
echo " -c, --check Check connection"
|
|
echo " -x, --delete-projects Delete projects"
|
|
echo " -y, --delete-nets Delete networks"
|
|
echo " -z, --delete-vms Delete vms"
|
|
echo " -T, --test Test functions"
|
|
}
|
|
|
|
function main {
|
|
|
|
echo Description
|
|
|
|
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 | --project ) create_projects
|
|
exit
|
|
;;
|
|
-c | --check ) check_vms
|
|
exit
|
|
;;
|
|
-T | --test ) test_functions
|
|
exit
|
|
;;
|
|
-x | --delete-projects ) delete_projects_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
|
|
}
|
|
|
|
trap failed ERR
|
|
function failed {
|
|
local r=$?
|
|
set +o errtrace
|
|
set +o xtrace
|
|
echo "Failed to execute"
|
|
echo "Starting cleanup..."
|
|
delete_all
|
|
echo "Finished cleanup"
|
|
exit $r
|
|
}
|
|
|
|
# Kick off script
|
|
# ---------------
|
|
|
|
echo $*
|
|
main $*
|
|
|
|
set +o xtrace
|
|
echo "*********************************************************************"
|
|
echo "SUCCESS: End DevStack Exercise: $0"
|
|
echo "*********************************************************************"
|