boot_from_volume.sh

boot_from_volume.sh

# 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/lib/cinder source $TOP_DIR/lib/neutron-legacy # DIVIDER source $TOP_DIR/openrc # 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:-boot_secgroup} # DIVIDER VM_NAME=${VM_NAME:-ex-bfv-inst} VOL_NAME=${VOL_NAME:-ex-vol-bfv} # 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 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) fi # DIVIDER nova delete $VM_NAME || true if ! timeout $ACTIVE_TIMEOUT sh -c "while nova show $VM_NAME; do sleep 1; done"; then echo "server didn't terminate!" exit 1 fi # DIVIDER KEY_NAME=test_key KEY_FILE=key.pem nova keypair-delete $KEY_NAME || true nova keypair-add $KEY_NAME > $KEY_FILE chmod 600 $KEY_FILE # DIVIDER # DIVIDER cinder delete $VOL_NAME || true if ! timeout $ACTIVE_TIMEOUT sh -c "while cinder list | grep $VOL_NAME; do sleep 1; done"; then echo "Volume $VOL_NAME not deleted" exit 1 fi # DIVIDER start_time=$(date +%s) cinder create --image-id $IMAGE --display-name=$VOL_NAME --display-description "test bootable 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 echo "Volume $VOL_NAME not created" exit 1 fi end_time=$(date +%s) echo "Completed cinder create in $((end_time - start_time)) seconds" # DIVIDER VOL_ID=$(cinder list | grep $VOL_NAME | get_field 1) die_if_not_set $LINENO VOL_ID "Failure retrieving volume ID for $VOL_NAME" # DIVIDER # DIVIDER VM_UUID=$(nova boot --flavor $INSTANCE_TYPE --image $IMAGE --block-device-mapping vda=$VOL_ID --security-groups=$SECGROUP --key-name $KEY_NAME $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 echo "server didn't become active!" exit 1 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 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 echo "Server $VM_NAME not deleted" exit 1 fi # DIVIDER if ! timeout $ACTIVE_TIMEOUT sh -c "while ! cinder list | grep $VOL_NAME | grep available; do sleep 1; done"; then echo "Volume $VOL_NAME not released" exit 1 fi # DIVIDER start_time=$(date +%s) cinder delete $VOL_ID || die $LINENO "Failure deleting volume $VOLUME_NAME" if ! timeout $ACTIVE_TIMEOUT sh -c "while cinder list | grep $VOL_NAME; do sleep 1; done"; then echo "Volume $VOL_NAME not deleted" exit 1 fi end_time=$(date +%s) echo "Completed cinder delete in $((end_time - start_time)) seconds" 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

This script demonstrates how to boot from a volume. It does the following:

  • Create a bootable volume
  • Boot a volume-backed instance

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 project functions

Import configuration

Import exercise configuration

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

Ironic does not support boot from volume.

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:

Images

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

Setup Keypair

Set up volume

Delete any old volume

Create the bootable volume

Get volume ID

Boot instance

Boot using the --block-device-mapping param. The format of mapping is: <dev_name>=<id>:<type>:<size(GB)>:<delete_on_terminate> Leaving the middle two fields blank appears to do-the-right-thing

Check that the status is active within ACTIVE_TIMEOUT seconds

Get the instance IP

Private IPs can be pinged in single node deployments

Clean up

Delete volume backed instance

Wait for volume to be released

Delete volume

Delete secgroup