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 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-06-23 20:22:33 -04:00
parent 113e78ee02
commit dd664dcddb
2 changed files with 10 additions and 4 deletions

View file

@ -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.)*

View file

@ -844,13 +844,18 @@ HTML = r"""<!doctype html>
${lignesDsn(bg, a => 'BD partagée ' + (a.usage || ''))}
</div>`;
}).join('');
const ligneLien = (etiquette, valeur) => `<div class="ch-base"><span class="badge-bd">${etiquette}</span> <span class="mono">${echapper(valeur)}</span></div>`;
const appHtml = apps.map(app => {
const dsns = basesDeApp(app, hote.nom);
const bd = dsns.length ? lignesDsn(dsns, a => (a.portee || 'groupe') + ' · ' + (a.usage || ''))
: '<div class="ch-stub">aucune base liée</div>';
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(`<div class="ch-base"><span class="badge-bd">BD ${echapper((a.portee || 'groupe') + ' · ' + (a.usage || ''))}</span> <span class="mono">${echapper(dsnBase(a))}</span></div>`));
const corps = liens.length ? `<div class="ch-bases">${liens.join('')}</div>` : '<div class="ch-stub">aucun lien</div>';
const port = String(app.port || '').trim() ? ` <span class="ch-meta">:${echapper(app.port)}</span>` : '';
return `<div class="ch-grp">
<div class="ch-grp-tete"><span class="badge-bd">app</span><span>${echapper(app.id)}</span><span class="ch-fleche"></span><span class="mono">${echapper(app.groupe)}</span></div>
${bd}
<div class="ch-grp-tete"><span class="badge-bd">app</span><span>${echapper(app.id)}</span>${port}<span class="ch-fleche"></span><span class="mono">${echapper(app.groupe)}</span></div>
${corps}
</div>`;
}).join('');
const appSection = apps.length ? `<div class="section-tete" style="margin:6px 2px 2px">Applications sur cet hôte <span class="compte">${apps.length}</span></div>${appHtml}` : '';