Merge "Set the Swift max_file_size to 1/2 the loopback"
diff --git a/doc/source/guides/neutron.rst b/doc/source/guides/neutron.rst
index c8b5c44..cac7bb0 100644
--- a/doc/source/guides/neutron.rst
+++ b/doc/source/guides/neutron.rst
@@ -546,6 +546,7 @@
 physical network to bridge name associations with the following syntax:
 
 ::
+
     OVS_BRIDGE_MAPPINGS=net1name:bridge1name,net2name:bridge2name,<...>
 
 Also, ``OVS_BRIDGE_MAPPINGS`` has precedence over ``PHYSICAL_NETWORK`` and
diff --git a/doc/source/plugin-registry.rst b/doc/source/plugin-registry.rst
index 29b743f..f31db51 100644
--- a/doc/source/plugin-registry.rst
+++ b/doc/source/plugin-registry.rst
@@ -192,31 +192,3 @@
 +----------------------------+-------------------------------------------------------------------------+
 |zaqar                       |git://git.openstack.org/openstack/zaqar                                  |
 +----------------------------+-------------------------------------------------------------------------+
-
-Drivers
-=======
-
-+--------------------+-------------------------------------------------+------------------+
-|Plugin Name         |URL                                              |Comments          |
-+--------------------+-------------------------------------------------+------------------+
-|dragonflow          |git://git.openstack.org/openstack/dragonflow     |[d1]_             |
-+--------------------+-------------------------------------------------+------------------+
-|odl                 |git://git.openstack.org/openstack/networking-odl |[d2]_             |
-+--------------------+-------------------------------------------------+------------------+
-
-.. [d1] demonstrates example of installing 3rd party SDN controller
-.. [d2] demonstrates a pretty advanced set of modes that that allow
-        one to run OpenDayLight either from a pre-existing install, or
-        also from source
-
-Alternate Configs
-=================
-
-+-------------+------------------------------------------------------------+------------+
-| Plugin Name | URL                                                        | Comments   |
-|             |                                                            |            |
-+-------------+------------------------------------------------------------+------------+
-|glusterfs    |git://git.openstack.org/openstack/devstack-plugin-glusterfs |            |
-+-------------+------------------------------------------------------------+------------+
-|             |                                                            |            |
-+-------------+------------------------------------------------------------+------------+
diff --git a/exercises/euca.sh b/exercises/euca.sh
index c2957e2..60e7d8c 100755
--- a/exercises/euca.sh
+++ b/exercises/euca.sh
@@ -17,7 +17,6 @@
 # an error.  It is also useful for following allowing as the install occurs.
 set -o xtrace
 
-
 # Settings
 # ========
 
@@ -89,7 +88,8 @@
     VOLUME_ZONE=`euca-describe-availability-zones | head -n1 | cut -f2`
     die_if_not_set $LINENO VOLUME_ZONE "Failure to find zone for volume"
 
-    VOLUME=`euca-create-volume -s 1 -z $VOLUME_ZONE | cut -f2`
+    VOLUME=`euca-create-volume -s 1 -z $VOLUME_ZONE` || die $LINENO "Failure to create volume"
+    VOLUME=`echo "$VOLUME" | cut -f2`
     die_if_not_set $LINENO VOLUME "Failure to create volume"
 
     # Test that volume has been created
diff --git a/functions-common b/functions-common
index 2c498a0..0b564cd 100644
--- a/functions-common
+++ b/functions-common
@@ -312,20 +312,20 @@
 # user if not available.  Note can't use generic install_package*
 # because they depend on this!
 function _ensure_lsb_release {
-    if [[ -x $(which lsb_release 2>/dev/null) ]]; then
+    if [[ -x $(command -v lsb_release 2>/dev/null) ]]; then
         return
     fi
 
-    if [[ -x $(which apt-get 2>/dev/null) ]]; then
+    if [[ -x $(command -v apt-get 2>/dev/null) ]]; then
         sudo apt-get install -y lsb-release
-    elif [[ -x $(which zypper 2>/dev/null) ]]; then
+    elif [[ -x $(command -v zypper 2>/dev/null) ]]; then
         # XXX: old code paths seem to have assumed SUSE platforms also
         # had "yum".  Keep this ordered above yum so we don't try to
         # install the rh package.  suse calls it just "lsb"
         sudo zypper -n install lsb
-    elif [[ -x $(which dnf 2>/dev/null) ]]; then
+    elif [[ -x $(command -v dnf 2>/dev/null) ]]; then
         sudo dnf install -y redhat-lsb-core
-    elif [[ -x $(which yum 2>/dev/null) ]]; then
+    elif [[ -x $(command -v yum 2>/dev/null) ]]; then
         # all rh patforms (fedora, centos, rhel) have this pkg
         sudo yum install -y redhat-lsb-core
     else
@@ -380,7 +380,8 @@
         DISTRO="sle${os_RELEASE%.*}"
     elif [[ "$os_VENDOR" =~ (Red.*Hat) || \
         "$os_VENDOR" =~ (CentOS) || \
-        "$os_VENDOR" =~ (OracleLinux) ]]; then
+        "$os_VENDOR" =~ (OracleLinux) || \
+        "$os_VENDOR" =~ (Virtuozzo) ]]; then
         # Drop the . release as we assume it's compatible
         # XXX re-evaluate when we get RHEL10
         DISTRO="rhel${os_RELEASE::1}"
