project to speed up development on physical hardware
diff --git a/README b/README
new file mode 100644
index 0000000..4a78f6e
--- /dev/null
+++ b/README
@@ -0,0 +1,7 @@
+Tool to build nfs export openstack environments. This is useful for development
+
+* todo: move as much from run to install as possible
+ * issue: HOST_IP will be different on each machine - might need to update / change stuff
+* todo: use local disk on nfs boots for instances
+* idea: create a live-cd / vmware preview image using this?
+* idea: use lxc to make the proto-image have everything? so launching a new server is just turn on / updating / run?
diff --git a/apts/dash b/apts/dash
new file mode 100644
index 0000000..91b852d
--- /dev/null
+++ b/apts/dash
@@ -0,0 +1,4 @@
+apache2
+libapache2-mod-wsgi
+python-dateutil
+python-anyjson
diff --git a/apts/general b/apts/general
new file mode 100644
index 0000000..5223de6
--- /dev/null
+++ b/apts/general
@@ -0,0 +1,11 @@
+pep8
+pylint
+python-pip
+screen
+unzip
+wget
+psmisc
+git-core
+lsof
+openssh-server
+vim
diff --git a/apts/glance b/apts/glance
new file mode 100644
index 0000000..1e87d58
--- /dev/null
+++ b/apts/glance
@@ -0,0 +1,8 @@
+python-eventlet
+python-routes
+python-greenlet
+python-argparse
+python-sqlalchemy
+python-wsgiref
+python-pastedeploy
+python-xattr
diff --git a/apts/keystone b/apts/keystone
new file mode 100644
index 0000000..6e6d3d5
--- /dev/null
+++ b/apts/keystone
@@ -0,0 +1,15 @@
+python-setuptools
+python-dev
+python-lxml
+python-pastescript
+python-pastedeploy
+python-paste
+sqlite3
+python-pysqlite2
+python-sqlalchemy
+python-webob
+python-greenlet
+python-routes
+libldap2-dev
+libsasl2-dev
+
diff --git a/apts/nova b/apts/nova
new file mode 100644
index 0000000..ba563c5
--- /dev/null
+++ b/apts/nova
@@ -0,0 +1,34 @@
+dnsmasq-base
+kpartx
+kvm
+gawk
+iptables
+ebtables
+sqlite3
+sudo
+kvm
+libvirt-bin
+vlan
+curl
+rabbitmq-server
+socat
+python-mox
+python-ipy
+python-paste
+python-migrate
+python-gflags
+python-greenlet
+python-libvirt
+python-libxml2
+python-routes
+python-netaddr
+python-pastedeploy
+python-eventlet
+python-cheetah
+python-carrot
+python-tempita
+python-sqlalchemy
+python-suds
+python-lockfile
+python-m2crypto
+python-boto
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..4166b4b
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+# TODO: make dest not hardcoded
+
+NAME=$1
+DEST="/boxes/$NAME/nfs"
+
+mkdir -p /boxes/$NAME
+
+# remove old nfs filesystem if one exists
+rm -rf $DEST
+
+# build a proto image - natty + packages that will install (optimization)
+if [ ! -d nfs ]; then
+ debootstrap natty nfs
+ cp sources.list nfs/etc/apt/sources.list
+ chroot nfs apt-get update
+ chroot nfs apt-get install -y `cat apts/* | egrep -v "(rabbitmq|libvirt)"`
+ chroot nfs pip install `cat pips/*`
+ git clone https://github.com/cloudbuilders/nova.git nfs/opt/nova
+ git clone https://github.com/cloudbuilders/openstackx.git nfs/opt/openstackx
+ git clone https://github.com/cloudbuilders/noVNC.git nfs/opt/noVNC
+ git clone https://github.com/cloudbuilders/openstack-dashboard.git nfs/opt/dash
+ git clone https://github.com/cloudbuilders/python-novaclient.git nfs/opt/python-novaclient
+ git clone https://github.com/cloudbuilders/keystone.git nfs/opt/keystone
+ git clone https://github.com/cloudbuilders/glance.git nfs/opt/glance
+fi
+
+cp -pr nfs $DEST
+
+# set hostname
+echo $NAME > $DEST/etc/hostname
+echo "127.0.0.1 localhost $NAME" > $DEST/etc/hosts
+
+# copy kernel modules
+cp -pr /lib/modules/`uname -r` $DEST/lib/modules
+
+# copy openstack installer and requirement lists to a new directory.
+mkdir -p $DEST/opt
+cp stack.sh $DEST/opt/stack.sh
+cp -r pips $DEST/opt
+cp -r apts $DEST/opt
+
+# injecting root's ssh key
+# FIXME: only do this if id_rsa.pub exists
+mkdir $DEST/root/.ssh
+chmod 700 $DEST/root/.ssh
+cp /root/.ssh/id_rsa.pub $DEST/root/.ssh/authorized_keys
+
+# set root password to password
+echo root:password | chroot $DEST chpasswd
+
diff --git a/natty b/natty
new file mode 100644
index 0000000..9e08600
--- /dev/null
+++ b/natty
@@ -0,0 +1,219 @@
+# based on debootstrap/scripts/natty
+
+case $ARCH in
+ amd64|i386)
+ default_mirror http://archive.ubuntu.com/ubuntu
+ ;;
+ sparc)
+ case $SUITE in
+ gutsy)
+ default_mirror http://archive.ubuntu.com/ubuntu
+ ;;
+ *)
+ default_mirror http://ports.ubuntu.com/ubuntu-ports
+ ;;
+ esac
+ ;;
+ *)
+ default_mirror http://ports.ubuntu.com/ubuntu-ports
+ ;;
+esac
+mirror_style release
+download_style apt
+finddebs_style from-indices
+variants - buildd fakechroot minbase
+
+if doing_variant fakechroot; then
+ test "$FAKECHROOT" = "true" || error 1 FAKECHROOTREQ "This variant requires fakechroot environment to be started"
+fi
+
+case $ARCH in
+ alpha|ia64) LIBC="libc6.1" ;;
+ *) LIBC="libc6" ;;
+esac
+
+work_out_debs () {
+ required="$(get_debs Priority: required) openssh-server"
+
+ if doing_variant -; then
+ #required="$required $(get_debs Priority: important)"
+ # ^^ should be getting debconf here somehow maybe
+ base="$(get_debs Priority: important)"
+ elif doing_variant buildd; then
+ base="$(get_debs Build-Essential: yes)"
+ elif doing_variant fakechroot || doing_variant minbase; then
+ base="apt"
+ fi
+}
+
+first_stage_install () {
+ extract $required
+
+ mkdir -p "$TARGET/var/lib/dpkg"
+ : >"$TARGET/var/lib/dpkg/status"
+ : >"$TARGET/var/lib/dpkg/available"
+
+ setup_etc
+ if [ ! -e "$TARGET/etc/fstab" ]; then
+ echo '# UNCONFIGURED FSTAB FOR BASE SYSTEM' > "$TARGET/etc/fstab"
+ chown 0:0 "$TARGET/etc/fstab"; chmod 644 "$TARGET/etc/fstab"
+ fi
+
+ if doing_variant fakechroot; then
+ setup_devices_fakechroot
+ else
+ setup_devices
+ fi
+
+ x_feign_install () {
+ local pkg="$1"
+ local deb="$(debfor $pkg)"
+ local ver="$(extract_deb_field "$TARGET/$deb" Version)"
+
+ mkdir -p "$TARGET/var/lib/dpkg/info"
+
+ echo \
+"Package: $pkg
+Version: $ver
+Status: install ok installed" >> "$TARGET/var/lib/dpkg/status"
+
+ touch "$TARGET/var/lib/dpkg/info/${pkg}.list"
+ }
+
+ x_feign_install dpkg
+}
+
+second_stage_install () {
+ x_core_install () {
+ smallyes '' | in_target dpkg --force-depends --install $(debfor "$@")
+ }
+
+ p () {
+ baseprog="$(($baseprog + ${1:-1}))"
+ }
+
+ if doing_variant fakechroot; then
+ setup_proc_fakechroot
+ else
+ setup_proc
+ in_target /sbin/ldconfig
+ fi
+
+ DEBIAN_FRONTEND=noninteractive
+ DEBCONF_NONINTERACTIVE_SEEN=true
+ export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
+
+ baseprog=0
+ bases=7
+
+ p; progress $baseprog $bases INSTCORE "Installing core packages" #1
+ info INSTCORE "Installing core packages..."
+
+ p; progress $baseprog $bases INSTCORE "Installing core packages" #2
+ ln -sf mawk "$TARGET/usr/bin/awk"
+ x_core_install base-files base-passwd
+ p; progress $baseprog $bases INSTCORE "Installing core packages" #3
+ x_core_install dpkg
+
+ if [ ! -e "$TARGET/etc/localtime" ]; then
+ ln -sf /usr/share/zoneinfo/Etc/UTC "$TARGET/etc/localtime"
+ fi
+
+ if doing_variant fakechroot; then
+ install_fakechroot_tools
+ fi
+
+ p; progress $baseprog $bases INSTCORE "Installing core packages" #4
+ x_core_install $LIBC
+
+ p; progress $baseprog $bases INSTCORE "Installing core packages" #5
+ x_core_install perl-base
+
+ p; progress $baseprog $bases INSTCORE "Installing core packages" #6
+ rm "$TARGET/usr/bin/awk"
+ x_core_install mawk
+
+ p; progress $baseprog $bases INSTCORE "Installing core packages" #7
+ if doing_variant -; then
+ x_core_install debconf
+ fi
+
+ baseprog=0
+ bases=$(set -- $required; echo $#)
+
+ info UNPACKREQ "Unpacking required packages..."
+
+ smallyes '' |
+ (repeatn 5 in_target_failmsg UNPACK_REQ_FAIL_FIVE "Failure while unpacking required packages. This will be attempted up to five times." "" \
+ dpkg --status-fd 8 --force-depends --unpack $(debfor $required) 8>&1 1>&7 |
+ dpkg_progress $baseprog $bases UNPACKREQ "Unpacking required packages" UNPACKING) 7>&1
+
+ info CONFREQ "Configuring required packages..."
+
+ if doing_variant fakechroot; then
+ # fix initscripts postinst (no mounting possible, and wrong if condition)
+ sed -i '/dpkg.*--compare-versions/ s/\<lt\>/lt-nl/' "$TARGET/var/lib/dpkg/info/initscripts.postinst"
+ fi
+
+ mv "$TARGET/sbin/start-stop-daemon" "$TARGET/sbin/start-stop-daemon.REAL"
+ echo \
+"#!/bin/sh
+echo
+echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "$TARGET/sbin/start-stop-daemon"
+ chmod 755 "$TARGET/sbin/start-stop-daemon"
+
+ if [ -x "$TARGET/sbin/initctl" ]; then
+ mv "$TARGET/sbin/initctl" "$TARGET/sbin/initctl.REAL"
+ echo \
+"#!/bin/sh
+echo
+echo \"Warning: Fake initctl called, doing nothing\"" > "$TARGET/sbin/initctl"
+ chmod 755 "$TARGET/sbin/initctl"
+ fi
+
+ setup_dselect_method apt
+
+ smallyes '' |
+ (in_target_failmsg CONF_REQ_FAIL "Failure while configuring required packages." "" \
+ dpkg --status-fd 8 --configure --pending --force-configure-any --force-depends 8>&1 1>&7 |
+ dpkg_progress $baseprog $bases CONFREQ "Configuring required packages" CONFIGURING) 7>&1
+
+ baseprog=0
+ bases="$(set -- $base; echo $#)"
+
+ info UNPACKBASE "Unpacking the base system..."
+
+ setup_available $required $base
+ done_predeps=
+ while predep=$(get_next_predep); do
+ # We have to resolve dependencies of pre-dependencies manually because
+ # dpkg --predep-package doesn't handle this.
+ predep=$(without "$(without "$(resolve_deps $predep)" "$required")" "$done_predeps")
+ # XXX: progress is tricky due to how dpkg_progress works
+ # -- cjwatson 2009-07-29
+ p; smallyes '' |
+ in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor $predep)
+ base=$(without "$base" "$predep")
+ done_predeps="$done_predeps $predep"
+ done
+
+ smallyes '' |
+ (repeatn 5 in_target_failmsg INST_BASE_FAIL_FIVE "Failure while installing base packages. This will be re-attempted up to five times." "" \
+ dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base) 8>&1 1>&7 |
+ dpkg_progress $baseprog $bases UNPACKBASE "Unpacking base system" UNPACKING) 7>&1
+
+ info CONFBASE "Configuring the base system..."
+
+ smallyes '' |
+ (repeatn 5 in_target_failmsg CONF_BASE_FAIL_FIVE "Failure while configuring base packages. This will be re-attempted up to five times." "" \
+ dpkg --status-fd 8 --force-confold --skip-same-version --configure -a 8>&1 1>&7 |
+ dpkg_progress $baseprog $bases CONFBASE "Configuring base system" CONFIGURING) 7>&1
+
+ if [ -x "$TARGET/sbin/initctl.REAL" ]; then
+ mv "$TARGET/sbin/initctl.REAL" "$TARGET/sbin/initctl"
+ fi
+ mv "$TARGET/sbin/start-stop-daemon.REAL" "$TARGET/sbin/start-stop-daemon"
+
+ progress $bases $bases CONFBASE "Configuring base system"
+ info BASESUCCESS "Base system installed successfully."
+}
diff --git a/pips/dash b/pips/dash
new file mode 100644
index 0000000..e20d6e6
--- /dev/null
+++ b/pips/dash
@@ -0,0 +1,22 @@
+nose==1.0.0
+Django==1.3
+django-nose==0.1.2
+django-mailer
+django-registration==0.7
+kombu
+nova-adminclient
+python-cloudfiles
+python-dateutil
+routes
+webob
+sqlalchemy
+paste
+PasteDeploy
+sqlalchemy-migrate
+eventlet
+xattr
+pep8
+pylint
+
+-e git+https://github.com/jacobian/openstack.compute.git#egg=openstack
+
diff --git a/sources.list b/sources.list
new file mode 100644
index 0000000..96fab5f
--- /dev/null
+++ b/sources.list
@@ -0,0 +1,9 @@
+deb http://us.archive.ubuntu.com/ubuntu/ natty main restricted
+deb http://us.archive.ubuntu.com/ubuntu/ natty-updates main restricted
+deb http://us.archive.ubuntu.com/ubuntu/ natty universe
+deb http://us.archive.ubuntu.com/ubuntu/ natty-updates universe
+deb http://us.archive.ubuntu.com/ubuntu/ natty multiverse
+deb http://us.archive.ubuntu.com/ubuntu/ natty-updates multiverse
+deb http://security.ubuntu.com/ubuntu natty-security main restricted
+deb http://security.ubuntu.com/ubuntu natty-security universe
+deb http://security.ubuntu.com/ubuntu natty-security multiverse
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
+