summaryrefslogtreecommitdiff
path: root/test/lib/ansible_test/_internal/ansible_util.py
diff options
context:
space:
mode:
authorMatt Clay <matt@mystile.com>2021-02-12 15:46:15 -0800
committerMatt Clay <matt@mystile.com>2021-02-13 01:05:00 -0800
commitd092356fc510069fe59258230c94871f32995c61 (patch)
tree8eee9accc8e329b0485f271597980430ec0edf5f /test/lib/ansible_test/_internal/ansible_util.py
parent133a29acb4ab06ccc881dd851febfd426b17ead5 (diff)
downloadansible-d092356fc510069fe59258230c94871f32995c61.tar.gz
Fix ansible-test handling of egg-info.
Resolves https://github.com/ansible/ansible/issues/67990
Diffstat (limited to 'test/lib/ansible_test/_internal/ansible_util.py')
-rw-r--r--test/lib/ansible_test/_internal/ansible_util.py54
1 files changed, 45 insertions, 9 deletions
diff --git a/test/lib/ansible_test/_internal/ansible_util.py b/test/lib/ansible_test/_internal/ansible_util.py
index 68298d92a1..339eff6908 100644
--- a/test/lib/ansible_test/_internal/ansible_util.py
+++ b/test/lib/ansible_test/_internal/ansible_util.py
@@ -11,6 +11,10 @@ from .constants import (
SOFT_RLIMIT_NOFILE,
)
+from .io import (
+ write_text_file,
+)
+
from .util import (
common_environment,
display,
@@ -20,6 +24,7 @@ from .util import (
ANSIBLE_TEST_DATA_ROOT,
ANSIBLE_BIN_PATH,
ANSIBLE_SOURCE_ROOT,
+ get_ansible_version,
)
from .util_common import (
@@ -75,7 +80,7 @@ def ansible_environment(args, color=True, ansible_config=None):
ANSIBLE_LIBRARY='/dev/null',
ANSIBLE_DEVEL_WARNING='false', # Don't show warnings that CI is running devel
ANSIBLE_CONTROLLER_PYTHON_WARNING='false', # Don't show warnings in CI for old controller Python
- PYTHONPATH=get_ansible_python_path(),
+ PYTHONPATH=get_ansible_python_path(args),
PAGER='/bin/cat',
PATH=path,
# give TQM worker processes time to report code coverage results
@@ -171,28 +176,59 @@ def configure_plugin_paths(args): # type: (CommonConfig) -> t.Dict[str, str]
return env
-def get_ansible_python_path(): # type: () -> str
+def get_ansible_python_path(args): # type: (CommonConfig) -> str
"""
Return a directory usable for PYTHONPATH, containing only the ansible package.
If a temporary directory is required, it will be cached for the lifetime of the process and cleaned up at exit.
"""
- if ANSIBLE_SOURCE_ROOT:
- # when running from source there is no need for a temporary directory to isolate the ansible package
- return os.path.dirname(ANSIBLE_LIB_ROOT)
-
try:
return get_ansible_python_path.python_path
except AttributeError:
pass
- python_path = create_temp_dir(prefix='ansible-test-')
- get_ansible_python_path.python_path = python_path
+ if ANSIBLE_SOURCE_ROOT:
+ # when running from source there is no need for a temporary directory to isolate the ansible package
+ python_path = os.path.dirname(ANSIBLE_LIB_ROOT)
+ else:
+ # when not running from source the installed directory is unsafe to add to PYTHONPATH
+ # doing so would expose many unwanted packages on sys.path
+ # instead a temporary directory is created which contains only ansible using a symlink
+ python_path = create_temp_dir(prefix='ansible-test-')
+
+ os.symlink(ANSIBLE_LIB_ROOT, os.path.join(python_path, 'ansible'))
+
+ if not args.explain:
+ generate_egg_info(python_path)
- os.symlink(ANSIBLE_LIB_ROOT, os.path.join(python_path, 'ansible'))
+ get_ansible_python_path.python_path = python_path
return python_path
+def generate_egg_info(path): # type: (str) -> None
+ """Generate an egg-info in the specified base directory."""
+ # minimal PKG-INFO stub following the format defined in PEP 241
+ # required for older setuptools versions to avoid a traceback when importing pkg_resources from packages like cryptography
+ # newer setuptools versions are happy with an empty directory
+ # including a stub here means we don't need to locate the existing file or have setup.py generate it when running from source
+ pkg_info = '''
+Metadata-Version: 1.0
+Name: ansible
+Version: %s
+Platform: UNKNOWN
+Summary: Radically simple IT automation
+Author-email: info@ansible.com
+License: GPLv3+
+''' % get_ansible_version()
+
+ pkg_info_path = os.path.join(path, 'ansible_core.egg-info', 'PKG-INFO')
+
+ if os.path.exists(pkg_info_path):
+ return
+
+ write_text_file(pkg_info_path, pkg_info.lstrip(), create_directories=True)
+
+
def check_pyyaml(args, version, required=True, quiet=False):
"""
:type args: EnvironmentConfig