infra : la zone or tourne en cron, et la documentation dit vrai #159
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!159
Loading…
Reference in a new issue
No description provided.
Delete branch "lenaic/136-zone-or-en-cron"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
infra : la zone or tourne en cron
La zone or en base est ce que lisent l'API, Grafana métier, les règles de
recommandation et le futur modèle. Elle est modélisée, testée et documentée — et
elle ne tourne pas. Vérifié sur le serveur le 06/09 :
public.mesure = 0,qualite_jour = 0,prevision = 0.Ce que ça change
taches_planifieesporte deux entrées de plus, chaînées derrière la passe argent :silver-daily.shsilver.loggold-daily.shgold.logload-postgres.shgold.logMême journal pour les deux nouvelles : c'est un seul geste, « la journée passe
en base », et lire deux fichiers pour savoir où il s'est arrêté est exactement ce
qu'on ne veut pas faire en panne.
Le piège, et pourquoi la variable est dans la même PR
La ligne de cron seule n'aurait rien changé.
load-postgres.shlitENERVISION_ETL_DATABASE_URLdans/etc/enervision/postgres.env; le gabarit nerendait que les
PG_*_PASSWORD. Vérifié sur le serveur : la variable estabsente. Le job serait sorti en code 2 à chaque passe — la zone or grossit
dans MinIO,
gold-dailyréussit à la minute 17, et la base reste vide. Une passesur deux réussit, ce qui rend le cas invisible dans un journal que personne ne lit.
Le manuel donne la signature exacte à chercher dans
gold.log.Hygiène documentaire portée par cette PR
Ces corrections vont dans les PR concernées, jamais en PR à part : une PR
« virgules » est du bruit que personne ne relit.
README.md:services/etl/y était listé deux fois ;tests/annonçaitdu bout en bout que
tests/e2e/ne contient pas.docs/api/decisions.md: « ADR à écrire » pour le jeton, alors que l'ADR 0002existe depuis le 02/09.
tests/unit/README.mdettests/e2e/README.mddisent ce qu'ils contiennent..mailmap:git shortlog -sneest la preuve de croisement du §9 desexigences collectives, et elle comptait quinze auteurs pour six personnes.
Elle en compte huit. Aucune adresse n'est inventée ; les deux identités
restantes sont laissées à part et expliquées dans le fichier. Gabriel, si
Gabouilest bien toi, la ligne à ajouter est écrite en commentaire.Preuve
ansible-playbook site.yml --syntax-check: sans erreuryamllint infra/ansible: propreansible-playbook tests/ci/test-role-app.yml: 10 contrôles, 0 échectests/ci/test-liens-markdown.sh: 149 liens, aucun cassé--check --diff --limit prod: non joué, le coffre est chiffré⚠️ À savoir pour le déploiement
Le serveur est à
eb12df2et a 52 commits de retard.gold-daily.shestarrivé au commit
dcc76db, soit deux heures après la version déployée : lescript n'existe pas sur la machine. Ce déploiement doit donc porter
developet cette PR ensemble — sinon le cron pointe vers un script absent.
Exigences : EF-12, ENF-04. Suite des #136 et #44.
C'est le retour principal. Toute la PR existe parce que ENERVISION_ETL_DATABASE_URL était absente sans que rien ne le dise. Or tests/ci/test-role-app.yml n'assertionne que le texte source des tâches du rôle (bloc_cron, bloc_stat…) et ne regarde aucun gabarit. La variable peut donc redisparaître d'un postgres.env.j2 sans qu'un seul contrôle bronche, et on retombe exactement dans le mode de panne que le manuel décrit si bien.
Le fichier de test lit déjà du source à la main, l'ajout est de trois lignes : charger roles/app/templates/postgres.env.j2 et asserter qu'il porte ENERVISION_ETL_DATABASE_URL=. Idem pour les deux entrées de taches_planifiees si tu veux fermer complètement.
agreger_un_jour écrit deux partitions successives et non atomiques : ecrire_partition(... TABLE_MESURE) puis qualite.ecrire_qualite_jour (agregation.py:184-191). Si gold-daily dépasse dix minutes — ou si un rejeu manuel tourne à 26 —, load-postgres lit une partition à moitié réécrite : mesure neuve, qualite_jour ancienne, et l'on conflict do update grave le mélange.
Le manuel voit le symptôme (« un écart entre les deux comptes veut dire qu'un rejeu manuel a tourné entre-temps ») mais ne retient que la cause manuelle. Deux issues : un flock sur un même verrou dans les deux lanceurs, ou une phrase dans vars.yml expliquant pourquoi dix minutes suffisent avec marge. Un chiffre de durée observée de gold-daily trancherait.
Le commentaire du gabarit décrit le piège avec précision, puis remet la correction au jour de la panne (« le jour où ce mot de passe doit en contenir un, encoder ici »). C'est le contraire de ce que la PR défend partout ailleurs. Attention si tu corriges : | urlencode de Jinja laisse / dans les caractères sûrs, il ne suffit pas seul.
L'idiome du dépôt existe déjà : la tâche « Refuser de déployer sans les secrets du coffre » (main.yml:12) est l'endroit pour une assertion « le mot de passe applicatif ne contient aucun de @:/?#% ou espace ». Panne au déploiement plutôt qu'en exploitation.
Les trois sont traités dans
fa69e14, et j'ai suivi ta rédaction sur deux, passur la troisième.
1. Le verrou, et pas une phrase sur les dix minutes
Tu avais raison sur le mode de panne, et j'ai pris ton premier remède. Un chiffre
de durée vieillira avec le volume, le verrou non, et je ne peux même pas le
relever aujourd'hui puisque la zone or n'est pas encore sur le serveur.
75 et pas 4, et c'est le détail qui m'a arrêté :
agregation.pyetchargement.pyrendent déjà 2, 3 et 4 pour leurs propres pannes. Un codepartagé rendrait « verrou non obtenu » indiscernable de « partition absente »
dans
gold.log, c'est-à-dire exactement le contraire de ce que tu demandes.75 est l'
EX_TEMPFAILdesysexits, dont le sens est « réessaie plus tard ».L'attente est bornée à un quart de la cadence : au delà, mieux vaut que la passe
de l'heure suivante rattrape que d'empiler des processus.
Éprouvé en conditions réelles, deux lanceurs concurrents :
2. L'encodage, mais pas l'assertion que tu proposes
Tu as raison sur le fond, et sur le piège :
urlencodegarde/dans lescaractères sûrs. Le
replacederrière ferme ce trou, et l'ordre compte,l'inverse encoderait le
%de%2F.Je n'ai pas pris l'assertion dans « Refuser de déployer sans les secrets du
coffre », et c'est un désaccord assumé. Le coffre est chiffré, personne ne
relit la valeur de ce mot de passe avant de déployer, moi le premier. Une
assertion sur une donnée qu'on ne peut pas inspecter casse le déploiement entier
le jour où elle a tort, et le rôle
appa déjà vécu ça deux fois cette semaine.L'encodage, lui, est vrai quelle que soit la valeur : il n'y a plus de condition
à vérifier.
Aller-retour prouvé sur un mot de passe hostile :
Reste le
.-sourçage par/bin/sh, qu'un espace ou un$casserait toujours,sur les cinq mots de passe. Hors périmètre ici : ces fichiers sont aussi lus en
env_filepar Docker, et changer leur guillemetage se paierait ailleurs.3. Le banc lit enfin les gabarits
Ton retour principal était le bon. Trois contrôles ajoutés, et j'ai fermé
complètement comme tu le suggérais :
ENERVISION_ETL_DATABASE_URL, enpostgresql://, encodée ;serviceet leurscript, et les deux passes de la zone or sont bien sousetl;Pas de compte total des tâches : il changerait à chaque job ajouté, et un banc
qui rougit pour une raison légitime finit par être désarmé.
Ce que le banc vaut, éprouvé dans les deux sens
Vert sur l'arbre sain, et rouge sur les cinq défauts réintroduits un par un,
chaque fois sur le contrôle visé :
Le quatrième est passé au vert à ma première rédaction. Il cherchait le mot
flock, qui survit dans le commentaire au-dessus et dans lecommand -v flock.Il lit maintenant les lignes exécutées, commentaires retirés. C'est la troisième
fois que ce dépôt me prend sur ce point, le contrôle porte la remarque en clair.
Vérifications
tests/unit/apine tourne pas sur mon poste, il manqueemail-validator, quiest bien déclaré dans
services/api/enervision_api/pyproject.toml. Rien de ceque je touche n'est de ce côté.
LGTM