# 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/cinder source $TOP_DIR/lib/neutron-legacy # DIVIDER source $TOP_DIR/exerciserc # DIVIDER is_service_enabled cinder || exit 55 # DIVIDER [ "$VIRT_DRIVER" == "ironic" ] && exit 55 # DIVIDER DEFAULT_INSTANCE_TYPE=${DEFAULT_INSTANCE_TYPE:-m1.tiny} # DIVIDER DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-ami} # DIVIDER SECGROUP=${SECGROUP:-vol_secgroup} # DIVIDER VM_NAME=${VM_NAME:-ex-vol-inst} VOL_NAME="ex-vol-$(openssl rand -hex 4)" # 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 if is_service_enabled n-cell; then # DIVIDER SECGROUP="default" echo "Using the default security group because of Cells." else # 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 echo "Security group not created" exit 1 fi fi fi # DIVIDER if ! nova secgroup-list-rules $SECGROUP | grep -q icmp; then nova secgroup-add-rule $SECGROUP icmp -1 -1 fi if ! nova secgroup-list-rules $SECGROUP | grep -q " tcp .* 22 "; then nova secgroup-add-rule $SECGROUP tcp 22 22 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!" 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 if [[ -n $(cinder list | grep $VOL_NAME | head -1 | get_field 2) ]]; then die $LINENO "Volume $VOL_NAME already exists" fi # DIVIDER start_time=$(date +%s) cinder create --display-name $VOL_NAME --display-description "test volume: $VOL_NAME" $DEFAULT_VOLUME_SIZE || \ die $LINENO "Failure creating volume $VOL_NAME" if ! timeout $ACTIVE_TIMEOUT sh -c "while ! cinder list | grep $VOL_NAME | grep available; do sleep 1; done"; then die $LINENO "Volume $VOL_NAME not created" fi end_time=$(date +%s) echo "Completed cinder create in $((end_time - start_time)) seconds" # DIVIDER VOL_ID=$(cinder list | grep $VOL_NAME | head -1 | get_field 1) die_if_not_set $LINENO VOL_ID "Failure retrieving volume ID for $VOL_NAME" # DIVIDER DEVICE=/dev/vdb start_time=$(date +%s) nova volume-attach $VM_UUID $VOL_ID $DEVICE || \ die $LINENO "Failure attaching volume $VOL_NAME to $VM_NAME" if ! timeout $ACTIVE_TIMEOUT sh -c "while ! cinder list | grep $VOL_NAME | grep in-use; do sleep 1; done"; then die $LINENO "Volume $VOL_NAME not attached to $VM_NAME" fi end_time=$(date +%s) echo "Completed volume-attach in $((end_time - start_time)) seconds" VOL_ATTACH=$(cinder list | grep $VOL_NAME | head -1 | get_field -1) die_if_not_set $LINENO VOL_ATTACH "Failure retrieving $VOL_NAME status" if [[ "$VOL_ATTACH" != $VM_UUID ]]; then die $LINENO "Volume not attached to correct instance" fi # DIVIDER # DIVIDER start_time=$(date +%s) nova volume-detach $VM_UUID $VOL_ID || die $LINENO "Failure detaching volume $VOL_NAME from $VM_NAME" if ! timeout $ACTIVE_TIMEOUT sh -c "while ! cinder list | grep $VOL_NAME | grep available; do sleep 1; done"; then die $LINENO "Volume $VOL_NAME not detached from $VM_NAME" fi end_time=$(date +%s) echo "Completed volume-detach in $((end_time - start_time)) seconds" # DIVIDER start_time=$(date +%s) cinder delete $VOL_ID || die $LINENO "Failure deleting volume $VOL_NAME" if ! timeout $ACTIVE_TIMEOUT sh -c "while cinder list | grep $VOL_NAME; do sleep 1; done"; then die $LINENO "Volume $VOL_NAME not deleted" fi end_time=$(date +%s) echo "Completed cinder delete in $((end_time - start_time)) seconds" # DIVIDER nova delete $VM_UUID || die $LINENO "Failure deleting instance $VM_NAME" 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 if [[ $SECGROUP = "default" ]] ; then echo "Skipping deleting default security group" else # DIVIDER nova secgroup-delete $SECGROUP || die $LINENO "Failure deleting security group $SECGROUP" fi set +o xtrace echo "*********************************************************************" echo "SUCCESS: End DevStack Exercise: $0" echo "*********************************************************************" # DIVIDER

Test cinder volumes with the cinder command from python-cinderclient

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.


Keep track of the current directory

Import common functions

Import configuration

Import project functions

Import exercise configuration

If cinder is not enabled we exit with exitcode 55 which mean exercise is skipped.

Ironic does not currently support volume attachment.

Instance type to create

Boot this image, use first AMI image if unset

Security group name

Instance and volume names

Launching a server

List servers for tenant:


List the images available

Grab the id of the image to launch

Security Groups

List security groups

Cells does not support security groups, so force the use of "default"

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


Verify it doesn't exist

Create a new volume

Get volume ID

Attach to server

Clean up

Detach volume

Delete volume

Delete instance

Delete secgroup