Merge "A service to install diskimage-builder"
diff --git a/files/apache-horizon.template b/files/apache-horizon.template
index af880c4..c1dd693 100644
--- a/files/apache-horizon.template
+++ b/files/apache-horizon.template
@@ -1,6 +1,6 @@
 <VirtualHost *:80>
     WSGIScriptAlias / %HORIZON_DIR%/openstack_dashboard/wsgi/django.wsgi
-    WSGIDaemonProcess horizon user=%USER% group=%GROUP% processes=3 threads=10 home=%HORIZON_DIR%
+    WSGIDaemonProcess horizon user=%USER% group=%GROUP% processes=3 threads=10 home=%HORIZON_DIR% display-name=%{GROUP}
     WSGIApplicationGroup %{GLOBAL}
 
     SetEnv APACHE_RUN_USER %USER%
diff --git a/files/apache-keystone.template b/files/apache-keystone.template
index 805e7b8..fc8731c 100644
--- a/files/apache-keystone.template
+++ b/files/apache-keystone.template
@@ -2,7 +2,7 @@
 Listen %ADMINPORT%
 
 <VirtualHost *:%PUBLICPORT%>
-    WSGIDaemonProcess keystone-public processes=5 threads=1 user=%USER%
+    WSGIDaemonProcess keystone-public processes=5 threads=1 user=%USER% display-name=%{GROUP}
     WSGIProcessGroup keystone-public
     WSGIScriptAlias / %PUBLICWSGI%
     WSGIApplicationGroup %{GLOBAL}
@@ -12,7 +12,7 @@
 </VirtualHost>
 
 <VirtualHost *:%ADMINPORT%>
-    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=%USER%
+    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=%USER% display-name=%{GROUP}
     WSGIProcessGroup keystone-admin
     WSGIScriptAlias / %ADMINWSGI%
     WSGIApplicationGroup %{GLOBAL}
diff --git a/files/apts/keystone b/files/apts/keystone
index b7218b7..d316a42 100644
--- a/files/apts/keystone
+++ b/files/apts/keystone
@@ -6,6 +6,7 @@
 python-pysqlite2
 python-sqlalchemy
 python-mysqldb
+python-mysql.connector
 python-webob
 python-greenlet
 python-routes
diff --git a/files/apts/neutron b/files/apts/neutron
index 92e0a06..d3a08c7 100644
--- a/files/apts/neutron
+++ b/files/apts/neutron
@@ -15,6 +15,7 @@
 python-eventlet
 python-sqlalchemy
 python-mysqldb
+python-mysql.connector
 python-pyudev
 python-qpid # dist:precise
 dnsmasq-base
diff --git a/files/apts/nova b/files/apts/nova
index e779849..090ca4d 100644
--- a/files/apts/nova
+++ b/files/apts/nova
@@ -6,6 +6,7 @@
 iputils-arping
 mysql-server # NOPRIME
 python-mysqldb
+python-mysql.connector
 python-xattr # needed for glance which is needed for nova --- this shouldn't be here
 python-lxml # needed for glance which is needed for nova --- this shouldn't be here
 gawk
diff --git a/files/rpms-suse/keystone b/files/rpms-suse/keystone
index 403d82f..a734cb9 100644
--- a/files/rpms-suse/keystone
+++ b/files/rpms-suse/keystone
@@ -10,5 +10,6 @@
 python-greenlet
 python-lxml
 python-mysql
+python-mysql.connector
 python-pysqlite
 sqlite3
diff --git a/files/rpms-suse/neutron b/files/rpms-suse/neutron
index f3bafc7..79f5bff 100644
--- a/files/rpms-suse/neutron
+++ b/files/rpms-suse/neutron
@@ -10,6 +10,7 @@
 python-iso8601
 python-kombu
 python-mysql
+python-mysql.connector
 python-Paste
 python-PasteDeploy
 python-pyudev
diff --git a/files/rpms-suse/nova b/files/rpms-suse/nova
index 7a1160e..2a210e5 100644
--- a/files/rpms-suse/nova
+++ b/files/rpms-suse/nova
@@ -35,6 +35,7 @@
 python-lxml # needed for glance which is needed for nova --- this shouldn't be here
 python-mox
 python-mysql
+python-mysql.connector
 python-numpy # needed by websockify for spice console
 python-paramiko
 python-sqlalchemy-migrate
diff --git a/files/rpms/neutron b/files/rpms/neutron
index f02c02b..aaff48a 100644
--- a/files/rpms/neutron
+++ b/files/rpms/neutron
@@ -4,6 +4,7 @@
 ebtables
 iptables
 iputils
+mysql-connector-python
 mysql-server # NOPRIME
 openvswitch # NOPRIME
 python-boto
