diff --git a/dev/config.sh b/dev/config.sh
index 8c781199ec5a6304b6fbfb39fff469f1cc9f0cba..d518b81ffe2cf9df0d6b65675a5069d717fd5ba5 100644
--- a/dev/config.sh
+++ b/dev/config.sh
@@ -23,3 +23,6 @@
 
 # Additional arguments to pass to kayobe commands.
 #export KAYOBE_EXTRA_ARGS=
+
+# Upper constraints to use when installing Python packages.
+#export UPPER_CONSTRAINTS_FILE=
diff --git a/dev/functions b/dev/functions
index b9b7f154fe51ec6301e9f0e972f691a93e232ae9..f77ef852c1562ede4984b1de7a22cc781b73d95f 100644
--- a/dev/functions
+++ b/dev/functions
@@ -41,6 +41,21 @@ function config_defaults {
     # Additional arguments to pass to kayobe commands.
     export KAYOBE_EXTRA_ARGS=${KAYOBE_EXTRA_ARGS:-}
 
+    # Use .gitreview as the key to determine the appropriate branch to clone
+    # for tests. Inspired by OSA code.
+    PARENT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+    if [ -f "${PARENT}/../.gitreview" ]; then
+      BRANCH=$(awk -F'=' '/defaultbranch/ {print $2}' "${PARENT}/../.gitreview")
+      if [[ "${BRANCH}" == "" ]]; then
+        SERIES="master"
+      else
+        SERIES="$(echo ${BRANCH} | sed 's|stable/||')"
+      fi
+
+      # Upper constraints to use when installing Python packages.
+      export UPPER_CONSTRAINTS_FILE="${UPPER_CONSTRAINTS_FILE:-https://releases.openstack.org/constraints/upper/${SERIES}}"
+    fi
+
     # Path to the Tenks virtual environment.
     export TENKS_VENV_PATH="${TENKS_VENV_PATH:-${HOME}/tenks-test-venv}"
 
@@ -395,7 +410,11 @@ function overcloud_test_init {
     echo "Performing overcloud test init"
     environment_setup
 
-    pip install python-openstackclient
+    if [[ ! -z "$UPPER_CONSTRAINTS_FILE" ]]; then
+        pip install python-openstackclient -c "$UPPER_CONSTRAINTS_FILE"
+    else
+        pip install python-openstackclient
+    fi
     source "${KOLLA_CONFIG_PATH:-/etc/kolla}/admin-openrc.sh"
 
     # This guards init-runonce from running more than once