Merge "Remove error from httpd/apache on unstack.sh"
diff --git a/exercises/euca.sh b/exercises/euca.sh
index 76df254..46e4025 100755
--- a/exercises/euca.sh
+++ b/exercises/euca.sh
@@ -169,7 +169,7 @@
 # case changed with bug/836978. Requesting the status of an invalid instance
 # will now return an error message including the instance id, so we need to
 # filter that out.
-if ! timeout $TERMINATE_TIMEOUT sh -c "while euca-describe-instances $INSTANCE |grep -v \"InstanceNotFound\" | grep -q $INSTANCE; do sleep 1; done"; then
+if ! timeout $TERMINATE_TIMEOUT sh -c "while euca-describe-instances $INSTANCE | grep -ve \"\\\(InstanceNotFound\\\|InvalidInstanceId\[.\]NotFound\\\)\" | grep -q $INSTANCE; do sleep 1; done"; then
     echo "server didn't terminate within $TERMINATE_TIMEOUT seconds"
     exit 1
 fi
diff --git a/functions b/functions
index 55a81c5..7948378 100644
--- a/functions
+++ b/functions
@@ -1133,18 +1133,6 @@
     fi
 }
 
-# Check if qpid can be used on the current distro.
-# qpid_is_supported
-function qpid_is_supported() {
-    if [[ -z "$DISTRO" ]]; then
-        GetDistro
-    fi
-
-    # Qpid was introduced to Ubuntu in precise, disallow it on oneiric; it is
-    # not in openSUSE either right now.
-    ( ! ([[ "$DISTRO" = "oneiric" ]] || is_suse) )
-}
-
 # Restore xtrace
 $XTRACE
 
diff --git a/lib/cinder b/lib/cinder
index d9f8d63..8b1ccd7 100644
--- a/lib/cinder
+++ b/lib/cinder
@@ -184,14 +184,7 @@
         iniset $CINDER_CONF DEFAULT use_syslog True
     fi
 
-    if is_service_enabled qpid ; then
-        iniset $CINDER_CONF DEFAULT rpc_backend cinder.openstack.common.rpc.impl_qpid
-    elif is_service_enabled zeromq; then
-        iniset $CINDER_CONF DEFAULT rpc_backend nova.openstack.common.rpc.impl_zmq
-    elif [ -n "$RABBIT_HOST" ] &&  [ -n "$RABBIT_PASSWORD" ]; then
-        iniset $CINDER_CONF DEFAULT rabbit_host $RABBIT_HOST
-        iniset $CINDER_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
-    fi
+    iniset_rpc_backend cinder $CINDER_CONF DEFAULT
 
     if [[ "$CINDER_SECURE_DELETE" == "False" ]]; then
         iniset $CINDER_CONF DEFAULT secure_delete False
diff --git a/lib/databases/mysql b/lib/databases/mysql
index 1c0f5eb..965df6e 100644
--- a/lib/databases/mysql
+++ b/lib/databases/mysql
@@ -63,6 +63,21 @@
 default-storage-engine = InnoDB" $MY_CONF
     fi
 
+    # Turn on slow query log
+    sudo sed -i '/log.slow.queries/d' $MY_CONF
+    sudo sed -i -e "/^\[mysqld\]/ a \
+log-slow-queries = /var/log/mysql/mysql-slow.log" $MY_CONF
+
+    # Log any query taking longer than a second
+    sudo sed -i '/long.query.time/d' $MY_CONF
+    sudo sed -i -e "/^\[mysqld\]/ a \
+long-query-time = 1" $MY_CONF
+
+    # Log all non-indexed queries
+    sudo sed -i '/log.queries.not.using.indexes/d' $MY_CONF
+    sudo sed -i -e "/^\[mysqld\]/ a \
+log-queries-not-using-indexes" $MY_CONF
+
     restart_service $MYSQL
 }
 
diff --git a/lib/heat b/lib/heat
index 89bd44f..5b8b360 100644
--- a/lib/heat
+++ b/lib/heat
@@ -69,13 +69,7 @@
     iniset $HEAT_API_CFN_CONF DEFAULT bind_host $HEAT_API_CFN_HOST
     iniset $HEAT_API_CFN_CONF DEFAULT bind_port $HEAT_API_CFN_PORT
 
