#!/usr/bin/env bash # **exercise.sh** - using the cloud can be fun # we will use the ``nova`` cli tool provided by the ``python-novaclient`` # package # # 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 # ======== # Use stackrc and localrc for settings source ./stackrc HOST=${HOST:-localhost} # Nova original used project_id as the *account* that owned resources (servers, # ip address, ...) With the addition of Keystone we have standardized on the # term **tenant** as the entity that owns the resources. **novaclient** still # uses the old deprecated terms project_id. Note that this field should now be # set to tenant_name, not tenant_id. export NOVA_PROJECT_ID=${TENANT:-demo} # In addition to the owning entity (tenant), nova stores the entity performing # the action as the **user**. export NOVA_USERNAME=${USERNAME:-demo} # With Keystone you pass the keystone password instead of an api key. export NOVA_API_KEY=${ADMIN_PASSWORD:-secrete} # With the addition of Keystone, to use an openstack cloud you should # authenticate against keystone, which returns a **Token** and **Service # Catalog**. The catalog contains the endpoint for all services the user/tenant # has access to - including nova, glance, keystone, swift, ... We currently # recommend using the 2.0 *auth api*. # # *NOTE*: Using the 2.0 *auth api* does mean that compute api is 2.0. We will # use the 1.1 *compute api* export NOVA_URL=${NOVA_URL:-http://$HOST:5000/v2.0/} # Currently novaclient needs you to specify the *compute api* version. This # needs to match the config of your catalog returned by Keystone. export NOVA_VERSION=1.1 # FIXME - why does this need to be specified? export NOVA_REGION_NAME=RegionOne # set log level to DEBUG (helps debug issues) export NOVACLIENT_DEBUG=1 # Get a token for clients that don't support service catalog # ========================================================== # manually create a token by querying keystone (sending JSON data). Keystone # returns a token and catalog of endpoints. We use python to parse the token # and save it. TOKEN=`curl -s -d "{\"auth\":{\"passwordCredentials\": {\"username\": \"$NOVA_USERNAME\", \"password\": \"$NOVA_API_KEY\"}}}" -H "Content-type: application/json" http://$HOST:5000/v2.0/tokens | python -c "import sys; import json; tok = json.loads(sys.stdin.read()); print tok['access']['token']['id'];"` # Launching a server # ================== # List servers for tenant: nova list # Images # ------ # Nova has a **deprecated** way of listing images. nova image-list # But we recommend using glance directly glance -A $TOKEN index # Let's grab the id of the first AMI image to launch IMAGE=`glance -A $TOKEN index | egrep ami | cut -d" " -f1` # Security Groups # --------------- SECGROUP=test_secgroup # List of secgroups: nova secgroup-list # Create a secgroup nova secgroup-create $SECGROUP "test_secgroup description" # Flavors # ------- # List of flavors: nova flavor-list # and grab the first flavor in the list to launch FLAVOR=`nova flavor-list | head -n 4 | tail -n 1 | cut -d"|" -f2` NAME="myserver" nova boot --flavor $FLAVOR --image $IMAGE $NAME --security_groups=$SECGROUP # let's give it 10 seconds to launch sleep 10 # check that the status is active nova show $NAME | grep status | grep -q ACTIVE # get the IP of the server IP=`nova show $NAME | grep "private network" | cut -d"|" -f3` # ping it once (timeout of a second) ping -c1 -w1 $IP || true # sometimes the first ping fails (10 seconds isn't enough time for the VM's # network to respond?), so let's wait 5 seconds and really test ping sleep 5 ping -c1 -w1 $IP # allow icmp traffic nova secgroup-add-rule $SECGROUP icmp -1 -1 0.0.0.0/0 # List rules for a secgroup nova secgroup-list-rules $SECGROUP # allocate a floating ip nova floating-ip-create # store floating address FIP=`nova floating-ip-list | grep None | head -1 | cut -d '|' -f2 | sed 's/ //g'` # add floating ip to our server nova add-floating-ip $NAME $FIP # sleep for a smidge sleep 1 # ping our fip ping -c1 -w1 $FIP # dis-allow icmp traffic nova secgroup-delete-rule $SECGROUP icmp -1 -1 0.0.0.0/0 # sleep for a smidge sleep 1 # ping our fip if ( ping -c1 -w1 $FIP); then print "Security group failure - ping should not be allowed!" exit 1 fi # de-allocate the floating ip nova floating-ip-delete $FIP # shutdown the server nova delete $NAME # Delete a secgroup nova secgroup-delete $SECGROUP # FIXME: validate shutdown within 5 seconds # (nova show $NAME returns 1 or status != ACTIVE)?