[EF-12] Migrations de la zone or : les sept tables et le référentiel des sites #105
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.
Blocks
#29 [infra] TimescaleDB, hypertables et compression
g2/enervision
#35 [EF-12] Agrégation et zone or matérialisée
g2/enervision
Reference
g2/enervision#105
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Exigence couverte
EF-12, ENF-04, ENF-07
Épreuve servie
EC05 · Data, ETL et BI
Charge estimée
1 j.h
Ce qu'on veut obtenir
Créer les tables de la zone or dans PostgreSQL, par des migrations versionnées. Elles n'existent nulle part :
db/migrations/ne contient que les six migrations d'authentification.C'est un trou entre deux tickets. Le #29 demande de convertir les tables de mesures en hypertables alors qu'il n'y a rien à convertir. Le #35 écrit dans la zone or sans la créer. Ce ticket ne dépend ni du collecteur ni de personne, il peut partir tout de suite.
Le modèle est déjà arrêté : voir la section « Modèle de données de la zone or » du dossier d'architecture collectif, et
docs/GLOSSAIRE.mdpour les sept sites et leurs capacités.Critères d'acceptation
site,mesure,prevision,alerte,qualite_jour,recommandation,acces_site.(site_id, horodatage)est la même que celle des zones bronze et argent, c'est elle qui rend l'auditabilité vérifiable.mesureporte la valeur retenue et la valeur brute côte à côte, plus la méthode d'imputation et l'indicateur de qualité : une valeur reconstituée ne remplace jamais la valeur mesurée.recommandationporte l'identifiant et la version de la règle, plus les valeurs déclenchantes enjsonb.siteest peuplée depuisdocs/GLOSSAIRE.md: sept lignes, identifiant, libellé, type, capacité déclarée et unité.grafanalit les tables nouvellement créées, la clause par défaut posée à l'installation le prévoit.Comment on le vérifie
Commande python db/migrate.py puis \dt et \d mesure dans psql
Attendu les sept tables, la clé primaire composite sur mesure, sept lignes dans site
Preuve la sortie de \dt et celle d'un SELECT sur site, collées à la fermeture
Manuel d'exploitation à mettre à jour
docs/POSTGRESQL.md, section schéma, etdb/migrations/README.mdRisque et retour arrière
Une table de la zone or portant une donnée à ne pas exposer serait lisible par
grafanasans que personne ne l'ait décidé, la clause de droits par défaut couvrant tout le schémapublic. À vérifier table par table. Retour arrière : chaque migration porte sonDROPcorrespondant, le volume est vide à ce stade.État : le lot est écrit, la demande de fusion #110 est ouverte, l'application sur le serveur reste à faire
Huit migrations,
0008à0015, plus la fiche de décision et les manuels. Brancheolivier/105-migrations-zone-or.Le ticket a été rattrapé par le #29 en cours de route. Sa migration
0007_zone_or_mesure.sql(demande #106, ouverte) pose déjàsiteetmesureen forme réduite — sans table de mesures, il n'y avait rien à convertir en hypertable — et elle est déjà appliquée sur les deux bases. Plutôt que de la défaire, ce lot passe au-dessus : il complète ces deux tables et pose les cinq autres. Les fichiers0008et0010créent la forme complète sur une base neuve et ajoutent ce qui manque sur une base déjà posée, si bien que l'ordre de fusion des deux demandes n'a plus d'importance.Les critères, un par un
site,mesure,prevision,alerte,qualite_jour,recommandationdanspublic;acces_sitedansops.(site_id, horodatage)surmesureetprevision, dans cet ordre, comme en bronze et en argent.mesureporte la valeur retenue et la valeur brute, plus la méthode d'imputation et l'indicateur de qualité — et la clé bronze, sans laquelle le contrôle de l'ENF-07 se fait à la main, donc ne se fait jamais.recommandationporteregle_id,regle_versionet les valeurs déclenchantes enjsonb.sitepeuplée depuis le glossaire : sept lignes, identifiant, libellé, type, localisation, capacité, unité. Un cas de test relit ces sept lignes dansdocs/GLOSSAIRE.md— une capacité corrigée d'un côté et pas de l'autre fait rougir la chaîne.db/migrations/README.mdet tenue par un cas de test.grafanalit les tables — vérifiable seulement après application. Voir ci-dessous.Ce que la mise en place a révélé, et qui vaut plus que le ticket
1. Les objets appartenaient à
postgres, pas au rôle applicatif. Sur la production,public.site,public.mesure, le schémaopsetops.schema_migrationsétaient possédés parpostgres: la0007y a été appliquée en superutilisateur. Deux conséquences :ALTER DEFAULT PRIVILEGES FOR ROLE enervision_prodne vaut que pour les objets créés par ce rôle. Ces deux tables ne sont lisibles par Grafana que grâce augrantexplicite écrit dans la0007. La table suivante posée de la même façon aurait été muette, sans le moindre message, et le symptôme serait apparu sur un tableau de bord vide des jours plus tard.La reprise est un geste de superutilisateur — elle ne peut pas vivre dans une migration jouée par le rôle applicatif :
tests/integration/test_zone_or.pyvérifie désormais le propriétaire des tables, pour que la reprise ne se reperde pas.2. Les six migrations d'authentification n'ont jamais été jouées sur la production.
opsn'y contient queschema_migrations. Elles passeront avec ce lot, puisque0015_ops_acces_site.sqlréférenceops.users— c'est attendu, mais ça n'a rien à voir avec la zone or, et il valait mieux le dire avant que de le découvrir dans un journal d'application.3. La méthode d'imputation passe de trois régimes à quatre. La forme réduite fait porter à
nonedeux sens distincts, « valeur mesurée » et « trou assumé ». Le §9 dedocs/data/etl-pipeline.mdet l'ADR 0006 nommentmeasuredle régime de la valeur présente et valide ; les confondre interdit de compter les valeurs réellement mesurées, ce que la répartition par méthode dequalite_jourdemande précisément. À valider par qui porte la #106.4. Le §6 du dossier d'architecture collectif n'est pas sur
develop. Le fichierdocs/ARCHITECTURE.mdque ce ticket cite comme référence du modèle n'existe que sur la branchelenaic/0-dossier-architecture: sa demande de fusion #54 a été fermée sans fusion. Le modèle a été suivi depuis cette branche. Deux écarts assumés par rapport à lui, motivés dans l'ADR 0008 :acces_siteest dansopset non danspublic, et sa clé estops.users (id)et non unsujet_oidc— le jeton est émis par notre API et Keycloak est reporté (ADR 0002), aucun annuaire ne sert de sujet aujourd'hui. À reprendre avec @lenaic : soit la demande #54 est rouverte, soit le §6 est corrigé, mais un ticket ne peut pas citer indéfiniment une référence absente dedevelop.Ce qui reste, et pourquoi le ticket n'est pas fermé
L'application sur
enervision_preprodpuisenervision_prod— avec le rôle applicatif, jamais enpostgres— et la sortie de\dt,\d mesureet du contrôle de droits, à coller ici. La reprise de propriété ci-dessus la précède ; sans elle, lesalter tablede0008et0010échouent sur un refus de droits.Documentation
publicpour les six tables de données,opspour la table des accès, avec ce qui a été écarté ;docs/POSTGRESQL.md, section schéma, réécrite sur l'état posé, avec un tableau d'exposition Grafana table par table — c'est le « à vérifier table par table » du risque de ce ticket ;db/migrations/README.md— la convention de retour arrière, le motif « crée ou complète » et son défaut silencieux, le geste de reprise de propriété ;README.mdracine — le vocabulaireraw/curatedannoncé pourdb/migrations/et jamais implémenté est retiré, ce qui referme un point ouvert du §14 dedocs/data/etl-pipeline.md.