Compare commits
5 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
241960a806 |
||
|
|
99f2987ac4 |
||
|
|
65fa10e6c8 |
||
|
|
2fb312451a |
||
|
|
a1ccc1599e |
4 changed files with 16 additions and 173 deletions
|
|
@ -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 <releng@fedoraproject.org> - 1-19.1
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
|
||||
|
||||
* Wed Jul 23 2025 Fedora Release Engineering <releng@fedoraproject.org> - 1-18.1
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
|
||||
|
||||
* Thu Jan 16 2025 Fedora Release Engineering <releng@fedoraproject.org> - 1-17.1
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
|
||||
|
||||
* Tue Dec 17 2024 Maxwell G <maxwell@gtmx.me> - 1-16.1
|
||||
- Temporarily disable tests subpackage on EL 10
|
||||
|
||||
* Wed Jul 17 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1-16
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
|
||||
|
||||
* Sat Feb 10 2024 Maxwell G <maxwell@gtmx.me> - 1-15
|
||||
- %%ansible_test_unit: handle test dependencies on other collections
|
||||
|
||||
* Mon Jan 22 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1-14
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Fri Jan 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1-13
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Tue Dec 05 2023 Maxwell G <maxwell@gtmx.me> - 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 <releng@fedoraproject.org> - 1-9.1
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||
* Mon Jan 30 2023 Miro Hrončok <mhroncok@redhat.com> - 1-8.2
|
||||
- Rebuilt to change Python shebangs to /usr/bin/python3.6 on EPEL 8
|
||||
|
||||
* Sat Sep 24 2022 Maxwell G <gotmax@e.email> - 1-8.1
|
||||
- Refactor %%ansible_collection_url, %%ansible_collection_install,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
34
tox.ini
34
tox.ini
|
|
@ -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}
|
||||
Loading…
Add table
Add a link
Reference in a new issue