project to speed up development on physical hardware
diff --git a/stack.sh b/stack.sh
new file mode 100755
index 0000000..4edb49f
--- /dev/null
+++ b/stack.sh
@@ -0,0 +1,261 @@
+#!/usr/bin/env bash
+
+# **stack.sh** is rackspace cloudbuilder's opinionated openstack installation.
+
+# Quit script on error
+set -o errexit
+
+# Log commands as they are run for debugging
+set -o xtrace
+
+DIR=`pwd`
+DEST=/opt
+CMD=$1
+
+# Set hte destination directories for openstack projects
+NOVA_DIR=$DEST/nova
+DASH_DIR=$DEST/dash
+GLANCE_DIR=$DEST/glance
+KEYSTONE_DIR=$DEST/keystone
+NOVACLIENT_DIR=$DEST/python-novaclient
+API_DIR=$DEST/openstackx
+NOVNC_DIR=$DEST/noVNC
+
+# Use the first IP unless an explicit is set by a HOST_IP environment variable
+if [ ! -n "$HOST_IP" ]; then
+ HOST_IP=`LC_ALL=C ifconfig | grep -m 1 'inet addr:'| cut -d: -f2 | awk '{print $1}'`
+fi
+
+# NOVA CONFIGURATION
+INTERFACE=${INTERFACE:-eth0}
+FLOATING_RANGE=${FLOATING_RANGE:-10.6.0.0/27}
+FIXED_RANGE=${FIXED_RANGE:-10.0.0.0/24}
+LIBVIRT_TYPE=${LIBVIRT_TYPE:-qemu}
+NET_MAN=${NET_MAN:-VlanManager}
+# NOTE(vish): If you are using FlatDHCP on multiple hosts, set the interface
+# below but make sure that the interface doesn't already have an
+# ip or you risk breaking things.
+# FLAT_INTERFACE=eth0
+
+SQL_CONN=sqlite:///$NOVA_DIR/nova.sqlite
+
+# clone a git repository to a location, or if it already
+# exists, fetch and checkout remote master
+function clone_or_up {
+ if [ -d $2 ]; then
+ cd $2
+ git fetch origin
+ git checkout origin/master
+ else
+ git clone $1 $2
+ fi
+}
+
+# You should only have to run this once
+if [ "$CMD" == "install" ]; then
+ #apt-get install -y python-software-properties
+ # FIXME: do we still need this?
+ # DELETEME: add-apt-repository ppa:nova-core/trunk
+ # DELETEME: apt-get update -qq
+
+ # fixme: do we need: python-boto
+ apt-get install -y -q `cat $DIR/apts/*`
+
+ # install python requirements
+ pip install -r $DIR/pips/dash
+
+ # TODO: kill openstackx
+ clone_or_up https://github.com/cloudbuilders/nova.git $NOVA_DIR
+ clone_or_up https://github.com/cloudbuilders/openstackx.git $API_DIR
+ clone_or_up https://github.com/cloudbuilders/noVNC.git $NOVNC_DIR
+ clone_or_up https://github.com/cloudbuilders/openstack-dashboard.git $DASH_DIR
+ clone_or_up https://github.com/cloudbuilders/python-novaclient.git $NOVACLIENT_DIR
+ clone_or_up https://github.com/cloudbuilders/keystone.git $KEYSTONE_DIR
+ clone_or_up https://github.com/cloudbuilders/glance.git $GLANCE_DIR
+
+ mkdir -p $NOVA_DIR/instances
+ mkdir -p $NOVA_DIR/networks
+
+ # these components are imported into each other...
+ cd $NOVACLIENT_DIR; python setup.py develop
+ cd $KEYSTONE_DIR; python setup.py develop
+ cd $GLANCE_DIR; python setup.py develop
+ cd $API_DIR; python setup.py develop
+ cd $DASH_DIR/django-openstack; python setup.py develop
+ cd $DASH_DIR/openstack-dashboard; python setup.py develop
+ # dash currently imports quantum even if you aren't using it
+ cd $DASH_DIR/openstack-dashboard
+ mkdir quantum
+ touch quantum/__init__.py
+ touch quantum/client.py
+
+
+ # attempt to load kvm and nbd modules
+ modprobe kvm || true
+ modprobe nbd || true
+ /etc/init.d/libvirt-bin restart
+
+ # install dashboard
+ cd $DASH_DIR/openstack-dashboard
+ cp local/local_settings.py.example local/local_settings.py
+# python tools/install_venv.py
+ dashboard/manage.py syncdb
+ # setup apache
+ mkdir $DASH_DIR/.blackhole
+
+# cat > $DASH_DIR/openstack-dashboard/dashboard/wsgi/local.wsgi <<EOF
+#import sys
+#sys.path.append('/$DASH_DIR/openstack-dashboard/.dashboard-venv/lib/python2.6/site-packages/')
+#sys.path.append('/$DASH_DIR/openstack-dashboard/.dashboard-venv/lib/python2.7/site-packages/')
+#sys.path.append('/$DASH_DIR/openstack-dashboard/')
+#sys.path.append('/$DASH_DIR/django-openstack/')
+#sys.path.append('/$API_DIR')
+#sys.path.append('/$DASH_DIR/openstack-dashboard/.dashboard-venv/src/openstack')
+#
+#EOF
+ cat $DASH_DIR/openstack-dashboard/dashboard/wsgi/django.wsgi >> $DASH_DIR/openstack-dashboard/dashboard/wsgi/local.wsgi
+
+ cat > /etc/apache2/sites-enabled/000-default <<EOF
+<VirtualHost *:80>
+ WSGIScriptAlias / $DASH_DIR/openstack-dashboard/dashboard/wsgi/local.wsgi
+ WSGIDaemonProcess dashboard user=www-data group=www-data processes=3 threads=10
+ WSGIProcessGroup dashboard
+
+ DocumentRoot $DASH_DIR/.blackhole/
+ Alias /media $DASH_DIR/openstack-dashboard/media
+
+ <Directory />
+ Options FollowSymLinks
+ AllowOverride None
+ </Directory>
+
+ <Directory $DASH_DIR/>
+ Options Indexes FollowSymLinks MultiViews
+ AllowOverride None
+ Order allow,deny
+ allow from all
+ </Directory>
+
+ ErrorLog /var/log/apache2/error.log
+ LogLevel warn
+ CustomLog /var/log/apache2/access.log combined
+</VirtualHost>
+EOF
+
+ chown -R www-data:www-data $DASH_DIR
+
+ mkdir -p /var/log/glance
+
+ mkdir -p $DEST/images
+ wget -c http://images.ansolabs.com/tty.tgz
+ tar -C $DEST/images -zxf tty.tgz
+ exit
+fi
+
+# Configure screen
+cat >~/.screenrc <<EOF
+hardstatus on
+hardstatus alwayslastline
+hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G}%H %{..Y}%d/%m %c"
+
+defscrollback 1024
+
+vbell off
+startup_message off
+EOF
+
+NL=`echo -ne '\015'`
+
+function screen_it {
+ screen -S nova -X screen -t $1
+ screen -S nova -p $1 -X stuff "$2$NL"
+}
+
+function add_nova_flag {
+ echo "$1" >> $NOVA_DIR/bin/nova.conf
+}
+
+if [ "$CMD" == "run" ] || [ "$CMD" == "run_detached" ]; then
+
+ rm -f $NOVA_DIR/bin/nova.conf
+
+ add_nova_flag "--verbose"
+ add_nova_flag "--nodaemon"
+ add_nova_flag "--dhcpbridge_flagfile=$NOVA_DIR/bin/nova.conf"
+ add_nova_flag "--network_manager=nova.network.manager.$NET_MAN"
+ add_nova_flag "--my_ip=$HOST_IP"
+ add_nova_flag "--public_interface=$INTERFACE"
+ add_nova_flag "--vlan_interface=$INTERFACE"
+ add_nova_flag "--sql_connection=$SQL_CONN"
+ add_nova_flag "--libvirt_type=$LIBVIRT_TYPE"
+ add_nova_flag "--osapi_extensions_path=$API_DIR/extensions"
+ add_nova_flag "--vncproxy_url=http://$HOST_IP:6080"
+ add_nova_flag "--vncproxy_wwwroot=$NOVNC_DIR/noVNC/noVNC"
+
+ if [ -n "$FLAT_INTERFACE" ]; then
+ add_nova_flag "--flat_interface=$FLAT_INTERFACE"
+ fi
+
+ add_nova_flag "--api_paste_config=$KEYSTONE_DIR/examples/paste/nova-api-paste.ini"
+ add_nova_flag "--image_service=nova.image.glance.GlanceImageService"
+
+ killall dnsmasq || true
+ screen -d -m -S nova -t nova
+ sleep 1
+ rm -f $NOVA_DIR/nova.sqlite
+ rm -rf $NOVA_DIR/instances
+ mkdir -p $NOVA_DIR/instances
+ rm -rf $NOVA_DIR/networks
+ mkdir -p $NOVA_DIR/networks
+
+ # create the database
+ $NOVA_DIR/bin/nova-manage db sync
+ rm -f keystone.db
+ # add default data
+ curl -OL https://raw.github.com/cloudbuilders/deploy.sh/master/initial_data.sh
+ BIN_DIR=$KEYSTONE_DIR/bin bash initial_data.sh
+
+ # create a small network
+ $NOVA_DIR/bin/nova-manage network create private $FIXED_RANGE 1 32
+
+ # create some floating ips
+ $NOVA_DIR/bin/nova-manage floating create $FLOATING_RANGE
+
+ # nova api crashes if we start it with a regular screen command,
+ # so send the start command by forcing text into the window.
+
+ rm -rf /var/lib/glance/images/*
+ rm -f $GLANCE_DIR/glance.sqlite
+
+ screen_it n-api "$NOVA_DIR/bin/nova-api"
+ screen_it g-api "cd $GLANCE_DIR; bin/glance-api --config-file=etc/glance-api.conf"
+ screen_it g-reg "cd $GLANCE_DIR; bin/glance-registry --config-file=etc/glance-registry.conf"
+ screen_it cpu "$NOVA_DIR/bin/nova-compute"
+ screen_it net "$NOVA_DIR/bin/nova-network"
+ screen_it sched "$NOVA_DIR/bin/nova-scheduler"
+ screen_it key "$KEYSTONE_DIR/bin/keystone --config-file $KEYSTONE_DIR/etc/keystone.conf"
+ screen_it dash "/etc/init.d/apache2 restart; tail -f /var/log/apache2/error.log"
+ screen_it vnc "$NOVA_DIR/bin/nova-vncproxy"
+ screen_it test ""
+
+ # FIXME: switch to just importing images
+ # remove previously converted images
+ rm -rf $DIR/images/[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]
+ $NOVA_DIR/bin/nova-manage image convert $DIR/images
+
+ if [ "$CMD" != "run_detached" ]; then
+ screen -S nova -x
+ fi
+fi
+
+if [ "$CMD" == "run" ] || [ "$CMD" == "terminate" ]; then
+ virsh list | grep i- | awk '{print $1}' | xargs -n1 virsh destroy
+ $NOVA_DIR/tools/clean-vlans
+ echo "FIXME: clean networks?"
+fi
+
+if [ "$CMD" == "run" ] || [ "$CMD" == "clean" ]; then
+ screen -S nova -X quit
+ rm -f *.pid*
+fi
+