-    if is_service_enabled rabbit; then
-        iniset $HEAT_API_CFN_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_kombu
-        iniset $HEAT_API_CFN_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
-        iniset $HEAT_API_CFN_CONF DEFAULT rabbit_host $RABBIT_HOST
-    elif is_service_enabled qpid; then
-        iniset $HEAT_API_CFN_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_qpid
-    fi
+    iniset_rpc_backend heat $HEAT_API_CFN_CONF DEFAULT
 
     HEAT_API_CFN_PASTE_INI=$HEAT_CONF_DIR/heat-api-cfn-paste.ini
     cp $HEAT_DIR/etc/heat/heat-api-cfn-paste.ini $HEAT_API_CFN_PASTE_INI
@@ -98,13 +92,7 @@
     iniset $HEAT_API_CONF DEFAULT bind_host $HEAT_API_HOST
     iniset $HEAT_API_CONF DEFAULT bind_port $HEAT_API_PORT
 
-    if is_service_enabled rabbit; then
-        iniset $HEAT_API_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_kombu
-        iniset $HEAT_API_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
-        iniset $HEAT_API_CONF DEFAULT rabbit_host $RABBIT_HOST
-    elif is_service_enabled qpid; then
-        iniset $HEAT_API_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_qpid
-    fi
+    iniset_rpc_backend heat $HEAT_API_CONF DEFAULT
 
     HEAT_API_PASTE_INI=$HEAT_CONF_DIR/heat-api-paste.ini
     cp $HEAT_DIR/etc/heat/heat-api-paste.ini $HEAT_API_PASTE_INI
@@ -134,13 +122,7 @@
     iniset $HEAT_ENGINE_CONF DEFAULT sql_connection $dburl
     iniset $HEAT_ENGINE_CONF DEFAULT auth_encryption_key `hexdump -n 16 -v -e '/1 "%02x"' /dev/random`
 
-    if is_service_enabled rabbit; then
-        iniset $HEAT_ENGINE_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_kombu
-        iniset $HEAT_ENGINE_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
-        iniset $HEAT_ENGINE_CONF DEFAULT rabbit_host $RABBIT_HOST
-    elif is_service_enabled qpid; then
-        iniset $HEAT_ENGINE_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_qpid
-    fi
+    iniset_rpc_backend heat $HEAT_ENGINE_CONF DEFAULT
 
     # Cloudwatch API
     HEAT_API_CW_CONF=$HEAT_CONF_DIR/heat-api-cloudwatch.conf
@@ -151,13 +133,7 @@
     iniset $HEAT_API_CW_CONF DEFAULT bind_host $HEAT_API_CW_HOST
     iniset $HEAT_API_CW_CONF DEFAULT bind_port $HEAT_API_CW_PORT
 
-    if is_service_enabled rabbit; then
-        iniset $HEAT_API_CW_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_kombu
-        iniset $HEAT_API_CW_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
-        iniset $HEAT_API_CW_CONF DEFAULT rabbit_host $RABBIT_HOST
-    elif is_service_enabled qpid; then
-        iniset $HEAT_API_CW_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_qpid
-    fi
+    iniset_rpc_backend heat $HEAT_API_CW_CONF DEFAULT
 
     HEAT_API_CW_PASTE_INI=$HEAT_CONF_DIR/heat-api-cloudwatch-paste.ini
     cp $HEAT_DIR/etc/heat/heat-api-cloudwatch-paste.ini $HEAT_API_CW_PASTE_INI
diff --git a/lib/quantum b/lib/quantum
index 343e5a9..7c2df91 100644
--- a/lib/quantum
+++ b/lib/quantum
@@ -92,6 +92,8 @@
 Q_ALLOW_OVERLAPPING_IP=${Q_ALLOW_OVERLAPPING_IP:-False}
 # Use quantum-debug command
 Q_USE_DEBUG_COMMAND=${Q_USE_DEBUG_COMMAND:-False}
+# The name of the default q-l3 router
+Q_ROUTER_NAME=${Q_ROUTER_NAME:-router1}
 
 if is_service_enabled quantum; then
     Q_RR_CONF_FILE=$QUANTUM_CONF_DIR/rootwrap.conf
