Merge "Init placement client in tempest Manager object"
diff --git a/.zuul.yaml b/.zuul.yaml
index bee60bf..7d77b71 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -297,6 +297,16 @@
         c-bak: false
 
 - job:
+    name: tempest-full-stein
+    parent: tempest-full
+    override-checkout: stable/stein
+
+- job:
+    name: tempest-full-stein-py3
+    parent: tempest-full-py3
+    override-checkout: stable/stein
+
+- job:
     name: tempest-full-rocky
     parent: tempest-full
     nodeset: openstack-single-node-xenial
@@ -514,6 +524,10 @@
         - tempest-full-py3-ipv6:
             voting: false
             irrelevant-files: *tempest-irrelevant-files
+        - tempest-full-stein:
+            irrelevant-files: *tempest-irrelevant-files
+        - tempest-full-stein-py3:
+            irrelevant-files: *tempest-irrelevant-files
         - tempest-full-rocky:
             irrelevant-files: *tempest-irrelevant-files
         - tempest-full-rocky-py3:
@@ -615,6 +629,8 @@
             irrelevant-files: *tempest-irrelevant-files
     periodic-stable:
       jobs:
+        - tempest-full-stein
+        - tempest-full-stein-py3
         - tempest-full-rocky
         - tempest-full-rocky-py3
         - tempest-full-queens
diff --git a/HACKING.rst b/HACKING.rst
index eb6551a..1559fc6 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -28,6 +28,8 @@
 - [T117] Check negative tests have ``@decorators.attr(type=['negative'])``
   applied.
 
+It is recommended to use ``tox -eautopep8`` before submitting a patch.
+
 Test Data/Configuration
 -----------------------
 - Assume nothing about existing test data
diff --git a/tools/format.sh b/tools/format.sh
index adffb8c..dec8f1c 100755
--- a/tools/format.sh
+++ b/tools/format.sh
@@ -1,5 +1,29 @@
 #!/bin/bash
+
 cd $(dirname "$(readlink -f "$0")")
 
-autopep8 --exit-code --max-line-length=79 --experimental --in-place -r ../tempest ../setup.py && echo Formatting was not needed. >&2
+AUTOPEP8=`which autopep8 2>/dev/null`
 
+if [[ -z "$AUTOPEP8" ]]; then
+    AUTOPEP8=`which autopep8-3`
+fi
+
+if [[ -z "$AUTOPEP8" ]]; then
+    echo "Unable to locate autopep8" >&2
+    exit 2
+fi
+
+# isort is not compatible with the default flake8 (H306), maybe flake8-isort
+# isort -rc -sl -fss ../tempest ../setup.py
+$AUTOPEP8 --exit-code --max-line-length=79 --experimental --in-place -r ../tempest ../setup.py
+ERROR=$?
+
+if [[ $ERROR -eq 0 ]]; then
+    echo "Formatting was not needed." >&2
+    exit 0
+elif [[ $ERROR -eq 1 ]]; then
+    echo "Formatting failed.." >&2
+    exit 1
+else
+    echo "done" >&2
+fi
diff --git a/tox.ini b/tox.ini
index 433f168..230249f 100644
--- a/tox.ini
+++ b/tox.ini
@@ -198,7 +198,7 @@
 
 [testenv:pep8]
 deps =
-    -r test-requirements.txt
+    -r{toxinidir}/test-requirements.txt
     autopep8
 basepython = python3
 commands =
@@ -210,7 +210,7 @@
 deps = autopep8
 basepython = python3
 commands =
-    autopep8 --max-line-length=79  --experimental --in-place -r tempest setup.py
+    {toxinidir}/tools/format.sh
 
 [testenv:uuidgen]
 commands =