Problème
Depuis la migration du plugin observability vers apps/server-nestjs (#2418), les utilisateurs perdent l'accès Grafana.
Constat. getListPerms (apps/server-nestjs/src/modules/observability/observability.utils.ts) range chaque utilisateur dans une seule paire de groupes Keycloak : prod si au moins un environnement prod existe, hors-prod sinon. Le plugin historique (cloud-pi-native/console-plugin-observability, src/function.ts) rangeait chaque utilisateur dans les deux paires — le wrapper de hooks Fastify (apps/server/src/utils/hook-wrapper.ts, transformToHookProject) attachait la même liste de permissions à chaque environnement.
Impact. reconcileGroupMembership est une sync diff-and-remove : au premier project.upsert sous server-nestjs, tous les membres du groupe opposé à la paire choisie sont retirés de Keycloak. Grafana associe les rôles org à partir de ces groupes : la perte d'accès est déterministe.
Preuve. Repro : apps/server-nestjs/src/modules/observability/zz-investigate-repro.spec.ts — 2 tests échouent (contrat legacy attendu : utilisateur présent dans les deux paires quand les deux stages existent). Le spec existant (observability.utils.spec.ts) code en dur la sémantique régressive (« assigns to prod bucket when a prod environment exists »).
Définition du fini
Impacts
- Sécurité : retrait destructif d'adhésions Keycloak (perte d'accès Grafana) — sync à corrective après déploiement du fix
- API/données : aucun changement de schéma
- Exploitation : instances affectées nécessitent un replay des hooks projet après mise à jour
Problème
Depuis la migration du plugin observability vers
apps/server-nestjs(#2418), les utilisateurs perdent l'accès Grafana.Constat.
getListPerms(apps/server-nestjs/src/modules/observability/observability.utils.ts) range chaque utilisateur dans une seule paire de groupes Keycloak : prod si au moins un environnement prod existe, hors-prod sinon. Le plugin historique (cloud-pi-native/console-plugin-observability,src/function.ts) rangeait chaque utilisateur dans les deux paires — le wrapper de hooks Fastify (apps/server/src/utils/hook-wrapper.ts,transformToHookProject) attachait la même liste de permissions à chaque environnement.Impact.
reconcileGroupMembershipest une sync diff-and-remove : au premierproject.upsertsous server-nestjs, tous les membres du groupe opposé à la paire choisie sont retirés de Keycloak. Grafana associe les rôles org à partir de ces groupes : la perte d'accès est déterministe.Preuve. Repro :
apps/server-nestjs/src/modules/observability/zz-investigate-repro.spec.ts— 2 tests échouent (contrat legacy attendu : utilisateur présent dans les deux paires quand les deux stages existent). Le spec existant (observability.utils.spec.ts) code en dur la sémantique régressive (« assigns to prod bucket when a prod environment exists »).Définition du fini
getListPermsrestaure le bucketing par stage legacy : un utilisateur apparaît dans la paire prod si un env prod existe et dans la paire hors-prod si un env non-prod existereconcileGroupMembershipne retire personne (les deux stages présents)pnpm lintet tests du workspace server-nestjs vertsproject.upsertpar projet affecté pour restaurer les adhésions détruites (idempotent)Impacts