From 975cf1655aafae7a7e8d758b6d2ebab6bfd93d04 Mon Sep 17 00:00:00 2001 From: Martin Krizek Date: Wed, 17 Jan 2024 09:24:35 +0100 Subject: [PATCH] modules: remove PY2 compat (#81990) --- lib/ansible/modules/apt.py | 6 +++--- lib/ansible/modules/apt_repository.py | 5 ++--- lib/ansible/modules/async_wrapper.py | 17 ++++++++++------- lib/ansible/modules/copy.py | 5 ++--- lib/ansible/modules/hostname.py | 18 +----------------- lib/ansible/modules/pip.py | 22 +++++----------------- lib/ansible/modules/uri.py | 8 +++----- 7 files changed, 26 insertions(+), 55 deletions(-) diff --git a/lib/ansible/modules/apt.py b/lib/ansible/modules/apt.py index 6a3e16eba63..ad72782b7ec 100644 --- a/lib/ansible/modules/apt.py +++ b/lib/ansible/modules/apt.py @@ -375,7 +375,7 @@ from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.common.locale import get_best_parsable_locale from ansible.module_utils.common.respawn import has_respawned, probe_interpreters_for_module, respawn_module from ansible.module_utils.common.text.converters import to_native, to_text -from ansible.module_utils.six import PY3, string_types +from ansible.module_utils.six import string_types from ansible.module_utils.urls import fetch_file DPKG_OPTIONS = 'force-confdef,force-confold' @@ -1260,13 +1260,13 @@ def main(): # made any more complex than it already is to try and cover more, eg, custom interpreters taking over # system locations) - apt_pkg_name = 'python3-apt' if PY3 else 'python-apt' + apt_pkg_name = 'python3-apt' if has_respawned(): # this shouldn't be possible; short-circuit early if it happens... module.fail_json(msg="{0} must be installed and visible from {1}.".format(apt_pkg_name, sys.executable)) - interpreters = ['/usr/bin/python3', '/usr/bin/python2', '/usr/bin/python'] + interpreters = ['/usr/bin/python3', '/usr/bin/python'] interpreter = probe_interpreters_for_module(interpreters, 'apt') diff --git a/lib/ansible/modules/apt_repository.py b/lib/ansible/modules/apt_repository.py index fb69f5e5672..bea93340c6f 100644 --- a/lib/ansible/modules/apt_repository.py +++ b/lib/ansible/modules/apt_repository.py @@ -182,7 +182,6 @@ import time from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.common.respawn import has_respawned, probe_interpreters_for_module, respawn_module from ansible.module_utils.common.text.converters import to_native -from ansible.module_utils.six import PY3 from ansible.module_utils.urls import fetch_url from ansible.module_utils.common.locale import get_best_parsable_locale @@ -664,13 +663,13 @@ def main(): # made any more complex than it already is to try and cover more, eg, custom interpreters taking over # system locations) - apt_pkg_name = 'python3-apt' if PY3 else 'python-apt' + apt_pkg_name = 'python3-apt' if has_respawned(): # this shouldn't be possible; short-circuit early if it happens... module.fail_json(msg="{0} must be installed and visible from {1}.".format(apt_pkg_name, sys.executable)) - interpreters = ['/usr/bin/python3', '/usr/bin/python2', '/usr/bin/python'] + interpreters = ['/usr/bin/python3', '/usr/bin/python'] interpreter = probe_interpreters_for_module(interpreters, 'apt') diff --git a/lib/ansible/modules/async_wrapper.py b/lib/ansible/modules/async_wrapper.py index 61c1cd52adb..cd87f1f4f2f 100644 --- a/lib/ansible/modules/async_wrapper.py +++ b/lib/ansible/modules/async_wrapper.py @@ -21,8 +21,6 @@ import multiprocessing from ansible.module_utils.common.text.converters import to_text, to_bytes -PY3 = sys.version_info[0] == 3 - syslog.openlog('ansible-%s' % os.path.basename(__file__)) syslog.syslog(syslog.LOG_NOTICE, 'Invoked with %s' % " ".join(sys.argv[1:])) @@ -168,13 +166,18 @@ def _run_module(wrapped_cmd, jid): interpreter = _get_interpreter(cmd[0]) if interpreter: cmd = interpreter + cmd - script = subprocess.Popen(cmd, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + script = subprocess.Popen( + cmd, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=False, + text=True, + encoding="utf-8", + errors="surrogateescape", + ) (outdata, stderr) = script.communicate() - if PY3: - outdata = outdata.decode('utf-8', 'surrogateescape') - stderr = stderr.decode('utf-8', 'surrogateescape') (filtered_outdata, json_warnings) = _filter_non_json_lines(outdata) diff --git a/lib/ansible/modules/copy.py b/lib/ansible/modules/copy.py index 2226735e1c8..3f1085e1c80 100644 --- a/lib/ansible/modules/copy.py +++ b/lib/ansible/modules/copy.py @@ -301,7 +301,6 @@ from ansible.module_utils.common.text.converters import to_bytes, to_native from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.common.process import get_bin_path from ansible.module_utils.common.locale import get_best_parsable_locale -from ansible.module_utils.six import PY3 # The AnsibleModule object @@ -705,7 +704,7 @@ def main(): raise # might be needed below - if PY3 and hasattr(os, 'listxattr'): + if hasattr(os, 'listxattr'): try: src_has_acls = 'system.posix_acl_access' in os.listxattr(src) except Exception as e: @@ -715,7 +714,7 @@ def main(): # at this point we should always have tmp file module.atomic_move(b_mysrc, dest, unsafe_writes=module.params['unsafe_writes']) - if PY3 and hasattr(os, 'listxattr') and platform.system() == 'Linux' and not remote_src: + if hasattr(os, 'listxattr') and platform.system() == 'Linux' and not remote_src: # atomic_move used above to copy src into dest might, in some cases, # use shutil.copy2 which in turn uses shutil.copystat. # Since Python 3.3, shutil.copystat copies file extended attributes: diff --git a/lib/ansible/modules/hostname.py b/lib/ansible/modules/hostname.py index 520632e2657..1f0bfa03c23 100644 --- a/lib/ansible/modules/hostname.py +++ b/lib/ansible/modules/hostname.py @@ -81,7 +81,6 @@ from ansible.module_utils.common.sys_info import get_platform_subclass from ansible.module_utils.facts.system.service_mgr import ServiceMgrFactCollector from ansible.module_utils.facts.utils import get_file_lines, get_file_content from ansible.module_utils.common.text.converters import to_native, to_text -from ansible.module_utils.six import PY3, text_type STRATS = { 'alpine': 'Alpine', @@ -532,21 +531,6 @@ class DarwinStrategy(BaseStrategy): self.name_types = ('HostName', 'ComputerName', 'LocalHostName') self.scrubbed_name = self._scrub_hostname(self.module.params['name']) - def _make_translation(self, replace_chars, replacement_chars, delete_chars): - if PY3: - return str.maketrans(replace_chars, replacement_chars, delete_chars) - - if not isinstance(replace_chars, text_type) or not isinstance(replacement_chars, text_type): - raise ValueError('replace_chars and replacement_chars must both be strings') - if len(replace_chars) != len(replacement_chars): - raise ValueError('replacement_chars must be the same length as replace_chars') - - table = dict(zip((ord(c) for c in replace_chars), replacement_chars)) - for char in delete_chars: - table[ord(char)] = None - - return table - def _scrub_hostname(self, name): """ LocalHostName only accepts valid DNS characters while HostName and ComputerName @@ -558,7 +542,7 @@ class DarwinStrategy(BaseStrategy): name = to_text(name) replace_chars = u'\'"~`!@#$%^&*(){}[]/=?+\\|-_ ' delete_chars = u".'" - table = self._make_translation(replace_chars, u'-' * len(replace_chars), delete_chars) + table = str.maketrans(replace_chars, '-' * len(replace_chars), delete_chars) name = name.translate(table) # Replace multiple dashes with a single dash diff --git a/lib/ansible/modules/pip.py b/lib/ansible/modules/pip.py index 9fc89499a5e..99ac446c868 100644 --- a/lib/ansible/modules/pip.py +++ b/lib/ansible/modules/pip.py @@ -324,7 +324,6 @@ except Exception: from ansible.module_utils.common.text.converters import to_native from ansible.module_utils.basic import AnsibleModule, is_executable, missing_required_lib from ansible.module_utils.common.locale import get_best_parsable_locale -from ansible.module_utils.six import PY3 #: Python one-liners to be run at the command line that will determine the @@ -451,15 +450,7 @@ def _is_present(module, req, installed_pkgs, pkg_command): def _get_pip(module, env=None, executable=None): - # Older pip only installed under the "/usr/bin/pip" name. Many Linux - # distros install it there. - # By default, we try to use pip required for the current python - # interpreter, so people can use pip to install modules dependencies - candidate_pip_basenames = ('pip2', 'pip') - if PY3: - # pip under python3 installs the "/usr/bin/pip3" name - candidate_pip_basenames = ('pip3',) - + candidate_pip_basenames = ('pip3',) pip = None if executable is not None: if os.path.isabs(executable): @@ -600,13 +591,10 @@ def setup_virtualenv(module, env, chdir, out, err): if not _is_venv_command(module.params['virtualenv_command']): if virtualenv_python: cmd.append('-p%s' % virtualenv_python) - elif PY3: - # Ubuntu currently has a patch making virtualenv always - # try to use python2. Since Ubuntu16 works without - # python2 installed, this is a problem. This code mimics - # the upstream behaviour of using the python which invoked - # virtualenv to determine which python is used inside of - # the virtualenv (when none are specified). + else: + # This code mimics the upstream behaviour of using the python + # which invoked virtualenv to determine which python is used + # inside of the virtualenv (when none are specified). cmd.append('-p%s' % sys.executable) # if venv or pyvenv are used and virtualenv_python is defined, then diff --git a/lib/ansible/modules/uri.py b/lib/ansible/modules/uri.py index 4dbfa7a9b6e..343c814ae00 100644 --- a/lib/ansible/modules/uri.py +++ b/lib/ansible/modules/uri.py @@ -443,11 +443,10 @@ import json import os import re import shutil -import sys import tempfile from ansible.module_utils.basic import AnsibleModule, sanitize_keys -from ansible.module_utils.six import PY2, PY3, binary_type, iteritems, string_types +from ansible.module_utils.six import binary_type, iteritems, string_types from ansible.module_utils.six.moves.urllib.parse import urlencode, urlsplit from ansible.module_utils.common.text.converters import to_native, to_text from ansible.module_utils.compat.datetime import utcnow, utcfromtimestamp @@ -719,7 +718,7 @@ def main(): if maybe_output: try: - if PY3 and (r.fp is None or r.closed): + if r.fp is None or r.closed: raise TypeError content = r.read() except (AttributeError, TypeError): @@ -770,8 +769,7 @@ def main(): js = json.loads(u_content) uresp['json'] = js except Exception: - if PY2: - sys.exc_clear() # Avoid false positive traceback in fail_json() on Python 2 + ... else: u_content = None