From 17d785611c85f7cbb3d7f853331d8909f24f83bc Mon Sep 17 00:00:00 2001
From: Ryan Petrello <lists@ryanpetrello.com>
Date: Tue, 17 Sep 2013 10:53:20 -0400
Subject: [PATCH] Provide a more generic run-tox.sh.

Rename run-tox.sh to run-unittests.sh.
Add a new run-tox.sh that takes the tox environment name as its first
argument instead of the python version number suffix. This makes it
easier to run alternative jobs through tox (building docs, building
with different versions of dependencies, etc.).

Based on feedback in https://review.openstack.org/#/c/38218/

Change-Id: I7e5a23fbe88af94bbfbbed4a47c5eb6527ab1d47
---
 .../jenkins/files/slave_scripts/run-tox.sh    |  67 ++---------
 .../files/slave_scripts/run-unittests.sh      | 104 ++++++++++++++++++
 .../jenkins_job_builder/config/horizon.yaml   |   2 +-
 .../jenkins_job_builder/config/macros.yaml    |   8 +-
 .../jenkins_job_builder/config/misc.yaml      |   4 +-
 .../jenkins_job_builder/config/projects.yaml  |   2 +-
 .../openstack_project/files/zuul/layout.yaml  |   4 +-
 7 files changed, 123 insertions(+), 68 deletions(-)
 create mode 100755 modules/jenkins/files/slave_scripts/run-unittests.sh

diff --git a/modules/jenkins/files/slave_scripts/run-tox.sh b/modules/jenkins/files/slave_scripts/run-tox.sh
index 1536a1a2a9..afe8092ee7 100755
--- a/modules/jenkins/files/slave_scripts/run-tox.sh
+++ b/modules/jenkins/files/slave_scripts/run-tox.sh
@@ -6,64 +6,34 @@
 # resulting environment at the end so that we have a record of exactly
 # what packages we ended up testing.
 #
-# Usage: run-tox.sh PYTHONVERSION
+# Usage: run-tox.sh VENV
 #
-# Where PYTHONVERSION is the numeric version identifier used as a suffix
-# in the tox.ini file.  E.g., "26" or "27" for "py26"/"jenkins26" or
-# "py27"/"jenkins27" respectively.
+# Where VENV is the name of the tox environment to run (specified in the
+# project's tox.ini file).
 
-version=$1
+venv=$1
 org=$2
 project=$3
 
-if [[ -z "$version" || -z "$org" || -z "$project" ]]
+if [[ -z "$venv" || -z "$org" || -z "$project" ]]
 then
-  echo "Usage: $? VERSION ORG PROJECT"
+  echo "Usage: $? VENV ORG PROJECT"
   echo
-  echo "VERSION: The tox environment python version (eg '27')"
-  echo "ORG: The project organization (eg 'openstack')"
+  echo "VENV: The tox environment to run (eg 'python27')"
+  echo "ORG: The project organization (eg 'stackforge')"
   echo "PROJECT: The project name (eg 'nova')"
   exit 1
 fi
 
-venv=py$version
-
-export NOSE_WITH_XUNIT=1
-export NOSE_WITH_HTML_OUTPUT=1
-export NOSE_HTML_OUT_FILE='nose_results.html'
-export TMPDIR=`/bin/mktemp -d`
-trap "rm -rf $TMPDIR" EXIT
-
 /usr/local/jenkins/slave_scripts/jenkins-oom-grep.sh pre
 
 sudo /usr/local/jenkins/slave_scripts/jenkins-sudo-grep.sh pre
 
 source /usr/local/jenkins/slave_scripts/select-mirror.sh $org $project
 
-# Workaround the combo of tox running setup.py outside of virtualenv
-# and RHEL having an old distribute. The next line can be removed
-# when either get fixed.
-python setup.py --version 2>/dev/null
-
-tox -e$venv
+tox -v -e$venv
 result=$?
 
-echo "Begin pip freeze output from test virtualenv:"
-echo "======================================================================"
-.tox/$venv/bin/pip freeze
-echo "======================================================================"
-
-if [ -d ".testrepository" ] ; then
-    if [ -f ".testrepository/0.2" ] ; then
-        cp .testrepository/0.2 ./subunit_log.txt
-    elif [ -f ".testrepository/0" ] ; then
-        .tox/$venv/bin/subunit-1to2 < .testrepository/0 > ./subunit_log.txt
-    fi
-    .tox/$venv/bin/python /usr/local/jenkins/slave_scripts/subunit2html.py ./subunit_log.txt testr_results.html
-    gzip -9 ./subunit_log.txt
-    gzip -9 ./testr_results.html
-fi
-
 sudo /usr/local/jenkins/slave_scripts/jenkins-sudo-grep.sh post
 sudoresult=$?
 
