Simplify the over-engineered ansible rendering. Simplify docker image mgmt on Puppet so it doesn't use that awful puppetlabs-docker module
All checks were successful
CI / test (push) Successful in 20m26s
Lint / test (push) Successful in 47s

This commit is contained in:
Miguel Jacq 2026-06-19 16:32:25 +10:00
parent 05b2875c17
commit b8926f9a5f
Signed by: mig5
GPG key ID: 03906B4110AAD3B8
27 changed files with 3369 additions and 3585 deletions

View file

@ -7,11 +7,11 @@ import tarfile
import pytest
import enroll.manifest as manifest
from enroll.ansible_renderer import context as ansible_context
from enroll.ansible_renderer import jinjaturtle as ansible_jt
from enroll.ansible_renderer import layout as ansible_layout
from enroll.ansible_renderer import tasks as ansible_tasks
from enroll.ansible_renderer import yamlutil as ansible_yaml
import enroll.jinjaturtle as jinjaturtle_mod
from enroll import ansible as ansible_layout
from enroll import ansible as ansible_tasks
from enroll import ansible as ansible_yaml
from enroll import yamlutil as yaml_helpers
def _minimal_package_state(packages):
@ -829,7 +829,7 @@ def test_copy2_replace_overwrites_readonly_destination(tmp_path: Path):
import os
import stat
from enroll.ansible_renderer.layout import _copy2_replace
from enroll.ansible import _copy2_replace
src = tmp_path / "src"
dst = tmp_path / "dst"
@ -940,7 +940,7 @@ def test_manifest_includes_dnf_config_role_when_present(tmp_path: Path):
def test_render_install_packages_tasks_uses_generic_package_provider():
from enroll.ansible_renderer.tasks import _render_install_packages_tasks
from enroll.ansible import _render_install_packages_tasks
txt = _render_install_packages_tasks("role", "role")
assert "ansible.builtin.package" in txt
@ -1078,15 +1078,6 @@ def test_manifest_orders_cron_and_logrotate_at_playbook_tail(tmp_path: Path):
assert "role: users" in roles
def test_yaml_helpers_fallback_when_yaml_unavailable(monkeypatch):
monkeypatch.setattr(ansible_yaml, "_try_yaml", lambda: None)
assert ansible_yaml._yaml_load_mapping("foo: 1\n") == {}
out = ansible_yaml._yaml_dump_mapping({"b": 2, "a": 1})
# Best-effort fallback is key: repr(value)
assert out.splitlines()[0].startswith("a: ")
assert out.endswith("\n")
def test_copy2_replace_makes_readonly_sources_user_writable(
monkeypatch, tmp_path: Path
):
@ -1214,13 +1205,13 @@ def test_manifest_applies_jinjaturtle_to_jinjifyable_managed_file(
__import__("json").dumps(state), encoding="utf-8"
)
monkeypatch.setattr(ansible_context, "find_jinjaturtle_cmd", lambda: "jinjaturtle")
monkeypatch.setattr(jinjaturtle_mod, "find_jinjaturtle_cmd", lambda: "jinjaturtle")
class _Res:
template_text = "key={{ foo }}\n"
vars_text = "foo: 123\n"
monkeypatch.setattr(ansible_jt, "run_jinjaturtle", lambda *a, **k: _Res())
monkeypatch.setattr(jinjaturtle_mod, "run_jinjaturtle", lambda *a, **k: _Res())
out_dir = tmp_path / "out"
manifest.manifest(str(bundle), str(out_dir), jinjaturtle="on")
@ -1335,13 +1326,11 @@ def test_manifest_writes_firewall_runtime_role(tmp_path: Path):
).exists()
def test_try_yaml_with_yaml_installed():
result = ansible_yaml._try_yaml()
# PyYAML should be installed for tests
if result is None:
pytest.skip("PyYAML not installed")
assert hasattr(result, "safe_load")
assert hasattr(result, "dump")
def test_yamlutil_uses_pyyaml():
import yaml
assert hasattr(yaml, "safe_load")
assert hasattr(yaml, "dump")
def test_yaml_load_mapping_with_yaml(tmp_path: Path):
@ -1353,48 +1342,48 @@ list:
- item1
- item2
"""
result = ansible_yaml._yaml_load_mapping(text)
result = yaml_helpers.yaml_load_mapping(text)
assert result["key1"] == "value1"
assert result["key2"]["nested"] == "value"
assert result["list"] == ["item1", "item2"]
def test_yaml_load_mapping_empty():
result = ansible_yaml._yaml_load_mapping("")
result = yaml_helpers.yaml_load_mapping("")
assert result == {}
def test_yaml_load_mapping_invalid():
result = ansible_yaml._yaml_load_mapping("invalid: yaml: :")
result = yaml_helpers.yaml_load_mapping("invalid: yaml: :")
assert result == {}
def test_yaml_load_mapping_not_dict():
result = ansible_yaml._yaml_load_mapping("- item1\n- item2")
result = yaml_helpers.yaml_load_mapping("- item1\n- item2")
assert result == {}
def test_yaml_load_mapping_none():
result = ansible_yaml._yaml_load_mapping("~")
result = yaml_helpers.yaml_load_mapping("~")
assert result == {}
def test_yaml_dump_mapping_with_yaml(tmp_path: Path):
obj = {"key1": "value1", "key2": 123}
result = ansible_yaml._yaml_dump_mapping(obj)
result = yaml_helpers.yaml_dump_mapping(obj)
assert "key1: value1" in result
assert "key2:" in result
def test_yaml_dump_mapping_empty():
result = ansible_yaml._yaml_dump_mapping({})
result = yaml_helpers.yaml_dump_mapping({})
# Empty dict produces '{}'
assert result.strip() == "{}"
def test_yaml_dump_mapping_with_nested(tmp_path: Path):
obj = {"key1": {"nested": "value"}}
result = ansible_yaml._yaml_dump_mapping(obj)
result = yaml_helpers.yaml_dump_mapping(obj)
assert "nested:" in result
@ -1758,7 +1747,7 @@ def test_users_role_only_creates_ssh_dir_when_managed_ssh_files_exist(tmp_path):
users_defaults_text = (out / "roles" / "users" / "defaults" / "main.yml").read_text(
encoding="utf-8"
)
users_defaults = ansible_yaml._yaml_load_mapping(users_defaults_text)
users_defaults = yaml_helpers.yaml_load_mapping(users_defaults_text)
users_tasks = (out / "roles" / "users" / "tasks" / "main.yml").read_text(
encoding="utf-8"
)