diff --git a/files/rpms/nova b/files/rpms/nova
index 6097991..ccee8a7 100644
--- a/files/rpms/nova
+++ b/files/rpms/nova
@@ -15,6 +15,7 @@
 libxml2-python
 numpy # needed by websockify for spice console
 m2crypto
+mysql-connector-python
 mysql-server # NOPRIME
 parted
 polkit
diff --git a/lib/ceilometer b/lib/ceilometer
index 7bd1421..4030aca 100644
--- a/lib/ceilometer
+++ b/lib/ceilometer
@@ -154,6 +154,7 @@
 
     if [ "$CEILOMETER_BACKEND" = 'mysql' ] || [ "$CEILOMETER_BACKEND" = 'postgresql' ] ; then
         iniset $CEILOMETER_CONF database connection `database_connection_url ceilometer`
+        iniset $CEILOMETER_CONF DEFAULT collector_workers $(( ($(nproc) + 1) / 2 ))
     else
         iniset $CEILOMETER_CONF database connection mongodb://localhost:27017/ceilometer
         configure_mongodb
diff --git a/lib/cinder b/lib/cinder
index 38ce4d6..c78715e 100644
--- a/lib/cinder
+++ b/lib/cinder
@@ -470,11 +470,9 @@
         for be in ${CINDER_ENABLED_BACKENDS//,/ }; do
             BE_TYPE=${be%%:*}
             BE_NAME=${be##*:}
-            if type configure_cinder_backend_${BE_TYPE} >/dev/null 2>&1; then
-                # openstack volume type create --property volume_backend_name="${BE_TYPE}" ${BE_NAME}
-                cinder type-create ${BE_NAME} && \
-                    cinder type-key ${BE_NAME} set volume_backend_name="${BE_NAME}"
-            fi
+            # openstack volume type create --property volume_backend_name="${BE_TYPE}" ${BE_NAME}
+            cinder type-create ${BE_NAME} && \
+                cinder type-key ${BE_NAME} set volume_backend_name="${BE_NAME}"
         done
     fi
 }
diff --git a/lib/database b/lib/database
index 0661049..e226515 100644
--- a/lib/database
+++ b/lib/database
@@ -89,7 +89,7 @@
     # a multi-node DevStack installation.
 
     # NOTE: Don't specify ``/db`` in this string so we can use it for multiple services
-    BASE_SQL_CONN=${BASE_SQL_CONN:-${DATABASE_TYPE}://$DATABASE_USER:$DATABASE_PASSWORD@$DATABASE_HOST}
+    BASE_SQL_CONN=${BASE_SQL_CONN:-$(get_database_type)://$DATABASE_USER:$DATABASE_PASSWORD@$DATABASE_HOST}
 
     return 0
 }
@@ -120,6 +120,14 @@
     database_connection_url_$DATABASE_TYPE $db
 }
 
+function get_database_type {
+    if [[ -n "${SQLALCHEMY_DATABASE_DRIVER}" ]]; then
+        echo "${DATABASE_TYPE}+${SQLALCHEMY_DATABASE_DRIVER}"
+    else
+        echo "${DATABASE_TYPE}"
+    fi
+}
+
 
 # Restore xtrace
 $XTRACE
diff --git a/lib/neutron_plugins/linuxbridge_agent b/lib/neutron_plugins/linuxbridge_agent
index 82b5fc9..2638dd3 100644
--- a/lib/neutron_plugins/linuxbridge_agent
+++ b/lib/neutron_plugins/linuxbridge_agent
@@ -47,6 +47,7 @@
         iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.firewall.NoopFirewallDriver
     fi
     AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-linuxbridge-agent"
+    iniset /$Q_PLUGIN_CONF_FILE agent tunnel_types $Q_TUNNEL_TYPES
     # Define extra "AGENT" configuration options when q-agt is configured by defining
     # the array ``Q_AGENT_EXTRA_AGENT_OPTS``.
     # For Example: ``Q_AGENT_EXTRA_AGENT_OPTS=(foo=true bar=2)``
diff --git a/lib/neutron_plugins/ml2 b/lib/neutron_plugins/ml2
index 42dd57f..44b947f 100644
--- a/lib/neutron_plugins/ml2
+++ b/lib/neutron_plugins/ml2
@@ -6,13 +6,13 @@
 set +o xtrace
 
 # Enable this to simply and quickly enable tunneling with ML2.
-# Select either 'gre', 'vxlan', or '(gre vxlan)'
+# Select either 'gre', 'vxlan', or 'gre,vxlan'
 Q_ML2_TENANT_NETWORK_TYPE=${Q_ML2_TENANT_NETWORK_TYPE:-"vxlan"}
 # This has to be set here since the agent will set this in the config file
 if [[ "$Q_ML2_TENANT_NETWORK_TYPE" == "gre" || "$Q_ML2_TENANT_NETWORK_TYPE" == "vxlan" ]]; then
-    Q_AGENT_EXTRA_AGENT_OPTS+=(tunnel_types=$Q_ML2_TENANT_NETWORK_TYPE)
+    Q_TUNNEL_TYPES=$Q_ML2_TENANT_NETWORK_TYPE
 elif [[ "$ENABLE_TENANT_TUNNELS" == "True" ]]; then
-    Q_AGENT_EXTRA_AGENT_OPTS+=(tunnel_types=gre)
+    Q_TUNNEL_TYPES=gre
 fi
 
 # Default openvswitch L2 agent
diff --git a/lib/neutron_plugins/ofagent_agent b/lib/neutron_plugins/ofagent_agent
index 66283ad..b4c2ada 100644
--- a/lib/neutron_plugins/ofagent_agent
+++ b/lib/neutron_plugins/ofagent_agent
@@ -71,6 +71,7 @@
     fi
     AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-ofagent-agent"
 
+    iniset /$Q_PLUGIN_CONF_FILE agent tunnel_types $Q_TUNNEL_TYPES
     # Define extra "AGENT" configuration options when q-agt is configured by defining
     # defining the array ``Q_AGENT_EXTRA_AGENT_OPTS``.
     # For Example: ``Q_AGENT_EXTRA_AGENT_OPTS=(foo=true bar=2)``
diff --git a/lib/neutron_plugins/openvswitch_agent b/lib/neutron_plugins/openvswitch_agent
index 5adb0c5..3fc37de 100644
--- a/lib/neutron_plugins/openvswitch_agent
+++ b/lib/neutron_plugins/openvswitch_agent
@@ -102,6 +102,7 @@
         # Set root wrap
         iniset "/$Q_PLUGIN_CONF_FILE.domU" agent root_helper "$Q_RR_COMMAND"
     fi
+    iniset /$Q_PLUGIN_CONF_FILE agent tunnel_types $Q_TUNNEL_TYPES
     # Define extra "AGENT" configuration options when q-agt is configured by defining
     # defining the array ``Q_AGENT_EXTRA_AGENT_OPTS``.
     # For Example: ``Q_AGENT_EXTRA_AGENT_OPTS=(foo=true bar=2)``
diff --git a/lib/stackforge b/lib/stackforge
index e6528af..b744318 100644
--- a/lib/stackforge
+++ b/lib/stackforge
@@ -35,10 +35,6 @@
 
 # install_stackforge() - Collect source and prepare
 function install_stackforge {
-    # TODO(sdague): remove this once we get to Icehouse, this just makes
-    # for a smoother transition of existing users.
-    cleanup_stackforge
-
     git_clone $WSME_REPO $WSME_DIR $WSME_BRANCH
     setup_package $WSME_DIR
 
@@ -46,20 +42,6 @@
     setup_package $PECAN_DIR
 }
 
-# cleanup_stackforge() - purge possibly old versions of stackforge libraries
-function cleanup_stackforge {
-    # this means we've got an old version installed, lets get rid of it
-    # otherwise python hates itself
-    for lib in wsme pecan; do
-        if ! python -c "import $lib" 2>/dev/null; then
-            echo "Found old $lib... removing to ensure consistency"
-            local PIP_CMD=$(get_pip_command)
-            pip_install $lib
-            sudo $PIP_CMD uninstall -y $lib
-        fi
-    done
-}
-
 # Restore xtrace
 $XTRACE
 
diff --git a/lib/tempest b/lib/tempest
index d6d6020..681da1e 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -419,7 +419,7 @@
 # install_tempest() - Collect source and prepare
 function install_tempest {
     git_clone $TEMPEST_REPO $TEMPEST_DIR $TEMPEST_BRANCH
-    pip_install "tox<1.7"
+    pip_install tox
 }
 
 # init_tempest() - Initialize ec2 images
diff --git a/stackrc b/stackrc
index 8299383..4f955bd 100644
--- a/stackrc
+++ b/stackrc
@@ -52,6 +52,18 @@
     ENABLED_SERVICES+=,rabbit,tempest,mysql
 fi
 
+# SQLAlchemy supports multiple database drivers for each database server
+# type. For example, deployer may use MySQLdb, MySQLConnector, or oursql
+# to access MySQL database.
+#
+# When defined, the variable controls which database driver is used to
+# connect to database server. Otherwise using default driver defined for
+# each database type.
+#
+# You can find the list of currently supported drivers for each database
+# type at: http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html
+# SQLALCHEMY_DATABASE_DRIVER="mysqldb"
+
 # Global toggle for enabling services under mod_wsgi. If this is set to
 # ``True`` all services that use HTTPD + mod_wsgi as the preferred method of
 # deployment, will be deployed under Apache. If this is set to ``False`` all