diff --git a/ansible-packaging.spec b/ansible-packaging.spec index 08cb792..96f8cb8 100644 --- a/ansible-packaging.spec +++ b/ansible-packaging.spec @@ -2,7 +2,7 @@ Name: ansible-packaging Version: 1 -Release: 19.1%{?dist} +Release: 12%{?dist} Summary: RPM packaging macros and generators for Ansible collections License: GPL-3.0-or-later @@ -147,40 +147,12 @@ echo "Ensure macro prefers the collection namespace and name passed as an argume # ansible-core in RHEL 8.6 is built against python38. In c8s and the next RHEL # 8 minor release, it will be built against python39. The testing dependencies # are not yet packaged for either python version in EPEL 8. -# -# The ansible-test binary is unshipped in EL 10, so we cannot ship the tests -# subpackage yet. -# https://issues.redhat.com/browse/RHEL-69915 -%if %{undefined el8} && %{undefined el10} +%if ! (%{defined rhel} && 0%{?rhel} < 9) %files tests %endif %changelog -* Fri Jan 16 2026 Fedora Release Engineering - 1-19.1 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild - -* Wed Jul 23 2025 Fedora Release Engineering - 1-18.1 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Thu Jan 16 2025 Fedora Release Engineering - 1-17.1 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Tue Dec 17 2024 Maxwell G - 1-16.1 -- Temporarily disable tests subpackage on EL 10 - -* Wed Jul 17 2024 Fedora Release Engineering - 1-16 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Sat Feb 10 2024 Maxwell G - 1-15 -- %%ansible_test_unit: handle test dependencies on other collections - -* Mon Jan 22 2024 Fedora Release Engineering - 1-14 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Fri Jan 19 2024 Fedora Release Engineering - 1-13 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - * Tue Dec 05 2023 Maxwell G - 1-12 - %%ansible_collection_url: handle new URL scheme @@ -192,8 +164,8 @@ echo "Ensure macro prefers the collection namespace and name passed as an argume - ansible-packaging-tests - don't depend on pytest-forked with ansible-core 2.16 - ansible-srpm-macros - include license file in the package -* Wed Jan 18 2023 Fedora Release Engineering - 1-9.1 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild +* Mon Jan 30 2023 Miro HronĨok - 1-8.2 +- Rebuilt to change Python shebangs to /usr/bin/python3.6 on EPEL 8 * Sat Sep 24 2022 Maxwell G - 1-8.1 - Refactor %%ansible_collection_url, %%ansible_collection_install, diff --git a/ansible_collection.py b/ansible_collection.py index c549283..80c4b33 100755 --- a/ansible_collection.py +++ b/ansible_collection.py @@ -19,15 +19,13 @@ the provided arguments. """ import argparse -import json import os import shutil import subprocess import sys -from itertools import chain from pathlib import Path from tempfile import TemporaryDirectory -from typing import Any, Dict, Optional, Sequence, Tuple, Union +from typing import Any, Dict, Optional, Sequence, Union from yaml import CSafeLoader, load @@ -66,7 +64,6 @@ class AnsibleCollection: "ansible-galaxy", "collection", "install", - "--force", "-n", "-p", str(destdir), @@ -87,24 +84,13 @@ class AnsibleCollection: with open(filelist, "w", encoding="utf-8") as file: file.write(contents) - def unit_test( - self, - extra_args: Sequence[str], - extra_paths: Sequence[Path], - collections: Sequence[str], - ) -> None: - with TemporaryDirectory() as _temp: - temp = Path(_temp) - temppath = temp / "ansible_collections" / self.namespace / self.name + def unit_test(self, extra_args: Sequence) -> None: + with TemporaryDirectory() as temp: + temppath = Path(temp) / "ansible_collections" / self.namespace / self.name shutil.copytree( self.collection_srcdir, temppath, ) - collection_paths = ( - self._get_collection_path(collection) for collection in collections - ) - for extra in chain(collection_paths, extra_paths): - self._handle_extra_path(temp, extra) args = ("ansible-test", "units", *extra_args) print(f"Running: {args}") print() @@ -118,67 +104,10 @@ class AnsibleCollection: env={**os.environ, "ANSIBLE_GALAXY_COLLECTIONS_PATH_WARNING": "0"}, ) - def _get_collection_path(self, collection: str) -> Path: - proc = subprocess.run( - ["ansible-galaxy", "collection", "list", "--format=json", collection], - check=True, - universal_newlines=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - # { - # "/usr/share/ansible/collections/ansible_collections": { - # "community.general": { - # "version": "8.2.0" - # } - # } - # } - data: Dict[str, Dict[str, Any]] = json.loads(proc.stdout) - for path, collection_part in data.items(): - version = collection_part[collection]["version"] - print(f"Using locally-installed version {version} of {collection}") - return Path(path, *collection.split(".", 1)) - raise CollectionError(f"Failed to add {collection} to the test tree") - - def _handle_extra_path(self, collection_tree: Path, extra_path: Path) -> None: - namespace_name = _get_namespace_name(extra_path) - if namespace_name == (self.namespace, self.name): - raise CollectionError( - f"{extra_path} is the same collection as {self.collection_srcdir}" - ) - new_path = Path(collection_tree, "ansible_collections", *namespace_name) - if new_path.is_dir(): - raise CollectionError( - f"Cannot copy {extra_path}." - f" Collection {namespace_name} was already added." - ) - print( - f"Copying {extra_path} ({'.'.join(namespace_name)}) to the collection tree" - ) - shutil.copytree(extra_path, new_path) - - -def _get_namespace_name(extra_path: Path) -> Tuple[str, str]: - data_file = extra_path / "MANIFEST.json" - data_file2 = extra_path / "galaxy.yml" - if data_file.is_file(): - with data_file.open("r", encoding="utf-8") as fp: - data = json.load(fp)["collection_info"] - elif data_file2.is_file(): - data_file = data_file2 - with data_file2.open("r", encoding="utf-8") as fp: - data = load(fp, Loader=CSafeLoader) - else: - raise CollectionError(f"No metadata file found for collection in {extra_path}") - expected_keys = {"namespace", "name"} - if set(data) & expected_keys != expected_keys: - raise CollectionError(f"Invalid metadata file: {data_file}") - return data["namespace"], data["name"] - def parseargs() -> argparse.Namespace: parser = argparse.ArgumentParser( - description="Install and test Ansible Collections in an rpmbuild environment" + "Install and test Ansible Collections in an rpmbuild environment" ) subparsers = parser.add_subparsers(dest="action") install_parser = subparsers.add_parser( @@ -203,33 +132,13 @@ def parseargs() -> argparse.Namespace: help="Run ansible-test unit after creating the necessary directory structure", ) test_parser.add_argument( - "-p", - "--extra-path", - dest="extra_paths", - action="append", - help="Path to an extra collection include in the test ansible_collection tree", - type=Path, + "extra_args", nargs="*", help="Extra arguments to pass to ansible-test" ) - test_parser.add_argument( - "-c", - "--collection", - action="append", - dest="collections", - help="Add a collection from the collection path to the test tree", - ) - test_parser.set_defaults(allow_extra_args=True) - args, extra_args = parser.parse_known_args() + args = parser.parse_args() # add_subparsers does not support required on Python 3.6 if not args.action: parser.print_usage() sys.exit(2) - if extra_args: - if not getattr(args, "allow_extra_args", False): - parser.error(f"unrecognized arguments: {' '.join(extra_args)}") - if extra_args and extra_args[0] == "--": - extra_args = extra_args[1:] - args.extra_args = extra_args - vars(args).pop("allow_extra_args", None) return args @@ -240,15 +149,11 @@ def main(): collection.install(args.collections_dir) collection.write_filelist(args.filelist) elif args.action == "test": - collection.unit_test( - args.extra_args, - (args.extra_paths or ()), - (args.collections or ()), - ) + collection.unit_test(args.extra_args) if __name__ == "__main__": try: main() except (CollectionError, subprocess.CalledProcessError) as err: - sys.exit(str(err)) + sys.exit(err) diff --git a/macros.ansible b/macros.ansible index 2cc3c2e..db2269a 100644 --- a/macros.ansible +++ b/macros.ansible @@ -16,9 +16,9 @@ --filelist %{ansible_collection_filelist} } -%ansible_test_unit(p:c:) %{shrink: -%{_rpmconfigdir}/ansible_collection.py test -%{**} --python-interpreter %{__python3} --local +%ansible_test_unit() %{shrink: +%{_rpmconfigdir}/ansible_collection.py test -- +--python-interpreter %{__python3} --local %{?*} } # TODO: Officially deprecate this macro and add the following line to the macro diff --git a/tox.ini b/tox.ini deleted file mode 100644 index ee08526..0000000 --- a/tox.ini +++ /dev/null @@ -1,34 +0,0 @@ -[tox] -env_list = - formatters - lint - typing-py{36,39,311,312} - -[testenv:formatters] -description = Run formatters -skip_install = true -deps = - isort - black -commands = - black {posargs} ansible_collection.py ansible-generator - isort {posargs} ansible_collection.py ansible-generator - -[testenv:lint] -description = Run linters -skip_install = true -deps = - ruff -commands = - ruff check {posargs} ansible_collection.py ansible-generator - -[testenv:typing-py{36,39,311,312}] -description = Run type checkers -skip_install = true -deps = - mypy - types-pyyaml -commands = - mypy {posargs} ansible_collection.py ansible-generator -set_env = - PYTHONPATH=${PWD}