Simplify the over-engineered ansible rendering. Simplify docker image mgmt on Puppet so it doesn't use that awful puppetlabs-docker module
This commit is contained in:
parent
05b2875c17
commit
b8926f9a5f
27 changed files with 3369 additions and 3585 deletions
|
|
@ -2,8 +2,7 @@ import json
|
|||
from pathlib import Path
|
||||
|
||||
import enroll.manifest as manifest_mod
|
||||
from enroll.ansible_renderer import context as ansible_context
|
||||
from enroll.ansible_renderer import jinjaturtle as ansible_jt
|
||||
import enroll.jinjaturtle as jinjaturtle_mod
|
||||
from enroll.jinjaturtle import JinjifyResult
|
||||
|
||||
|
||||
|
|
@ -108,7 +107,7 @@ def test_manifest_uses_jinjaturtle_templates_and_does_not_copy_raw(
|
|||
|
||||
# Pretend jinjaturtle exists.
|
||||
monkeypatch.setattr(
|
||||
ansible_context, "find_jinjaturtle_cmd", lambda: "/usr/bin/jinjaturtle"
|
||||
jinjaturtle_mod, "find_jinjaturtle_cmd", lambda: "/usr/bin/jinjaturtle"
|
||||
)
|
||||
|
||||
# Stub jinjaturtle output.
|
||||
|
|
@ -121,7 +120,7 @@ def test_manifest_uses_jinjaturtle_templates_and_does_not_copy_raw(
|
|||
vars_text="foo_key: 1\n",
|
||||
)
|
||||
|
||||
monkeypatch.setattr(ansible_jt, "run_jinjaturtle", fake_run_jinjaturtle)
|
||||
monkeypatch.setattr(jinjaturtle_mod, "run_jinjaturtle", fake_run_jinjaturtle)
|
||||
|
||||
manifest_mod.manifest(str(bundle), str(out), jinjaturtle="on")
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from enroll.cm import CMModule
|
||||
from enroll.ansible_renderer.model import AnsibleRole
|
||||
from enroll.ansible import AnsibleRole
|
||||
|
||||
|
||||
def test_ansible_role_extends_cm_module_and_normalises_service_snapshot():
|
||||
|
|
|
|||
|
|
@ -675,7 +675,6 @@ def test_manifest_puppet_renders_container_images_static_and_hiera(tmp_path: Pat
|
|||
bundle = tmp_path / "bundle"
|
||||
out = tmp_path / "puppet"
|
||||
_write_state(bundle, state)
|
||||
|
||||
manifest.manifest(str(bundle), str(out), target="puppet")
|
||||
|
||||
site_pp = (out / "manifests" / "site.pp").read_text(encoding="utf-8")
|
||||
|
|
@ -683,8 +682,10 @@ def test_manifest_puppet_renders_container_images_static_and_hiera(tmp_path: Pat
|
|||
pp = (out / "modules" / "container_images" / "manifests" / "init.pp").read_text(
|
||||
encoding="utf-8"
|
||||
)
|
||||
assert "docker::image" in pp
|
||||
assert "image_digest => 'sha256:" + "a" * 64 + "'" in pp
|
||||
assert "docker::image" not in pp
|
||||
assert "docker pull" in pp
|
||||
assert "Docker::Image" not in pp
|
||||
assert digest in pp
|
||||
assert "docker tag" in pp
|
||||
assert "podman pull" in pp
|
||||
metadata = json.loads(
|
||||
|
|
@ -692,9 +693,7 @@ def test_manifest_puppet_renders_container_images_static_and_hiera(tmp_path: Pat
|
|||
encoding="utf-8"
|
||||
)
|
||||
)
|
||||
assert metadata["dependencies"] == [
|
||||
{"name": "puppetlabs-docker", "version_requirement": ">= 8.0.0 < 15.0.0"}
|
||||
]
|
||||
assert metadata["dependencies"] == []
|
||||
|
||||
fqdn_out = tmp_path / "puppet-fqdn"
|
||||
manifest.manifest(str(bundle), str(fqdn_out), target="puppet", fqdn="node.example")
|
||||
|
|
@ -706,7 +705,8 @@ def test_manifest_puppet_renders_container_images_static_and_hiera(tmp_path: Pat
|
|||
fqdn_out / "modules" / "container_images" / "manifests" / "init.pp"
|
||||
).read_text(encoding="utf-8")
|
||||
assert "Array[Hash] $container_images = []" in fqdn_pp
|
||||
assert "docker::image" in fqdn_pp
|
||||
assert "docker::image" not in fqdn_pp
|
||||
assert "enroll-docker-pull-${idx}" in fqdn_pp
|
||||
assert "enroll-podman-pull-${idx}" in fqdn_pp
|
||||
assert "$image['pull_cmd']" in fqdn_pp
|
||||
assert "podman pull" in (
|
||||
|
|
|
|||
|
|
@ -469,7 +469,7 @@ def test_manifest_salt_renders_container_images_in_single_and_fqdn_modes(
|
|||
|
||||
|
||||
def test_manifest_salt_uses_jinjaturtle_templates(monkeypatch, tmp_path: Path):
|
||||
from enroll import salt as salt_mod
|
||||
import enroll.jinjaturtle as jinjaturtle_mod
|
||||
from enroll.jinjaturtle import JinjifyResult
|
||||
|
||||
bundle = tmp_path / "bundle"
|
||||
|
|
@ -479,9 +479,9 @@ def test_manifest_salt_uses_jinjaturtle_templates(monkeypatch, tmp_path: Path):
|
|||
_write_state(bundle, state)
|
||||
|
||||
monkeypatch.setattr(
|
||||
salt_mod, "find_jinjaturtle_cmd", lambda: "/usr/bin/jinjaturtle"
|
||||
jinjaturtle_mod, "find_jinjaturtle_cmd", lambda: "/usr/bin/jinjaturtle"
|
||||
)
|
||||
monkeypatch.setattr(salt_mod, "can_jinjify_path", lambda _path: True)
|
||||
monkeypatch.setattr(jinjaturtle_mod, "can_jinjify_path", lambda _path: True)
|
||||
|
||||
def fake_run_jinjaturtle(
|
||||
jt_exe: str, src_path: str, *, role_name: str, force_format=None
|
||||
|
|
@ -494,7 +494,7 @@ def test_manifest_salt_uses_jinjaturtle_templates(monkeypatch, tmp_path: Path):
|
|||
vars_text="foo_setting: true\n",
|
||||
)
|
||||
|
||||
monkeypatch.setattr(salt_mod, "run_jinjaturtle", fake_run_jinjaturtle)
|
||||
monkeypatch.setattr(jinjaturtle_mod, "run_jinjaturtle", fake_run_jinjaturtle)
|
||||
|
||||
manifest.manifest(str(bundle), str(out), target="salt", jinjaturtle="on")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue