Merge "Additional attempts to flosh stdout/stderr"
diff --git a/README.md b/README.md
index 9914b1e..a0f5b26 100644
--- a/README.md
+++ b/README.md
@@ -73,7 +73,7 @@
 This is a recent change (Oct 2013) from the previous behaviour of
 automatically creating a ``stack`` user.  Automatically creating
 user accounts is not the right response to running as root, so
-that bit is now an explicit step using ``tools/create-stack-user.sh``. 
+that bit is now an explicit step using ``tools/create-stack-user.sh``.
 Run that (as root!) or just check it out to see what DevStack's
 expectations are for the account it runs under.  Many people simply
 use their usual login (the default 'ubuntu' login on a UEC image
@@ -253,10 +253,6 @@
 
 If you would like to use Xenserver as the hypervisor, please refer to the instructions in `./tools/xen/README.md`.
 
-# DevStack on Docker
-
-If you would like to use Docker as the hypervisor, please refer to the instructions in `./tools/docker/README.md`.
-
 # Additional Projects
 
 DevStack has a hook mechanism to call out to a dispatch script at specific
diff --git a/exercises/boot_from_volume.sh b/exercises/boot_from_volume.sh
index f679669..dff8e7a 100755
--- a/exercises/boot_from_volume.sh
+++ b/exercises/boot_from_volume.sh
@@ -44,9 +44,6 @@
 # the exercise is skipped
 is_service_enabled cinder || exit 55
 
-# Also skip if the hypervisor is Docker
-[[ "$VIRT_DRIVER" == "docker" ]] && exit 55
-
 # Instance type to create
 DEFAULT_INSTANCE_TYPE=${DEFAULT_INSTANCE_TYPE:-m1.tiny}
 
diff --git a/exercises/euca.sh b/exercises/euca.sh
index ad852a4..3768b56 100755
--- a/exercises/euca.sh
+++ b/exercises/euca.sh
@@ -40,9 +40,6 @@
 # the exercise is skipped
 is_service_enabled n-api || exit 55
 
-# Skip if the hypervisor is Docker
-[[ "$VIRT_DRIVER" == "docker" ]] && exit 55
-
 # Instance type to create
 DEFAULT_INSTANCE_TYPE=${DEFAULT_INSTANCE_TYPE:-m1.tiny}
 
diff --git a/exercises/floating_ips.sh b/exercises/floating_ips.sh
index 8b7b961..1416d4d 100755
--- a/exercises/floating_ips.sh
+++ b/exercises/floating_ips.sh
@@ -40,9 +40,6 @@
 # the exercise is skipped
 is_service_enabled n-api || exit 55
 
-# Skip if the hypervisor is Docker
-[[ "$VIRT_DRIVER" == "docker" ]] && exit 55
-
 # Instance type to create
 DEFAULT_INSTANCE_TYPE=${DEFAULT_INSTANCE_TYPE:-m1.tiny}
 
diff --git a/exercises/savanna.sh b/exercises/sahara.sh
similarity index 88%
rename from exercises/savanna.sh
rename to exercises/sahara.sh
index fc3f976..867920e 100755
--- a/exercises/savanna.sh
+++ b/exercises/sahara.sh
@@ -1,8 +1,8 @@
 #!/usr/bin/env bash
 
-# **savanna.sh**
+# **sahara.sh**
 
-# Sanity check that Savanna started if enabled
+# Sanity check that Sahara started if enabled
 
 echo "*********************************************************************"
 echo "Begin DevStack Exercise: $0"
@@ -33,9 +33,9 @@
 # Import exercise configuration
 source $TOP_DIR/exerciserc
 
-is_service_enabled savanna || exit 55
+is_service_enabled sahara || exit 55
 
-curl http://$SERVICE_HOST:8386/ 2>/dev/null | grep -q 'Auth' || die $LINENO "Savanna API not functioning!"
+curl http://$SERVICE_HOST:8386/ 2>/dev/null | grep -q 'Auth' || die $LINENO "Sahara API isn't functioning!"
 
 set +o xtrace
 echo "*********************************************************************"
diff --git a/exercises/sec_groups.sh b/exercises/sec_groups.sh
index d71a1e0..5f8b0a4 100755
--- a/exercises/sec_groups.sh
+++ b/exercises/sec_groups.sh
@@ -37,9 +37,6 @@
 # the exercise is skipped
 is_service_enabled n-api || exit 55
 
-# Skip if the hypervisor is Docker
-[[ "$VIRT_DRIVER" == "docker" ]] && exit 55
-
 
 # Testing Security Groups
 # =======================
diff --git a/exercises/volumes.sh b/exercises/volumes.sh
index 83d25c7..0d556df 100755
--- a/exercises/volumes.sh
+++ b/exercises/volumes.sh
@@ -41,9 +41,6 @@
 # exercise is skipped.
 is_service_enabled cinder || exit 55
 
-# Also skip if the hypervisor is Docker
-[[ "$VIRT_DRIVER" == "docker" ]] && exit 55
-
 # Instance type to create
 DEFAULT_INSTANCE_TYPE=${DEFAULT_INSTANCE_TYPE:-m1.tiny}
 
diff --git a/extras.d/70-sahara.sh b/extras.d/70-sahara.sh
new file mode 100644
index 0000000..80e07ff
--- /dev/null
+++ b/extras.d/70-sahara.sh
@@ -0,0 +1,37 @@
+# sahara.sh - DevStack extras script to install Sahara
+
+if is_service_enabled sahara; then
+    if [[ "$1" == "source" ]]; then
+        # Initial source
+        source $TOP_DIR/lib/sahara
+        source $TOP_DIR/lib/sahara-dashboard
+    elif [[ "$1" == "stack" && "$2" == "install" ]]; then
+        echo_summary "Installing sahara"
+        install_sahara
+        cleanup_sahara
+        if is_service_enabled horizon; then
+            install_sahara_dashboard
+        fi
+    elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
+        echo_summary "Configuring sahara"
+        configure_sahara
+        create_sahara_accounts
+        if is_service_enabled horizon; then
+            configure_sahara_dashboard
+        fi
+    elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
+        echo_summary "Initializing sahara"
+        start_sahara
+    fi
+
+    if [[ "$1" == "unstack" ]]; then
+        stop_sahara
+        if is_service_enabled horizon; then
+            cleanup_sahara_dashboard
+        fi
+    fi
+
+    if [[ "$1" == "clean" ]]; then
+        cleanup_sahara
+    fi
+fi
diff --git a/extras.d/70-savanna.sh b/extras.d/70-savanna.sh
deleted file mode 100644
index edc1376..0000000
--- a/extras.d/70-savanna.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-# savanna.sh - DevStack extras script to install Savanna
-
-if is_service_enabled savanna; then
-    if [[ "$1" == "source" ]]; then
-        # Initial source
-        source $TOP_DIR/lib/savanna
-        source $TOP_DIR/lib/savanna-dashboard
-    elif [[ "$1" == "stack" && "$2" == "install" ]]; then
-        echo_summary "Installing Savanna"
-        install_savanna
-        cleanup_savanna
-        if is_service_enabled horizon; then
-            install_savanna_dashboard
-        fi
-    elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
-        echo_summary "Configuring Savanna"
-        configure_savanna
-        create_savanna_accounts
-        if is_service_enabled horizon; then
-            configure_savanna_dashboard
-        fi
-    elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
-        echo_summary "Initializing Savanna"
-        start_savanna
-    fi
-
-    if [[ "$1" == "unstack" ]]; then
-        stop_savanna
-        if is_service_enabled horizon; then
-            cleanup_savanna_dashboard
-        fi
-    fi
-
-    if [[ "$1" == "clean" ]]; then
-        cleanup_savanna
-    fi
-fi
diff --git a/files/rpms/cinder b/files/rpms/cinder
index 199ae10..423d57c 100644
--- a/files/rpms/cinder
+++ b/files/rpms/cinder
@@ -4,4 +4,4 @@
 python-devel
 postgresql-devel
 iscsi-initiator-utils
-python-lxml         #dist:f18,f19,f20,rhel7
+python-lxml         #dist:f19,f20,rhel7
diff --git a/files/rpms/glance b/files/rpms/glance
index 534097a..2007e2e 100644
--- a/files/rpms/glance
+++ b/files/rpms/glance
@@ -9,8 +9,8 @@
 python-devel
 python-eventlet
 python-greenlet
-python-lxml         #dist:f18,f19,f20,rhel7
-python-paste-deploy #dist:f18,f19,f20,rhel7
+python-lxml         #dist:f19,f20,rhel7
+python-paste-deploy #dist:f19,f20,rhel7
 python-routes
 python-sqlalchemy
 python-wsgiref      #dist:f18,f19,f20
diff --git a/files/rpms/horizon b/files/rpms/horizon
index 59503cc..2dd24e0 100644
--- a/files/rpms/horizon
+++ b/files/rpms/horizon
@@ -16,8 +16,8 @@
 python-migrate
 python-mox
 python-nose
-python-paste        #dist:f18,f19,f20
-python-paste-deploy #dist:f18,f19,f20
+python-paste        #dist:f19,f20
+python-paste-deploy #dist:f19,f20
 python-routes
 python-sphinx
 python-sqlalchemy
diff --git a/files/rpms/keystone b/files/rpms/keystone
index 99e8524..7182091 100644
--- a/files/rpms/keystone
+++ b/files/rpms/keystone
@@ -1,9 +1,9 @@
 python-greenlet
 libxslt-devel       # dist:f20
-python-lxml         #dist:f18,f19,f20
-python-paste        #dist:f18,f19,f20
-python-paste-deploy #dist:f18,f19,f20
-python-paste-script #dist:f18,f19,f20
+python-lxml         #dist:f19,f20
+python-paste        #dist:f19,f20
+python-paste-deploy #dist:f19,f20
+python-paste-script #dist:f19,f20
 python-routes
 python-sqlalchemy
 python-webob
diff --git a/files/rpms/neutron b/files/rpms/neutron
index 42d7f68..06ea0ea 100644
--- a/files/rpms/neutron
+++ b/files/rpms/neutron
@@ -11,8 +11,8 @@
 python-iso8601
 python-kombu
 #rhel6 gets via pip
-python-paste        # dist:f18,f19,f20,rhel7
-python-paste-deploy # dist:f18,f19,f20,rhel7
+python-paste        # dist:f19,f20,rhel7
+python-paste-deploy # dist:f19,f20,rhel7
 python-qpid
 python-routes
 python-sqlalchemy
diff --git a/files/rpms/nova b/files/rpms/nova
index a607d92..45d6e0b 100644
--- a/files/rpms/nova
+++ b/files/rpms/nova
@@ -28,11 +28,11 @@
 python-lockfile
 python-migrate
 python-mox
-python-paramiko # dist:f18,f19,f20,rhel7
+python-paramiko # dist:f19,f20,rhel7
 # ^ on RHEL6, brings in python-crypto which conflicts with version from
 # pip we need
-python-paste        # dist:f18,f19,f20,rhel7
-python-paste-deploy # dist:f18,f19,f20,rhel7
+python-paste        # dist:f19,f20,rhel7
+python-paste-deploy # dist:f19,f20,rhel7
 python-qpid
 python-routes
 python-sqlalchemy
diff --git a/files/rpms/swift b/files/rpms/swift
index 72253f7..bf29ea2 100644
--- a/files/rpms/swift
+++ b/files/rpms/swift
@@ -9,7 +9,7 @@
 python-greenlet
 python-netifaces
 python-nose
-python-paste-deploy # dist:f18,f19,f20,rhel7
+python-paste-deploy # dist:f19,f20,rhel7
 python-simplejson
 python-webob
 pyxattr
diff --git a/functions-common b/functions-common
index 90cd3df..c6fd5c7 100644
--- a/functions-common
+++ b/functions-common
@@ -517,12 +517,14 @@
     GIT_DEST=$2
     GIT_REF=$3
     RECLONE=$(trueorfalse False $RECLONE)
+    local orig_dir=`pwd`
 
     if [[ "$OFFLINE" = "True" ]]; then
         echo "Running in offline mode, clones already exist"
         # print out the results so we know what change was used in the logs
         cd $GIT_DEST
         git show --oneline | head -1
+        cd $orig_dir
         return
     fi
 
@@ -572,6 +574,7 @@
     # print out the results so we know what change was used in the logs
     cd $GIT_DEST
     git show --oneline | head -1
+    cd $orig_dir
 }
 
 # git can sometimes get itself infinitely stuck with transient network
diff --git a/lib/neutron_plugins/nuage b/lib/neutron_plugins/nuage
new file mode 100644
index 0000000..3649f39
--- /dev/null
+++ b/lib/neutron_plugins/nuage
@@ -0,0 +1,69 @@
+# Nuage Neutron Plugin
+# ----------------------
+
+# Save trace setting
+MY_XTRACE=$(set +o | grep xtrace)
+set +o xtrace
+
+function neutron_plugin_create_nova_conf {
+    NOVA_OVS_BRIDGE=${NOVA_OVS_BRIDGE:-"br-int"}
+    iniset $NOVA_CONF DEFAULT neutron_ovs_bridge $NOVA_OVS_BRIDGE
+    NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtGenericVIFDriver"}
+    LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver
+    iniset $NOVA_CONF DEFAULT firewall_driver $LIBVIRT_FIREWALL_DRIVER
+}
+
+function neutron_plugin_install_agent_packages {
+    :
+}
+
+function neutron_plugin_configure_common {
+    Q_PLUGIN_CONF_PATH=etc/neutron/plugins/nuage
+    Q_PLUGIN_CONF_FILENAME=nuage_plugin.ini
+    Q_DB_NAME="nuage_neutron"
+    Q_PLUGIN_CLASS="neutron.plugins.nuage.plugin.NuagePlugin"
+    Q_PLUGIN_EXTENSIONS_PATH=neutron/plugins/nuage/extensions
+    #Nuage specific Neutron defaults. Actual value must be set and sourced
+    NUAGE_CNA_SERVERS=${NUAGE_CNA_SERVERS:-'localhost:8443'}
+    NUAGE_CNA_SERVER_AUTH=${NUAGE_CNA_SERVER_AUTH:-'username:password'}
+    NUAGE_CNA_ORGANIZATION=${NUAGE_CNA_ORGANIZATION:-'org'}
+    NUAGE_CNA_SERVER_SSL=${NUAGE_CNA_SERVER_SSL:-'True'}
+    NUAGE_CNA_BASE_URI=${NUAGE_CNA_BASE_URI:-'/'}
+    NUAGE_CNA_AUTH_RESOURCE=${NUAGE_CNA_AUTH_RESOURCE:-'/'}
+    NUAGE_CNA_DEF_NETPART_NAME=${NUAGE_CNA_DEF_NETPART_NAME:-''}
+}
+
+function neutron_plugin_configure_debug_command {
+    :
+}
+
+function neutron_plugin_configure_dhcp_agent {
+    :
+}
+
+function neutron_plugin_configure_l3_agent {
+    :
+}
+
+function neutron_plugin_configure_plugin_agent {
+    :
+}
+
+function neutron_plugin_configure_service {
+    iniset $NEUTRON_CONF DEFAULT api_extensions_path neutron/plugins/nuage/extensions/
+    iniset /$Q_PLUGIN_CONF_FILE restproxy base_uri $NUAGE_CNA_BASE_URI
+    iniset /$Q_PLUGIN_CONF_FILE restproxy serverssl $NUAGE_CNA_SERVER_SSL
+    iniset /$Q_PLUGIN_CONF_FILE restproxy serverauth $NUAGE_CNA_SERVER_AUTH
+    iniset /$Q_PLUGIN_CONF_FILE restproxy organization $NUAGE_CNA_ORGANIZATION
+    iniset /$Q_PLUGIN_CONF_FILE restproxy server $NUAGE_CNA_SERVERS
+    iniset /$Q_PLUGIN_CONF_FILE restproxy auth_resource $NUAGE_CNA_AUTH_RESOURCE
+    iniset /$Q_PLUGIN_CONF_FILE restproxy default_net_partition_name $NUAGE_CNA_DEF_NETPART_NAME
+}
+
+function has_neutron_plugin_security_group {
+    # 1 means False here
+    return 1
+}
+
+# Restore xtrace
+$MY_XTRACE
diff --git a/lib/nova b/lib/nova
index a1f49dc..b01d107 100644
--- a/lib/nova
+++ b/lib/nova
@@ -715,19 +715,28 @@
     start_nova_rest
 }
 
-# stop_nova() - Stop running processes (non-screen)
-function stop_nova {
-    # Kill the nova screen windows
-    # Some services are listed here twice since more than one instance
-    # of a service may be running in certain configs.
-    for serv in n-api n-cpu n-crt n-net n-sch n-novnc n-xvnc n-cauth n-spice n-cond n-cell n-cell n-api-meta n-obj; do
-        screen_stop $serv
-    done
+function stop_nova_compute {
+    screen_stop n-cpu
     if is_service_enabled n-cpu && [[ -r $NOVA_PLUGINS/hypervisor-$VIRT_DRIVER ]]; then
         stop_nova_hypervisor
     fi
 }
 
+function stop_nova_rest {
+    # Kill the nova screen windows
+    # Some services are listed here twice since more than one instance
+    # of a service may be running in certain configs.
+    for serv in n-api n-crt n-net n-sch n-novnc n-xvnc n-cauth n-spice n-cond n-cell n-cell n-api-meta n-obj; do
+        screen_stop $serv
+    done
+}
+
+# stop_nova() - Stop running processes (non-screen)
+function stop_nova {
+    stop_nova_rest
+    stop_nova_compute
+}
+
 
 # Restore xtrace
 $XTRACE
diff --git a/lib/nova_plugins/hypervisor-docker b/lib/nova_plugins/hypervisor-docker
deleted file mode 100644
index fd3c4fe..0000000
--- a/lib/nova_plugins/hypervisor-docker
+++ /dev/null
@@ -1,132 +0,0 @@
-# lib/nova_plugins/docker
-# Configure the Docker hypervisor
-
-# Enable with:
-#
-#   VIRT_DRIVER=docker
-
-# Dependencies:
-#
-# - ``functions`` file
-# - ``nova`` and ``glance`` configurations
-
-# install_nova_hypervisor - install any external requirements
-# configure_nova_hypervisor - make configuration changes, including those to other services
-# start_nova_hypervisor - start any external services
-# stop_nova_hypervisor - stop any external services
-# cleanup_nova_hypervisor - remove transient data and cache
-
-# Save trace setting
-MY_XTRACE=$(set +o | grep xtrace)
-set +o xtrace
-
-
-# Defaults
-# --------
-
-# Set up default directories
-DOCKER_DIR=$DEST/docker
-
-DOCKER_UNIX_SOCKET=/var/run/docker.sock
-DOCKER_PID_FILE=/var/run/docker.pid
-DOCKER_REGISTRY_PORT=${DOCKER_REGISTRY_PORT:-5042}
-
-DOCKER_IMAGE=${DOCKER_IMAGE:-cirros:latest}
-DOCKER_IMAGE_NAME=$DEFAULT_IMAGE_NAME
-DOCKER_REGISTRY_IMAGE=${DOCKER_REGISTRY_IMAGE:-registry:latest}
-DOCKER_REGISTRY_IMAGE_NAME=registry
-DOCKER_REPOSITORY_NAME=${SERVICE_HOST}:${DOCKER_REGISTRY_PORT}/${DOCKER_IMAGE_NAME}
-
-DOCKER_APT_REPO=${DOCKER_APT_REPO:-https://get.docker.io/ubuntu}
-
-
-# Entry Points
-# ------------
-
-# clean_nova_hypervisor - Clean up an installation
-function cleanup_nova_hypervisor {
-    stop_service docker
-
-    # Clean out work area
-    sudo rm -rf /var/lib/docker
-}
-
-# configure_nova_hypervisor - Set config files, create data dirs, etc
-function configure_nova_hypervisor {
-    iniset $NOVA_CONF DEFAULT compute_driver docker.DockerDriver
-    iniset $GLANCE_API_CONF DEFAULT container_formats ami,ari,aki,bare,ovf,docker
-}
-
-# is_docker_running - Return 0 (true) if Docker is running, otherwise 1
-function is_docker_running {
-    local docker_pid
-    if [ -f "$DOCKER_PID_FILE" ]; then
-        docker_pid=$(cat "$DOCKER_PID_FILE")
-    fi
-    if [[ -z "$docker_pid" ]] || ! ps -p "$docker_pid" | grep [d]ocker; then
-        return 1
-    fi
-    return 0
-}
-
-# install_nova_hypervisor() - Install external components
-function install_nova_hypervisor {
-    # So far this is Ubuntu only
-    if ! is_ubuntu; then
-        die $LINENO "Docker is only supported on Ubuntu at this time"
-    fi
-
-    # Make sure Docker is installed
-    if ! is_package_installed lxc-docker; then
-        die $LINENO "Docker is not installed.  Please run tools/docker/install_docker.sh"
-    fi
-
-    if ! (is_docker_running); then
-        die $LINENO "Docker not running"
-    fi
-}
-
-# start_nova_hypervisor - Start any required external services
-function start_nova_hypervisor {
-    if ! (is_docker_running); then
-        die $LINENO "Docker not running"
-    fi
-
-    # Start the Docker registry container
-    docker run -d -p ${DOCKER_REGISTRY_PORT}:5000 \
-        -e SETTINGS_FLAVOR=openstack -e OS_USERNAME=${OS_USERNAME} \
-        -e OS_PASSWORD=${OS_PASSWORD} -e OS_TENANT_NAME=${OS_TENANT_NAME} \
-        -e OS_GLANCE_URL="${SERVICE_PROTOCOL}://${GLANCE_HOSTPORT}" \
-        -e OS_AUTH_URL=${OS_AUTH_URL} \
-        $DOCKER_REGISTRY_IMAGE_NAME ./docker-registry/run.sh
-
-    echo "Waiting for docker registry to start..."
-    DOCKER_REGISTRY=${SERVICE_HOST}:${DOCKER_REGISTRY_PORT}
-    if ! timeout $SERVICE_TIMEOUT sh -c "while ! curl -s $DOCKER_REGISTRY; do sleep 1; done"; then
-        die $LINENO "docker-registry did not start"
-    fi
-
-    # Tag image if not already tagged
-    if ! docker images | grep $DOCKER_REPOSITORY_NAME; then
-        docker tag $DOCKER_IMAGE_NAME $DOCKER_REPOSITORY_NAME
-    fi
-
-    # Make sure we copied the image in Glance
-    if ! (glance image-show "$DOCKER_IMAGE"); then
-        docker push $DOCKER_REPOSITORY_NAME
-    fi
-}
-
-# stop_nova_hypervisor - Stop any external services
-function stop_nova_hypervisor {
-    # Stop the docker registry container
-    docker kill $(docker ps | grep docker-registry | cut -d' ' -f1)
-}
-
-
-# Restore xtrace
-$MY_XTRACE
-
-# Local variables:
-# mode: shell-script
-# End:
diff --git a/lib/sahara b/lib/sahara
new file mode 100644
index 0000000..4cb04ec
--- /dev/null
+++ b/lib/sahara
@@ -0,0 +1,177 @@
+# lib/sahara
+
+# Dependencies:
+# ``functions`` file
+# ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
+
+# ``stack.sh`` calls the entry points in this order:
+#
+# install_sahara
+# configure_sahara
+# start_sahara
+# stop_sahara
+# cleanup_sahara
+
+# Save trace setting
+XTRACE=$(set +o | grep xtrace)
+set +o xtrace
+
+
+# Defaults
+# --------
+
+# Set up default repos
+SAHARA_REPO=${SAHARA_REPO:-${GIT_BASE}/openstack/sahara.git}
+SAHARA_BRANCH=${SAHARA_BRANCH:-master}
+
+# Set up default directories
+SAHARA_DIR=$DEST/sahara
+SAHARA_CONF_DIR=${SAHARA_CONF_DIR:-/etc/sahara}
+SAHARA_CONF_FILE=${SAHARA_CONF_DIR}/sahara.conf
+SAHARA_DEBUG=${SAHARA_DEBUG:-True}
+
+SAHARA_SERVICE_HOST=${SAHARA_SERVICE_HOST:-$SERVICE_HOST}
+SAHARA_SERVICE_PORT=${SAHARA_SERVICE_PORT:-8386}
+SAHARA_SERVICE_PROTOCOL=${SAHARA_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
+
+SAHARA_AUTH_CACHE_DIR=${SAHARA_AUTH_CACHE_DIR:-/var/cache/sahara}
+
+# Support entry points installation of console scripts
+if [[ -d $SAHARA_DIR/bin ]]; then
+    SAHARA_BIN_DIR=$SAHARA_DIR/bin
+else
+    SAHARA_BIN_DIR=$(get_python_exec_prefix)
+fi
+
+# Tell Tempest this project is present
+TEMPEST_SERVICES+=,sahara
+
+# For backward compatibility with current tests in Tempest
+TEMPEST_SERVICES+=,savanna
+
+
+# Functions
+# ---------
+
+# create_sahara_accounts() - Set up common required sahara accounts
+#
+# Tenant      User       Roles
+# ------------------------------
+# service     sahara    admin
+function create_sahara_accounts {
+
+    SERVICE_TENANT=$(openstack project list | awk "/ $SERVICE_TENANT_NAME / { print \$2 }")
+    ADMIN_ROLE=$(openstack role list | awk "/ admin / { print \$2 }")
+
+    SAHARA_USER=$(openstack user create \
+        sahara \
+        --password "$SERVICE_PASSWORD" \
+        --project $SERVICE_TENANT \
+        --email sahara@example.com \
+        | grep " id " | get_field 2)
+    openstack role add \
+        $ADMIN_ROLE \
+        --project $SERVICE_TENANT \
+        --user $SAHARA_USER
+
+    if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
+        SAHARA_SERVICE=$(openstack service create \
+            sahara \
+            --type=data_processing \
+            --description="Sahara Data Processing" \
+            | grep " id " | get_field 2)
+        openstack endpoint create \
+            $SAHARA_SERVICE \
+            --region RegionOne \
+            --publicurl "$SAHARA_SERVICE_PROTOCOL://$SAHARA_SERVICE_HOST:$SAHARA_SERVICE_PORT/v1.1/\$(tenant_id)s" \
+            --adminurl "$SAHARA_SERVICE_PROTOCOL://$SAHARA_SERVICE_HOST:$SAHARA_SERVICE_PORT/v1.1/\$(tenant_id)s" \
+            --internalurl "$SAHARA_SERVICE_PROTOCOL://$SAHARA_SERVICE_HOST:$SAHARA_SERVICE_PORT/v1.1/\$(tenant_id)s"
+    fi
+}
+
+# cleanup_sahara() - Remove residual data files, anything left over from
+# previous runs that would need to clean up.
+function cleanup_sahara {
+
+    # Cleanup auth cache dir
+    sudo rm -rf $SAHARA_AUTH_CACHE_DIR
+}
+
+# configure_sahara() - Set config files, create data dirs, etc
+function configure_sahara {
+
+    if [[ ! -d $SAHARA_CONF_DIR ]]; then
+        sudo mkdir -p $SAHARA_CONF_DIR
+    fi
+    sudo chown $STACK_USER $SAHARA_CONF_DIR
+
+    # Copy over sahara configuration file and configure common parameters.
+    # TODO(slukjanov): rename when sahara internals will be updated
+    cp $SAHARA_DIR/etc/savanna/savanna.conf.sample $SAHARA_CONF_FILE
+
+    # Create auth cache dir
+    sudo mkdir -p $SAHARA_AUTH_CACHE_DIR
+    sudo chown $STACK_USER $SAHARA_AUTH_CACHE_DIR
+    rm -rf $SAHARA_AUTH_CACHE_DIR/*
+
+    # Set obsolete keystone auth configs for backward compatibility
+    iniset $SAHARA_CONF_FILE DEFAULT os_auth_host $KEYSTONE_SERVICE_HOST
+    iniset $SAHARA_CONF_FILE DEFAULT os_auth_port $KEYSTONE_SERVICE_PORT
+    iniset $SAHARA_CONF_FILE DEFAULT os_auth_protocol $KEYSTONE_SERVICE_PROTOCOL
+    iniset $SAHARA_CONF_FILE DEFAULT os_admin_password $SERVICE_PASSWORD
+    iniset $SAHARA_CONF_FILE DEFAULT os_admin_username sahara
+    iniset $SAHARA_CONF_FILE DEFAULT os_admin_tenant_name $SERVICE_TENANT_NAME
+
+    # Set actual keystone auth configs
+    iniset $SAHARA_CONF_FILE keystone_authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/
+    iniset $SAHARA_CONF_FILE keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
+    iniset $SAHARA_CONF_FILE keystone_authtoken admin_user sahara
+    iniset $SAHARA_CONF_FILE keystone_authtoken admin_password $SERVICE_PASSWORD
+    iniset $SAHARA_CONF_FILE keystone_authtoken signing_dir $SAHARA_AUTH_CACHE_DIR
+    iniset $SAHARA_CONF_FILE keystone_authtoken cafile $KEYSTONE_SSL_CA
+
+    iniset $SAHARA_CONF_FILE DEFAULT debug $SAHARA_DEBUG
+
+    iniset $SAHARA_CONF_FILE database connection `database_connection_url sahara`
+
+    if is_service_enabled neutron; then
+        iniset $SAHARA_CONF_FILE DEFAULT use_neutron true
+        iniset $SAHARA_CONF_FILE DEFAULT use_floating_ips true
+    fi
+
+    if is_service_enabled heat; then
+        iniset $SAHARA_CONF_FILE DEFAULT infrastructure_engine heat
+    else
+        iniset $SAHARA_CONF_FILE DEFAULT infrastructure_engine direct
+    fi
+
+    iniset $SAHARA_CONF_FILE DEFAULT use_syslog $SYSLOG
+
+    recreate_database sahara utf8
+    $SAHARA_BIN_DIR/sahara-db-manage --config-file $SAHARA_CONF_FILE upgrade head
+}
+
+# install_sahara() - Collect source and prepare
+function install_sahara {
+    git_clone $SAHARA_REPO $SAHARA_DIR $SAHARA_BRANCH
+    setup_develop $SAHARA_DIR
+}
+
+# start_sahara() - Start running processes, including screen
+function start_sahara {
+    screen_it sahara "cd $SAHARA_DIR && $SAHARA_BIN_DIR/sahara-api --config-file $SAHARA_CONF_FILE"
+}
+
+# stop_sahara() - Stop running processes
+function stop_sahara {
+    # Kill the Sahara screen windows
+    screen -S $SCREEN_NAME -p sahara -X kill
+}
+
+
+# Restore xtrace
+$XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/sahara-dashboard b/lib/sahara-dashboard
new file mode 100644
index 0000000..a81df0f
--- /dev/null
+++ b/lib/sahara-dashboard
@@ -0,0 +1,72 @@
+# lib/sahara-dashboard
+
+# Dependencies:
+#
+# - ``functions`` file
+# - ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
+# - ``SERVICE_HOST``
+
+# ``stack.sh`` calls the entry points in this order:
+#
+# - install_sahara_dashboard
+# - configure_sahara_dashboard
+# - cleanup_sahara_dashboard
+
+# Save trace setting
+XTRACE=$(set +o | grep xtrace)
+set +o xtrace
+
+source $TOP_DIR/lib/horizon
+
+# Defaults
+# --------
+
+# Set up default repos
+SAHARA_DASHBOARD_REPO=${SAHARA_DASHBOARD_REPO:-${GIT_BASE}/openstack/sahara-dashboard.git}
+SAHARA_DASHBOARD_BRANCH=${SAHARA_DASHBOARD_BRANCH:-master}
+
+SAHARA_PYTHONCLIENT_REPO=${SAHARA_PYTHONCLIENT_REPO:-${GIT_BASE}/openstack/python-saharaclient.git}
+SAHARA_PYTHONCLIENT_BRANCH=${SAHARA_PYTHONCLIENT_BRANCH:-master}
+
+# Set up default directories
+SAHARA_DASHBOARD_DIR=$DEST/sahara-dashboard
+SAHARA_PYTHONCLIENT_DIR=$DEST/python-saharaclient
+
+# Functions
+# ---------
+
+function configure_sahara_dashboard {
+
+    echo -e "AUTO_ASSIGNMENT_ENABLED = False" >> $HORIZON_DIR/openstack_dashboard/local/local_settings.py
+    echo -e "HORIZON_CONFIG['dashboards'] += ('sahara',)" >> $HORIZON_DIR/openstack_dashboard/settings.py
+    echo -e "INSTALLED_APPS += ('saharadashboard',)" >> $HORIZON_DIR/openstack_dashboard/settings.py
+
+    if is_service_enabled neutron; then
+        echo -e "SAHARA_USE_NEUTRON = True" >> $HORIZON_DIR/openstack_dashboard/local/local_settings.py
+    fi
+}
+
+# install_sahara_dashboard() - Collect source and prepare
+function install_sahara_dashboard {
+    install_python_saharaclient
+    git_clone $SAHARA_DASHBOARD_REPO $SAHARA_DASHBOARD_DIR $SAHARA_DASHBOARD_BRANCH
+    setup_develop $SAHARA_DASHBOARD_DIR
+}
+
+function install_python_saharaclient {
+    git_clone $SAHARA_PYTHONCLIENT_REPO $SAHARA_PYTHONCLIENT_DIR $SAHARA_PYTHONCLIENT_BRANCH
+    setup_develop $SAHARA_PYTHONCLIENT_DIR
+}
+
+# Cleanup file settings.py from Sahara
+function cleanup_sahara_dashboard {
+    sed -i '/sahara/d' $HORIZON_DIR/openstack_dashboard/settings.py
+}
+
+# Restore xtrace
+$XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
+
diff --git a/lib/savanna b/lib/savanna
deleted file mode 100644
index 2cb092c..0000000
--- a/lib/savanna
+++ /dev/null
@@ -1,173 +0,0 @@
-# lib/savanna
-
-# Dependencies:
-# ``functions`` file
-# ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
-
-# ``stack.sh`` calls the entry points in this order:
-#
-# install_savanna
-# configure_savanna
-# start_savanna
-# stop_savanna
-# cleanup_savanna
-
-# Save trace setting
-XTRACE=$(set +o | grep xtrace)
-set +o xtrace
-
-
-# Defaults
-# --------
-
-# Set up default repos
-SAVANNA_REPO=${SAVANNA_REPO:-${GIT_BASE}/openstack/savanna.git}
-SAVANNA_BRANCH=${SAVANNA_BRANCH:-master}
-
-# Set up default directories
-SAVANNA_DIR=$DEST/savanna
-SAVANNA_CONF_DIR=${SAVANNA_CONF_DIR:-/etc/savanna}
-SAVANNA_CONF_FILE=${SAVANNA_CONF_DIR}/savanna.conf
-SAVANNA_DEBUG=${SAVANNA_DEBUG:-True}
-
-SAVANNA_SERVICE_HOST=${SAVANNA_SERVICE_HOST:-$SERVICE_HOST}
-SAVANNA_SERVICE_PORT=${SAVANNA_SERVICE_PORT:-8386}
-SAVANNA_SERVICE_PROTOCOL=${SAVANNA_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
-
-SAVANNA_AUTH_CACHE_DIR=${SAVANNA_AUTH_CACHE_DIR:-/var/cache/savanna}
-
-# Support entry points installation of console scripts
-if [[ -d $SAVANNA_DIR/bin ]]; then
-    SAVANNA_BIN_DIR=$SAVANNA_DIR/bin
-else
-    SAVANNA_BIN_DIR=$(get_python_exec_prefix)
-fi
-
-# Tell Tempest this project is present
-TEMPEST_SERVICES+=,savanna
-
-
-# Functions
-# ---------
-
-# create_savanna_accounts() - Set up common required savanna accounts
-#
-# Tenant      User       Roles
-# ------------------------------
-# service     savanna    admin
-function create_savanna_accounts {
-
-    SERVICE_TENANT=$(openstack project list | awk "/ $SERVICE_TENANT_NAME / { print \$2 }")
-    ADMIN_ROLE=$(openstack role list | awk "/ admin / { print \$2 }")
-
-    SAVANNA_USER=$(openstack user create \
-        savanna \
-        --password "$SERVICE_PASSWORD" \
-        --project $SERVICE_TENANT \
-        --email savanna@example.com \
-        | grep " id " | get_field 2)
-    openstack role add \
-        $ADMIN_ROLE \
-        --project $SERVICE_TENANT \
-        --user $SAVANNA_USER
-
-    if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
-        SAVANNA_SERVICE=$(openstack service create \
-            savanna \
-            --type=data_processing \
-            --description="Savanna Data Processing" \
-            | grep " id " | get_field 2)
-        openstack endpoint create \
-            $SAVANNA_SERVICE \
-            --region RegionOne \
-            --publicurl "$SAVANNA_SERVICE_PROTOCOL://$SAVANNA_SERVICE_HOST:$SAVANNA_SERVICE_PORT/v1.1/\$(tenant_id)s" \
-            --adminurl "$SAVANNA_SERVICE_PROTOCOL://$SAVANNA_SERVICE_HOST:$SAVANNA_SERVICE_PORT/v1.1/\$(tenant_id)s" \
-            --internalurl "$SAVANNA_SERVICE_PROTOCOL://$SAVANNA_SERVICE_HOST:$SAVANNA_SERVICE_PORT/v1.1/\$(tenant_id)s"
-    fi
-}
-
-# cleanup_savanna() - Remove residual data files, anything left over from
-# previous runs that would need to clean up.
-function cleanup_savanna {
-
-    # Cleanup auth cache dir
-    sudo rm -rf $SAVANNA_AUTH_CACHE_DIR
-}
-
-# configure_savanna() - Set config files, create data dirs, etc
-function configure_savanna {
-
-    if [[ ! -d $SAVANNA_CONF_DIR ]]; then
-        sudo mkdir -p $SAVANNA_CONF_DIR
-    fi
-    sudo chown $STACK_USER $SAVANNA_CONF_DIR
-
-    # Copy over savanna configuration file and configure common parameters.
-    cp $SAVANNA_DIR/etc/savanna/savanna.conf.sample $SAVANNA_CONF_FILE
-
-    # Create auth cache dir
-    sudo mkdir -p $SAVANNA_AUTH_CACHE_DIR
-    sudo chown $STACK_USER $SAVANNA_AUTH_CACHE_DIR
-    rm -rf $SAVANNA_AUTH_CACHE_DIR/*
-
-    # Set obsolete keystone auth configs for backward compatibility
-    iniset $SAVANNA_CONF_FILE DEFAULT os_auth_host $KEYSTONE_SERVICE_HOST
-    iniset $SAVANNA_CONF_FILE DEFAULT os_auth_port $KEYSTONE_SERVICE_PORT
-    iniset $SAVANNA_CONF_FILE DEFAULT os_auth_protocol $KEYSTONE_SERVICE_PROTOCOL
-    iniset $SAVANNA_CONF_FILE DEFAULT os_admin_password $SERVICE_PASSWORD
-    iniset $SAVANNA_CONF_FILE DEFAULT os_admin_username savanna
-    iniset $SAVANNA_CONF_FILE DEFAULT os_admin_tenant_name $SERVICE_TENANT_NAME
-
-    # Set actual keystone auth configs
-    iniset $SAVANNA_CONF_FILE keystone_authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/
-    iniset $SAVANNA_CONF_FILE keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
-    iniset $SAVANNA_CONF_FILE keystone_authtoken admin_user savanna
-    iniset $SAVANNA_CONF_FILE keystone_authtoken admin_password $SERVICE_PASSWORD
-    iniset $SAVANNA_CONF_FILE keystone_authtoken signing_dir $SAVANNA_AUTH_CACHE_DIR
-    iniset $SAVANNA_CONF_FILE keystone_authtoken cafile $KEYSTONE_SSL_CA
-
-    iniset $SAVANNA_CONF_FILE DEFAULT debug $SAVANNA_DEBUG
-
-    iniset $SAVANNA_CONF_FILE database connection `database_connection_url savanna`
-
-    if is_service_enabled neutron; then
-        iniset $SAVANNA_CONF_FILE DEFAULT use_neutron true
-        iniset $SAVANNA_CONF_FILE DEFAULT use_floating_ips true
-    fi
-
-    if is_service_enabled heat; then
-        iniset $SAVANNA_CONF_FILE DEFAULT infrastructure_engine heat
-    else
-        iniset $SAVANNA_CONF_FILE DEFAULT infrastructure_engine savanna
-    fi
-
-    iniset $SAVANNA_CONF_FILE DEFAULT use_syslog $SYSLOG
-
-    recreate_database savanna utf8
-    $SAVANNA_BIN_DIR/savanna-db-manage --config-file $SAVANNA_CONF_FILE upgrade head
-}
-
-# install_savanna() - Collect source and prepare
-function install_savanna {
-    git_clone $SAVANNA_REPO $SAVANNA_DIR $SAVANNA_BRANCH
-    setup_develop $SAVANNA_DIR
-}
-
-# start_savanna() - Start running processes, including screen
-function start_savanna {
-    screen_it savanna "cd $SAVANNA_DIR && $SAVANNA_BIN_DIR/savanna-api --config-file $SAVANNA_CONF_FILE"
-}
-
-# stop_savanna() - Stop running processes
-function stop_savanna {
-    # Kill the Savanna screen windows
-    screen -S $SCREEN_NAME -p savanna -X kill
-}
-
-
-# Restore xtrace
-$XTRACE
-
-# Local variables:
-# mode: shell-script
-# End:
diff --git a/lib/savanna-dashboard b/lib/savanna-dashboard
deleted file mode 100644
index 6fe15a3..0000000
--- a/lib/savanna-dashboard
+++ /dev/null
@@ -1,72 +0,0 @@
-# lib/savanna-dashboard
-
-# Dependencies:
-#
-# - ``functions`` file
-# - ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
-# - ``SERVICE_HOST``
-
-# ``stack.sh`` calls the entry points in this order:
-#
-# - install_savanna_dashboard
-# - configure_savanna_dashboard
-# - cleanup_savanna_dashboard
-
-# Save trace setting
-XTRACE=$(set +o | grep xtrace)
-set +o xtrace
-
-source $TOP_DIR/lib/horizon
-
-# Defaults
-# --------
-
-# Set up default repos
-SAVANNA_DASHBOARD_REPO=${SAVANNA_DASHBOARD_REPO:-${GIT_BASE}/openstack/savanna-dashboard.git}
-SAVANNA_DASHBOARD_BRANCH=${SAVANNA_DASHBOARD_BRANCH:-master}
-
-SAVANNA_PYTHONCLIENT_REPO=${SAVANNA_PYTHONCLIENT_REPO:-${GIT_BASE}/openstack/python-savannaclient.git}
-SAVANNA_PYTHONCLIENT_BRANCH=${SAVANNA_PYTHONCLIENT_BRANCH:-master}
-
-# Set up default directories
-SAVANNA_DASHBOARD_DIR=$DEST/savanna-dashboard
-SAVANNA_PYTHONCLIENT_DIR=$DEST/python-savannaclient
-
-# Functions
-# ---------
-
-function configure_savanna_dashboard {
-
-    echo -e "AUTO_ASSIGNMENT_ENABLED = False" >> $HORIZON_DIR/openstack_dashboard/local/local_settings.py
-    echo -e "HORIZON_CONFIG['dashboards'] += ('savanna',)" >> $HORIZON_DIR/openstack_dashboard/settings.py
-    echo -e "INSTALLED_APPS += ('savannadashboard',)" >> $HORIZON_DIR/openstack_dashboard/settings.py
-
-    if is_service_enabled neutron; then
-        echo -e "SAVANNA_USE_NEUTRON = True" >> $HORIZON_DIR/openstack_dashboard/local/local_settings.py
-    fi
-}
-
-# install_savanna_dashboard() - Collect source and prepare
-function install_savanna_dashboard {
-    install_python_savannaclient
-    git_clone $SAVANNA_DASHBOARD_REPO $SAVANNA_DASHBOARD_DIR $SAVANNA_DASHBOARD_BRANCH
-    setup_develop $SAVANNA_DASHBOARD_DIR
-}
-
-function install_python_savannaclient {
-    git_clone $SAVANNA_PYTHONCLIENT_REPO $SAVANNA_PYTHONCLIENT_DIR $SAVANNA_PYTHONCLIENT_BRANCH
-    setup_develop $SAVANNA_PYTHONCLIENT_DIR
-}
-
-# Cleanup file settings.py from Savanna
-function cleanup_savanna_dashboard {
-    sed -i '/savanna/d' $HORIZON_DIR/openstack_dashboard/settings.py
-}
-
-# Restore xtrace
-$XTRACE
-
-# Local variables:
-# mode: shell-script
-# End:
-
diff --git a/stackrc b/stackrc
index 6bb6f37..4566378 100644
--- a/stackrc
+++ b/stackrc
@@ -320,9 +320,6 @@
     openvz)
         DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-ubuntu-12.04-x86_64}
         IMAGE_URLS=${IMAGE_URLS:-"http://download.openvz.org/template/precreated/ubuntu-12.04-x86_64.tar.gz"};;
-    docker)
-        DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-cirros}
-        IMAGE_URLS=${IMAGE_URLS:-};;
     libvirt)
         case "$LIBVIRT_TYPE" in
             lxc) # the cirros root disk in the uec tarball is empty, so it will not work for lxc
@@ -335,7 +332,7 @@
         ;;
     vsphere)
         DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-debian-2.6.32-i686}
-        IMAGE_URLS=${IMAGE_URLS:-"http://partnerweb.vmware.com/programs/vmdkimage/debian-2.6.32-i686.vmdk"};;
+        IMAGE_URLS=${IMAGE_URLS:-"http://partnerweb.vmware.com/programs/vmdkimage/cirros-0.3.0-i386-disk.vmdk"};;
     xenserver)
         DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-cirros-0.3.0-x86_64-disk}
         IMAGE_URLS=${IMAGE_URLS:-"https://github.com/downloads/citrix-openstack/warehouse/cirros-0.3.0-x86_64-disk.vhd.tgz"};;
diff --git a/tools/docker/README.md b/tools/docker/README.md
deleted file mode 100644
index 976111f..0000000
--- a/tools/docker/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# DevStack on Docker
-
-Using Docker as Nova's hypervisor requries two steps:
-
-* Configure DevStack by adding the following to `localrc`::
-
-    VIRT_DRIVER=docker
-
-* Download and install the Docker service and images::
-
-    tools/docker/install_docker.sh
-
-After this, `stack.sh` should run as normal.
diff --git a/tools/docker/install_docker.sh b/tools/docker/install_docker.sh
deleted file mode 100755
index 27c8c82..0000000
--- a/tools/docker/install_docker.sh
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env bash
-
-# **install_docker.sh** - Do the initial Docker installation and configuration
-
-# install_docker.sh
-#
-# Install docker package and images
-# * downloads a base busybox image and a glance registry image if necessary
-# * install the images in Docker's image cache
-
-
-# Keep track of the current directory
-SCRIPT_DIR=$(cd $(dirname "$0") && pwd)
-TOP_DIR=$(cd $SCRIPT_DIR/../..; pwd)
-
-# Import common functions
-source $TOP_DIR/functions
-
-# Load local configuration
-source $TOP_DIR/stackrc
-
-FILES=$TOP_DIR/files
-
-# Get our defaults
-source $TOP_DIR/lib/nova_plugins/hypervisor-docker
-
-SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
-
-
-# Install Docker Service
-# ======================
-
-if is_fedora; then
-    install_package docker-io socat
-else
-    # Stop the auto-repo updates and do it when required here
-    NO_UPDATE_REPOS=True
-
-    # Set up home repo
-    curl https://get.docker.io/gpg | sudo apt-key add -
-    install_package python-software-properties && \
-        sudo sh -c "echo deb $DOCKER_APT_REPO docker main > /etc/apt/sources.list.d/docker.list"
-    apt_get update
-    install_package --force-yes lxc-docker socat
-fi
-
-# Start the daemon - restart just in case the package ever auto-starts...
-restart_service docker
-
-echo "Waiting for docker daemon to start..."
-DOCKER_GROUP=$(groups | cut -d' ' -f1)
-CONFIGURE_CMD="while ! /bin/echo -e 'GET /v1.3/version HTTP/1.0\n\n' | socat - unix-connect:$DOCKER_UNIX_SOCKET 2>/dev/null | grep -q '200 OK'; do
-    # Set the right group on docker unix socket before retrying
-    sudo chgrp $DOCKER_GROUP $DOCKER_UNIX_SOCKET
-    sudo chmod g+rw $DOCKER_UNIX_SOCKET
-    sleep 1
-done"
-if ! timeout $SERVICE_TIMEOUT sh -c "$CONFIGURE_CMD"; then
-    die $LINENO "docker did not start"
-fi
-
-# Get guest container image
-docker pull $DOCKER_IMAGE
-docker tag $DOCKER_IMAGE $DOCKER_IMAGE_NAME
-
-# Get docker-registry image
-docker pull $DOCKER_REGISTRY_IMAGE
-docker tag $DOCKER_REGISTRY_IMAGE $DOCKER_REGISTRY_IMAGE_NAME