@@ -89,23 +59,4 @@ then
     exit 1
 fi
 
-htmlreport=$(find . -name $NOSE_HTML_OUT_FILE)
-if [ -f "$htmlreport" ]
-then
-    passcount=$(grep -c 'tr class=.passClass' $htmlreport)
-    if [ $passcount -eq "0" ]
-    then
-        echo
-        echo "Zero tests passed, which probably means there was an error"
-        echo "parsing one of the python files, or that some other failure"
-        echo "during test setup prevented a sane run."
-        echo
-        exit 1
-    fi
-else
-    echo
-    echo "WARNING: Unable to find $NOST_HTML_OUT_FILE to confirm results!"
-    echo
-fi
-
 exit $result
diff --git a/modules/jenkins/files/slave_scripts/run-unittests.sh b/modules/jenkins/files/slave_scripts/run-unittests.sh
new file mode 100755
index 0000000000..66b2791032
--- /dev/null
+++ b/modules/jenkins/files/slave_scripts/run-unittests.sh
@@ -0,0 +1,104 @@
+#!/bin/bash -x
+
+# Call tox with the jenkins version of the test environment so it is used.
+# Also, run pip freeze on the resulting environment at the end so that we have
+# a record of exactly what packages we ended up testing.
+#
+# Usage: run-unittests.sh PYTHONVERSION
+#
+# Where PYTHONVERSION is the numeric version identifier used as a suffix
+# in the tox.ini file.  E.g., "26" or "27" for "py26"/"jenkins26" or
+# "py27"/"jenkins27" respectively.
+
+version=$1
+org=$2
+project=$3
+
+if [[ -z "$version" || -z "$org" || -z "$project" ]]
+then
+  echo "Usage: $? VERSION ORG PROJECT"
+  echo
+  echo "VERSION: The tox environment python version (eg '27')"
+  echo "ORG: The project organization (eg 'openstack')"
+  echo "PROJECT: The project name (eg 'nova')"
+  exit 1
+fi
+
+venv=py$version
+
+export NOSE_WITH_XUNIT=1
+export NOSE_WITH_HTML_OUTPUT=1
+export NOSE_HTML_OUT_FILE='nose_results.html'
+export TMPDIR=`/bin/mktemp -d`
+trap "rm -rf $TMPDIR" EXIT
+
+/usr/local/jenkins/slave_scripts/jenkins-oom-grep.sh pre
+
+sudo /usr/local/jenkins/slave_scripts/jenkins-sudo-grep.sh pre
+
+source /usr/local/jenkins/slave_scripts/select-mirror.sh $org $project
+
+tox -e$venv
+result=$?
+
+echo "Begin pip freeze output from test virtualenv:"
+echo "======================================================================"
+.tox/$venv/bin/pip freeze
+echo "======================================================================"
+
+if [ -d ".testrepository" ] ; then
+    if [ -f ".testrepository/0.2" ] ; then
+        cp .testrepository/0.2 ./subunit_log.txt
+    elif [ -f ".testrepository/0" ] ; then
+        cp .testrepository/0 ./subunit_log.txt
+    fi
+    .tox/$venv/bin/python /usr/local/jenkins/slave_scripts/subunit2html.py ./subunit_log.txt testr_results.html
+    gzip -9 ./subunit_log.txt
+    gzip -9 ./testr_results.html
+fi
+
+sudo /usr/local/jenkins/slave_scripts/jenkins-sudo-grep.sh post
+sudoresult=$?
+
+if [ $sudoresult -ne "0" ]
+then
+    echo
+    echo "This test has failed because it attempted to execute commands"
+    echo "with sudo.  See above for the exact commands used."
+    echo
+    exit 1
+fi
+
+/usr/local/jenkins/slave_scripts/jenkins-oom-grep.sh post
+oomresult=$?
+
+if [ $oomresult -ne "0" ]
+then
+    echo
+    echo "This test has failed because it attempted to exceed configured"
+    echo "memory limits and was killed prior to completion.  See above"
+    echo "for related kernel messages."
+    echo
+    exit 1
+fi
+
+htmlreport=$(find . -name $NOSE_HTML_OUT_FILE)
+if [ -f "$htmlreport" ]
+then
+    passcount=$(grep -c 'tr class=.passClass' $htmlreport)
+    if [ $passcount -eq "0" ]
+    then
+        echo
+        echo "Zero tests passed, which probably means there was an error"
+        echo "parsing one of the python files, or that some other failure"
+        echo "during test setup prevented a sane run."
+        echo
+        exit 1
+    fi
+else
+    echo
+    echo "WARNING: Unable to find $NOST_HTML_OUT_FILE to confirm results!"
+    echo
+fi
+
+exit $result
diff --git a/modules/openstack_project/files/jenkins_job_builder/config/horizon.yaml b/modules/openstack_project/files/jenkins_job_builder/config/horizon.yaml
index b800e19d25..69528de23a 100644
--- a/modules/openstack_project/files/jenkins_job_builder/config/horizon.yaml
+++ b/modules/openstack_project/files/jenkins_job_builder/config/horizon.yaml
@@ -23,7 +23,7 @@
 
     builders:
       - gerrit-git-prep
