diff --git a/docs/platforms_and_mappings.rst b/docs/platforms_and_mappings.rst index 6b45b988844b78ca29cd6e3e72b13632ea91110c..cc2d024db664eea3600ab4c0c1902b35b9918ce9 100644 --- a/docs/platforms_and_mappings.rst +++ b/docs/platforms_and_mappings.rst @@ -106,3 +106,4 @@ the libvirt-ci repository, located using the ``--data-dir DIR`` argument to ``lcitool``, is extended to the following paths:: $DIR/mappings.yml + $DIR/targets/$NAME.yml diff --git a/lcitool/application.py b/lcitool/application.py index e70b391a993800c9eda306504c5e588200c870c4..e1c55f061a193ba4d22b02e9962ba8b852d9c58a 100644 --- a/lcitool/application.py +++ b/lcitool/application.py @@ -72,7 +72,7 @@ class Application: base = resource_filename(__name__, "ansible") config = Config() - targets = Targets() + targets = Targets(data_dir) inventory = Inventory(targets, config) packages = Packages(data_dir) projects = Projects(data_dir) @@ -134,7 +134,7 @@ class Application: self._entrypoint_debug(args) config = Config() - targets = Targets() + targets = Targets(args.data_dir) inventory = Inventory(targets, config) for host in sorted(inventory.hosts): print(host) @@ -142,7 +142,7 @@ class Application: def _action_targets(self, args): self._entrypoint_debug(args) - targets = Targets() + targets = Targets(args.data_dir) for target in sorted(targets.targets): if args.containerized: facts = targets.target_facts[target] @@ -167,7 +167,7 @@ class Application: facts = {} config = Config() - targets = Targets() + targets = Targets(args.data_dir) inventory = Inventory(targets, config) host = args.host target = args.target @@ -224,7 +224,7 @@ class Application: def _action_variables(self, args): self._entrypoint_debug(args) - targets = Targets() + targets = Targets(args.data_dir) packages = Packages(args.data_dir) projects = Projects(args.data_dir) projects_expanded = projects.expand_names(args.projects) @@ -253,7 +253,7 @@ class Application: def _action_dockerfile(self, args): self._entrypoint_debug(args) - targets = Targets() + targets = Targets(args.data_dir) packages = Packages(args.data_dir) projects = Projects(args.data_dir) projects_expanded = projects.expand_names(args.projects) @@ -278,7 +278,7 @@ class Application: def _action_buildenvscript(self, args): self._entrypoint_debug(args) - targets = Targets() + targets = Targets(args.data_dir) packages = Packages(args.data_dir) projects = Projects(args.data_dir) projects_expanded = projects.expand_names(args.projects) @@ -300,7 +300,7 @@ class Application: if args.base_dir is not None: base_path = Path(args.base_dir) ci_path = Path(args.ci_dir) - targets = Targets() + targets = Targets(args.data_dir) packages = Packages(args.data_dir) projects = Projects(args.data_dir) manifest = Manifest(targets, packages, projects, args.manifest, args.quiet, ci_path, base_path) diff --git a/lcitool/targets.py b/lcitool/targets.py index 1bbd2530b170093932c818d2171a823f9dc1a8a0..3d380a6f452a45ed6b3c59b3f61e5905c28533d9 100644 --- a/lcitool/targets.py +++ b/lcitool/targets.py @@ -52,18 +52,17 @@ class Targets(): def _load_target_facts(self): facts = {} all_targets = {item.stem - for item in self._data_dir.list_files("facts/targets", ".yml", - internal=True)} + for item in self._data_dir.list_files("facts/targets", ".yml")} # first load the shared facts from targets/all.yml - shared_facts = self._data_dir.load_yaml("facts/targets", "all") + shared_facts = self._data_dir.merge_facts("facts/targets", "all") # then load the rest of the facts for target in all_targets: if target == "all": continue - facts[target] = self._data_dir.load_yaml("facts/targets", target) + facts[target] = self._data_dir.merge_facts("facts/targets", target) self._validate_target_facts(facts[target], target) facts[target]["target"] = target diff --git a/lcitool/util.py b/lcitool/util.py index 9a899ba73d6321afc0c38f3c07fd3dc2a7fe9396..da7fc8bb79289cc9ee06bb437ff72f6e85be4942 100644 --- a/lcitool/util.py +++ b/lcitool/util.py @@ -253,15 +253,6 @@ class DataDir: if file.is_file() and (suffix is None or file.suffix == suffix): yield file - def load_yaml(self, resource_path, name): - file = Path(resource_filename(__name__, resource_path), name + ".yml") - if not file.exists(): - return {} - - log.debug(f"Loading facts from '{file}'") - with open(file, "r") as infile: - return yaml.safe_load(infile) - def merge_facts(self, resource_path, name): result = {} for file in self._search(resource_path, name + ".yml"): diff --git a/tests/data/targets/override/targets/centos-stream-8.yml b/tests/data/targets/override/targets/centos-stream-8.yml new file mode 100644 index 0000000000000000000000000000000000000000..6b11160fd1dc292b096d29ceca64546a35139754 --- /dev/null +++ b/tests/data/targets/override/targets/centos-stream-8.yml @@ -0,0 +1,3 @@ +paths: + pip3: /usr/bin/pip3.8 + python: /usr/bin/python3.8 diff --git a/tests/test_targets.py b/tests/test_targets.py index 61985f7f18f0c6e99c5485d48fe78acf2df6c338..9a76fc1bdab36d2d20c790322d53fb3c6e0e6e10 100644 --- a/tests/test_targets.py +++ b/tests/test_targets.py @@ -4,9 +4,14 @@ # # SPDX-License-Identifier: GPL-2.0-or-later +from pathlib import Path import pytest +from lcitool.targets import Targets +from lcitool.util import DataDir + from conftest import ALL_TARGETS +import test_utils.utils as test_utils @pytest.mark.parametrize("target", ALL_TARGETS) @@ -32,3 +37,12 @@ def test_group_vars(targets, target): assert facts["target"] == target assert facts["os"]["name"] == target_osname_map[target_os] assert facts["os"]["version"] == target_version.capitalize() + + +def test_override(): + datadir = DataDir(Path(test_utils.test_data_dir(__file__), 'override')) + targets = Targets(datadir) + facts = targets.target_facts['centos-stream-8'] + + assert facts["paths"]["pip3"] == "/usr/bin/pip3.8" + assert facts["paths"]["python"] == "/usr/bin/python3.8"