mirror of
https://github.com/ansible-collections/ansible.posix.git
synced 2026-06-09 18:15:54 +00:00
Fix all deprecated module_utils imports before ansible-core 2.24 removal
SUMMARY
Fixes all deprecated ansible.module_utils imports across the entire collection that will be removed in ansible-core 2.24.
This PR comprehensively addresses deprecation warnings reported in #686 by updating import statements in 20 files to use the new recommended import paths, and removes 8 unused test utility files that contained deprecated imports.
Deprecated imports replaced:
Deprecated import
Replacement
ansible.module_utils._text
ansible.module_utils.common.text.converters
ansible.module_utils.common._collections_compat
collections.abc
ansible.module_utils.six.moves.shlex_quote
shlex.quote
ansible.module_utils.six.moves.reduce
functools.reduce
ansible.module_utils.six.moves.urllib.parse.urlparse
urllib.parse.urlparse
ansible.module_utils.six.string_types
basestring/str (Python 2/3 compatible)
ansible.module_utils.six.text_type
str
ansible.module_utils.six.PY3
Removed (simplified Python 2/3 conditionals)
ansible.module_utils.six.with_metaclass
Native metaclass= syntax
ansible.module_utils.six.iteritems
dict.items()
Files fixed (20 files, 1 commit per file for easier review):
plugins/action/patch.py
plugins/action/synchronize.py
plugins/callback/cgroup_perf_recap.py
plugins/callback/json.py
plugins/callback/jsonl.py
plugins/callback/profile_roles.py
plugins/callback/profile_tasks.py
plugins/modules/acl.py
plugins/modules/authorized_key.py
plugins/modules/firewalld_info.py
plugins/modules/mount.py
plugins/modules/patch.py
plugins/modules/rhel_rpm_ostree.py
plugins/modules/rpm_ostree_upgrade.py
plugins/modules/seboolean.py
plugins/modules/synchronize.py
plugins/modules/sysctl.py
plugins/shell/csh.py
plugins/shell/fish.py
tests/unit/modules/system/test_mount.py
Files deleted (8 unused test utility files):
These files are dead code - none of them are imported or used anywhere in the test suite or the collection. Removing them also addresses Python 2.7 compatibility concerns raised in code review, as several contained deprecated imports that would be incorrect to fix for Python 2.
tests/unit/compat/builtins.py
tests/unit/mock/loader.py
tests/unit/mock/path.py
tests/unit/mock/procenv.py
tests/unit/mock/vault_helper.py
tests/unit/mock/yaml_helper.py
tests/unit/modules/conftest.py
tests/unit/modules/utils.py
Completeness verified with:
git grep -n -P '_compat|utils._text|utils.six' -- '*.py' | grep -v yml
This command returns no results, confirming all deprecated imports have been replaced.
Notes on Python 2.7 compatibility:
For modules that may run on Python 2.7 managed hosts (e.g., authorized_key.py, synchronize.py, sysctl.py), Python 2/3 compatible fallbacks were used instead of direct Python 3 replacements:
authorized_key.py: try/except ImportError for urllib.parse.urlparse (falls back to urlparse on Python 2)
synchronize.py: try/except ImportError for shlex.quote (falls back to pipes.quote on Python 2)
sysctl.py: uses sys.version_info to set string_types to str on Python 3 (basestring on Python 2)
Also removes corresponding pylint:ansible-bad-import-from entries from tests/sanity/ignore-2.21.txt and tests/sanity/ignore-2.22.txt where applicable.
Fixes #686
ISSUE TYPE
Bugfix Pull Request
ADDITIONAL INFORMATION
Approach:
Each file is fixed in a separate commit for easier code review. The changelog fragment is added in a final commit. Corresponding pylint:ansible-bad-import-from ignore entries in tests/sanity/ignore-2.21.txt and tests/sanity/ignore-2.22.txt are removed in the same commit as the file fix (or the file removal commit).
CI results:
All 59 checks passing (Azure Pipelines sanity, units, lint, Docker, Remote across ansible-core 2.17 through devel, and Zuul ansible/check).
Reviewed-by: Felix Fontein <felix@fontein.de>
Reviewed-by: Pavel Bar
Reviewed-by: Abhijeet Kasurde
(cherry picked from commit 2022c1bd86)
Co-authored-by: centosinfra-prod-github-app[bot] <161850885+centosinfra-prod-github-app[bot]@users.noreply.github.com>
95 lines
4.3 KiB
Python
95 lines
4.3 KiB
Python
# Copyright (c) 2014, Chris Church <chris@ninemoreminutes.com>
|
|
# Copyright (c) 2017 Ansible Project
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
from __future__ import (absolute_import, division, print_function)
|
|
__metaclass__ = type
|
|
|
|
DOCUMENTATION = '''
|
|
name: fish
|
|
short_description: fish shell (/bin/fish)
|
|
description:
|
|
- This is here because some people are restricted to fish.
|
|
extends_documentation_fragment:
|
|
- shell_common
|
|
'''
|
|
|
|
from shlex import quote as shlex_quote
|
|
from ansible.plugins.shell.sh import ShellModule as ShModule
|
|
|
|
|
|
class ShellModule(ShModule):
|
|
|
|
# Common shell filenames that this plugin handles
|
|
COMPATIBLE_SHELLS = frozenset(('fish',))
|
|
# Family of shells this has. Must match the filename without extension
|
|
SHELL_FAMILY = 'fish'
|
|
|
|
_SHELL_EMBEDDED_PY_EOL = '\n'
|
|
_SHELL_REDIRECT_ALLNULL = '> /dev/null 2>&1'
|
|
_SHELL_AND = '; and'
|
|
_SHELL_OR = '; or'
|
|
_SHELL_SUB_LEFT = '('
|
|
_SHELL_SUB_RIGHT = ')'
|
|
_SHELL_GROUP_LEFT = ''
|
|
_SHELL_GROUP_RIGHT = ''
|
|
|
|
def env_prefix(self, **kwargs):
|
|
env = self.env.copy()
|
|
env.update(kwargs)
|
|
ret = []
|
|
for k, v in kwargs.items():
|
|
if v is None:
|
|
ret.append('set -e %s;' % k)
|
|
else:
|
|
ret.append('set -lx %s %s;' % (k, shlex_quote(str(v))))
|
|
return ' '.join(ret)
|
|
|
|
def build_module_command(self, env_string, shebang, cmd, arg_path=None):
|
|
# don't quote the cmd if it's an empty string, because this will break pipelining mode
|
|
if cmd.strip() != '':
|
|
cmd = shlex_quote(cmd)
|
|
cmd_parts = [env_string.strip(), shebang.replace("#!", "").strip(), cmd]
|
|
if arg_path is not None:
|
|
cmd_parts.append(arg_path)
|
|
new_cmd = " ".join(cmd_parts)
|
|
return new_cmd
|
|
|
|
def checksum(self, path, python_interp):
|
|
# The following test is fish-compliant.
|
|
#
|
|
# In the following test, each condition is a check and logical
|
|
# comparison (or or and) that sets the rc value. Every check is run so
|
|
# the last check in the series to fail will be the rc that is
|
|
# returned.
|
|
#
|
|
# If a check fails we error before invoking the hash functions because
|
|
# hash functions may successfully take the hash of a directory on BSDs
|
|
# (UFS filesystem?) which is not what the rest of the ansible code
|
|
# expects
|
|
#
|
|
# If all of the available hashing methods fail we fail with an rc of
|
|
# 0. This logic is added to the end of the cmd at the bottom of this
|
|
# function.
|
|
|
|
# Return codes:
|
|
# checksum: success!
|
|
# 0: Unknown error
|
|
# 1: Remote file does not exist
|
|
# 2: No read permissions on the file
|
|
# 3: File is a directory
|
|
# 4: No python interpreter
|
|
|
|
# Quoting gets complex here. We're writing a python string that's
|
|
# used by a variety of shells on the remote host to invoke a python
|
|
# "one-liner".
|
|
shell_escaped_path = shlex_quote(path)
|
|
test = "set rc flag; [ -r %(p)s ] %(shell_or)s set rc 2; [ -f %(p)s ] %(shell_or)s set rc 1; [ -d %(p)s ] %(shell_and)s set rc 3; %(i)s -V 2>/dev/null %(shell_or)s set rc 4; [ x\"$rc\" != \"xflag\" ] %(shell_and)s echo \"$rc \"%(p)s %(shell_and)s exit 0" % dict(p=shell_escaped_path, i=python_interp, shell_and=self._SHELL_AND, shell_or=self._SHELL_OR) # NOQA
|
|
csums = [
|
|
u"({0} -c 'import hashlib; BLOCKSIZE = 65536; hasher = hashlib.sha1();{2}afile = open(\"'{1}'\", \"rb\"){2}buf = afile.read(BLOCKSIZE){2}while len(buf) > 0:{2}\thasher.update(buf){2}\tbuf = afile.read(BLOCKSIZE){2}afile.close(){2}print(hasher.hexdigest())' 2>/dev/null)".format(python_interp, shell_escaped_path, self._SHELL_EMBEDDED_PY_EOL), # NOQA Python > 2.4 (including python3)
|
|
u"({0} -c 'import sha; BLOCKSIZE = 65536; hasher = sha.sha();{2}afile = open(\"'{1}'\", \"rb\"){2}buf = afile.read(BLOCKSIZE){2}while len(buf) > 0:{2}\thasher.update(buf){2}\tbuf = afile.read(BLOCKSIZE){2}afile.close(){2}print(hasher.hexdigest())' 2>/dev/null)".format(python_interp, shell_escaped_path, self._SHELL_EMBEDDED_PY_EOL), # NOQA Python == 2.4
|
|
]
|
|
|
|
cmd = (" %s " % self._SHELL_OR).join(csums)
|
|
cmd = "%s; %s %s (echo \'0 \'%s)" % (test, cmd, self._SHELL_OR, shell_escaped_path)
|
|
return cmd
|