Add USE_PYTHON3 and PYTHON3_VERSION variables to allow services to use
python 3 if they indicate support in their python package metadata.
Tested in Heat here -> I837c2fba682ab430d50e9f43913f2fed20325a7a.
Project config change to add a dedicated job to Heat is here -> I0837e62d6ccc66397a5e409f0961edd4be31f467
Change-Id: I079e18b58b214bf8362945c253d6d894ca8b1a6b
| ... | ... |
@@ -28,10 +28,13 @@ declare -A PROJECT_VENV |
| 28 | 28 |
# Get the path to the pip command. |
| 29 | 29 |
# get_pip_command |
| 30 | 30 |
function get_pip_command {
|
| 31 |
- which pip || which pip-python |
|
| 31 |
+ local version="$1" |
|
| 32 |
+ # NOTE(dhellmann): I don't know if we actually get a pip3.4-python |
|
| 33 |
+ # under any circumstances. |
|
| 34 |
+ which pip${version} || which pip${version}-python
|
|
| 32 | 35 |
|
| 33 | 36 |
if [ $? -ne 0 ]; then |
| 34 |
- die $LINENO "Unable to find pip; cannot continue" |
|
| 37 |
+ die $LINENO "Unable to find pip${version}; cannot continue"
|
|
| 35 | 38 |
fi |
| 36 | 39 |
} |
| 37 | 40 |
|
| ... | ... |
@@ -66,6 +69,13 @@ function pip_install_gr {
|
| 66 | 66 |
pip_install $clean_name |
| 67 | 67 |
} |
| 68 | 68 |
|
| 69 |
+# Determine the python versions supported by a package |
|
| 70 |
+function get_python_versions_for_package {
|
|
| 71 |
+ local name=$1 |
|
| 72 |
+ cd $name && python setup.py --classifiers \ |
|
| 73 |
+ | grep 'Language' | cut -f5 -d: | grep '\.' | tr '\n' ' ' |
|
| 74 |
+} |
|
| 75 |
+ |
|
| 69 | 76 |
# Wrapper for ``pip install`` to set cache and proxy environment variables |
| 70 | 77 |
# Uses globals ``OFFLINE``, ``PIP_VIRTUAL_ENV``, |
| 71 | 78 |
# ``PIP_UPGRADE``, ``TRACK_DEPENDS``, ``*_proxy``, |
| ... | ... |
@@ -104,8 +114,22 @@ function pip_install {
|
| 104 | 104 |
local sudo_pip="env" |
| 105 | 105 |
else |
| 106 | 106 |
local cmd_pip |
| 107 |
- cmd_pip=$(get_pip_command) |
|
| 107 |
+ cmd_pip=$(get_pip_command $PYTHON2_VERSION) |
|
| 108 | 108 |
local sudo_pip="sudo -H" |
| 109 |
+ if python3_enabled; then |
|
| 110 |
+ # Look at the package classifiers to find the python |
|
| 111 |
+ # versions supported, and if we find the version of |
|
| 112 |
+ # python3 we've been told to use, use that instead of the |
|
| 113 |
+ # default pip |
|
| 114 |
+ local package_dir=${!#}
|
|
| 115 |
+ local python_versions |
|
| 116 |
+ if [[ -d "$package_dir" ]]; then |
|
| 117 |
+ python_versions=$(get_python_versions_for_package $package_dir) |
|
| 118 |
+ if [[ $python_versions =~ $PYTHON3_VERSION ]]; then |
|
| 119 |
+ cmd_pip=$(get_pip_command $PYTHON3_VERSION) |
|
| 120 |
+ fi |
|
| 121 |
+ fi |
|
| 122 |
+ fi |
|
| 109 | 123 |
fi |
| 110 | 124 |
fi |
| 111 | 125 |
|
| ... | ... |
@@ -113,6 +137,8 @@ function pip_install {
|
| 113 | 113 |
# Always apply constraints |
| 114 | 114 |
cmd_pip="$cmd_pip -c $REQUIREMENTS_DIR/upper-constraints.txt" |
| 115 | 115 |
|
| 116 |
+ # FIXME(dhellmann): Need to force multiple versions of pip for |
|
| 117 |
+ # packages like setuptools? |
|
| 116 | 118 |
local pip_version |
| 117 | 119 |
pip_version=$(python -c "import pip; \ |
| 118 | 120 |
print(pip.__version__.strip('.')[0])")
|
| ... | ... |
@@ -276,6 +302,21 @@ function setup_package {
|
| 276 | 276 |
fi |
| 277 | 277 |
} |
| 278 | 278 |
|
| 279 |
+# Report whether python 3 should be used |
|
| 280 |
+function python3_enabled {
|
|
| 281 |
+ if [[ $USE_PYTHON3 == "True" ]]; then |
|
| 282 |
+ return 0 |
|
| 283 |
+ else |
|
| 284 |
+ return 1 |
|
| 285 |
+ fi |
|
| 286 |
+} |
|
| 287 |
+ |
|
| 288 |
+# Install python3 packages |
|
| 289 |
+function install_python3 {
|
|
| 290 |
+ if is_ubuntu; then |
|
| 291 |
+ apt_get install python3.4 python3.4-dev |
|
| 292 |
+ fi |
|
| 293 |
+} |
|
| 279 | 294 |
|
| 280 | 295 |
# Restore xtrace |
| 281 | 296 |
$INC_PY_TRACE |
| ... | ... |
@@ -19,6 +19,7 @@ |
| 19 | 19 |
function stack_install_service {
|
| 20 | 20 |
local service=$1 |
| 21 | 21 |
if type install_${service} >/dev/null 2>&1; then
|
| 22 |
+ # FIXME(dhellmann): Needs to be python3-aware at some point. |
|
| 22 | 23 |
if [[ ${USE_VENV} = True && -n ${PROJECT_VENV[$service]:-} ]]; then
|
| 23 | 24 |
rm -rf ${PROJECT_VENV[$service]}
|
| 24 | 25 |
source $TOP_DIR/tools/build_venv.sh ${PROJECT_VENV[$service]} ${ADDITIONAL_VENV_PACKAGES//,/ }
|
| ... | ... |
@@ -118,6 +118,17 @@ if [[ -r $RC_DIR/.localrc.password ]]; then |
| 118 | 118 |
source $RC_DIR/.localrc.password |
| 119 | 119 |
fi |
| 120 | 120 |
|
| 121 |
+# Control whether Python 3 should be used. |
|
| 122 |
+export USE_PYTHON3=${USE_PYTHON3:-False}
|
|
| 123 |
+ |
|
| 124 |
+# When Python 3 is supported by an application, adding the specific |
|
| 125 |
+# version of Python 3 to this variable will install the app using that |
|
| 126 |
+# version of the interpreter instead of 2.7. |
|
| 127 |
+export PYTHON3_VERSION=${PYTHON3_VERSION:-3.4}
|
|
| 128 |
+ |
|
| 129 |
+# Just to be more explicit on the Python 2 version to use. |
|
| 130 |
+export PYTHON2_VERSION=${PYTHON2_VERSION:-2.7}
|
|
| 131 |
+ |
|
| 121 | 132 |
# allow local overrides of env variables, including repo config |
| 122 | 133 |
if [[ -f $RC_DIR/localrc ]]; then |
| 123 | 134 |
# Old-style user-supplied config |
| ... | ... |
@@ -8,6 +8,7 @@ |
| 8 | 8 |
|
| 9 | 9 |
# Assumptions: |
| 10 | 10 |
# - update pip to $INSTALL_PIP_VERSION |
| 11 |
+# - if USE_PYTHON3=True, PYTHON3_VERSION refers to a version already installed |
|
| 11 | 12 |
|
| 12 | 13 |
set -o errexit |
| 13 | 14 |
set -o xtrace |
| ... | ... |
@@ -31,6 +32,8 @@ GetDistro |
| 31 | 31 |
echo "Distro: $DISTRO" |
| 32 | 32 |
|
| 33 | 33 |
function get_versions {
|
| 34 |
+ # FIXME(dhellmann): Deal with multiple python versions here? This |
|
| 35 |
+ # is just used for reporting, so maybe not? |
|
| 34 | 36 |
PIP=$(which pip 2>/dev/null || which pip-python 2>/dev/null || true) |
| 35 | 37 |
if [[ -n $PIP ]]; then |
| 36 | 38 |
PIP_VERSION=$($PIP --version | awk '{ print $2}')
|
| ... | ... |
@@ -75,6 +78,9 @@ function install_get_pip {
|
| 75 | 75 |
touch $LOCAL_PIP.downloaded |
| 76 | 76 |
fi |
| 77 | 77 |
sudo -H -E python $LOCAL_PIP |
| 78 |
+ if python3_enabled; then |
|
| 79 |
+ sudo -H -E python${PYTHON3_VERSION} $LOCAL_PIP
|
|
| 80 |
+ fi |
|
| 78 | 81 |
} |
| 79 | 82 |
|
| 80 | 83 |
|
| ... | ... |
@@ -114,6 +120,7 @@ get_versions |
| 114 | 114 |
# python in f23 depends on the python-pip package |
| 115 | 115 |
if ! { is_fedora && [[ $DISTRO == "f23" ]]; }; then
|
| 116 | 116 |
uninstall_package python-pip |
| 117 |
+ uninstall_package python3-pip |
|
| 117 | 118 |
fi |
| 118 | 119 |
|
| 119 | 120 |
install_get_pip |
| ... | ... |
@@ -122,6 +129,7 @@ if [[ -n $PYPI_ALTERNATIVE_URL ]]; then |
| 122 | 122 |
configure_pypi_alternative_url |
| 123 | 123 |
fi |
| 124 | 124 |
|
| 125 |
+set -x |
|
| 125 | 126 |
pip_install -U setuptools |
| 126 | 127 |
|
| 127 | 128 |
get_versions |