@@ -389,7 +390,26 @@
     elif [[ "$os_VENDOR" =~ (kvmibm) ]]; then
         DISTRO="${os_VENDOR}${os_RELEASE::1}"
     else
-        die $LINENO "Unable to determine DISTRO"
+        # We can't make a good choice here.  Setting a sensible DISTRO
+        # is part of the problem, but not the major issue -- we really
+        # only use DISTRO in the code as a fine-filter.
+        #
+        # The bigger problem is categorising the system into one of
+        # our two big categories as Ubuntu/Debian-ish or
+        # Fedora/CentOS-ish.
+        #
+        # The setting of os_PACKAGE above is only set to "deb" based
+        # on a hard-coded list of vendor names ... thus we will
+        # default to thinking unknown distros are RPM based
+        # (ie. is_ubuntu does not match).  But the platform will then
+        # also not match in is_fedora, because that also has a list of
+        # names.
+        #
+        # So, if you are reading this, getting your distro supported
+        # is really about making sure it matches correctly in these
+        # functions.  Then you can choose a sensible way to construct
+        # DISTRO based on your distros release approach.
+        die $LINENO "Unable to determine DISTRO, can not continue."
     fi
     typeset -xr DISTRO
 }
@@ -421,7 +441,7 @@
 
     [ "$os_VENDOR" = "Fedora" ] || [ "$os_VENDOR" = "Red Hat" ] || \
         [ "$os_VENDOR" = "CentOS" ] || [ "$os_VENDOR" = "OracleLinux" ] || \
-        [ "$os_VENDOR" = "CloudLinux" ] || [ "$os_VENDOR" = "kvmibm" ]
+        [ "$os_VENDOR" = "Virtuozzo" ] || [ "$os_VENDOR" = "kvmibm" ]
 }
 
 
@@ -1286,7 +1306,7 @@
     elif is_fedora; then
         sudo ${YUM:-yum} remove -y "$@" ||:
     elif is_suse; then
-        sudo zypper rm "$@"
+        sudo zypper rm "$@" ||:
     else
         exit_distro_not_supported "uninstalling packages"
     fi
@@ -1304,15 +1324,16 @@
 
     # Warning: this would not work if yum output message
     # have been translated to another language
-    parse_yum_result='\
-        BEGIN { result=0 }\
-        /^YUM_FAILED/ { exit $2 }\
-        /^No package/ { result=1 }\
-        //{ print }\
+    parse_yum_result='             \
+        BEGIN { result=0 }         \
+        /^YUM_FAILED/ { exit $2 }  \
+        /^No package/ { result=1 } \
+        /^Failed:/    { result=1 } \
+        //{ print }                \
         END { exit result }'
 
     # The manual check for missing packages is because yum -y assumes
-    # missing packages are OK.
+    # missing or failed packages are OK.
     # See https://bugzilla.redhat.com/show_bug.cgi?id=965567
     (sudo_with_proxies "${YUM:-yum}" install -y "$@" 2>&1 || echo YUM_FAILED $?) \
         | awk "$parse_yum_result"
