Remove nova tarball from test-requirements

Using test-requirements to get a specific version of nova for tests is
preventing DevStack from installing blazar-nova, because nova is already
added to upper-constraints.txt as "-e file:///opt/stack/nova#egg=nova".
DevStack shows the following error message:

    Could not satisfy constraints for 'nova': installation from path or url cannot be constrained to a version

Import tools/tox_install.sh from Neutron repos and adapt it to install
Nova in tox environments used for unit tests. Minimal modifications were
made to this script in order to easily track changes from Neutron repos.

tox.ini is modified to use this script instead of pip. For pep8 checks,
we exclude the .tmp directory where nova is cloned in gate jobs,
otherwise the nova source is checked as well and triggers failures.

See [1] and [2] for more details about the issue fixed by this commit.

[1] https://bugs.launchpad.net/devstack/+bug/1540328/comments/13
[2] https://review.openstack.org/#/c/405630/1

Closes-Bug: #1641577
Change-Id: I542461e609866b21f597b0c4a2954807c5b8f8b7
This commit is contained in:
Pierre Riteau 2017-01-17 03:42:38 +00:00
parent 71f02b0382
commit dd08b76fc9
3 changed files with 71 additions and 4 deletions

View File

@ -15,5 +15,4 @@ testrepository>=0.0.18 # Apache-2.0/BSD
testtools>=1.4.0 # MIT
coverage>=4.0 # Apache-2.0
http://tarballs.openstack.org/nova/nova-master.tar.gz#egg=nova
oslotest>=1.10.0 # Apache-2.0

68
tools/tox_install.sh Executable file
View File

@ -0,0 +1,68 @@
#!/usr/bin/env bash
# The blazar-nova repo suffers from the problem of depending on nova, which
# does not exist on PyPI.
# This wrapper for tox's package installer will use the existing package
# if it exists, else use zuul-cloner if that program exists, else grab it
# from nova master via a hard-coded URL. That last case should only
# happen with devs running unit tests locally.
# From the tox.ini config page:
# install_command=ARGV
# default:
# pip install {opts} {packages}
ZUUL_CLONER=/usr/zuul-env/bin/zuul-cloner
BRANCH_NAME=${NOVA_BRANCH:-master}
nova_installed=$(echo "import nova" | python 2>/dev/null ; echo $?)
NOVA_DIR=$HOME/nova
set -e
set -x
install_cmd="pip install -c$1"
shift
# The devstack based functional tests have nova checked out in
# $NOVA_DIR on the test systems - with the change to test in it.
# Use this directory if it exists, so that this script installs the
# nova version to test here.
# Note that the functional tests use sudo to run tox and thus
# variables used for zuul-cloner to check out the correct version are
# lost.
if [ -d "$NOVA_DIR" ]; then
echo "FOUND Nova code at $NOVA_DIR - using"
$install_cmd -U -e $NOVA_DIR
elif [ $nova_installed -eq 0 ]; then
echo "ALREADY INSTALLED" > /tmp/tox_install.txt
location=$(python -c "import nova; print(nova.__file__)")
echo "ALREADY INSTALLED at $location"
echo "Nova already installed; using existing package"
elif [ -x "$ZUUL_CLONER" ]; then
echo "ZUUL CLONER" > /tmp/tox_install.txt
# Make this relative to current working directory so that
# git clean can remove it. We cannot remove the directory directly
# since it is referenced after $install_cmd -e.
mkdir -p .tmp
NOVA_DIR=$(/bin/mktemp -d -p $(pwd)/.tmp)
pushd $NOVA_DIR
$ZUUL_CLONER --cache-dir \
/opt/git \
--branch $BRANCH_NAME \
git://git.openstack.org \
openstack/nova
cd openstack/nova
$install_cmd -e .
popd
else
echo "PIP HARDCODE" > /tmp/tox_install.txt
if [ -z "$NOVA_PIP_LOCATION" ]; then
NOVA_PIP_LOCATION="git+https://git.openstack.org/openstack/nova@$BRANCH_NAME#egg=nova"
fi
$install_cmd -U -e ${NOVA_PIP_LOCATION}
fi
$install_cmd -U $*
exit $?

View File

@ -1,11 +1,11 @@
[tox]
envlist = py35,py34,py27,pep8
minversion = 1.6
minversion = 2.0
skipsdist = True
[testenv]
usedevelop = True
install_command = pip install -U {opts} {packages}
install_command = {toxinidir}/tools/tox_install.sh {env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}
deps = -r{toxinidir}/test-requirements.txt
-r{toxinidir}/requirements.txt
setenv = VIRTUAL_ENV={envdir}
@ -27,7 +27,7 @@ commands = {posargs}
[flake8]
show-source = true
builtins = _
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,tools
exclude = .venv,.git,.tmp,.tox,dist,doc,*lib/python*,*egg,tools
[hacking]
import_exceptions = nova.openstack.common.gettextutils