Merge "Correctly source .stackenv"
diff --git a/files/apts/n-api b/files/apts/n-api
index ad943ff..0f08daa 100644
--- a/files/apts/n-api
+++ b/files/apts/n-api
@@ -1,2 +1 @@
-gcc  # temporary because this pulls in glance to get the client without running the glance prereqs
 python-dateutil
diff --git a/functions b/functions
index 1590166..edc4bf9 100644
--- a/functions
+++ b/functions
@@ -781,9 +781,9 @@
     if is_ubuntu; then
         apt_get purge "$@"
     elif is_fedora; then
-        yum remove -y "$@"
+        sudo yum remove -y "$@"
     elif is_suse; then
-        rpm -e "$@"
+        sudo rpm -e "$@"
     else
         exit_distro_not_supported "uninstalling packages"
     fi
@@ -1356,5 +1356,5 @@
 
 
 # Local variables:
-# -*- mode: Shell-script -*-
+# mode: shell-script
 # End:
diff --git a/lib/baremetal b/lib/baremetal
index 5326dd1..24cce9f 100644
--- a/lib/baremetal
+++ b/lib/baremetal
@@ -434,3 +434,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/ceilometer b/lib/ceilometer
index d90694c..58cafd1 100644
--- a/lib/ceilometer
+++ b/lib/ceilometer
@@ -138,3 +138,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/cinder b/lib/cinder
index 7688ad9..deace68 100644
--- a/lib/cinder
+++ b/lib/cinder
@@ -123,9 +123,6 @@
 
 # configure_cinder() - Set config files, create data dirs, etc
 function configure_cinder() {
-    setup_develop $CINDER_DIR
-    setup_develop $CINDERCLIENT_DIR
-
     if [[ ! -d $CINDER_CONF_DIR ]]; then
         sudo mkdir -p $CINDER_CONF_DIR
     fi
@@ -367,7 +364,13 @@
 # install_cinder() - Collect source and prepare
 function install_cinder() {
     git_clone $CINDER_REPO $CINDER_DIR $CINDER_BRANCH
+    setup_develop $CINDER_DIR
+}
+
+# install_cinderclient() - Collect source and prepare
+function install_cinderclient() {
     git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH
+    setup_develop $CINDERCLIENT_DIR
 }
 
 # apply config.d approach (e.g. Oneiric does not have this)
@@ -431,3 +434,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/database b/lib/database
index 79b77a2..cbe886f 100644
--- a/lib/database
+++ b/lib/database
@@ -114,3 +114,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/databases/mysql b/lib/databases/mysql
index 0633ab0..30450b1 100644
--- a/lib/databases/mysql
+++ b/lib/databases/mysql
@@ -139,3 +139,7 @@
 
 # Restore xtrace
 $MY_XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/databases/postgresql b/lib/databases/postgresql
index efc206f..b64de2c 100644
--- a/lib/databases/postgresql
+++ b/lib/databases/postgresql
@@ -90,3 +90,7 @@
 
 # Restore xtrace
 $PG_XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/glance b/lib/glance
index edf6982..3376400 100644
--- a/lib/glance
+++ b/lib/glance
@@ -62,15 +62,8 @@
     sudo rm -rf $GLANCE_CACHE_DIR $GLANCE_IMAGE_DIR $GLANCE_AUTH_CACHE_DIR
 }
 
