summaryrefslogtreecommitdiff
path: root/test/lib
diff options
context:
space:
mode:
authorMatt Clay <matt@mystile.com>2023-02-23 12:45:43 -0800
committerGitHub <noreply@github.com>2023-02-23 12:45:43 -0800
commit6bfe6b899a4881ebc065834a43a26e123d7fdab3 (patch)
tree24b21bea3cd65c6cb85cb4f1391a48751998b6e6 /test/lib
parent56036013cd09db0f1b20402a69be44345ddafb22 (diff)
downloadansible-6bfe6b899a4881ebc065834a43a26e123d7fdab3.tar.gz
ansible-test - Fix vendoring support (#80074)
- Support loading of vendored Python packages. - Exclude vendored Python packages from payloads.
Diffstat (limited to 'test/lib')
-rw-r--r--test/lib/ansible_test/_internal/payload.py8
-rw-r--r--test/lib/ansible_test/_internal/util.py17
2 files changed, 25 insertions, 0 deletions
diff --git a/test/lib/ansible_test/_internal/payload.py b/test/lib/ansible_test/_internal/payload.py
index f62dc2baa8..10dde7b8b1 100644
--- a/test/lib/ansible_test/_internal/payload.py
+++ b/test/lib/ansible_test/_internal/payload.py
@@ -48,6 +48,14 @@ def create_payload(args: CommonConfig, dst_path: str) -> None:
permissions: dict[str, int] = {}
filters: dict[str, t.Callable[[tarfile.TarInfo], t.Optional[tarfile.TarInfo]]] = {}
+ # Exclude vendored files from the payload.
+ # They may not be compatible with the delegated environment.
+ files = [
+ (abs_path, rel_path) for abs_path, rel_path in files
+ if not rel_path.startswith('lib/ansible/_vendor/')
+ or rel_path == 'lib/ansible/_vendor/__init__.py'
+ ]
+
def apply_permissions(tar_info: tarfile.TarInfo, mode: int) -> t.Optional[tarfile.TarInfo]:
"""
Apply the specified permissions to the given file.
diff --git a/test/lib/ansible_test/_internal/util.py b/test/lib/ansible_test/_internal/util.py
index 53959d41a2..029f73be22 100644
--- a/test/lib/ansible_test/_internal/util.py
+++ b/test/lib/ansible_test/_internal/util.py
@@ -23,10 +23,14 @@ import time
import functools
import shlex
import typing as t
+import warnings
from struct import unpack, pack
from termios import TIOCGWINSZ
+# CAUTION: Avoid third-party imports in this module whenever possible.
+# Any third-party imports occurring here will result in an error if they are vendored by ansible-core.
+
try:
from typing_extensions import TypeGuard # TypeGuard was added in Python 3.10
except ImportError:
@@ -339,6 +343,17 @@ def get_ansible_version() -> str:
return ansible_version
+def _enable_vendoring() -> None:
+ """Enable support for loading Python packages vendored by ansible-core."""
+ # Load the vendoring code by file path, since ansible may not be in our sys.path.
+ # Convert warnings into errors, to avoid problems from surfacing later.
+
+ with warnings.catch_warnings():
+ warnings.filterwarnings('error')
+
+ load_module(os.path.join(ANSIBLE_LIB_ROOT, '_vendor', '__init__.py'), 'ansible_vendor')
+
+
@cache
def get_available_python_versions() -> dict[str, str]:
"""Return a dictionary indicating which supported Python versions are available."""
@@ -1154,3 +1169,5 @@ def type_guard(sequence: c.Sequence[t.Any], guard_type: t.Type[C]) -> TypeGuard[
display = Display() # pylint: disable=locally-disabled, invalid-name
+
+_enable_vendoring()