commit ba23cc730f2a9483792524e3759bd78f36621dcc Author: Jesse Andrews Date: Sun Sep 11 03:22:13 2011 -0700 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-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 <> $DASH_DIR/openstack-dashboard/dashboard/wsgi/local.wsgi + + cat > /etc/apache2/sites-enabled/000-default < + 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 + + + Options FollowSymLinks + AllowOverride None + + + + Options Indexes FollowSymLinks MultiViews + AllowOverride None + Order allow,deny + allow from all + + + ErrorLog /var/log/apache2/error.log + LogLevel warn + CustomLog /var/log/apache2/access.log combined + +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 <> $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 +