0101 — Migration de la zone grise bash → Python (bench/lima/ confort)
Proposed (2026-06-30)
Prolonge 0097 (le moteur de
chemin est Python ; le bash restant = artefacts node-side) et applique
0049 /
0017 (bash node-side, Python testé) à la
dernière poche de bash d’orchestration : cinq scripts de confort dans
bench/lima/. S’inscrit dans la lignée des retraits déjà faits — le Justfile
et env.sh (redondants avec nestor). Cohérent avec
0034 (preuve banc) et
0042 (fraîcheur des preuves). Valeurs
d’exemple génériques (0023).
Contexte
Section intitulée « Contexte »Après la refonte du moteur (ADR 0097), il subsiste ~1900 lignes de bash de
confort dans bench/lima/ — access.sh (275), metrology.sh (421),
rollback-lib.sh (871), check-freshness.sh (129), gitea-init.sh (207). Un
audit de chacun (rôle réel, irréductibilité node-side, appelants, équivalent
Python, testabilité) établit un constat central : aucun n’est, en
totalité, irréductible node-side. Ce sont de l’orchestration kubectl +
calcul + parsing + rendu de fichier hôte — exactement la cible Python de
l’ADR 0097. Et le Python couvre déjà l’essentiel (history.py,
metrics.py, seed.py, graph.py) ; la « migration » est surtout brancher
l’appelant et retirer le doublon bash, pas réécrire.
Décision
Section intitulée « Décision »On migre la zone grise vers Python, par étapes prouvables, en gardant
uniquement l’irréductible node-side (qui n’est pas dans ces scripts mais
dans les primitives vm_sh/limactl et storage/ceph/cleanup.sh). Verdicts :
| Script (L) | Verdict | Pourquoi |
|---|---|---|
| gitea-init.sh (207) | SUPPRIMER | Mort : 0 appelant ; le seed est déjà live en Python (seed.py + _seed_do_banc), prouvé au banc (drift L60). Son en-tête « Sourcé par run-phases.sh » est mensonger. |
| access.sh (275) | MIGRER (nestor/access.py) | topology.py:cmd_access fait déjà subprocess → run-phases.sh → access.sh (double shell-out). Toute la plomberie Python existe (_kubectl, décodage secret, patron Popen+port-forward de seed.py). 0 % node-side. |
| check-freshness.sh (129) | MIGRER (Python) | Logique pure déjà dans history.py (parité testée). Reste ~30 L de glue + recâbler 1 ligne du workflow bench-freshness.yml. Un seul appelant (CI cron). |
| metrology.sh (421) | MIGRER le pur + SUPPRIMER le mort | ~40 % déjà porté (history.py/metrics.py) ; ~55 % record/sample/cache orphelin (run-phases.sh ne le source plus). |
| rollback-lib.sh (871) | SUPPRIMER le pur + MIGRER le reliquat | ~85 % déjà porté byte-pour-byte dans nestor/graph.py (topo_sort, 54 tests). Reste phase_rollback (orchestration kubectl) + 1 geste node-side ceph (vm_sh < cleanup.sh). |
Ordre (dégressif en risque)
Section intitulée « Ordre (dégressif en risque) »- gitea-init.sh → supprimer — mort, geste propre évident (catégorie Justfile/env.sh). Aucune dépendance.
- access.sh → migrer (
nestor/access.py) — le candidat le plus naturel : remplace le double subprocess decmd_accesspar du Python natif, banc-only, testable par stub. Corrige au passage la dette des flags morts (--print-hosts/--no-hosts) — vestiges du bloc/etc/hosts+ Gateway L7 de l’ADR 0048, déjà supplanté par l’exposition L4 NodePort (0092) : au banc unkubectl port-forwardpar UI exposée (réseau Lima isolé), en prod l’accès directhttp://<IP-nœud>:<nodePort>. La décision ADR 0048 (accès dev en une commande : URLs + secrets +.env) reste valide ; seul son mécanisme (forward SSH /*.cluster.lan) est remplacé. - check-freshness.sh → migrer — pur consommateur de
history.py, recâble 1 ligne de workflow. - metrology.sh → après (3) — quand le dernier
sourcevivant disparaît : supprimer le.sh+metrology.bats+ le bloc record/cache mort. - rollback-lib.sh → en dernier, en 2 temps — (a) migrer
phase_rollback+ primitiveskubectlvers le cheminremove --discoverPython (le geste node-side ceph passe par la couche nodeside) ; (b) alors seulement supprimer la partie pure (déjà dansgraph.py) +rollback.bats. Preuve banc obligatoire (k8s sur mono-nœud local-path ; le node-side ceph ne se prouve que sur prod, ADR 0085).
Conséquences
Section intitulée « Conséquences »- Une seule source de vérité : plus de logique dupliquée bash ↔ Python (la fraîcheur, la métrologie, l’ordre de rollback vivent en un seul endroit, testé).
bench/lima/se réduit à l’orchestrateur node-side (run-phases.sh+lib.sh+cni.sh) — l’irréductible ADR 0049, hors de cette migration.- Chaque étape est prouvable au banc ; les étapes 1–4 sont à faible risque (mort / CI / banc-only), seule l’étape 5 touche le montage et exige une preuve banc complète.
- Migrer
rollback-librésout l’issue #519 (compat bash 3.2 detopo_sort) par disparition — la version Python (graph.py) n’a pas le problème ; pas besoin de patcher le bash si on le supprime.
Ce qui RESTE en bash légitimement (pas un échec)
Section intitulée « Ce qui RESTE en bash légitimement (pas un échec) »L’irréductible node-side est plus petit que les scripts et déjà séparé :
storage/ceph/cleanup.sh: wipe disques +/var/lib/rookdans la VM.rollback-libne fait que le pousser viavm_sh; le node-side réel y reste.- L’enveloppe
vm_sh/limactl shell(transport d’un script dans la VM) — une primitive, pas la logique des 5 scripts. run-phases.sh/lib.sh(chemin nommé codé, ADR 0045 ;limactl,write_inventory) — hors périmètre, gardent leur légitimité (ADR 0049).
Mnémonique : reste en bash ce qui s’exécute dans la VM ou provisionne.
Alternatives écartées
Section intitulée « Alternatives écartées »- Tout garder en bash (statu quo) : maintient une logique dupliquée
(fraîcheur/métrologie/rollback en double bash ↔ Python), à l’encontre d’ADR
0097 ; et laisse
gitea-init.shmort avec un en-tête mensonger. - Tout migrer d’un coup (big-bang) :
rollback-libtouche le montage/démontage banc — un big-bang sans preuve par étape contredit ADR 0034. D’où l’ordre dégressif et la preuve banc en fin (étape 5). - Patcher
rollback-libpour bash 3.2 (#519) sans migrer : corrige le symptôme en gardant le doublon. Migrer le résout par disparition.