-      - shell: '/usr/local/jenkins/slave_scripts/run-tox.sh 27dj14 openstack horizon'
+      - shell: '/usr/local/jenkins/slave_scripts/run-unittests.sh 27dj14 openstack horizon'
       - assert-no-extra-files
 
     publishers:
diff --git a/modules/openstack_project/files/jenkins_job_builder/config/macros.yaml b/modules/openstack_project/files/jenkins_job_builder/config/macros.yaml
index 806c8df9f5..46e6aedb18 100644
--- a/modules/openstack_project/files/jenkins_job_builder/config/macros.yaml
+++ b/modules/openstack_project/files/jenkins_job_builder/config/macros.yaml
@@ -134,22 +134,22 @@
 - builder:
     name: python26
     builders:
-      - shell: "/usr/local/jenkins/slave_scripts/run-tox.sh 26 {github-org} {project}"
+      - shell: "/usr/local/jenkins/slave_scripts/run-unittests.sh 26 {github-org} {project}"
 
 - builder:
     name: python27
     builders:
-      - shell: "/usr/local/jenkins/slave_scripts/run-tox.sh 27 {github-org} {project}"
+      - shell: "/usr/local/jenkins/slave_scripts/run-unittests.sh 27 {github-org} {project}"
 
 - builder:
     name: python33
     builders:
-      - shell: "/usr/local/jenkins/slave_scripts/run-tox.sh 33 {github-org} {project}"
+      - shell: "/usr/local/jenkins/slave_scripts/run-unittests.sh 33 {github-org} {project}"
 
 - builder:
     name: pypy
     builders:
-      - shell: "/usr/local/jenkins/slave_scripts/run-tox.sh py {github-org} {project}"
+      - shell: "/usr/local/jenkins/slave_scripts/run-unittests.sh py {github-org} {project}"
 
 - builder:
     name: assert-no-extra-files
diff --git a/modules/openstack_project/files/jenkins_job_builder/config/misc.yaml b/modules/openstack_project/files/jenkins_job_builder/config/misc.yaml
index 9ff14c753a..718ca5ee22 100644
--- a/modules/openstack_project/files/jenkins_job_builder/config/misc.yaml
+++ b/modules/openstack_project/files/jenkins_job_builder/config/misc.yaml
@@ -36,11 +36,11 @@
     node: '{node}'
 
 - job-template:
-    name: 'gate-{name}-tox-{env}'
+    name: 'gate-{name}-unittests-{env}'
 
     builders:
       - gerrit-git-prep
-      - shell: '/usr/local/jenkins/slave_scripts/run-tox.sh {env} {github-org} {name}'
+      - shell: '/usr/local/jenkins/slave_scripts/run-unittests.sh {env} {github-org} {name}'
       - assert-no-extra-files
 
     publishers:
diff --git a/modules/openstack_project/files/jenkins_job_builder/config/projects.yaml b/modules/openstack_project/files/jenkins_job_builder/config/projects.yaml
index 619d93ce0b..1d18554758 100644
--- a/modules/openstack_project/files/jenkins_job_builder/config/projects.yaml
+++ b/modules/openstack_project/files/jenkins_job_builder/config/projects.yaml
@@ -120,7 +120,7 @@
 
     jobs:
       - python-jobs
-      - gate-{name}-tox-{env}
+      - gate-{name}-unittests-{env}
       - hook-{name}-rtfd
       - pypi-jobs
 
diff --git a/modules/openstack_project/files/zuul/layout.yaml b/modules/openstack_project/files/zuul/layout.yaml
index a4d187e980..510f161cee 100644
--- a/modules/openstack_project/files/zuul/layout.yaml
+++ b/modules/openstack_project/files/zuul/layout.yaml
@@ -2392,8 +2392,8 @@ projects:
       - gate-sqlalchemy-migrate-python26
       - gate-sqlalchemy-migrate-python27
     experimental:
-      - gate-sqlalchemy-migrate-tox-26sa07
-      - gate-sqlalchemy-migrate-tox-27sa07
+      - gate-sqlalchemy-migrate-unittests-26sa07
+      - gate-sqlalchemy-migrate-unittests-27sa07
     post:
       - sqlalchemy-migrate-branch-tarball
       - hook-sqlalchemy-migrate-rtfd