grenade/setup-javelin

153 lines
4.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# ``setup-javelin``
# Keep track of the grenade directory
GRENADE_DIR=$(cd $(dirname "$0") && pwd)
# Import common functions
source $GRENADE_DIR/functions
# Determine what system we are running on. This provides ``os_VENDOR``,
# ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME``
# and ``DISTRO``
GetDistro
# Source params
source $GRENADE_DIR/grenaderc
# For debugging
set -o xtrace
# Create Javelin Project
# ======================
# Get DevStack Configuration
source $BASE_DEVSTACK_DIR/openrc admin admin
# Our configuration
source $GRENADE_DIR/javelin.conf
DEFAULT_INSTANCE_TYPE=${DEFAULT_INSTANCE_TYPE:-m1.tiny}
# Add To Keystone
# ---------------
function get_id () {
echo `"$@" | awk '/ id / { print $4 }'`
}
# Create javelin project and user
JAVELIN_TENANT=$(keystone tenant-list | awk "/ $JPROJECT / { print \$2 }")
[[ -z "$JAVELIN_TENANT" ]] && \
JAVELIN_TENANT=$(get_id keystone tenant-create --name=$JPROJECT)
JAVELIN_USER=$(keystone user-list | awk "/ $JUSER / { print \$2 }")
[[ -z "$JAVELIN_USER" ]] && \
JAVELIN_USER=$(get_id keystone user-create --name=$JUSER \
--pass="$JPASSWORD" \
--email=bob@javelin.org)
MEMBER_ROLE=$(keystone role-list | awk "/ Member / { print \$2 }")
keystone user-role-add --tenant_id $JAVELIN_TENANT \
--user_id $JAVELIN_USER \
--role_id $MEMBER_ROLE
# Switch Identities
# -----------------
source $BASE_DEVSTACK_DIR/openrc $JPROJECT $JUSER
export OS_PASSWORD=$JPASSWORD
# Add Custom Image
# ----------------
# It's really cirros with our own name
# Assumes DevStack.$BASE has already set this up
CIRROS_IMAGE=${DEFAULT_IMAGE_NAME:-cirros-0.3.1-x86_64-uec}
CIRROS_DIR=$BASE_DEVSTACK_DIR/files/images/$CIRROS_IMAGE
KERNEL=$CIRROS_DIR/${CIRROS_IMAGE/uec/}vmlinuz
RAMDISK=$CIRROS_DIR/${CIRROS_IMAGE/uec/}initrd
ROOTDISK=$CIRROS_DIR/${CIRROS_IMAGE/uec/}blank.img
JAVELIN_IMAGE=${CIRROS_IMAGE/cirros/javelin}
# Old glance client cuts off name field, use nova image-list for now
IMAGE=$(nova image-list | awk "/ $JAVELIN_IMAGE.img / { print \$2 }")
if [[ -z "$IMAGE" ]]; then
RVAL=$(glance add --silent-upload name=$JAVELIN_IMAGE-kernel is_public=True container_format=aki disk_format=aki <"$KERNEL")
KERNEL_ID=$(echo $RVAL | cut -d":" -f2 | tr -d " ")
RVAL=$(glance add --silent-upload name=$JAVELIN_IMAGE-ramdisk is_public=True container_format=ari disk_format=ari <"$RAMDISK")
RAMDISK_ID=$(echo $RVAL | cut -d":" -f2 | tr -d " ")
glance add name=$JAVELIN_IMAGE.img is_public=True container_format=ami disk_format=ami ${KERNEL_ID:+kernel_id=$KERNEL_ID} ${RAMDISK_ID:+ramdisk_id=$RAMDISK_ID} < "${ROOTDISK}"
IMAGE=$(nova image-list | awk "/ $JAVELIN_IMAGE.img / { print \$2 }")
die_if_not_set $LINENO IMAGE "Failure getting image"
fi
# Add Custom Security Group
# -------------------------
# Create our secgroup
if ! nova secgroup-list | grep -q $JAVELIN_SECGROUP; then
nova secgroup-create $JAVELIN_SECGROUP "$JPROJECT access rules"
if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova secgroup-list | grep -q $JAVELIN_SECGROUP; do sleep 1; done"; then
die $LINENO "$JAVELIN_SECGROUP security group not created"
fi
fi
# Add some rules
if ! nova secgroup-list-rules $JAVELIN_SECGROUP | grep tcp | grep -q 22; then
nova secgroup-add-rule $JAVELIN_SECGROUP icmp -1 -1 0.0.0.0/0
nova secgroup-add-rule $JAVELIN_SECGROUP tcp 22 22 0.0.0.0/0
fi
# Identify A Flavor
# -----------------
FLAVOR=`nova flavor-list | grep $DEFAULT_INSTANCE_TYPE | get_field 1`
if [[ -z "$FLAVOR" ]]; then
# Grab the first flavor in the list to launch if default doesn't exist
FLAVOR=`nova flavor-list | head -n 4 | tail -n 1 | get_field 1`
fi
# Create a Volume
# ---------------
if ! nova volume-list | grep -q $JAVELIN_VOLUME; then
nova volume-create --display_name=$JAVELIN_VOLUME 1
if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova volume-list | grep $JAVELIN_VOLUME | grep -q available; do sleep 1; done"; then
die $LINENO "$JAVELIN_VOLUME volume not created"
fi
fi
# Create An Instance
# ------------------
# Boot an instance
BOOT_TXT=$(nova boot --flavor "$FLAVOR" --image "$IMAGE" $JSERVER | awk "/adminPass/ { print \$2 \"=\" \$4 };/ id / { print \$2 \"=\" \$4 }"; exit ${PIPESTATUS[0]})
ret=$?
if [[ ! $ret = 0 ]]; then
die $LINENO "Failed to boot $JSERVER"
fi
eval $BOOT_TXT
# Check that the status is active within ACTIVE_TIMEOUT seconds
if ! timeout $ACTIVE_TIMEOUT sh -c "while ! nova show $id | grep status | grep -q ACTIVE; do sleep 1; done"; then
die $LINENO "server didn't become active!"
fi
# Put some stuff in Swift
# -----------------------
swift upload javelin /etc/hosts
if ! swift list javelin | grep -q hosts; then
die $LINENO "Swift upload failed"
fi