-# configure_glanceclient() - Set config files, create data dirs, etc
-function configure_glanceclient() {
-    setup_develop $GLANCECLIENT_DIR
-}
-
 # configure_glance() - Set config files, create data dirs, etc
 function configure_glance() {
-    setup_develop $GLANCE_DIR
-
     if [[ ! -d $GLANCE_CONF_DIR ]]; then
         sudo mkdir -p $GLANCE_CONF_DIR
     fi
@@ -116,6 +109,15 @@
     iniset_rpc_backend glance $GLANCE_API_CONF DEFAULT
     iniset $GLANCE_API_CONF keystone_authtoken signing_dir $GLANCE_AUTH_CACHE_DIR/api
 
+    # Store the images in swift if enabled.
+    if is_service_enabled s-proxy; then
+        iniset $GLANCE_API_CONF DEFAULT default_store swift
+        iniset $GLANCE_API_CONF DEFAULT swift_store_auth_address $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/
+        iniset $GLANCE_API_CONF DEFAULT swift_store_user $SERVICE_TENANT_NAME:glance
+        iniset $GLANCE_API_CONF DEFAULT swift_store_key $SERVICE_PASSWORD
+        iniset $GLANCE_API_CONF DEFAULT swift_store_create_container_on_put True
+    fi
+
     cp -p $GLANCE_DIR/etc/glance-registry-paste.ini $GLANCE_REGISTRY_PASTE_INI
 
     cp -p $GLANCE_DIR/etc/glance-api-paste.ini $GLANCE_API_PASTE_INI
@@ -171,11 +173,13 @@
 # install_glanceclient() - Collect source and prepare
 function install_glanceclient() {
     git_clone $GLANCECLIENT_REPO $GLANCECLIENT_DIR $GLANCECLIENT_BRANCH
+    setup_develop $GLANCECLIENT_DIR
 }
 
 # install_glance() - Collect source and prepare
 function install_glance() {
     git_clone $GLANCE_REPO $GLANCE_DIR $GLANCE_BRANCH
+    setup_develop $GLANCE_DIR
 }
 
 # start_glance() - Start running processes, including screen
@@ -197,3 +201,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/heat b/lib/heat
index 56d6f39..88535c3 100644
--- a/lib/heat
+++ b/lib/heat
@@ -184,3 +184,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/horizon b/lib/horizon
index bc739ed..b63e1f8 100644
--- a/lib/horizon
+++ b/lib/horizon
@@ -178,3 +178,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/keystone b/lib/keystone
index 805cb6f..0fbc7d7 100644
--- a/lib/keystone
+++ b/lib/keystone
@@ -75,15 +75,8 @@
     :
 }
 
-# configure_keystoneclient() - Set config files, create data dirs, etc
-function configure_keystoneclient() {
-    setup_develop $KEYSTONECLIENT_DIR
-}
-
 # configure_keystone() - Set config files, create data dirs, etc
 function configure_keystone() {
-    setup_develop $KEYSTONE_DIR
-
     if [[ ! -d $KEYSTONE_CONF_DIR ]]; then
         sudo mkdir -p $KEYSTONE_CONF_DIR
     fi
@@ -305,6 +298,7 @@
 # install_keystoneclient() - Collect source and prepare
 function install_keystoneclient() {
     git_clone $KEYSTONECLIENT_REPO $KEYSTONECLIENT_DIR $KEYSTONECLIENT_BRANCH
+    setup_develop $KEYSTONECLIENT_DIR
 }
 
 # install_keystone() - Collect source and prepare
@@ -314,6 +308,7 @@
         install_ldap
     fi
     git_clone $KEYSTONE_REPO $KEYSTONE_DIR $KEYSTONE_BRANCH
+    setup_develop $KEYSTONE_DIR
 }
 
 # start_keystone() - Start running processes, including screen
@@ -346,3 +341,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/ldap b/lib/ldap
index 9d415c5..53f6837 100644
--- a/lib/ldap
+++ b/lib/ldap
@@ -76,3 +76,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/nova b/lib/nova
index 46eeea4..8d045b5 100644
--- a/lib/nova
+++ b/lib/nova
@@ -169,11 +169,6 @@
     sudo rm -rf $NOVA_STATE_PATH $NOVA_AUTH_CACHE_DIR
 }
 
-# configure_novaclient() - Set config files, create data dirs, etc
-function configure_novaclient() {
-    setup_develop $NOVACLIENT_DIR
-}
-
 # configure_nova_rootwrap() - configure Nova's rootwrap
 function configure_nova_rootwrap() {
     # Deploy new rootwrap filters files (owned by root).
@@ -204,8 +199,6 @@
 
 # configure_nova() - Set config files, create data dirs, etc
 function configure_nova() {
-    setup_develop $NOVA_DIR
-
     # Put config files in ``/etc/nova`` for everyone to find
     if [[ ! -d $NOVA_CONF_DIR ]]; then
         sudo mkdir -p $NOVA_CONF_DIR
@@ -597,6 +590,7 @@
 # install_novaclient() - Collect source and prepare
 function install_novaclient() {
     git_clone $NOVACLIENT_REPO $NOVACLIENT_DIR $NOVACLIENT_BRANCH
+    setup_develop $NOVACLIENT_DIR
 }
 
 # install_nova() - Collect source and prepare
@@ -627,6 +621,7 @@
     fi
 
     git_clone $NOVA_REPO $NOVA_DIR $NOVA_BRANCH
+    setup_develop $NOVA_DIR
 }
 
 # start_nova_api() - Start the API process ahead of other things
@@ -663,6 +658,11 @@
     screen_it n-xvnc "cd $NOVA_DIR && $NOVA_BIN_DIR/nova-xvpvncproxy --config-file $NOVA_CONF"
     screen_it n-spice "cd $NOVA_DIR && $NOVA_BIN_DIR/nova-spicehtml5proxy --config-file $NOVA_CONF --web $SPICE_DIR"
     screen_it n-cauth "cd $NOVA_DIR && $NOVA_BIN_DIR/nova-consoleauth"
+
+    # Starting the nova-objectstore only if swift3 service is not enabled.
+    # Swift will act as s3 objectstore.
+    is_service_enabled swift3 || \
+        screen_it n-obj "cd $NOVA_DIR && $NOVA_BIN_DIR/nova-objectstore"
 }
 
 # stop_nova() - Stop running processes (non-screen)
