From d0b0aff5bc68d1435b783c2d547ae5a21182eac5 Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Fri, 1 Aug 2025 10:54:26 +0200 Subject: [PATCH] wsl connection: import paramiko directly (#10531) Import paramiko directly. --- changelogs/fragments/10531-wsl-paramiko.yml | 3 +++ plugins/connection/wsl.py | 15 +++++++++++---- tests/unit/plugins/connection/test_wsl.py | 3 +-- 3 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 changelogs/fragments/10531-wsl-paramiko.yml diff --git a/changelogs/fragments/10531-wsl-paramiko.yml b/changelogs/fragments/10531-wsl-paramiko.yml new file mode 100644 index 0000000000..08257d6c78 --- /dev/null +++ b/changelogs/fragments/10531-wsl-paramiko.yml @@ -0,0 +1,3 @@ +bugfixes: + - "wsl connection plugin - avoid deprecated ansible-core paramiko import helper, import paramiko directly instead + (https://github.com/ansible-collections/community.general/issues/10515, https://github.com/ansible-collections/community.general/pull/10531)." diff --git a/plugins/connection/wsl.py b/plugins/connection/wsl.py index 1d26cefa18..92ffec52b3 100644 --- a/plugins/connection/wsl.py +++ b/plugins/connection/wsl.py @@ -315,6 +315,7 @@ import pathlib import shlex import socket import tempfile +import traceback import typing as t from ansible.errors import ( @@ -323,9 +324,8 @@ from ansible.errors import ( AnsibleError, ) from ansible_collections.community.general.plugins.module_utils._filelock import FileLock, LockTimeout +from ansible_collections.community.general.plugins.module_utils.version import LooseVersion from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text -from ansible.module_utils.compat.paramiko import PARAMIKO_IMPORT_ERR, paramiko -from ansible.module_utils.compat.version import LooseVersion from ansible.playbook.play_context import PlayContext from ansible.plugins.connection import ConnectionBase from ansible.utils.display import Display @@ -333,8 +333,15 @@ from ansible.utils.path import makedirs_safe from binascii import hexlify from subprocess import list2cmdline +try: + import paramiko + PARAMIKO_IMPORT_ERR = None +except ImportError: + paramiko = None + PARAMIKO_IMPORT_ERR = traceback.format_exc() -if t.TYPE_CHECKING and paramiko: + +if t.TYPE_CHECKING and PARAMIKO_IMPORT_ERR is None: from paramiko import MissingHostKeyPolicy from paramiko.client import SSHClient from paramiko.pkey import PKey @@ -437,7 +444,7 @@ class Connection(ConnectionBase): def _connect(self) -> Connection: """ activates the connection object """ - if paramiko is None: + if PARAMIKO_IMPORT_ERR is not None: raise AnsibleError(f'paramiko is not installed: {to_native(PARAMIKO_IMPORT_ERR)}') port = self.get_option('port') diff --git a/tests/unit/plugins/connection/test_wsl.py b/tests/unit/plugins/connection/test_wsl.py index a714e7cf89..c28d1fbec9 100644 --- a/tests/unit/plugins/connection/test_wsl.py +++ b/tests/unit/plugins/connection/test_wsl.py @@ -12,7 +12,6 @@ from ansible_collections.community.general.plugins.connection.wsl import authent from ansible_collections.community.general.plugins.module_utils._filelock import FileLock, LockTimeout from ansible.errors import AnsibleError, AnsibleAuthenticationFailure, AnsibleConnectionFailure from ansible.module_utils.common.text.converters import to_bytes -from ansible.module_utils.compat.paramiko import paramiko from ansible.playbook.play_context import PlayContext from ansible.plugins.loader import connection_loader from io import StringIO @@ -20,7 +19,7 @@ from pathlib import Path from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import patch, MagicMock, mock_open -pytest.importorskip('paramiko') +paramiko = pytest.importorskip('paramiko') @pytest.fixture