Use unique build dir for pip installs
There is a bug in pip [1] where it will choose to install a package from an existing build-dir if it exists over the version actually requested. Thus if a prior component has installed a later version of the package, the unpacked code is already in /tmp/$USER-pip-build; it gets re-installed and manifests in a confusing error along the lines of --- Downloading/unpacking requests>=1.1,<1.2.3 (from -r /home/stack//python-cinderclient/requirements.txt (line 5)) Running setup.py egg_info for package requests Requested requests>=1.1,<1.2.3 (from -r /home/stack/python-cinderclient/requirements.txt (line 5)), but installing version 1.2.3 ... error: Installed distribution requests 1.2.3 conflicts with requirement requests>=1.1,<1.2.3 --- I believe pip 1.4 fixes this problem, but it should always be safe to specify a unique build-directory for pip installs to avoid picking up old versions. We also add a cleanup_tmp function for clearing out anything that stack.sh might leave around when un-stacking, and add a catch-all for the pip-build dir. [1] https://github.com/pypa/pip/issues/709 Change-Id: I7ce919cddfd6d6175ae67bd864f82e256ebc7090
This commit is contained in:
parent
89b58846b5
commit
31dcd3e7ab
23
functions
23
functions
@ -913,14 +913,35 @@ function pip_install {
|
|||||||
PIP_MIRROR_OPT="--use-mirrors"
|
PIP_MIRROR_OPT="--use-mirrors"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# pip < 1.4 has a bug where it will use an already existing build
|
||||||
|
# directory unconditionally. Say an earlier component installs
|
||||||
|
# foo v1.1; pip will have built foo's source in
|
||||||
|
# /tmp/$USER-pip-build. Even if a later component specifies foo <
|
||||||
|
# 1.1, the existing extracted build will be used and cause
|
||||||
|
# confusing errors. By creating unique build directories we avoid
|
||||||
|
# this problem. See
|
||||||
|
# https://github.com/pypa/pip/issues/709
|
||||||
|
local pip_build_tmp=$(mktemp --tmpdir -d pip-build.XXXXX)
|
||||||
|
|
||||||
$SUDO_PIP PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-/var/cache/pip} \
|
$SUDO_PIP PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-/var/cache/pip} \
|
||||||
HTTP_PROXY=$http_proxy \
|
HTTP_PROXY=$http_proxy \
|
||||||
HTTPS_PROXY=$https_proxy \
|
HTTPS_PROXY=$https_proxy \
|
||||||
NO_PROXY=$no_proxy \
|
NO_PROXY=$no_proxy \
|
||||||
$CMD_PIP install $PIP_MIRROR_OPT $@
|
$CMD_PIP install --build=${pip_build_tmp} \
|
||||||
|
$PIP_MIRROR_OPT $@ \
|
||||||
|
&& $SUDO_PIP rm -rf ${pip_build_tmp}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Cleanup anything from /tmp on unstack
|
||||||
|
# clean_tmp
|
||||||
|
function cleanup_tmp {
|
||||||
|
local tmp_dir=${TMPDIR:-/tmp}
|
||||||
|
|
||||||
|
# see comments in pip_install
|
||||||
|
sudo rm -rf ${tmp_dir}/pip-build.*
|
||||||
|
}
|
||||||
|
|
||||||
# Service wrapper to restart services
|
# Service wrapper to restart services
|
||||||
# restart_service service-name
|
# restart_service service-name
|
||||||
function restart_service() {
|
function restart_service() {
|
||||||
|
@ -111,3 +111,5 @@ if is_service_enabled neutron; then
|
|||||||
stop_neutron_third_party
|
stop_neutron_third_party
|
||||||
cleanup_neutron
|
cleanup_neutron
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
cleanup_tmp
|
||||||
|
Loading…
Reference in New Issue
Block a user