@@ -176,7 +178,7 @@
 # Set common config for all quantum server and agents.
 function configure_quantum() {
     _configure_quantum_common
-    _configure_quantum_rpc
+    iniset_rpc_backend quantum $QUANTUM_CONF DEFAULT
 
     if is_service_enabled q-svc; then
         _configure_quantum_service
@@ -277,7 +279,14 @@
 
     if is_service_enabled q-l3; then
         # Create a router, and add the private subnet as one of its interfaces
-        ROUTER_ID=$(quantum router-create --tenant_id $TENANT_ID router1 | grep ' id ' | get_field 2)
+        if [[ "$Q_USE_NAMESPACE" == "True" ]]; then
+            # If namespaces are enabled, create a tenant-owned router.
+            ROUTER_ID=$(quantum router-create --tenant_id $TENANT_ID $Q_ROUTER_NAME | grep ' id ' | get_field 2)
+        else
+            # If namespaces are disabled, the L3 agent can only target
+            # a single router, which should not be tenant-owned.
+            ROUTER_ID=$(quantum router-create $Q_ROUTER_NAME | grep ' id ' | get_field 2)
+        fi
         quantum router-interface-add $ROUTER_ID $SUBNET_ID
         # Create an external network, and a subnet. Configure the external network as router gw
         EXT_NET_ID=$(quantum net-create "$PUBLIC_NETWORK_NAME" -- --router:external=True | grep ' id ' | get_field 2)
@@ -596,19 +605,6 @@
     AGENT_BINARY="$QUANTUM_DIR/quantum/plugins/ryu/agent/ryu_quantum_agent.py"
 }
 