diff --git a/lib/databases/postgresql b/lib/databases/postgresql
index 852bac4..14425a5 100644
--- a/lib/databases/postgresql
+++ b/lib/databases/postgresql
@@ -47,7 +47,7 @@
 }
 
 function configure_database_postgresql {
-    local pg_conf pg_dir pg_hba root_roles
+    local pg_conf pg_dir pg_hba root_roles version
     echo_summary "Configuring and starting PostgreSQL"
     if is_fedora; then
         pg_hba=/var/lib/pgsql/data/pg_hba.conf
@@ -56,6 +56,13 @@
             sudo postgresql-setup initdb
         fi
     elif is_ubuntu; then
+        version=`psql --version | cut -d ' ' -f3 | cut -d. -f1-2`
+        if vercmp $version '>=' 9.3; then
+            if [ -z "`pg_lsclusters -h`" ]; then
+                echo 'No PostgreSQL clusters exist; will create one'
+                sudo pg_createcluster $version main --start
+            fi
+        fi
         pg_dir=`find /etc/postgresql -name pg_hba.conf|xargs dirname`
         pg_hba=$pg_dir/pg_hba.conf
         pg_conf=$pg_dir/postgresql.conf
diff --git a/lib/neutron-legacy b/lib/neutron-legacy
index 7d6e881..e06a020 100644
--- a/lib/neutron-legacy
+++ b/lib/neutron-legacy
@@ -486,8 +486,7 @@
 }
 
 function create_nova_conf_neutron {
-    iniset $NOVA_CONF DEFAULT network_api_class "nova.network.neutronv2.api.API"
-
+    iniset $NOVA_CONF DEFAULT use_neutron True
     iniset $NOVA_CONF neutron auth_type "password"
     iniset $NOVA_CONF neutron auth_url "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_AUTH_PORT/v3"
     iniset $NOVA_CONF neutron username "$Q_ADMIN_USERNAME"
@@ -502,7 +501,6 @@
     if [[ "$Q_USE_SECGROUP" == "True" ]]; then
         LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver
         iniset $NOVA_CONF DEFAULT firewall_driver $LIBVIRT_FIREWALL_DRIVER
-        iniset $NOVA_CONF DEFAULT security_group_api neutron
     fi
 
     # optionally set options in nova_conf
diff --git a/lib/neutron_plugins/openvswitch_agent b/lib/neutron_plugins/openvswitch_agent
index 94a2689..e1c5a50 100644
--- a/lib/neutron_plugins/openvswitch_agent
+++ b/lib/neutron_plugins/openvswitch_agent
@@ -44,12 +44,6 @@
 
     # Setup agent for tunneling
     if [[ "$OVS_ENABLE_TUNNELING" == "True" ]]; then
-        # Verify tunnels are supported
-        # REVISIT - also check kernel module support for GRE and patch ports
-        OVS_VERSION=`ovs-vsctl --version | head -n 1 | grep -E -o "[0-9]+\.[0-9]+"`
-        if [ `vercmp_numbers "$OVS_VERSION" "1.4"` -lt "0" ] && ! is_service_enabled q-svc ; then
-            die $LINENO "You are running OVS version $OVS_VERSION. OVS 1.4+ is required for tunneling between multiple hosts."
-        fi
         iniset /$Q_PLUGIN_CONF_FILE ovs local_ip $TUNNEL_ENDPOINT_IP
         iniset /$Q_PLUGIN_CONF_FILE ovs tunnel_bridge $OVS_TUNNEL_BRIDGE
     fi
diff --git a/lib/tempest b/lib/tempest
index 4fb3e5e..3b8a888 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -414,12 +414,15 @@
         if [[ ! -z "$HEAT_CFN_IMAGE_URL" ]]; then
             iniset $TEMPEST_CONFIG orchestration image_ref $(basename "${HEAT_CFN_IMAGE_URL%.*}")
         fi
-        # build a specialized heat flavor
-        available_flavors=$(nova flavor-list)
-        if [[ ! ( $available_flavors =~ 'm1.heat' ) ]]; then
-            nova flavor-create m1.heat 451 512 0 1
+        # Nova might not be enabled, especially when we want to test tempest scenario/API that only create Neutron resources
+        if is_service_enabled nova; then
+            # build a specialized heat flavor
+            available_flavors=$(nova flavor-list)
+            if [[ ! ( $available_flavors =~ 'm1.heat' ) ]]; then
+                nova flavor-create m1.heat 451 512 0 1
+            fi
+            iniset $TEMPEST_CONFIG orchestration instance_type "m1.heat"
         fi
-        iniset $TEMPEST_CONFIG orchestration instance_type "m1.heat"
         iniset $TEMPEST_CONFIG orchestration build_timeout 900
         iniset $TEMPEST_CONFIG orchestration stack_owner_role "_member_"
     fi
diff --git a/stackrc b/stackrc
index 7294f7b..088cfee 100644
--- a/stackrc
+++ b/stackrc
@@ -625,7 +625,7 @@
             IMAGE_URLS+=",http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-x86_64-uec.tar.gz";;
         ironic)
             # Ironic can do both partition and full disk images, depending on the driver
