| Jesse Andrews | b019151 | 2011-09-14 19:37:10 -0700 | [diff] [blame] | 1 | #!/usr/bin/env bash | 
|  | 2 |  | 
|  | 3 | # **exercise.sh** - using the cloud can be fun | 
|  | 4 |  | 
|  | 5 | # we will use the ``nova`` cli tool provided by the ``python-novaclient`` | 
|  | 6 | # package | 
| Jesse Andrews | b19424f | 2011-09-14 22:03:04 -0700 | [diff] [blame] | 7 | # | 
| Jesse Andrews | b019151 | 2011-09-14 19:37:10 -0700 | [diff] [blame] | 8 |  | 
| Jesse Andrews | b19424f | 2011-09-14 22:03:04 -0700 | [diff] [blame] | 9 |  | 
| Vishvananda Ishaya | 9b35367 | 2011-10-20 10:07:10 -0700 | [diff] [blame] | 10 | # This script exits on an error so that errors don't compound and you see | 
| Jesse Andrews | b19424f | 2011-09-14 22:03:04 -0700 | [diff] [blame] | 11 | # only the first error that occured. | 
|  | 12 | set -o errexit | 
|  | 13 |  | 
| Vishvananda Ishaya | 9b35367 | 2011-10-20 10:07:10 -0700 | [diff] [blame] | 14 | # Print the commands being run so that we can see the command that triggers | 
| Jesse Andrews | b19424f | 2011-09-14 22:03:04 -0700 | [diff] [blame] | 15 | # an error.  It is also useful for following allowing as the install occurs. | 
|  | 16 | set -o xtrace | 
|  | 17 |  | 
|  | 18 |  | 
|  | 19 | # Settings | 
|  | 20 | # ======== | 
| Jesse Andrews | b019151 | 2011-09-14 19:37:10 -0700 | [diff] [blame] | 21 |  | 
| Anthony Young | 6ab10d4 | 2011-10-20 10:24:50 -0700 | [diff] [blame] | 22 | # Use openrc + stackrc + localrc for settings | 
|  | 23 | source ./openrc | 
| Jesse Andrews | b019151 | 2011-09-14 19:37:10 -0700 | [diff] [blame] | 24 |  | 
| Anthony Young | 94c889a | 2011-10-11 18:07:48 +0000 | [diff] [blame] | 25 | # Get a token for clients that don't support service catalog | 
|  | 26 | # ========================================================== | 
| Jesse Andrews | b9c77d6 | 2011-10-15 18:37:25 -0700 | [diff] [blame] | 27 |  | 
| Vishvananda Ishaya | 9b35367 | 2011-10-20 10:07:10 -0700 | [diff] [blame] | 28 | # manually create a token by querying keystone (sending JSON data).  Keystone | 
| Jesse Andrews | b9c77d6 | 2011-10-15 18:37:25 -0700 | [diff] [blame] | 29 | # returns a token and catalog of endpoints.  We use python to parse the token | 
|  | 30 | # and save it. | 
|  | 31 |  | 
| Jesse Andrews | e61f318 | 2011-10-24 13:43:04 -0700 | [diff] [blame] | 32 | TOKEN=`curl -s -d  "{\"auth\":{\"passwordCredentials\": {\"username\": \"$NOVA_USERNAME\", \"password\": \"$NOVA_API_KEY\"}}}" -H "Content-type: application/json" http://$HOST_IP:5000/v2.0/tokens | python -c "import sys; import json; tok = json.loads(sys.stdin.read()); print tok['access']['token']['id'];"` | 
| Anthony Young | 94c889a | 2011-10-11 18:07:48 +0000 | [diff] [blame] | 33 |  | 
| Jesse Andrews | 593828d | 2011-09-14 22:44:50 -0700 | [diff] [blame] | 34 | # Launching a server | 
|  | 35 | # ================== | 
| Jesse Andrews | b19424f | 2011-09-14 22:03:04 -0700 | [diff] [blame] | 36 |  | 
| Jesse Andrews | 593828d | 2011-09-14 22:44:50 -0700 | [diff] [blame] | 37 | # List servers for tenant: | 
| Jesse Andrews | b019151 | 2011-09-14 19:37:10 -0700 | [diff] [blame] | 38 | nova list | 
| Jesse Andrews | 593828d | 2011-09-14 22:44:50 -0700 | [diff] [blame] | 39 |  | 
| Jesse Andrews | 593828d | 2011-09-14 22:44:50 -0700 | [diff] [blame] | 40 | # Images | 
|  | 41 | # ------ | 
|  | 42 |  | 
|  | 43 | # Nova has a **deprecated** way of listing images. | 
|  | 44 | nova image-list | 
|  | 45 |  | 
|  | 46 | # But we recommend using glance directly | 
| Jesse Andrews | 4e8847c | 2011-10-15 19:29:55 -0700 | [diff] [blame] | 47 | glance -A $TOKEN index | 
| Jesse Andrews | 593828d | 2011-09-14 22:44:50 -0700 | [diff] [blame] | 48 |  | 
| Jesse Andrews | d888e1c | 2011-10-15 20:01:12 -0700 | [diff] [blame] | 49 | # Let's grab the id of the first AMI image to launch | 
|  | 50 | IMAGE=`glance -A $TOKEN index | egrep ami | cut -d" " -f1` | 
|  | 51 |  | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 52 | # Security Groups | 
|  | 53 | # --------------- | 
|  | 54 | SECGROUP=test_secgroup | 
|  | 55 |  | 
|  | 56 | # List of secgroups: | 
|  | 57 | nova secgroup-list | 
|  | 58 |  | 
|  | 59 | # Create a secgroup | 
|  | 60 | nova secgroup-create $SECGROUP "test_secgroup description" | 
| Jesse Andrews | d888e1c | 2011-10-15 20:01:12 -0700 | [diff] [blame] | 61 |  | 
| Jesse Andrews | 6fc7101 | 2011-10-24 11:29:08 -0700 | [diff] [blame] | 62 | # determine flavor | 
|  | 63 | # ---------------- | 
| Jesse Andrews | d888e1c | 2011-10-15 20:01:12 -0700 | [diff] [blame] | 64 |  | 
|  | 65 | # List of flavors: | 
|  | 66 | nova flavor-list | 
|  | 67 |  | 
|  | 68 | # and grab the first flavor in the list to launch | 
|  | 69 | FLAVOR=`nova flavor-list | head -n 4 | tail -n 1 | cut -d"|" -f2` | 
|  | 70 |  | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 71 | NAME="myserver" | 
| Jesse Andrews | d888e1c | 2011-10-15 20:01:12 -0700 | [diff] [blame] | 72 |  | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 73 | nova boot --flavor $FLAVOR --image $IMAGE $NAME --security_groups=$SECGROUP | 
| Jesse Andrews | d888e1c | 2011-10-15 20:01:12 -0700 | [diff] [blame] | 74 |  | 
| Jesse Andrews | 6fc7101 | 2011-10-24 11:29:08 -0700 | [diff] [blame] | 75 | # Testing | 
|  | 76 | # ======= | 
|  | 77 |  | 
|  | 78 | # First check if it spins up (becomes active and responds to ping on | 
|  | 79 | # internal ip).  If you run this script from a nova node, you should | 
|  | 80 | # bypass security groups and have direct access to the server. | 
|  | 81 |  | 
|  | 82 | # Waiting for boot | 
|  | 83 | # ---------------- | 
|  | 84 |  | 
| Anthony Young | 79e807a | 2011-10-31 11:16:44 -0700 | [diff] [blame] | 85 | # Max time to wait while vm goes from build to active state | 
|  | 86 | ACTIVE_TIMEOUT=${ACTIVE_TIMEOUT:-10} | 
|  | 87 |  | 
|  | 88 | # Max time till the vm is bootable | 
|  | 89 | BOOT_TIMEOUT=${BOOT_TIMEOUT:-15} | 
|  | 90 |  | 
|  | 91 | # Max time to wait for proper association and dis-association. | 
|  | 92 | ASSOCIATE_TIMEOUT=${ASSOCIATE_TIMEOUT:-10} | 
|  | 93 |  | 
|  | 94 | # check that the status is active within ACTIVE_TIMEOUT seconds | 
|  | 95 | if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova show $NAME | grep status | grep -q ACTIVE; do sleep 1; done"; then | 
| Jesse Andrews | 5a77483 | 2011-10-26 21:30:02 -0700 | [diff] [blame] | 96 | echo "server didn't become active!" | 
|  | 97 | exit 1 | 
|  | 98 | fi | 
| Jesse Andrews | d888e1c | 2011-10-15 20:01:12 -0700 | [diff] [blame] | 99 |  | 
|  | 100 | # get the IP of the server | 
|  | 101 | IP=`nova show $NAME | grep "private network" | cut -d"|" -f3` | 
|  | 102 |  | 
| Anthony Young | 8ecd294 | 2011-10-24 22:58:14 -0700 | [diff] [blame] | 103 | # for single node deployments, we can ping private ips | 
|  | 104 | MULTI_HOST=${MULTI_HOST:-0} | 
| Justin Shepherd | 56a505f | 2011-10-26 10:45:02 -0500 | [diff] [blame] | 105 | if [ "$MULTI_HOST" = "0" ]; then | 
| Anthony Young | 8ecd294 | 2011-10-24 22:58:14 -0700 | [diff] [blame] | 106 | # sometimes the first ping fails (10 seconds isn't enough time for the VM's | 
| Anthony Young | 79e807a | 2011-10-31 11:16:44 -0700 | [diff] [blame] | 107 | # network to respond?), so let's ping for a default of 15 seconds with a | 
|  | 108 | # timeout of a second for each ping. | 
|  | 109 | if ! timeout $BOOT_TIMEOUT sh -c "while ! ping -c1 -w1 $IP; do sleep 1; done"; then | 
| Jesse Andrews | ab8dbce | 2011-10-26 21:23:20 -0700 | [diff] [blame] | 110 | echo "Couldn't ping server" | 
|  | 111 | exit 1 | 
|  | 112 | fi | 
| Anthony Young | 79e807a | 2011-10-31 11:16:44 -0700 | [diff] [blame] | 113 | else | 
|  | 114 | # On a multi-host system, without vm net access, do a sleep to wait for the boot | 
|  | 115 | sleep $BOOT_TIMEOUT | 
| Anthony Young | 8ecd294 | 2011-10-24 22:58:14 -0700 | [diff] [blame] | 116 | fi | 
| Jesse Andrews | 6fc7101 | 2011-10-24 11:29:08 -0700 | [diff] [blame] | 117 |  | 
|  | 118 | # Security Groups & Floating IPs | 
|  | 119 | # ------------------------------ | 
|  | 120 |  | 
|  | 121 | # allow icmp traffic (ping) | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 122 | nova secgroup-add-rule $SECGROUP icmp -1 -1 0.0.0.0/0 | 
|  | 123 |  | 
|  | 124 | # List rules for a secgroup | 
|  | 125 | nova secgroup-list-rules $SECGROUP | 
|  | 126 |  | 
|  | 127 | # allocate a floating ip | 
|  | 128 | nova floating-ip-create | 
|  | 129 |  | 
|  | 130 | # store  floating address | 
| Jesse Andrews | 6fc7101 | 2011-10-24 11:29:08 -0700 | [diff] [blame] | 131 | FLOATING_IP=`nova floating-ip-list | grep None | head -1 | cut -d '|' -f2 | sed 's/ //g'` | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 132 |  | 
|  | 133 | # add floating ip to our server | 
| Jesse Andrews | 6fc7101 | 2011-10-24 11:29:08 -0700 | [diff] [blame] | 134 | nova add-floating-ip $NAME $FLOATING_IP | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 135 |  | 
| Anthony Young | 79e807a | 2011-10-31 11:16:44 -0700 | [diff] [blame] | 136 | # test we can ping our floating ip within ASSOCIATE_TIMEOUT seconds | 
|  | 137 | if ! timeout $ASSOCIATE_TIMEOUT sh -c "while ! ping -c1 -w1 $FLOATING_IP; do sleep 1; done"; then | 
| Jesse Andrews | 5a77483 | 2011-10-26 21:30:02 -0700 | [diff] [blame] | 138 | echo "Couldn't ping server with floating ip" | 
|  | 139 | exit 1 | 
|  | 140 | fi | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 141 |  | 
| Jesse Andrews | b7cc5bc | 2011-10-26 22:11:31 -0700 | [diff] [blame] | 142 | # pause the VM and verify we can't ping it anymore | 
|  | 143 | nova pause $NAME | 
|  | 144 |  | 
| Jesse Andrews | 467135e | 2011-10-27 14:06:33 -0700 | [diff] [blame] | 145 | sleep 2 | 
| Jesse Andrews | b7cc5bc | 2011-10-26 22:11:31 -0700 | [diff] [blame] | 146 |  | 
| Jesse Andrews | 467135e | 2011-10-27 14:06:33 -0700 | [diff] [blame] | 147 | if ( ping -c1 -w1 $IP); then | 
| Jesse Andrews | b7cc5bc | 2011-10-26 22:11:31 -0700 | [diff] [blame] | 148 | echo "Pause failure - ping shouldn't work" | 
|  | 149 | exit 1 | 
|  | 150 | fi | 
|  | 151 |  | 
| Jesse Andrews | 0c484fe | 2011-10-27 14:10:47 -0700 | [diff] [blame] | 152 | if ( ping -c1 -w1 $FLOATING_IP); then | 
|  | 153 | echo "Pause failure - ping floating ips shouldn't work" | 
|  | 154 | exit 1 | 
|  | 155 | fi | 
|  | 156 |  | 
| Jesse Andrews | b7cc5bc | 2011-10-26 22:11:31 -0700 | [diff] [blame] | 157 | # unpause the VM and verify we can ping it again | 
|  | 158 | nova unpause $NAME | 
|  | 159 |  | 
| Jesse Andrews | 467135e | 2011-10-27 14:06:33 -0700 | [diff] [blame] | 160 | sleep 2 | 
| Jesse Andrews | b7cc5bc | 2011-10-26 22:11:31 -0700 | [diff] [blame] | 161 |  | 
| Jesse Andrews | 467135e | 2011-10-27 14:06:33 -0700 | [diff] [blame] | 162 | ping -c1 -w1 $IP | 
| Jesse Andrews | b7cc5bc | 2011-10-26 22:11:31 -0700 | [diff] [blame] | 163 |  | 
| Jesse Andrews | 6fc7101 | 2011-10-24 11:29:08 -0700 | [diff] [blame] | 164 | # dis-allow icmp traffic (ping) | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 165 | nova secgroup-delete-rule $SECGROUP icmp -1 -1 0.0.0.0/0 | 
|  | 166 |  | 
| Anthony Young | 1de18c6 | 2011-11-01 14:19:18 -0500 | [diff] [blame] | 167 | # FIXME (anthony): make xs support security groups | 
|  | 168 | if [ "$VIRT_DRIVER" != "xenserver"]; then | 
|  | 169 | # test we can aren't able to ping our floating ip within ASSOCIATE_TIMEOUT seconds | 
|  | 170 | if ! timeout $ASSOCIATE_TIMEOUT sh -c "while ping -c1 -w1 $FLOATING_IP; do sleep 1; done"; then | 
|  | 171 | print "Security group failure - ping should not be allowed!" | 
|  | 172 | echo "Couldn't ping server with floating ip" | 
|  | 173 | exit 1 | 
|  | 174 | fi | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 175 | fi | 
|  | 176 |  | 
|  | 177 | # de-allocate the floating ip | 
| Jesse Andrews | 6fc7101 | 2011-10-24 11:29:08 -0700 | [diff] [blame] | 178 | nova floating-ip-delete $FLOATING_IP | 
| Jesse Andrews | d888e1c | 2011-10-15 20:01:12 -0700 | [diff] [blame] | 179 |  | 
|  | 180 | # shutdown the server | 
|  | 181 | nova delete $NAME | 
|  | 182 |  | 
| Anthony Young | 20a2cae | 2011-10-17 16:02:24 -0700 | [diff] [blame] | 183 | # Delete a secgroup | 
|  | 184 | nova secgroup-delete $SECGROUP | 
|  | 185 |  | 
| Vishvananda Ishaya | 9b35367 | 2011-10-20 10:07:10 -0700 | [diff] [blame] | 186 | # FIXME: validate shutdown within 5 seconds | 
| Jesse Andrews | d888e1c | 2011-10-15 20:01:12 -0700 | [diff] [blame] | 187 | # (nova show $NAME returns 1 or status != ACTIVE)? | 
| Vishvananda Ishaya | f56e395 | 2011-10-24 16:05:57 -0700 | [diff] [blame] | 188 |  | 
|  | 189 | # Testing Euca2ools | 
|  | 190 | # ================== | 
|  | 191 |  | 
|  | 192 | # make sure that we can describe instances | 
|  | 193 | euca-describe-instances |