@@ -675,3 +675,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/quantum b/lib/quantum
index efdd43d..61b89f7 100644
--- a/lib/quantum
+++ b/lib/quantum
@@ -761,3 +761,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/rpc_backend b/lib/rpc_backend
index bbd51f0..d08cb01 100644
--- a/lib/rpc_backend
+++ b/lib/rpc_backend
@@ -159,3 +159,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/swift b/lib/swift
index d50b554..eb57477 100644
--- a/lib/swift
+++ b/lib/swift
@@ -79,9 +79,9 @@
 # Port bases used in port number calclution for the service "nodes"
 # The specified port number will be used, the additinal ports calculated by
 # base_port + node_num * 10
-OBJECT_PORT_BASE=6013
-CONTAINER_PORT_BASE=6011
-ACCOUNT_PORT_BASE=6012
+OBJECT_PORT_BASE=${OBJECT_PORT_BASE:-6013}
+CONTAINER_PORT_BASE=${CONTAINER_PORT_BASE:-6011}
+ACCOUNT_PORT_BASE=${ACCOUNT_PORT_BASE:-6012}
 
 
 # Entry Points
@@ -106,59 +106,11 @@
     local swift_node_config
     local swift_log_dir
 
-    setup_develop $SWIFT_DIR
-
     # Make sure to kill all swift processes first
     swift-init --run-dir=${SWIFT_DATA_DIR}/run all stop || true
 
-    # First do a bit of setup by creating the directories and
-    # changing the permissions so we can run it as our user.
-
-    USER_GROUP=$(id -g)
-    sudo mkdir -p ${SWIFT_DATA_DIR}/{drives,cache,run,logs}
-    sudo chown -R $USER:${USER_GROUP} ${SWIFT_DATA_DIR}
-
-    # Create a loopback disk and format it to XFS.
-    if [[ -e ${SWIFT_DATA_DIR}/drives/images/swift.img ]]; then
-        if egrep -q ${SWIFT_DATA_DIR}/drives/sdb1 /proc/mounts; then
-            sudo umount ${SWIFT_DATA_DIR}/drives/sdb1
-            sudo rm -f ${SWIFT_DATA_DIR}/drives/images/swift.img
-        fi
-    fi
-
-    mkdir -p  ${SWIFT_DATA_DIR}/drives/images
-    sudo touch  ${SWIFT_DATA_DIR}/drives/images/swift.img
-    sudo chown $USER: ${SWIFT_DATA_DIR}/drives/images/swift.img
-
-    dd if=/dev/zero of=${SWIFT_DATA_DIR}/drives/images/swift.img \
-        bs=1024 count=0 seek=${SWIFT_LOOPBACK_DISK_SIZE}
-
-    # Make a fresh XFS filesystem
-    mkfs.xfs -f -i size=1024  ${SWIFT_DATA_DIR}/drives/images/swift.img
-
-    # Mount the disk with mount options to make it as efficient as possible
-    mkdir -p ${SWIFT_DATA_DIR}/drives/sdb1
-    if ! egrep -q ${SWIFT_DATA_DIR}/drives/sdb1 /proc/mounts; then
-        sudo mount -t xfs -o loop,noatime,nodiratime,nobarrier,logbufs=8  \
-            ${SWIFT_DATA_DIR}/drives/images/swift.img ${SWIFT_DATA_DIR}/drives/sdb1
-    fi
-
-    # Create a link to the above mount and
-    # create all of the directories needed to emulate a few different servers
-    for node_number in ${SWIFT_REPLICAS_SEQ}; do
-        sudo ln -sf ${SWIFT_DATA_DIR}/drives/sdb1/$node_number ${SWIFT_DATA_DIR}/$node_number;
-        drive=${SWIFT_DATA_DIR}/drives/sdb1/${node_number}
-        node=${SWIFT_DATA_DIR}/${node_number}/node
-        node_device=${node}/sdb1
-        [[ -d $node ]] && continue
-        [[ -d $drive ]] && continue
-        sudo install -o ${USER} -g $USER_GROUP -d $drive
-        sudo install -o ${USER} -g $USER_GROUP -d $node_device
-        sudo chown -R $USER: ${node}
-    done
-
-   sudo mkdir -p ${SWIFT_CONF_DIR}/{object,container,account}-server
-   sudo chown -R $USER: ${SWIFT_CONF_DIR}
+    sudo mkdir -p ${SWIFT_CONF_DIR}/{object,container,account}-server
+    sudo chown -R $USER: ${SWIFT_CONF_DIR}
 
     if [[ "$SWIFT_CONF_DIR" != "/etc/swift" ]]; then
         # Some swift tools are hard-coded to use ``/etc/swift`` and are apparently not going to be fixed.
