Skip to content

feat(server-nestjs): implémenter le RBAC fins d'observability - #2435

Draft
shikanime wants to merge 1 commit into
mainfrom
feat/observability-adr014-rbac
Draft

feat(server-nestjs): implémenter le RBAC fins d'observability#2435
shikanime wants to merge 1 commit into
mainfrom
feat/observability-adr014-rbac

Conversation

@shikanime

@shikanime shikanime commented Aug 7, 2026

Copy link
Copy Markdown
Member

Issues liées

Issues numéro :


Quel est le comportement actuel ?

Le plugin observability (server-nestjs) synchronise uniquement les sous-groupes Grafana legacy grafana/<env>-<RO|RW> dans Keycloak à partir de getListPerms. Les groupes hiérarchiques /<slug>/console/<role> définis par l'ADR 014 (droits fins) ne sont ni créés ni propagés dans les values Grafana.

Quel est le nouveau comportement ?

  • getRbacPerms(project) calcule, depuis la matrice de permissions bitmask (@cpn-console/shared), l'appartenance d'un utilisateur à un rôle fin : MANAGE → admin, MANAGE_ENVIRONMENTS → devops, LIST_ENVIRONMENTS → readonly (le propriétaire est admin).
  • generateProjectRbacGroupPath(project, role) produit le chemin de groupe Keycloak hiérarchique /<slug>/console/<role> (ADR 014, cohérent avec les autres modules à droits fins : vault, project, sonarqube).
  • Lors des events create/update/delete, le service crée/met à jour/supprime ces groupes dans Keycloak en parallèle des sous-groupes Grafana legacy (étape 1 de migration : coexistence).
  • Les nouveaux groupes sont publiés dans les values Grafana générées (generateObservabilityProject).
  • Tests unitaires Vitest : getRbacPerms (mapping des permissions, exclusion des membres sans permission) et generateProjectRbacGroupPath.

Cette PR introduit-elle un breaking change ?

Non. Les groupes legacy sont conservés ; les nouveaux groupes s'ajoutent sans rupture (migration progressive, étape 1/3 de l'ADR 014). La suppression des sous-groupes legacy (étape 3) et les guards d'autorisation Keycloak/CASL (ADR 019) restent hors périmètre de cette PR.

Autres informations

  • Scope délibérément limité au module observability (pas de guard applicatif global).
  • Reste à faire : retrait des sous-groupes legacy une fois les nouveaux groupes provisionnés par les outils cibles.

@shikanime
shikanime force-pushed the feat/observability-adr014-rbac branch 2 times, most recently from 6d41afc to a77ab03 Compare August 7, 2026 11:47
@shikanime
shikanime marked this pull request as draft August 7, 2026 11:47
@shikanime shikanime self-assigned this Aug 7, 2026
@shikanime shikanime added the enhancement New feature or request label Aug 7, 2026
@shikanime shikanime added this to the 9.25.0 milestone Aug 7, 2026
@github-actions github-actions Bot added the built label Aug 7, 2026
@shikanime

Copy link
Copy Markdown
Member Author

Revue — PR #2435 (RBAC fins observability, ADR 014)

Vérifié localement sur a77ab03 :

  • ✅ Tests : 26/26 passants (dont 5 nouveaux : getRbacPerms ×4, generateProjectRbacGroupPath, + test de suppression de service)
  • ✅ ESLint : propre sur les 5 fichiers modifiés
  • nest build : vert (après bootstrap du workspace)

⚠️ Warning

  • observability.service.tssyncRbacGroups (chemin create/reconcile sur handleUpsert) n'a pas de test de service dédié. Les utils sont couverts et le chemin de suppression l'est, mais la création/réconciliation sur upsert n'est pas assertée. Ajouter un test vérifiant que handleUpsert appelle getOrCreateGroupByPath pour chaque rôle et addUserToGroup pour les membres mappés.

🔎 Nit

  • observability.utils.tsgetRbacPerms : le commentaire « Grafana mapping (ADR 014): admin/devops -> Editor, readonly -> Viewer » est placé sur la fonction qui calcule l'appartenance aux groupes Keycloak, pas le mapping de rôle Grafana (downstream). À reformuler en « RBAC role assignment from bitmask perms ».

Points positifs

  • Le shape de chemin /<slug>/console/{admin,devops,readonly} correspond exactement aux groupes OIDC canoniques de project.utils.ts:43,55,71 → observability réutilise les mêmes groupes Keycloak (design ADR-014 partagé), pas de fork.
  • reconcileMembers déduplique la logique add/remove entre les sous-groupes Grafana legacy et les nouveaux groupes RBAC — bon DRY.
  • Précédence mono-rôle (manage > rw > ro) et owner-toujours-admin respectés ; guard défensif if (!group?.id) continue en suppression.

Verdict : APPROVE

Aucun blocker. Ajouter le test du chemin upsert avant merge. Transmis à @cloud-pi-native/socle pour la revue d'habilitation approfondie (guards ADR-019 hors périmètre de cette PR).

@shikanime
shikanime requested a review from a team August 7, 2026 12:02
@shikanime
shikanime force-pushed the feat/observability-adr014-rbac branch 2 times, most recently from be6106f to d791621 Compare August 7, 2026 13:19
@shikanime shikanime changed the title feat(server-nestjs): implémenter le RBAC fins d'observability (ADR 014) feat(server-nestjs): implémenter le RBAC fins d'observability Aug 7, 2026
- getRbacPerms(project) calcule, depuis la matrice de permissions bitmask
  (@cpn-console/shared), l'appartenance d'un utilisateur a un role fin :
  MANAGE -> admin, MANAGE_ENVIRONMENTS -> devops, LIST_ENVIRONMENTS ->
  readonly (le proprietaire est admin)
- generateProjectRbacGroupPath(project, role) produit le chemin de groupe
  Keycloak hierarchique /<slug>/console/<role> (ADR 014, coherent avec les
  autres modules a droits fins : vault, project, sonarqube)
- Lors des events create/update/delete, le service cree/met a jour/supprime
  ces groupes dans Keycloak en parallele des sous-groupes Grafana legacy
  (etape 1 de migration : coexistence)
- Les nouveaux groupes sont publies dans les values Grafana generees
  (generateObservabilityProject)
- Tests unitaires Vitest : getRbacPerms (mapping des permissions, exclusion
  des membres sans permission) et generateProjectRbacGroupPath

Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: Icf82862003a3794164bbe4cef5d2fca26a6a6964
@shikanime
shikanime force-pushed the feat/observability-adr014-rbac branch from d791621 to 93a0de9 Compare August 7, 2026 14:16
@cloud-pi-native-sonarqube

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

built enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant