mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-07 03:15:56 +00:00
Consumer lookup plugins now reach the merged config through the Ansible
lookup loader instead of importing get_merged_applications /
get_merged_domains from utils.cache. The merge stays one cached
implementation surfaced via the applications/config/domains/users lookups;
consumers call lookup_loader.get(...).run() (the compose_networks idiom).
- get_merged_applications walks the whole meta/ tree recursively
(meta/**/*.yml to applications.<app>.<path>, addons and any depth) and
folds the raw meta/volumes.yml subtree onto applications.<app>.volumes
after the templar render so the Jinja source: strings stay unrendered.
- 31 consumer lookups rerouted; providers (applications/config/
applications_current_play/users/domains) and the raw-volume accessors
(volume/nginx) keep the cache import behind # nocheck: lookup-cache-import.
- New lint test_no_cache_imports_in_lookups enforces the contract.
- nfs_flavor is now the flavor SPOT (svc-storage-nfs-server + nfs_client_src
resolve via lookup('nfs_flavor')); removed the unused STORAGE_NFS_FLAVOR
group_var. Extracted extract_default_credentials to
utils/cache/schema_credentials.py to keep applications.py under the cap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
"""Extract literal ``default:`` credential values from a ``meta/schema.yml``
|
|
``credentials:`` tree.
|
|
|
|
Kept in its own module so ``utils.cache.applications`` stays under the
|
|
repo's per-file line cap. Strictly ansible-free (stdlib only) so the
|
|
runner-host CLI path keeps importing it without ansible installed.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Mapping
|
|
from typing import Any
|
|
|
|
_LEAF_MARKERS: tuple[str, ...] = ("default", "algorithm", "validation", "description")
|
|
|
|
|
|
def extract_default_credentials(creds_node: Any) -> dict[str, Any]:
|
|
"""Return the subset of a ``credentials:`` tree's leaves that carry a
|
|
literal ``default:`` Jinja string.
|
|
|
|
The shape mirrors the schema tree: nested keys stay nested. The literal
|
|
string is preserved verbatim, with no rendering and no validation. Leaves
|
|
WITHOUT ``default:`` are intentionally absent so the inventory's
|
|
apply_schema-generated values win the merge.
|
|
"""
|
|
if not isinstance(creds_node, Mapping):
|
|
return {}
|
|
|
|
if any(marker in creds_node for marker in _LEAF_MARKERS):
|
|
return {}
|
|
|
|
out: dict[str, Any] = {}
|
|
for key, value in creds_node.items():
|
|
if not isinstance(value, Mapping):
|
|
continue
|
|
if any(marker in value for marker in _LEAF_MARKERS):
|
|
if "default" in value:
|
|
out[key] = value["default"]
|
|
else:
|
|
nested = extract_default_credentials(value)
|
|
if nested:
|
|
out[key] = nested
|
|
return out
|