Set-OPS-Public/scripts/tests/test_expositions_sans_port.py

56 lines
2.7 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""Une exposition SANS PORT n'est jamais attribuee a l'edge du domaine.
POURQUOI (2026-09-29). Un edge ne publie que ce qui a un port : nginx n'ecrit un vhost que
pour une exposition qui en porte un. Le site expose aussi `sauvegarde` (SFTP), `pki` et
`dns` sans port web. Quand `genese.internal` a recu un edge, la derivation lui a attribue
ces trois noms ; la zone et le plancher les ont fait pointer vers `site-edge-01`, et les
sauvegardes des deux locataires y seraient allees frapper un sshd qui n'est pas le leur.
"""
from __future__ import annotations
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from inventory_rules import expositions_des_applications # noqa: E402
APPS = {"applications": {
"forge": {"groupe": "serveur_forgejo", "hote": "forge-01", "port": 443, "expose": ["forge.ex.internal"]},
"backup": {"groupe": "serveur_backup_site", "hote": "backup-01", "expose": ["sauvegarde.ex.internal"]},
"pki": {"groupe": "serveur_step_ca", "hote": "pki-01", "port": None, "expose": ["pki.ex.internal"]},
}}
DOMS = {"domaines_publics": {"ex.internal": {"edge": "serveur_nginx"}}}
def main() -> int:
edges = {e["fqdn"]: e["edge"] for e in expositions_des_applications(APPS, DOMS)}
attendu = {"forge.ex.internal": "serveur_nginx",
"sauvegarde.ex.internal": "serveur_backup_site",
"pki.ex.internal": "serveur_step_ca"}
if edges != attendu:
print(f"ECHEC attendu {attendu}, obtenu {edges}")
return 1
sans_edge = {e["fqdn"]: e["edge"] for e in expositions_des_applications(APPS, {"domaines_publics": {}})}
if sans_edge["forge.ex.internal"] != "serveur_forgejo":
print(f"ECHEC sans edge declare, le service doit se servir lui-meme : {sans_edge}")
return 1
vues = {e["fqdn"]: e["resout_vers"] for e in expositions_des_applications(APPS, DOMS)}
if vues != {"forge.ex.internal": "edge", "sauvegarde.ex.internal": "service",
"pki.ex.internal": "service"}:
print(f"ECHEC resolution par defaut : attendu l'edge pour ce qu'il sert, obtenu {vues}")
return 1
service = {"domaines_publics": {"ex.internal": {"edge": "serveur_nginx",
"resolution_interne": "service"}}}
vues = {e["fqdn"]: e["resout_vers"] for e in expositions_des_applications(APPS, service)}
if set(vues.values()) != {"service"}:
print(f"ECHEC `resolution_interne: service` : tout nom doit mener au service ({vues})")
return 1
print("OK — avec port : l'edge du domaine ; sans port : le service lui-meme ; "
"`resolution_interne: service` : chaque nom mene a son service.")
return 0
if __name__ == "__main__":
sys.exit(main())