-            if [[ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]]; then
+            if [[ -z "${IRONIC_DEPLOY_DRIVER%%agent*}" ]]; then
                 DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-cirros-${CIRROS_VERSION}-x86_64-disk}
             else
                 DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-cirros-${CIRROS_VERSION}-x86_64-uec}
@@ -639,11 +639,17 @@
     DOWNLOAD_DEFAULT_IMAGES=False
 fi
 
-# Staging Area for New Images, have them here for at least 24hrs for nodepool
-# to cache them otherwise the failure rates in the gate are too high
+# Staging area for new images.  These images are cached by a run of
+# ./tools/image_list.sh during CI image build (see
+# project-config:nodepool/elements/cache-devstack/extra-data.d/55-cache-devstack-repos).
+#
+# To avoid CI failures grabbing the images, new images should be here
+# for at least 24hrs (nodepool builds images at 14:00UTC) so the they
+# are in the cache.
 PRECACHE_IMAGES=$(trueorfalse False PRECACHE_IMAGES)
 if [[ "$PRECACHE_IMAGES" == "True" ]]; then
-
+    # required for trove devstack tests; see
+    #  git.openstack.org/cgit/openstack/trove/tree/devstack/plugin.sh
     IMAGE_URL="http://tarballs.openstack.org/trove/images/ubuntu/mysql.qcow2"
     if ! [[ "$IMAGE_URLS"  =~ "$IMAGE_URL" ]]; then
         IMAGE_URLS+=",$IMAGE_URL"
diff --git a/tests/test_package_ordering.sh b/tests/test_package_ordering.sh
index a568abf..bfc2a19 100755
--- a/tests/test_package_ordering.sh
+++ b/tests/test_package_ordering.sh
@@ -7,6 +7,7 @@
 
 source $TOP/tests/unittest.sh
 
+export LC_ALL=en_US.UTF-8
 PKG_FILES=$(find $TOP/files/debs $TOP/files/rpms $TOP/files/rpms-suse -type f)
 
 TMPDIR=$(mktemp -d)
diff --git a/tools/generate-devstack-plugins-list.sh b/tools/generate-devstack-plugins-list.sh
index 8a1f743..be3f60a 100644
--- a/tools/generate-devstack-plugins-list.sh
+++ b/tools/generate-devstack-plugins-list.sh
@@ -41,7 +41,9 @@
 (
 declare -A plugins
 
-test -r data/devstack-plugins-registry.header && cat data/devstack-plugins-registry.header
+if [[ -r data/devstack-plugins-registry.header ]]; then
+    cat data/devstack-plugins-registry.header
+fi
 
 sorted_plugins=$(python tools/generate-devstack-plugins-list.py)
 
@@ -52,7 +54,9 @@
     printf "+----------------------------+-------------------------------------------------------------------------+\n"
 done
 
-test -r data/devstack-plugins-registry.footer && cat data/devstack-plugins-registry.footer
+if [[ -r data/devstack-plugins-registry.footer ]]; then
+    cat data/devstack-plugins-registry.footer
+fi
 ) > doc/source/plugin-registry.rst
 
 if [[ -n ${1} ]]; then
diff --git a/tools/worlddump.py b/tools/worlddump.py
index 01f601c..72a257f 100755
--- a/tools/worlddump.py
+++ b/tools/worlddump.py
@@ -58,8 +58,8 @@
     try:
         subprocess.check_call(cmd, shell=True)
         print
-    except subprocess.CalledProcessError:
-        print "*** Failed to run: %s" % cmd
+    except subprocess.CalledProcessError as e:
+        print "*** Failed to run '%(cmd)s': %(err)s" % {'cmd': cmd, 'err': e}
 
 
 def _find_cmd(cmd):
diff --git a/tox.ini b/tox.ini
index ef557fb..3dfc377 100644
--- a/tox.ini
+++ b/tox.ini
@@ -12,7 +12,7 @@
 # against devstack, just set BASHATE_INSTALL_PATH=/path/... to your
 # modified bashate tree
 deps =
-   {env:BASHATE_INSTALL_PATH:bashate==0.4.0}
+   {env:BASHATE_INSTALL_PATH:bashate==0.5.0}
 whitelist_externals = bash
 commands = bash -c "find {toxinidir}             \
          -not \( -type d -name .?\* -prune \)    \
@@ -22,9 +22,10 @@
          -not -name \*~                          \
          -not -name \*.md                        \
          -not -name stack-screenrc               \
+         -not -name \*.orig                      \
+         -not -name \*.rej                       \
          \(                                      \
           -name \*.sh -or                        \
-          -name \*.orig -or                      \
           -name \*rc -or                         \
           -name functions\* -or                  \
           -wholename \*/inc/\* -or               \