c2fc5f890e
Fixes test for detecting when a volume has been successfully attached to an instance to not just rely on the state being in-use, but also be marked as "attached". The attachment state will be displayed when https://review.openstack.org/#/c/27098/ goes through. The attachment state is not currently displayed by euca-describe-volumes because of the extraneous data returned by the API as per bug #1074901. In the meantime the "attaching" status of the volume itself, rather than the attachment state, suffices for the test to work properly, but in the long term this will disappear as it is not a valid ec2 API state and volumes will move straight to the in-use state. Fixes bug #1170548 Change-Id: Id38f37e1a0efc991f60da35145f809d98b5f41cd
176 lines
6.4 KiB
Bash
Executable File
176 lines
6.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# **euca.sh**
|
|
|
|
# we will use the ``euca2ools`` cli tool that wraps the python boto
|
|
# library to test ec2 compatibility
|
|
|
|
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
|
|
|
|
|
|
# Settings
|
|
# ========
|
|
|
|
# Keep track of the current directory
|
|
EXERCISE_DIR=$(cd $(dirname "$0") && pwd)
|
|
TOP_DIR=$(cd $EXERCISE_DIR/..; pwd)
|
|
VOLUME_SIZE=1
|
|
ATTACH_DEVICE=/dev/vdc
|
|
|
|
# Import common functions
|
|
source $TOP_DIR/functions
|
|
|
|
# Import EC2 configuration
|
|
source $TOP_DIR/eucarc
|
|
|
|
# Import quantum functions if needed
|
|
if is_service_enabled quantum; then
|
|
source $TOP_DIR/lib/quantum
|
|
fi
|
|
|
|
# Import exercise configuration
|
|
source $TOP_DIR/exerciserc
|
|
|
|
# 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}
|
|
|
|
# Security group name
|
|
SECGROUP=${SECGROUP:-euca_secgroup}
|
|
|
|
|
|
# Launching a server
|
|
# ==================
|
|
|
|
# Find a machine image to boot
|
|
IMAGE=`euca-describe-images | grep machine | grep ${DEFAULT_IMAGE_NAME} | cut -f2 | head -n1`
|
|
die_if_not_set $LINENO IMAGE "Failure getting image $DEFAULT_IMAGE_NAME"
|
|
|
|
# Add a secgroup
|
|
if ! euca-describe-groups | grep -q $SECGROUP; then
|
|
euca-add-group -d "$SECGROUP description" $SECGROUP
|
|
if ! timeout $ASSOCIATE_TIMEOUT sh -c "while ! euca-describe-groups | grep -q $SECGROUP; do sleep 1; done"; then
|
|
die $LINENO "Security group not created"
|
|
fi
|
|
fi
|
|
|
|
# Launch it
|
|
INSTANCE=`euca-run-instances -g $SECGROUP -t $DEFAULT_INSTANCE_TYPE $IMAGE | grep INSTANCE | cut -f2`
|
|
die_if_not_set $LINENO INSTANCE "Failure launching instance"
|
|
|
|
# Assure it has booted within a reasonable time
|
|
if ! timeout $RUNNING_TIMEOUT sh -c "while ! euca-describe-instances $INSTANCE | grep -q running; do sleep 1; done"; then
|
|
die $LINENO "server didn't become active within $RUNNING_TIMEOUT seconds"
|
|
fi
|
|
|
|
# Volumes
|
|
# -------
|
|
if [[ "$ENABLED_SERVICES" =~ "c-vol" ]]; then
|
|
VOLUME_ZONE=`euca-describe-availability-zones | head -n1 | cut -f2`
|
|
die_if_not_set $LINENO VOLUME_ZONE "Failure to find zone for volume"
|
|
|
|
VOLUME=`euca-create-volume -s 1 -z $VOLUME_ZONE | cut -f2`
|
|
die_if_not_set $LINENO VOLUME "Failure to create volume"
|
|
|
|
# Test that volume has been created
|
|
VOLUME=`euca-describe-volumes | cut -f2`
|
|
die_if_not_set $LINENO VOLUME "Failure to get volume"
|
|
|
|
# Test volume has become available
|
|
if ! timeout $RUNNING_TIMEOUT sh -c "while ! euca-describe-volumes $VOLUME | grep -q available; do sleep 1; done"; then
|
|
die $LINENO "volume didnt become available within $RUNNING_TIMEOUT seconds"
|
|
fi
|
|
|
|
# Attach volume to an instance
|
|
euca-attach-volume -i $INSTANCE -d $ATTACH_DEVICE $VOLUME || \
|
|
die $LINENO "Failure attaching volume $VOLUME to $INSTANCE"
|
|
if ! timeout $ACTIVE_TIMEOUT sh -c "while ! euca-describe-volumes $VOLUME | grep -A 1 in-use | grep -q attach; do sleep 1; done"; then
|
|
die $LINENO "Could not attach $VOLUME to $INSTANCE"
|
|
fi
|
|
|
|
# Detach volume from an instance
|
|
euca-detach-volume $VOLUME || \
|
|
die $LINENO "Failure detaching volume $VOLUME to $INSTANCE"
|
|
if ! timeout $ACTIVE_TIMEOUT sh -c "while ! euca-describe-volumes $VOLUME | grep -q available; do sleep 1; done"; then
|
|
die $LINENO "Could not detach $VOLUME to $INSTANCE"
|
|
fi
|
|
|
|
# Remove volume
|
|
euca-delete-volume $VOLUME || \
|
|
die $LINENO "Failure to delete volume"
|
|
if ! timeout $ACTIVE_TIMEOUT sh -c "while euca-describe-volumes | grep $VOLUME; do sleep 1; done"; then
|
|
die $LINENO "Could not delete $VOLUME"
|
|
fi
|
|
else
|
|
echo "Volume Tests Skipped"
|
|
fi
|
|
|
|
# Allocate floating address
|
|
FLOATING_IP=`euca-allocate-address | cut -f2`
|
|
die_if_not_set $LINENO FLOATING_IP "Failure allocating floating IP"
|
|
|
|
# Associate floating address
|
|
euca-associate-address -i $INSTANCE $FLOATING_IP || \
|
|
die $LINENO "Failure associating address $FLOATING_IP to $INSTANCE"
|
|
|
|
# Authorize pinging
|
|
euca-authorize -P icmp -s 0.0.0.0/0 -t -1:-1 $SECGROUP || \
|
|
die $LINENO "Failure authorizing rule in $SECGROUP"
|
|
|
|
# Test we can ping our floating ip within ASSOCIATE_TIMEOUT seconds
|
|
ping_check "$PUBLIC_NETWORK_NAME" $FLOATING_IP $ASSOCIATE_TIMEOUT
|
|
|
|
# Revoke pinging
|
|
euca-revoke -P icmp -s 0.0.0.0/0 -t -1:-1 $SECGROUP || \
|
|
die $LINENO "Failure revoking rule in $SECGROUP"
|
|
|
|
# Release floating address
|
|
euca-disassociate-address $FLOATING_IP || \
|
|
die $LINENO "Failure disassociating address $FLOATING_IP"
|
|
|
|
# Wait just a tick for everything above to complete so release doesn't fail
|
|
if ! timeout $ASSOCIATE_TIMEOUT sh -c "while euca-describe-addresses | grep $INSTANCE | grep -q $FLOATING_IP; do sleep 1; done"; then
|
|
die $LINENO "Floating ip $FLOATING_IP not disassociated within $ASSOCIATE_TIMEOUT seconds"
|
|
fi
|
|
|
|
# Release floating address
|
|
euca-release-address $FLOATING_IP || \
|
|
die $LINENO "Failure releasing address $FLOATING_IP"
|
|
|
|
# Wait just a tick for everything above to complete so terminate doesn't fail
|
|
if ! timeout $ASSOCIATE_TIMEOUT sh -c "while euca-describe-addresses | grep -q $FLOATING_IP; do sleep 1; done"; then
|
|
die $LINENO "Floating ip $FLOATING_IP not released within $ASSOCIATE_TIMEOUT seconds"
|
|
fi
|
|
|
|
# Terminate instance
|
|
euca-terminate-instances $INSTANCE || \
|
|
die $LINENO "Failure terminating instance $INSTANCE"
|
|
|
|
# Assure it has terminated within a reasonable time. The behaviour of this
|
|
# case changed with bug/836978. Requesting the status of an invalid instance
|
|
# will now return an error message including the instance id, so we need to
|
|
# filter that out.
|
|
if ! timeout $TERMINATE_TIMEOUT sh -c "while euca-describe-instances $INSTANCE | grep -ve \"\\\(InstanceNotFound\\\|InvalidInstanceID\[.\]NotFound\\\)\" | grep -q $INSTANCE; do sleep 1; done"; then
|
|
die $LINENO "server didn't terminate within $TERMINATE_TIMEOUT seconds"
|
|
fi
|
|
|
|
# Delete secgroup
|
|
euca-delete-group $SECGROUP || die $LINENO "Failure deleting security group $SECGROUP"
|
|
|
|
set +o xtrace
|
|
echo "*********************************************************************"
|
|
echo "SUCCESS: End DevStack Exercise: $0"
|
|
echo "*********************************************************************"
|