Skip to content

Commit e46bec6

Browse files
committed
Merge branch 'master' into stable-diablo
2 parents e978e7f + e219b12 commit e46bec6

File tree

15 files changed

+480
-244
lines changed

15 files changed

+480
-244
lines changed

exercise.sh

Lines changed: 43 additions & 211 deletions
Original file line numberDiff line numberDiff line change
@@ -1,214 +1,46 @@
11
#!/usr/bin/env bash
22

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
7-
#
8-
9-
10-
# This script exits on an error so that errors don't compound and you see
11-
# only the first error that occured.
12-
set -o errexit
13-
14-
# Print the commands being run so that we can see the command that triggers
15-
# an error. It is also useful for following allowing as the install occurs.
16-
set -o xtrace
17-
18-
19-
# Settings
20-
# ========
21-
22-
# Use openrc + stackrc + localrc for settings
23-
source ./openrc
24-
25-
# Get a token for clients that don't support service catalog
26-
# ==========================================================
27-
28-
# manually create a token by querying keystone (sending JSON data). Keystone
29-
# returns a token and catalog of endpoints. We use python to parse the token
30-
# and save it.
31-
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'];"`
33-
34-
# Launching a server
35-
# ==================
36-
37-
# List servers for tenant:
38-
nova list
39-
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
47-
glance -A $TOKEN index
48-
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-
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"
61-
62-
# determine flavor
63-
# ----------------
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-
71-
NAME="myserver"
72-
73-
nova boot --flavor $FLAVOR --image $IMAGE $NAME --security_groups=$SECGROUP
74-
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-
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
96-
echo "server didn't become active!"
97-
exit 1
98-
fi
99-
100-
# get the IP of the server
101-
IP=`nova show $NAME | grep "private network" | cut -d"|" -f3`
102-
103-
# for single node deployments, we can ping private ips
104-
MULTI_HOST=${MULTI_HOST:-0}
105-
if [ "$MULTI_HOST" = "0" ]; then
106-
# sometimes the first ping fails (10 seconds isn't enough time for the VM's
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
110-
echo "Couldn't ping server"
111-
exit 1
3+
# Run everything in the exercises/ directory that isn't explicitly disabled
4+
5+
# comma separated list of script basenames to skip
6+
# to refrain from exercising euca.sh use SKIP_EXERCISES=euca
7+
SKIP_EXERCISES=${SKIP_EXERCISES:-""}
8+
9+
# Locate the scripts we should run
10+
EXERCISE_DIR=$(dirname "$0")/exercises
11+
basenames=$(for b in `ls $EXERCISE_DIR/*.sh`; do basename $b .sh; done)
12+
13+
# Track the state of each script
14+
passes=""
15+
failures=""
16+
skips=""
17+
18+
# Loop over each possible script (by basename)
19+
for script in $basenames; do
20+
if [[ "$SKIP_EXERCISES" =~ $script ]] ; then
21+
skips="$skips $script"
22+
else
23+
echo =========================
24+
echo Running $script
25+
echo =========================
26+
$EXERCISE_DIR/$script.sh
27+
if [[ $? -ne 0 ]] ; then
28+
failures="$failures $script"
29+
else
30+
passes="$passes $script"
31+
fi
11232
fi
113-
else
114-
# On a multi-host system, without vm net access, do a sleep to wait for the boot
115-
sleep $BOOT_TIMEOUT
116-
fi
117-
118-
# Security Groups & Floating IPs
119-
# ------------------------------
120-
121-
# allow icmp traffic (ping)
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
131-
FLOATING_IP=`nova floating-ip-list | grep None | head -1 | cut -d '|' -f2 | sed 's/ //g'`
132-
133-
# add floating ip to our server
134-
nova add-floating-ip $NAME $FLOATING_IP
135-
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
138-
echo "Couldn't ping server with floating ip"
139-
exit 1
140-
fi
141-
142-
# pause the VM and verify we can't ping it anymore
143-
nova pause $NAME
144-
145-
sleep 2
146-
147-
if ( ping -c1 -w1 $IP); then
148-
echo "Pause failure - ping shouldn't work"
149-
exit 1
150-
fi
151-
152-
if ( ping -c1 -w1 $FLOATING_IP); then
153-
echo "Pause failure - ping floating ips shouldn't work"
154-
exit 1
155-
fi
156-
157-
# unpause the VM and verify we can ping it again
158-
nova unpause $NAME
159-
160-
sleep 2
161-
162-
ping -c1 -w1 $IP
163-
164-
# dis-allow icmp traffic (ping)
165-
nova secgroup-delete-rule $SECGROUP icmp -1 -1 0.0.0.0/0
166-
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
175-
fi
176-
177-
# de-allocate the floating ip
178-
nova floating-ip-delete $FLOATING_IP
179-
180-
# shutdown the server
181-
nova delete $NAME
182-
183-
# Delete a secgroup
184-
nova secgroup-delete $SECGROUP
185-
186-
# FIXME: validate shutdown within 5 seconds
187-
# (nova show $NAME returns 1 or status != ACTIVE)?
188-
189-
# Testing Euca2ools
190-
# ==================
191-
192-
# make sure that we can describe instances
193-
euca-describe-instances
194-
195-
if [[ "$ENABLED_SERVICES" =~ "swift" ]]; then
196-
# Testing Swift
197-
# =============
198-
199-
# Check if we have to swift via keystone
200-
swift --auth-version 2 -A http://${HOST_IP}:5000/v2.0 -U admin -K $ADMIN_PASSWORD stat
201-
202-
# We start by creating a test container
203-
swift --auth-version 2 -A http://${HOST_IP}:5000/v2.0 -U admin -K $ADMIN_PASSWORD post testcontainer
204-
205-
# add some files into it.
206-
swift --auth-version 2 -A http://${HOST_IP}:5000/v2.0 -U admin -K $ADMIN_PASSWORD upload testcontainer /etc/issue
207-
208-
# list them
209-
swift --auth-version 2 -A http://${HOST_IP}:5000/v2.0 -U admin -K $ADMIN_PASSWORD list testcontainer
210-
211-
# And we may want to delete them now that we have tested that
212-
# everything works.
213-
swift --auth-version 2 -A http://${HOST_IP}:5000/v2.0 -U admin -K $ADMIN_PASSWORD delete testcontainer
214-
fi
33+
done
34+
35+
# output status of exercise run
36+
echo =========================
37+
echo =========================
38+
for script in $skips; do
39+
echo SKIP $script
40+
done
41+
for script in $passes; do
42+
echo PASS $script
43+
done
44+
for script in $failures; do
45+
echo FAILED $script
46+
done

exercises/euca.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env bash
2+
3+
# we will use the ``euca2ools`` cli tool that wraps the python boto
4+
# library to test ec2 compatibility
5+
#
6+
7+
# This script exits on an error so that errors don't compound and you see
8+
# only the first error that occured.
9+
set -o errexit
10+
11+
# Print the commands being run so that we can see the command that triggers
12+
# an error. It is also useful for following allowing as the install occurs.
13+
set -o xtrace
14+
15+
16+
# Settings
17+
# ========
18+
19+
# Use openrc + stackrc + localrc for settings
20+
pushd $(cd $(dirname "$0")/.. && pwd)
21+
source ./openrc
22+
popd
23+
24+
# find a machine image to boot
25+
IMAGE=`euca-describe-images | grep machine | cut -f2`
26+
27+
# launch it
28+
INSTANCE=`euca-run-instances $IMAGE | grep INSTANCE | cut -f2`
29+
30+
# assure it has booted within a reasonable time
31+
if ! timeout $RUNNING_TIMEOUT sh -c "while euca-describe-instances $INSTANCE | grep -q running; do sleep 1; done"; then
32+
echo "server didn't become active within $RUNNING_TIMEOUT seconds"
33+
exit 1
34+
fi
35+
36+
euca-terminate-instances $INSTANCE

0 commit comments

Comments
 (0)