floating_ips.sh

floating_ips.sh - using the cloud can be fun

# DIVIDER #!/usr/bin/env bash # DIVIDER echo "*********************************************************************" echo "Begin DevStack Exercise: $0" echo "*********************************************************************" # DIVIDER set -o errexit # DIVIDER set -o xtrace # DIVIDER # DIVIDER EXERCISE_DIR=$(cd $(dirname "$0") && pwd) TOP_DIR=$(cd $EXERCISE_DIR/..; pwd) # DIVIDER source $TOP_DIR/functions # DIVIDER source $TOP_DIR/openrc # DIVIDER source $TOP_DIR/lib/neutron-legacy # DIVIDER source $TOP_DIR/exerciserc # DIVIDER is_service_enabled n-api || exit 55 # DIVIDER DEFAULT_INSTANCE_TYPE=${DEFAULT_INSTANCE_TYPE:-m1.tiny} # DIVIDER DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-ami} # DIVIDER SECGROUP=${SECGROUP:-test_secgroup} # DIVIDER DEFAULT_FLOATING_POOL=${DEFAULT_FLOATING_POOL:-public} # DIVIDER TEST_FLOATING_POOL=${TEST_FLOATING_POOL:-test} # DIVIDER VM_NAME="ex-float" # DIVIDER is_service_enabled n-cell && exit 55 # DIVIDER # DIVIDER nova list # DIVIDER # DIVIDER openstack image list # DIVIDER IMAGE=$(openstack image list | egrep " $DEFAULT_IMAGE_NAME " | get_field 1) die_if_not_set $LINENO IMAGE "Failure getting image $DEFAULT_IMAGE_NAME" # DIVIDER # DIVIDER nova secgroup-list # DIVIDER if ! nova secgroup-list | grep -q $SECGROUP; then nova secgroup-create $SECGROUP "$SECGROUP description" if ! timeout $ASSOCIATE_TIMEOUT sh -c "while ! nova secgroup-list | grep -q $SECGROUP; do sleep 1; done"; then die $LINENO "Security group not created" fi fi # DIVIDER if ! nova secgroup-list-rules $SECGROUP | grep -q icmp; then nova secgroup-add-rule $SECGROUP icmp -1 -1 0.0.0.0/0 fi if ! nova secgroup-list-rules $SECGROUP | grep -q " tcp .* 22 "; then nova secgroup-add-rule $SECGROUP tcp 22 22 0.0.0.0/0 fi # DIVIDER nova secgroup-list-rules $SECGROUP # DIVIDER # DIVIDER nova flavor-list # DIVIDER INSTANCE_TYPE=$(nova flavor-list | grep $DEFAULT_INSTANCE_TYPE | get_field 1) if [[ -z "$INSTANCE_TYPE" ]]; then # DIVIDER INSTANCE_TYPE=$(nova flavor-list | head -n 4 | tail -n 1 | get_field 1) die_if_not_set $LINENO INSTANCE_TYPE "Failure retrieving INSTANCE_TYPE" fi # DIVIDER nova delete $VM_NAME || true if ! timeout $ACTIVE_TIMEOUT sh -c "while nova show $VM_NAME; do sleep 1; done"; then die $LINENO "server didn't terminate!" exit 1 fi # DIVIDER VM_UUID=$(nova boot --flavor $INSTANCE_TYPE --image $IMAGE --security-groups=$SECGROUP $VM_NAME | grep ' id ' | get_field 2) die_if_not_set $LINENO VM_UUID "Failure launching $VM_NAME" # DIVIDER if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova show $VM_UUID | grep status | grep -q ACTIVE; do sleep 1; done"; then die $LINENO "server didn't become active!" fi # DIVIDER IP=$(get_instance_ip $VM_UUID $PRIVATE_NETWORK_NAME) die_if_not_set $LINENO IP "Failure retrieving IP address" # DIVIDER ping_check $IP $BOOT_TIMEOUT "$PRIVATE_NETWORK_NAME" # DIVIDER # DIVIDER FLOATING_IP=$(nova floating-ip-create | grep $DEFAULT_FLOATING_POOL | get_field 1) die_if_not_set $LINENO FLOATING_IP "Failure creating floating IP from pool $DEFAULT_FLOATING_POOL" # DIVIDER if ! timeout $ASSOCIATE_TIMEOUT sh -c "while ! nova floating-ip-list | grep -q $FLOATING_IP; do sleep 1; done"; then die $LINENO "Floating IP not allocated" fi # DIVIDER nova add-floating-ip $VM_UUID $FLOATING_IP || \ die $LINENO "Failure adding floating IP $FLOATING_IP to $VM_NAME" # DIVIDER ping_check $FLOATING_IP $ASSOCIATE_TIMEOUT "$PUBLIC_NETWORK_NAME" if ! is_service_enabled neutron; then # DIVIDER TEST_FLOATING_IP=$(nova floating-ip-create $TEST_FLOATING_POOL | grep $TEST_FLOATING_POOL | get_field 1) die_if_not_set $LINENO TEST_FLOATING_IP "Failure creating floating IP in $TEST_FLOATING_POOL" # DIVIDER if ! timeout $ASSOCIATE_TIMEOUT sh -c "while ! nova floating-ip-list | grep $TEST_FLOATING_POOL | grep -q $TEST_FLOATING_IP; do sleep 1; done"; then die $LINENO "Floating IP not allocated" fi fi # DIVIDER nova secgroup-delete-rule $SECGROUP icmp -1 -1 0.0.0.0/0 || \ die $LINENO "Failure deleting security group rule from $SECGROUP" if ! timeout $ASSOCIATE_TIMEOUT sh -c "while nova secgroup-list-rules $SECGROUP | grep -q icmp; do sleep 1; done"; then die $LINENO "Security group rule not deleted from $SECGROUP" fi # DIVIDER if [ "$VIRT_DRIVER" != "ironic" -a "$VIRT_DRIVER" != "xenserver" -a "$VIRT_DRIVER" != "openvz" ]; then # DIVIDER ping_check $FLOATING_IP $ASSOCIATE_TIMEOUT "$PUBLIC_NETWORK_NAME" Fail fi # DIVIDER if ! is_service_enabled neutron; then # DIVIDER nova floating-ip-delete $TEST_FLOATING_IP || \ die $LINENO "Failure deleting floating IP $TEST_FLOATING_IP" fi # DIVIDER nova floating-ip-delete $FLOATING_IP || \ die $LINENO "Failure deleting floating IP $FLOATING_IP" # DIVIDER nova delete $VM_UUID || die $LINENO "Failure deleting instance $VM_NAME" # DIVIDER if ! timeout $TERMINATE_TIMEOUT sh -c "while nova list | grep -q $VM_UUID; do sleep 1; done"; then die $LINENO "Server $VM_NAME not deleted" fi # DIVIDER nova secgroup-delete $SECGROUP || \ die $LINENO "Failure deleting security group $SECGROUP" set +o xtrace echo "*********************************************************************" echo "SUCCESS: End DevStack Exercise: $0" echo "*********************************************************************" # DIVIDER

Test instance connectivity with the nova command from python-novaclient

This script exits on an error so that errors don't compound and you see only the first error that occurred.

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.

Settings

Keep track of the current directory

Import common functions

Import configuration

Import project functions

Import exercise configuration

If nova api is not enabled we exit with exitcode 55 so that the exercise is skipped

Instance type to create

Boot this image, use first AMI image if unset

Security group name

Default floating IP pool name

Additional floating IP pool and range

Instance name

Cells does not support floating ips API calls

Launching a server

List servers for tenant:

Images

List the images available

Grab the id of the image to launch

Security Groups

List security groups

Create a secgroup

Configure Security Group Rules

List secgroup rules

Set up instance

List flavors

Select a flavor

grab the first flavor in the list to launch if default doesn't exist

Clean-up from previous runs

Boot instance

Check that the status is active within ACTIVE_TIMEOUT seconds

Get the instance IP

Private IPs can be pinged in single node deployments

Floating IPs

Allocate a floating IP from the default pool

List floating addresses

Add floating IP to our server

Test we can ping our floating IP within ASSOCIATE_TIMEOUT seconds

Allocate an IP from second floating pool

list floating addresses

Dis-allow icmp traffic (ping)

FIXME (anthony): make xs support security groups

Test we can aren't able to ping our floating ip within ASSOCIATE_TIMEOUT seconds

Clean up

Delete second floating IP

Delete the floating ip

Delete instance

Wait for termination

Delete secgroup