From dd664dcddb08add33a172ff2573f2185ca1b88fc Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Tue, 23 Jun 2026 20:22:33 -0400 Subject: [PATCH] Phase 2 (debut) : vue Chaine holistique La vue Chaine de make inventaire-ui montre, par application, l'ensemble de ses liens (expose, requiert, bases/DSN, port) : on voit comment VM, applications, bases et domaines s'articulent. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 1 + scripts/inventory_gui.py | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1472c7a..9f16f53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2026-06-23 ### Modifié +- **Phase 2 (début) — vue Chaîne holistique.** Dans `make inventaire-ui`, la vue Chaîne montre désormais, pour chaque application d'un hôte, l'ensemble de ses liens : `expose` (FQDN publics), `requiert` (applications dont elle dépend) et ses bases (DSN), plus son port. On voit d'un coup d'œil comment VM, applications, bases et domaines s'articulent. - **Phase 1b — clarté de nommage.** La clé `domaines:` de `docs/nomenclature.yml` (familles fonctionnelles : `infra-pki`, `web-frontal`…) est renommée **`fonctions:`** pour lever la collision avec les domaines DNS (`docs/domaines.yml`). L'auto-proposition du GUI suit (`fonctionDe` / `infoFonction`, `nomenclature.fonctions`, libellés « Fonction inconnue… », placeholder `fonction-NN`). Aucun rôle ni inventaire impacté : la nomenclature n'est consommée qu'au moment de la planification. - **Refonte « application-hub », Phase 1 — les liens deviennent explicites (inventaire inchangé, zéro régression).** L'application porte désormais tous ses liens : `groupe` (capacité/rôle), `hote` (VM), `port`, **`requiert`** (autres applications dont elle dépend) et **`expose`** (FQDN publics qui la publient). L'**exposition DNS quitte `docs/domaines.yml`** (le bloc `exposition` est retiré) et vit sur l'application via `expose` ; `docs/domaines.yml` ne décrit plus que les zones (autorité, edge, secondaires, dnssec, mail). `serveurs_nginx` dérive ses vhosts des **applications** (`expose` + edge du domaine), résolvant `application → hôte → IP` (rôle + `expositions.conf.j2` réécrits). Nouvelle règle partagée `expositions_des_applications` (+ `domaine_parent`) dans `inventory_rules.py`, exposée à Ansible par le filter plugin ; `valider_applications` valide `requiert` (applis connues), `expose` (domaine parent déclaré) et `port`. CLI (`applications.py --port/--requiert/--expose`, `domaines.py` affiche les expositions dérivées) et **GUI** (champs Port/Requiert/Expose sur la fiche Application, persistés) suivent ; l'API expose aussi le registre des domaines. Le groupe n'est plus une cible de liaison, seulement une capacité. *(Renommage `nomenclature.domaines:` → `fonctions:` reporté en Phase 1b ; génération de l'inventaire depuis le plan en Phase 3.)* diff --git a/scripts/inventory_gui.py b/scripts/inventory_gui.py index c28e8d8..925e021 100644 --- a/scripts/inventory_gui.py +++ b/scripts/inventory_gui.py @@ -844,13 +844,18 @@ HTML = r""" ${lignesDsn(bg, a => 'BD partagée ' + (a.usage || ''))} `; }).join(''); + const ligneLien = (etiquette, valeur) => `
${etiquette} ${echapper(valeur)}
`; const appHtml = apps.map(app => { const dsns = basesDeApp(app, hote.nom); - const bd = dsns.length ? lignesDsn(dsns, a => (a.portee || 'groupe') + ' · ' + (a.usage || '')) - : '
aucune base liée
'; + const liens = []; + if (String(app.expose || '').trim()) liens.push(ligneLien('expose', app.expose)); + if (String(app.requiert || '').trim()) liens.push(ligneLien('requiert', app.requiert)); + dsns.forEach(a => liens.push(`
BD ${echapper((a.portee || 'groupe') + ' · ' + (a.usage || ''))} ${echapper(dsnBase(a))}
`)); + const corps = liens.length ? `
${liens.join('')}
` : '
aucun lien
'; + const port = String(app.port || '').trim() ? ` :${echapper(app.port)}` : ''; return `
-
app${echapper(app.id)}${echapper(app.groupe)}
- ${bd} +
app${echapper(app.id)}${port}${echapper(app.groupe)}
+ ${corps}
`; }).join(''); const appSection = apps.length ? `
Applications sur cet hôte ${apps.length}
${appHtml}` : '';