@@ -327,9 +279,55 @@
         tee /etc/rsyslog.d/10-swift.conf
 }
 
-# configure_swiftclient() - Set config files, create data dirs, etc
-function configure_swiftclient() {
-    setup_develop $SWIFTCLIENT_DIR
+# create_swift_disk - Create Swift backing disk
+function create_swift_disk() {
+    local node_number
+
+    # First do a bit of setup by creating the directories and
+    # changing the permissions so we can run it as our user.
+
+    USER_GROUP=$(id -g)
+    sudo mkdir -p ${SWIFT_DATA_DIR}/{drives,cache,run,logs}
+    sudo chown -R $USER:${USER_GROUP} ${SWIFT_DATA_DIR}
+
+    # Create a loopback disk and format it to XFS.
+    if [[ -e ${SWIFT_DATA_DIR}/drives/images/swift.img ]]; then
+        if egrep -q ${SWIFT_DATA_DIR}/drives/sdb1 /proc/mounts; then
+            sudo umount ${SWIFT_DATA_DIR}/drives/sdb1
+            sudo rm -f ${SWIFT_DATA_DIR}/drives/images/swift.img
+        fi
+    fi
+
+    mkdir -p ${SWIFT_DATA_DIR}/drives/images
+    sudo touch ${SWIFT_DATA_DIR}/drives/images/swift.img
+    sudo chown $USER: ${SWIFT_DATA_DIR}/drives/images/swift.img
+
+    dd if=/dev/zero of=${SWIFT_DATA_DIR}/drives/images/swift.img \
+        bs=1024 count=0 seek=${SWIFT_LOOPBACK_DISK_SIZE}
+
+    # Make a fresh XFS filesystem
+    mkfs.xfs -f -i size=1024  ${SWIFT_DATA_DIR}/drives/images/swift.img
+
+    # Mount the disk with mount options to make it as efficient as possible
+    mkdir -p ${SWIFT_DATA_DIR}/drives/sdb1
+    if ! egrep -q ${SWIFT_DATA_DIR}/drives/sdb1 /proc/mounts; then
+        sudo mount -t xfs -o loop,noatime,nodiratime,nobarrier,logbufs=8  \
+            ${SWIFT_DATA_DIR}/drives/images/swift.img ${SWIFT_DATA_DIR}/drives/sdb1
+    fi
+
+    # Create a link to the above mount and
+    # create all of the directories needed to emulate a few different servers
+    for node_number in ${SWIFT_REPLICAS_SEQ}; do
+        sudo ln -sf ${SWIFT_DATA_DIR}/drives/sdb1/$node_number ${SWIFT_DATA_DIR}/$node_number;
+        drive=${SWIFT_DATA_DIR}/drives/sdb1/${node_number}
+        node=${SWIFT_DATA_DIR}/${node_number}/node
+        node_device=${node}/sdb1
+        [[ -d $node ]] && continue
+        [[ -d $drive ]] && continue
+        sudo install -o ${USER} -g $USER_GROUP -d $drive
+        sudo install -o ${USER} -g $USER_GROUP -d $node_device
+        sudo chown -R $USER: ${node}
+    done
 }
 
 # init_swift() - Initialize rings
@@ -338,6 +336,9 @@
     # Make sure to kill all swift processes first
     swift-init --run-dir=${SWIFT_DATA_DIR}/run all stop || true
 
+    # Forcibly re-create the backing filesystem
+    create_swift_disk
+
     # This is where we create three different rings for swift with
     # different object servers binding on different ports.
     pushd ${SWIFT_CONF_DIR} >/dev/null && {
@@ -366,13 +367,14 @@
 
 function install_swift() {
     git_clone $SWIFT_REPO $SWIFT_DIR $SWIFT_BRANCH
+    setup_develop $SWIFT_DIR
 }
 
 function install_swiftclient() {
     git_clone $SWIFTCLIENT_REPO $SWIFTCLIENT_DIR $SWIFTCLIENT_BRANCH
+    setup_develop $SWIFTCLIENT_DIR
 }
 
-
 # start_swift() - Start running processes, including screen
 function start_swift() {
     # (re)start rsyslog
@@ -421,3 +423,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/tempest b/lib/tempest
index 85e643e..c1dc3a3 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -294,3 +294,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/template b/lib/template
index 02de5ce..72904fe 100644
--- a/lib/template
+++ b/lib/template
@@ -78,3 +78,7 @@
 
 # Restore xtrace
 $XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/tls b/lib/tls
index 202edef..fb8f4b9 100644
--- a/lib/tls
+++ b/lib/tls
@@ -316,3 +316,7 @@
 
     stud $STUD_PROTO -f $f_host,$f_port -b $b_host,$b_port $DEVSTACK_CERT 2>/dev/null
 }
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/stack.sh b/stack.sh
index 0407c30..1010b4e 100755
--- a/stack.sh
+++ b/stack.sh
@@ -564,9 +564,11 @@
 # Grab clients first
 install_keystoneclient
 install_glanceclient
+install_cinderclient
 install_novaclient
 # Check out the client libs that are used most
 git_clone $OPENSTACKCLIENT_REPO $OPENSTACKCLIENT_DIR $OPENSTACKCLIENT_BRANCH
+setup_develop $OPENSTACKCLIENT_DIR
 
 # glance, swift middleware and nova api needs keystone middleware
 if is_service_enabled key g-api n-api s-proxy; then
@@ -627,9 +629,6 @@
 echo_summary "Configuring OpenStack projects"
 
 # Set up our checkouts so they are installed in the python path
-configure_keystoneclient
-configure_novaclient
-setup_develop $OPENSTACKCLIENT_DIR
 
 if is_service_enabled key g-api n-api s-proxy; then
     configure_keystone
@@ -637,7 +636,6 @@
 
 if is_service_enabled s-proxy; then
     configure_swift
-    configure_swiftclient
     if is_service_enabled swift3; then
         setup_develop $SWIFT3_DIR
     fi
@@ -647,10 +645,6 @@
     configure_glance
 fi
 
-# Do this _after_ glance is installed to override the old binary
-# TODO(dtroyer): figure out when this is no longer necessary
-configure_glanceclient
-
 if is_service_enabled nova; then
     # First clean up old instances
     cleanup_nova
@@ -826,17 +820,7 @@
 
 if is_service_enabled g-reg; then
     echo_summary "Configuring Glance"
-
     init_glance
-
-    # Store the images in swift if enabled.
-    if is_service_enabled s-proxy; then
-        iniset $GLANCE_API_CONF DEFAULT default_store swift
-        iniset $GLANCE_API_CONF DEFAULT swift_store_auth_address $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/
-        iniset $GLANCE_API_CONF DEFAULT swift_store_user $SERVICE_TENANT_NAME:glance
-        iniset $GLANCE_API_CONF DEFAULT swift_store_key $SERVICE_PASSWORD
-        iniset $GLANCE_API_CONF DEFAULT swift_store_create_container_on_put True
-    fi
 fi
 
 
@@ -1065,12 +1049,6 @@
     start_ceilometer
 fi
 
-# Starting the nova-objectstore only if swift3 service is not enabled.
-# Swift will act as s3 objectstore.
-is_service_enabled swift3 || \
-    screen_it n-obj "cd $NOVA_DIR && $NOVA_BIN_DIR/nova-objectstore"
-
-
 # Configure and launch heat engine, api and metadata
 if is_service_enabled heat; then
     # Initialize heat, including replacing nova flavors
diff --git a/stackrc b/stackrc
index f35cdc0..5a4c580 100644
--- a/stackrc
+++ b/stackrc
@@ -221,3 +221,7 @@
 
 # Compatibility until it's eradicated from CI
 USE_SCREEN=${SCREEN_DEV:-$USE_SCREEN}
+
+# Local variables:
+# mode: shell-script
+# End: