diff --git a/inc/python b/inc/python index cf61389709..52ad56520a 100644 --- a/inc/python +++ b/inc/python @@ -450,6 +450,31 @@ function python3_enabled { fi } +# Provide requested python version and sets PYTHON variable +function install_python { + # NOTE: install_python function should finally just do what install_python3 + # does as soon Python 2 support has been dropped + if python3_enabled; then + install_python3 + export PYTHON=$(which python${PYTHON3_VERSION} 2>/dev/null || + which python3 2>/dev/null) + if [[ "${DISTRO}" =~ (rhel8) ]]; then + # Use Python 3 as default python command so that we have only one + # python alternative to use on the system for either python and + # python3 + sudo alternatives --set python "${PYTHON}" + else + # Install anyway Python 2 for legacy scripts that still requires + # python instead of python3 command + install_package python + fi + else + echo "WARNING - Python 2 support has been deprecated in favor of Python 3" + install_package python + export PYTHON=$(which python 2>/dev/null) + fi +} + # Install python3 packages function install_python3 { if is_ubuntu; then diff --git a/stack.sh b/stack.sh index 0f9d57bc9a..7119e5f648 100755 --- a/stack.sh +++ b/stack.sh @@ -415,11 +415,8 @@ fi # Ensure python is installed # -------------------------- -install_python3 +install_python -if ! python3_enabled; then - is_package_installed python || install_package python -fi # Configure Logging # ----------------- @@ -497,14 +494,14 @@ if [[ -n "$LOGFILE" ]]; then _of_args="$_of_args --no-timestamp" fi # Set fd 1 and 2 to write the log file - exec 1> >( $TOP_DIR/tools/outfilter.py $_of_args -o "${LOGFILE}" ) 2>&1 + exec 1> >( $PYTHON $TOP_DIR/tools/outfilter.py $_of_args -o "${LOGFILE}" ) 2>&1 # Set fd 6 to summary log file - exec 6> >( $TOP_DIR/tools/outfilter.py -o "${SUMFILE}" ) + exec 6> >( $PYTHON $TOP_DIR/tools/outfilter.py -o "${SUMFILE}" ) else # Set fd 1 and 2 to primary logfile - exec 1> >( $TOP_DIR/tools/outfilter.py -o "${LOGFILE}" ) 2>&1 + exec 1> >( $PYTHON $TOP_DIR/tools/outfilter.py -o "${LOGFILE}" ) 2>&1 # Set fd 6 to summary logfile and stdout - exec 6> >( $TOP_DIR/tools/outfilter.py -v -o "${SUMFILE}" >&3 ) + exec 6> >( $PYTHON $TOP_DIR/tools/outfilter.py -v -o "${SUMFILE}" >&3 ) fi echo_summary "stack.sh log $LOGFILE" @@ -521,7 +518,7 @@ else exec 1>/dev/null 2>&1 fi # Always send summary fd to original stdout - exec 6> >( $TOP_DIR/tools/outfilter.py -v >&3 ) + exec 6> >( $PYTHON $TOP_DIR/tools/outfilter.py -v >&3 ) fi # Basic test for ``$DEST`` path permissions (fatal on error unless skipped) @@ -557,9 +554,9 @@ function exit_trap { generate-subunit $DEVSTACK_START_TIME $SECONDS 'fail' >> ${SUBUNIT_OUTPUT} fi if [[ -z $LOGDIR ]]; then - $TOP_DIR/tools/worlddump.py + ${PYTHON} $TOP_DIR/tools/worlddump.py else - $TOP_DIR/tools/worlddump.py -d $LOGDIR + ${PYTHON} $TOP_DIR/tools/worlddump.py -d $LOGDIR fi else # If we error before we've installed os-testr, this will fail. diff --git a/tests/test_worlddump.sh b/tests/test_worlddump.sh index f407d407c0..919652536d 100755 --- a/tests/test_worlddump.sh +++ b/tests/test_worlddump.sh @@ -8,7 +8,7 @@ source $TOP/tests/unittest.sh OUT_DIR=$(mktemp -d) -$TOP/tools/worlddump.py -d $OUT_DIR +${PYTHON} $TOP/tools/worlddump.py -d $OUT_DIR if [[ $? -ne 0 ]]; then fail "worlddump failed" diff --git a/tools/generate-devstack-plugins-list.py b/tools/generate-devstack-plugins-list.py index 3ac9c4d9aa..1cacd06bf8 100644 --- a/tools/generate-devstack-plugins-list.py +++ b/tools/generate-devstack-plugins-list.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 # Copyright 2016 Hewlett Packard Enterprise Development Company, L.P. # diff --git a/tools/install_prereqs.sh b/tools/install_prereqs.sh index da59093581..a7c03d26cd 100755 --- a/tools/install_prereqs.sh +++ b/tools/install_prereqs.sh @@ -81,12 +81,6 @@ if [[ -n "$SYSLOG" && "$SYSLOG" != "False" ]]; then fi fi -if python3_enabled; then - install_python3 - export PYTHON=$(which python${PYTHON3_VERSION} 2>/dev/null || which python3 2>/dev/null) -else - export PYTHON=$(which python 2>/dev/null) -fi # Mark end of run # --------------- diff --git a/tools/outfilter.py b/tools/outfilter.py old mode 100755 new mode 100644 index cf091247d0..e910f79ff2 --- a/tools/outfilter.py +++ b/tools/outfilter.py @@ -1,5 +1,5 @@ -#!/usr/bin/env python -# +#!/usr/bin/env python3 + # Copyright 2014 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); you may diff --git a/tools/update_clouds_yaml.py b/tools/update_clouds_yaml.py index 9187c664d0..7be995e8f3 100755 --- a/tools/update_clouds_yaml.py +++ b/tools/update_clouds_yaml.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain diff --git a/tools/worlddump.py b/tools/worlddump.py old mode 100755 new mode 100644 index d5ff5d1ab5..1e6e176210 --- a/tools/worlddump.py +++ b/tools/worlddump.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright 2014 Hewlett-Packard Development Company, L.P. # @@ -23,8 +23,8 @@ import argparse import datetime from distutils import spawn import fnmatch +import io import os -import os.path import shutil import subprocess import sys @@ -109,9 +109,10 @@ def _bridge_list(): # This method gets max version searching 'OpenFlow versions 0x1:0x'. # And return a version value converted to an integer type. def _get_ofp_version(): - process = subprocess.Popen(['ovs-ofctl', '--version'], stdout=subprocess.PIPE) + process = subprocess.Popen(['ovs-ofctl', '--version'], + stdout=subprocess.PIPE) stdout, _ = process.communicate() - find_str = 'OpenFlow versions 0x1:0x' + find_str = b'OpenFlow versions 0x1:0x' offset = stdout.find(find_str) return int(stdout[offset + len(find_str):-1]) - 1 @@ -206,7 +207,7 @@ def process_list(): def compute_consoles(): _header("Compute consoles") - for root, dirnames, filenames in os.walk('/opt/stack'): + for root, _, filenames in os.walk('/opt/stack'): for filename in fnmatch.filter(filenames, 'console.log'): fullpath = os.path.join(root, filename) _dump_cmd("sudo cat %s" % fullpath) @@ -234,12 +235,22 @@ def var_core(): # tools out there that can do that sort of thing though. _dump_cmd("ls -ltrah /var/core") + +def disable_stdio_buffering(): + # re-open STDOUT as binary, then wrap it in a + # TextIOWrapper, and write through everything. + binary_stdout = io.open(sys.stdout.fileno(), 'wb', 0) + sys.stdout = io.TextIOWrapper(binary_stdout, write_through=True) + + def main(): opts = get_options() fname = filename(opts.dir, opts.name) print("World dumping... see %s for details" % fname) - sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) - with open(fname, 'w') as f: + + disable_stdio_buffering() + + with io.open(fname, 'w') as f: os.dup2(f.fileno(), sys.stdout.fileno()) disk_space() process_list()