-# Quantum RPC support - must be updated prior to starting any of the services
-function _configure_quantum_rpc() {
-    iniset $QUANTUM_CONF DEFAULT control_exchange quantum
-    if is_service_enabled qpid ; then
-        iniset $QUANTUM_CONF DEFAULT rpc_backend quantum.openstack.common.rpc.impl_qpid
-    elif is_service_enabled zeromq; then
-        iniset $QUANTUM_CONF DEFAULT rpc_backend quantum.openstack.common.rpc.impl_zmq
-    elif [ -n "$RABBIT_HOST" ] &&  [ -n "$RABBIT_PASSWORD" ]; then
-        iniset $QUANTUM_CONF DEFAULT rabbit_host $RABBIT_HOST
-        iniset $QUANTUM_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
-    fi
-}
-
 # _configure_quantum_service() - Set config files for quantum service
 # It is called when q-svc is enabled.
 function _configure_quantum_service() {
diff --git a/lib/rpc_backend b/lib/rpc_backend
new file mode 100644
index 0000000..4d7f8d2
--- /dev/null
+++ b/lib/rpc_backend
@@ -0,0 +1,123 @@
+# lib/rpc_backend
+# Interface for interactig with different rpc backend
+# rpc backend settings
+
+# Dependencies:
+# ``functions`` file
+# ``RABBIT_{HOST|PASSWORD}`` must be defined when RabbitMQ is used
+
+# ``stack.sh`` calls the entry points in this order:
+#
+# check_rpc_backend
+# install_rpc_backend
+# restart_rpc_backend
+# iniset_rpc_backend
+
+# Save trace setting
+XTRACE=$(set +o | grep xtrace)
+set +o xtrace
+
+# Entry Points
+# ------------
+
+# Make sure we only have one rpc backend enabled.
+# Also check the specified rpc backend is available on your platform.
+function check_rpc_backend() {
+    local rpc_backend_cnt=0
+    for svc in qpid zeromq rabbit; do
+        is_service_enabled $svc &&
+        ((rpc_backend_cnt++))
+    done
+    if [ "$rpc_backend_cnt" -gt 1 ]; then
+        echo "ERROR: only one rpc backend may be enabled,"
+        echo "       set only one of 'rabbit', 'qpid', 'zeromq'"
+        echo "       via ENABLED_SERVICES."
+    elif [ "$rpc_backend_cnt" == 0 ]; then
+        echo "ERROR: at least one rpc backend must be enabled,"
+        echo "       set one of 'rabbit', 'qpid', 'zeromq'"
+        echo "       via ENABLED_SERVICES."
+    fi
+
+    if is_service_enabled qpid && ! qpid_is_supported; then
+        echo "Qpid support is not available for this version of your distribution."
+        exit 1
+    fi
+}
+
+# install rpc backend
+function install_rpc_backend() {
+    if is_service_enabled rabbit; then
+        # Install rabbitmq-server
+        # the temp file is necessary due to LP: #878600
+        tfile=$(mktemp)
+        install_package rabbitmq-server > "$tfile" 2>&1
+        cat "$tfile"
+        rm -f "$tfile"
+    elif is_service_enabled qpid; then
+        if is_fedora; then
+            install_package qpid-cpp-server-daemon
+        elif is_ubuntu; then
+            install_package qpidd
+        else
+            exit_distro_not_supported "qpid installation"
+        fi
+    elif is_service_enabled zeromq; then
+        if is_fedora; then
+            install_package zeromq python-zmq
+        elif is_ubuntu; then
+            install_package libzmq1 python-zmq
+        elif is_suse; then
+            install_package libzmq1 python-pyzmq
+        else
+            exit_distro_not_supported "zeromq installation"
+        fi
+    fi
+}
+
+# restart the rpc backend
+function restart_rpc_backend() {
+    if is_service_enabled rabbit; then
+        # Start rabbitmq-server
+        echo_summary "Starting RabbitMQ"
+        if is_fedora || is_suse; then
+            # service is not started by default
+            restart_service rabbitmq-server
+        fi
+        # change the rabbit password since the default is "guest"
+        sudo rabbitmqctl change_password guest $RABBIT_PASSWORD
+    elif is_service_enabled qpid; then
+        echo_summary "Starting qpid"
+        restart_service qpidd
+    fi
+}
+
+# iniset cofiguration
+function iniset_rpc_backend() {
+    local package=$1
+    local file=$2
+    local section=$3
+    if is_service_enabled zeromq; then
+        iniset $file $section rpc_backend ${package}.openstack.common.rpc.impl_zmq
+    elif is_service_enabled qpid; then
+        iniset $file $section rpc_backend ${package}.openstack.common.rpc.impl_qpid
+    elif is_service_enabled rabbit; then
+        iniset $file $section rpc_backend ${package}.openstack.common.rpc.impl_kombu
+        iniset $file $section rabbit_host $RABBIT_HOST
+        iniset $file $section rabbit_password $RABBIT_PASSWORD
+    fi
+}
+
+# Check if qpid can be used on the current distro.
+# qpid_is_supported
+function qpid_is_supported() {
+    if [[ -z "$DISTRO" ]]; then
+        GetDistro
+    fi
+
+    # Qpid was introduced to Ubuntu in precise, disallow it on oneiric; it is
+    # not in openSUSE either right now.
+    ( ! ([[ "$DISTRO" = "oneiric" ]] || is_suse) )
+}
+
+# Restore xtrace
+$XTRACE
diff --git a/lib/tempest b/lib/tempest
index 906ca6a..0835234 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -11,6 +11,9 @@
 # - ``S3_SERVICE_PORT``
 # - ``SERVICE_HOST``
 # - ``BASE_SQL_CONN`` ``lib/database`` declares
+# - ``PUBLIC_NETWORK_NAME``
+# - ``Q_USE_NAMESPACE``
+# - ``Q_ROUTER_NAME``
 # Optional Dependencies:
 # IDENTITY_USE_SSL, IDENTITY_HOST, IDENTITY_PORT, IDENTITY_PATH
 # ALT_* (similar vars exists in keystone_data.sh)
@@ -61,6 +64,7 @@
     local flavors_ref
     local flavor_lines
     local public_network_id
+    local public_router_id
     local tenant_networks_reachable
 
     # TODO(afazekas):
@@ -132,9 +136,9 @@
     # If the ``DEFAULT_INSTANCE_TYPE`` not declared, use the new behavior
     # Tempest creates instane types for himself
     if  [[ -z "$DEFAULT_INSTANCE_TYPE" ]]; then
-        nova flavor-create m1.pico 42 32 0 1
+        nova flavor-create m1.nano 42 64 0 1
         flavor_ref=42
-        nova flavor-create m1.nano 84 64 0 1
+        nova flavor-create m1.micro 84 128 0 1
         flavor_ref_alt=84
     else
         # Check Nova for existing flavors and, if set, look for the
@@ -175,6 +179,12 @@
     if is_service_enabled q-l3; then
         public_network_id=$(quantum net-list | grep $PUBLIC_NETWORK_NAME | \
             awk '{print $2}')
+        if [ "$Q_USE_NAMESPACE" == "False" ]; then
+            # If namespaces are disabled, devstack will create a single
+            # public router that tempest should be configured to use.
+            public_router_id=$(quantum router-list | awk "/ $Q_ROUTER_NAME / \
+               { print \$2 }")
+        fi
     fi
 
     # Timeouts
@@ -243,6 +253,7 @@
     iniset $TEMPEST_CONF network password "$password"
     iniset $TEMPEST_CONF network tenant_networks_reachable "$tenant_networks_reachable"
     iniset $TEMPEST_CONF network public_network_id "$public_network_id"
+    iniset $TEMPEST_CONF network public_router_id "$public_router_id"
 
     #boto
     iniset $TEMPEST_CONF boto ec2_url "http://$SERVICE_HOST:8773/services/Cloud"
diff --git a/stack.sh b/stack.sh
index 5c071fc..bf473ca 100755
--- a/stack.sh
+++ b/stack.sh
@@ -95,8 +95,9 @@
     rm $TOP_DIR/.stackenv
 fi
 
-# Import database configuration
+# Import common services (database, message queue) configuration
 source $TOP_DIR/lib/database
+source $TOP_DIR/lib/rpc_backend
 
 # Validate database selection
 # Since DATABASE_BACKENDS is now set, this also gets ENABLED_SERVICES
@@ -118,10 +119,9 @@
     fi
 fi
 
-if is_service_enabled qpid && ! qpid_is_supported; then
-    echo "Qpid support is not available for this version of your distribution."
-    exit 1
-fi
+# Make sure we only have one rpc backend enabled,
+# and the specified rpc backend is available on your platform.
+check_rpc_backend
 
 # ``stack.sh`` keeps function libraries here
 # Make sure ``$TOP_DIR/lib`` directory is present
@@ -147,23 +147,6 @@
     exit 1
 fi
 
-# Make sure we only have one rpc backend enabled.
-rpc_backend_cnt=0
-for svc in qpid zeromq rabbit; do
-    is_service_enabled $svc &&
-        ((rpc_backend_cnt++))
-done
-if [ "$rpc_backend_cnt" -gt 1 ]; then
-    echo "ERROR: only one rpc backend may be enabled,"
-    echo "       set only one of 'rabbit', 'qpid', 'zeromq'"
-    echo "       via ENABLED_SERVICES."
-elif [ "$rpc_backend_cnt" == 0 ]; then
-    echo "ERROR: at least one rpc backend must be enabled,"
-    echo "       set one of 'rabbit', 'qpid', 'zeromq'"
-    echo "       via ENABLED_SERVICES."
-fi
-unset rpc_backend_cnt
-
 # Set up logging level
 VERBOSE=$(trueorfalse True $VERBOSE)
 
@@ -670,32 +653,7 @@
     fi
 fi
 
-if is_service_enabled rabbit; then
-    # Install rabbitmq-server
-    # the temp file is necessary due to LP: #878600
-    tfile=$(mktemp)
-    install_package rabbitmq-server > "$tfile" 2>&1
-    cat "$tfile"
-    rm -f "$tfile"
-elif is_service_enabled qpid; then
-    if is_fedora; then
-        install_package qpid-cpp-server-daemon
-    elif is_ubuntu; then
-        install_package qpidd
-    else
-        exit_distro_not_supported "qpid installation"
-    fi
-elif is_service_enabled zeromq; then
-    if is_fedora; then
-        install_package zeromq python-zmq
-    elif is_ubuntu; then
-        install_package libzmq1 python-zmq
-    elif is_suse; then
-        install_package libzmq1 python-pyzmq
-    else
-        exit_distro_not_supported "zeromq installation"
-    fi
-fi
+install_rpc_backend
 
 if is_service_enabled $DATABASE_BACKENDS; then
     install_database
@@ -868,20 +826,7 @@
 
 # Finalize queue installation
 # ----------------------------
-
-if is_service_enabled rabbit; then
-    # Start rabbitmq-server
-    echo_summary "Starting RabbitMQ"
-    if is_fedora || is_suse; then
-        # service is not started by default
-        restart_service rabbitmq-server
-    fi
-    # change the rabbit password since the default is "guest"
-    sudo rabbitmqctl change_password guest $RABBIT_PASSWORD
-elif is_service_enabled qpid; then
-    echo_summary "Starting qpid"
-    restart_service qpidd
-fi
+restart_rpc_backend
 
 
 # Configure database
@@ -1075,14 +1020,7 @@
     iniset $NOVA_CONF DEFAULT vncserver_listen "$VNCSERVER_LISTEN"
     iniset $NOVA_CONF DEFAULT vncserver_proxyclient_address "$VNCSERVER_PROXYCLIENT_ADDRESS"
     iniset $NOVA_CONF DEFAULT ec2_dmz_host "$EC2_DMZ_HOST"
-    if is_service_enabled zeromq; then
-        iniset $NOVA_CONF DEFAULT rpc_backend "nova.openstack.common.rpc.impl_zmq"
-    elif is_service_enabled qpid; then
-        iniset $NOVA_CONF DEFAULT rpc_backend "nova.rpc.impl_qpid"
-    elif [ -n "$RABBIT_HOST" ] &&  [ -n "$RABBIT_PASSWORD" ]; then
-        iniset $NOVA_CONF DEFAULT rabbit_host "$RABBIT_HOST"
-        iniset $NOVA_CONF DEFAULT rabbit_password "$RABBIT_PASSWORD"
-    fi
+    iniset_rpc_backend nova $NOVA_CONF DEFAULT
     iniset $NOVA_CONF DEFAULT glance_api_servers "$GLANCE_HOSTPORT"