8b3eb5ff |
#!/usr/bin/env bash
|
e62ba4d3 |
# **build_uec.sh**
|
e28f7756 |
# Make sure that we have the proper version of ubuntu (only works on oneiric)
if ! egrep -q "oneiric" /etc/lsb-release; then |
593e9aa8 |
echo "This script only works with ubuntu oneiric." |
e3c47a35 |
exit 1 |
8b3eb5ff |
fi
# Keep track of the current directory
TOOLS_DIR=$(cd $(dirname "$0") && pwd) |
7f9aa71b |
TOP_DIR=$(cd $TOOLS_DIR/..; pwd)
# Import common functions
. $TOP_DIR/functions |
8b3eb5ff |
|
53d7533d |
cd $TOP_DIR
# Source params
source ./stackrc
# Ubuntu distro to install
DIST_NAME=${DIST_NAME:-oneiric}
|
e3c47a35 |
# Configure how large the VM should be
GUEST_SIZE=${GUEST_SIZE:-10G}
|
228f246a |
# exit on error to stop unexpected errors
set -o errexit
set -o xtrace
|
8b3eb5ff |
# Abort if localrc is not set
if [ ! -e $TOP_DIR/localrc ]; then
echo "You must have a localrc with ALL necessary passwords defined before proceeding."
echo "See stack.sh for required passwords."
exit 1
fi
# Install deps if needed |
2679303c |
DEPS="kvm libvirt-bin kpartx cloud-utils curl" |
7f9aa71b |
apt_get install -y --force-yes $DEPS || true # allow this to fail gracefully for concurrent builds |
8b3eb5ff |
# Where to store files and instances |
d7326d2e |
WORK_DIR=${WORK_DIR:-/opt/uecstack} |
8b3eb5ff |
# Where to store images |
228f246a |
image_dir=$WORK_DIR/images/$DIST_NAME
mkdir -p $image_dir |
8b3eb5ff |
|
d7326d2e |
# Start over with a clean base image, if desired
if [ $CLEAN_BASE ]; then
rm -f $image_dir/disk
fi |
8b3eb5ff |
|
d7326d2e |
# Get the base image if it does not yet exist
if [ ! -e $image_dir/disk ]; then
$TOOLS_DIR/get_uec_image.sh -r $GUEST_SIZE $DIST_NAME $image_dir/disk $image_dir/kernel |
8b3eb5ff |
fi
|
d7326d2e |
# Copy over dev environment if COPY_ENV is set.
# This will also copy over your current devstack.
if [ $COPY_ENV ]; then
cd $TOOLS_DIR
./copy_dev_environment_to_uec.sh $image_dir/disk
fi |
8b3eb5ff |
|
d7326d2e |
# Option to warm the base image with software requirements.
if [ $WARM_CACHE ]; then
cd $TOOLS_DIR |
7c3053da |
./warm_apts_for_uec.sh $image_dir/disk |
d7326d2e |
fi |
8b3eb5ff |
# Name of our instance, used by libvirt
GUEST_NAME=${GUEST_NAME:-devstack}
# Mop up after previous runs
virsh destroy $GUEST_NAME || true
# Where this vm is stored |
228f246a |
vm_dir=$WORK_DIR/instances/$GUEST_NAME |
8b3eb5ff |
# Create vm dir and remove old disk |
228f246a |
mkdir -p $vm_dir
rm -f $vm_dir/disk |
8b3eb5ff |
# Create a copy of the base image |
f5a76919 |
qemu-img create -f qcow2 -b $image_dir/disk $vm_dir/disk |
8b3eb5ff |
# Back to devstack
cd $TOP_DIR
GUEST_NETWORK=${GUEST_NETWORK:-1}
GUEST_RECREATE_NET=${GUEST_RECREATE_NET:-yes}
GUEST_IP=${GUEST_IP:-192.168.$GUEST_NETWORK.50}
GUEST_CIDR=${GUEST_CIDR:-$GUEST_IP/24}
GUEST_NETMASK=${GUEST_NETMASK:-255.255.255.0}
GUEST_GATEWAY=${GUEST_GATEWAY:-192.168.$GUEST_NETWORK.1}
GUEST_MAC=${GUEST_MAC:-"02:16:3e:07:69:`printf '%02X' $GUEST_NETWORK`"}
GUEST_RAM=${GUEST_RAM:-1524288}
GUEST_CORES=${GUEST_CORES:-1}
# libvirt.xml configuration |
228f246a |
NET_XML=$vm_dir/net.xml |
8b47cdf1 |
NET_NAME=${NET_NAME:-devstack-$GUEST_NETWORK} |
8b3eb5ff |
cat > $NET_XML <<EOF
<network> |
8b47cdf1 |
<name>$NET_NAME</name> |
8b3eb5ff |
<bridge name="stackbr%d" />
<forward/> |
a6282623 |
<ip address="$GUEST_GATEWAY" netmask="$GUEST_NETMASK">
<dhcp> |
02cc96ca |
<range start='192.168.$GUEST_NETWORK.2' end='192.168.$GUEST_NETWORK.127' /> |
a6282623 |
</dhcp>
</ip> |
8b3eb5ff |
</network>
EOF
if [[ "$GUEST_RECREATE_NET" == "yes" ]]; then |
8b47cdf1 |
virsh net-destroy $NET_NAME || true |
dca89009 |
# destroying the network isn't enough to delete the leases |
8b47cdf1 |
rm -f /var/lib/libvirt/dnsmasq/$NET_NAME.leases |
228f246a |
virsh net-create $vm_dir/net.xml |
8b3eb5ff |
fi
# libvirt.xml configuration |
228f246a |
LIBVIRT_XML=$vm_dir/libvirt.xml |
8b3eb5ff |
cat > $LIBVIRT_XML <<EOF
<domain type='kvm'>
<name>$GUEST_NAME</name>
<memory>$GUEST_RAM</memory>
<os> |
228f246a |
<type>hvm</type> |
f5a76919 |
<kernel>$image_dir/kernel</kernel> |
438ea577 |
<cmdline>root=/dev/vda ro console=ttyS0 init=/usr/lib/cloud-init/uncloud-init ds=nocloud-net;s=http://192.168.$GUEST_NETWORK.1:4567/ ubuntu-pass=ubuntu</cmdline> |
8b3eb5ff |
</os>
<features>
<acpi/>
</features>
<clock offset='utc'/>
<vcpu>$GUEST_CORES</vcpu>
<devices>
<disk type='file'>
<driver type='qcow2'/> |
228f246a |
<source file='$vm_dir/disk'/> |
8b3eb5ff |
<target dev='vda' bus='virtio'/>
</disk>
<interface type='network'> |
72eab227 |
<source network='$NET_NAME'/> |
8b3eb5ff |
</interface> |
3b719e50 |
|
8b3eb5ff |
<!-- The order is significant here. File must be defined first -->
<serial type="file"> |
228f246a |
<source path='$vm_dir/console.log'/> |
8b3eb5ff |
<target port='1'/>
</serial>
<console type='pty' tty='/dev/pts/2'>
<source path='/dev/pts/2'/>
<target port='0'/>
</console>
<serial type='pty'>
<source path='/dev/pts/2'/>
<target port='0'/>
</serial>
<graphics type='vnc' port='-1' autoport='yes' keymap='en-us' listen='0.0.0.0'/>
</devices>
</domain>
EOF
|
d7ce7afe |
|
e49f751a |
rm -rf $vm_dir/uec |
9ed6bbd5 |
cp -r $TOOLS_DIR/uec $vm_dir/uec
|
d7ce7afe |
# set metadata
cat > $vm_dir/uec/meta-data<<EOF
hostname: $GUEST_NAME |
e3c47a35 |
instance-id: i-hop
instance-type: m1.ignore |
7306f3bf |
local-hostname: $GUEST_NAME.local |
d7ce7afe |
EOF
|
2838f12e |
# set user-data |
63cb9239 |
cat > $vm_dir/uec/user-data<<EOF |
446a3304 |
#!/bin/bash |
b17c4f30 |
# hostname needs to resolve for rabbit |
6e3a4c56 |
sed -i "s/127.0.0.1/127.0.0.1 \`hostname\`/" /etc/hosts |
446a3304 |
apt-get update |
c7f72ad8 |
apt-get install git sudo -y |
760ddde1 |
# Disable byobu |
d7326d2e |
sudo apt-get remove -y byobu |
b2256821 |
EOF
# Setup stack user with our key |
d7326d2e |
if [[ -e ~/.ssh/id_rsa.pub ]]; then |
b7661282 |
PUB_KEY=`cat ~/.ssh/id_rsa.pub` |
2838f12e |
cat >> $vm_dir/uec/user-data<<EOF |
b2256821 |
mkdir -p /opt/stack |
331ae29e |
if [ ! -d /opt/stack/devstack ]; then
git clone https://github.com/cloudbuilders/devstack.git /opt/stack/devstack
cd /opt/stack/devstack
cat > localrc <<LOCAL_EOF
ROOTSLEEP=0
`cat $TOP_DIR/localrc`
LOCAL_EOF
fi |
74759aa1 |
useradd -U -G sudo -s /bin/bash -d /opt/stack -m $STACK_USER
echo $STACK_USER:pass | chpasswd |
b2256821 |
mkdir -p /opt/stack/.ssh |
b7661282 |
echo "$PUB_KEY" > /opt/stack/.ssh/authorized_keys |
74759aa1 |
chown -R $STACK_USER /opt/stack |
b2256821 |
chmod 700 /opt/stack/.ssh
chmod 600 /opt/stack/.ssh/authorized_keys
grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers ||
echo "#includedir /etc/sudoers.d" >> /etc/sudoers
( umask 226 && echo "stack ALL=(ALL) NOPASSWD:ALL" \
> /etc/sudoers.d/50_stack_sh )
EOF
fi
# Run stack.sh |
2838f12e |
cat >> $vm_dir/uec/user-data<<EOF |
74759aa1 |
sudo -u $STACK_USER bash -l -c "cd /opt/stack/devstack && ./stack.sh" |
63cb9239 |
EOF
|
ee34f62b |
# (re)start a metadata service |
3ce79aa5 |
(
pid=`lsof -iTCP@192.168.$GUEST_NETWORK.1:4567 -n | awk '{print $2}' | tail -1` |
9645b0c9 |
[ -z "$pid" ] || kill -9 $pid |
3ce79aa5 |
) |
f504e281 |
cd $vm_dir/uec
python meta.py 192.168.$GUEST_NETWORK.1:4567 & |
9ed6bbd5 |
|
8b3eb5ff |
# Create the instance |
63fa7abd |
virsh create $vm_dir/libvirt.xml |
8b3eb5ff |
# Tail the console log till we are done
WAIT_TILL_LAUNCH=${WAIT_TILL_LAUNCH:-1}
if [ "$WAIT_TILL_LAUNCH" = "1" ]; then |
228f246a |
set +o xtrace |
8b3eb5ff |
# Done creating the container, let's tail the log
echo
echo "============================================================="
echo " -- YAY! --"
echo "============================================================="
echo
echo "We're done launching the vm, about to start tailing the"
echo "stack.sh log. It will take a second or two to start."
echo
echo "Just CTRL-C at any time to stop tailing." |
d7326d2e |
echo
if ! timeout 60 sh -c "while [ ! -s /var/lib/libvirt/dnsmasq/$NET_NAME.leases ]; do sleep 1; done"; then
echo "Your instance failed to acquire an IP address"
exit 1
fi
ip=`cat /var/lib/libvirt/dnsmasq/$NET_NAME.leases | cut -d " " -f3`
echo "#############################################################"
echo " -- This is your instance's IP: --"
echo " $ip"
echo "#############################################################"
sleep 2 |
8b3eb5ff |
|
228f246a |
while [ ! -e "$vm_dir/console.log" ]; do |
8b3eb5ff |
sleep 1
done
|
228f246a |
tail -F $vm_dir/console.log & |
8b3eb5ff |
TAIL_PID=$!
function kill_tail() {
kill $TAIL_PID
exit 1
}
# Let Ctrl-c kill tail and exit
trap kill_tail SIGINT
echo "Waiting stack.sh to finish..." |
d55a5159 |
while ! egrep -q '^stack.sh (completed|failed)' $vm_dir/console.log ; do |
8b3eb5ff |
sleep 1
done
set -o xtrace
kill $TAIL_PID
|
228f246a |
if ! grep -q "^stack.sh completed in" $vm_dir/console.log; then |
8b3eb5ff |
exit 1
fi |
d7326d2e |
set +o xtrace |
8b3eb5ff |
echo ""
echo "Finished - Zip-a-dee Doo-dah!"
fi |