Repository navigation
đĄ [REQUEST] - Migration des plugins vers une approche dĂ©clarative #2087
Description
Description
La crĂ©ation des ressources par les plugins du Console repose sur une logique impĂ©rative : chaque plugin orchestre lui-mĂȘme les appels HTTP au service externe (GitLab, Keycloak, Nexus, Harbor, Vault, SonarQube, ArgoCD). L'Ă©tat n'est pas dĂ©clarĂ© mais reconstruit Ă chaque rĂ©conciliation par une suite de lectures et de crĂ©ations manuelles.
Cette approche présente trois défaillances observées :
- Latence â les crĂ©ateurs enchaĂźnent des allers-retours API redondants (vĂ©rification d'existence, puis crĂ©ation, puis relecture) pour chaque ressource, sur chaque synchronisation, mĂȘme quand rien n'a changĂ©.
- CohĂ©rence â sous rĂ©conciliation concurrente (cron + Ă©vĂ©nement
project.upsert), deux passes peuvent crĂ©er la mĂȘme ressource ; le perdant reçoit un 409 (ou unhas already been taken) et fait Ă©chouer la synchronisation entiĂšre. Six de ces failles ont Ă©tĂ© constatĂ©es (issues liĂ©es ci-dessous). - Non-gĂ©nĂ©ralisable â chaque plugin rĂ©implĂ©mente le mĂȘme squelette de tolĂ©rance aux conflits, de retry et de gestion d'Ă©tat, sans mĂ©canisme commun de rĂ©conciliation.
L'objectif est de migrer cette logique vers le moteur Alchemy.run afin d'adopter une approche déclarative. Cela permettra de déléguer la gestion de l'état et de l'idempotence au moteur de réconciliation, garantissant ainsi que les ressources sont créées ou mises à jour de maniÚre optimale et fiable, quel que soit l'état de départ.
Contexte et étapes préalables
La migration dĂ©clarative ne peut ĂȘtre menĂ©e que sur une base saine. Les problĂšmes d'idempotence signalĂ©s ci-dessous doivent d'abord ĂȘtre rĂ©solus selon la convention de la couche client : chaque crĂ©ateur exposĂ© par un service client suit le motif create-first upsert (ensure*) â on tente la crĂ©ation, sur un 409/conflit on relit la ressource une seule fois puis on rĂ©concilie (mise Ă jour si l'Ă©tat diffĂšre, retour de l'existant sinon). Cette convention supprime les allers-retours redondants et stabilise l'Ă©tat des ressources, condition requise avant le passage au moteur de rĂ©conciliation.
La couche interface fournisseur / service externe définie dans #2427 fixe le contrat que le moteur déclaratif consommera ; la présente issue consomme l'état exposé par cette interface.
PRs liées
No response
Issues liées
- đ [BUG] - RĂ©conciliation SonarQube non idempotente : les variables CI GitLab Ă©chouent en 'already been taken' #2616 RĂ©conciliation SonarQube non idempotente : variables CI GitLab en
already been taken - đ [BUG] - RĂ©conciliation Keycloak non idempotente : course 409 sur la crĂ©ation du groupe racine #2618 RĂ©conciliation Keycloak non idempotente : course 409 sur la crĂ©ation du groupe racine
- đ [BUG] - RĂ©conciliation Nexus non idempotente : 7 chemins de crĂ©ation sans tolĂ©rance 409 #2619 RĂ©conciliation Nexus non idempotente : 7 chemins de crĂ©ation sans tolĂ©rance 409
- đ [BUG] - RĂ©conciliation Registry non idempotente : 4 chemins de crĂ©ation sans tolĂ©rance 409 #2620 RĂ©conciliation Registry non idempotente : 4 chemins de crĂ©ation sans tolĂ©rance 409
- đ [BUG] - gitlab-client : createGroupRepo et commit concurrents sans tolĂ©rance au conflit (Observability + ArgoCD) #2621 gitlab-client :
createGroupRepoet commit concurrents sans tolĂ©rance au conflit - đ [BUG] - ArgoCD : un secret-id Vault AppRole est gĂ©nĂ©rĂ© Ă chaque synchronisation #2622 ArgoCD : un secret-id Vault AppRole est gĂ©nĂ©rĂ© Ă chaque synchronisation
- đĄ [REQUEST] - Abstraction plugins : interface fournisseur vs service externe #2427 Abstraction plugins : interface fournisseur vs service externe (complĂ©mentaire)
Exemples simples
No response
Spécifications techniques
Alchemy.run est un moteur d'infrastructure dĂ©crite en code (type IaC) en TypeScript sur Effect, adoptant une approche dĂ©clarative (cycle de vie : plan â reconcile â delete). Le modĂšle pertinent pour les plugins :
- Provider â une ressource est gĂ©rĂ©e par un provider qui implĂ©mente
reconcile,delete,diff,readpour un type de ressource. - Reconcile convergent â une seule fonction
reconcile(news, output, olds, bindings)amĂšne l'Ă©tat rĂ©el au dĂ©sirĂ©, quel que soit le point de dĂ©part (greenfield, mise Ă jour, adoption). Forme attendue : observe â ensure â sync â return. - Observe â lecture de l'Ă©tat rĂ©el (
getX/describeX) ; nom physique dĂ©terministe dĂ©rivĂ© de stack/stage/id logique, ce qui permet Ă une retry de retrouver la ressource dĂ©jĂ créée. - Ensure â crĂ©er si absente (en tolĂ©rant les erreurs de type AlreadyExists comme des courses), puis pour chaque aspect mutable diffĂ©rer l'Ă©tat observĂ© contre le dĂ©sirĂ© et n'appliquer que le delta.
- Idempotence â chaque Ă©tape est indĂ©pendamment idempotente ;
reconcileetdeletesont sĂ»rs Ă rejouer (suppression d'une ressource dĂ©jĂ absente = succĂšs). - Adoption / rĂ©cupĂ©ration d'Ă©tat â
readretrouve une ressource créée lors d'un déploiement précédent dont l'état a été perdu, ou adopte une infrastructure préexistante.
Traduction pour les plugins du Console (keycloak, nexus, registry, gitlab, vault, sonarqube, argocd) :
- Chaque créateur impératif des services clients est exprimé comme un descripteur de ressource Alchemy dont le provider encapsule l'appel HTTP au service externe.
- Le moteur planifie (create / update / replace / delete / no-op) et pilote la rĂ©conciliation ; les allers-retours de type GETâCREATEârefetch disparaissent.
- La convention
ensure*actuelle de la couche client devient l'implĂ©mentation du corpsobserve â ensure â syncdu provider ; le nom physique dĂ©terministe remplace la lecture prĂ©alable redondante. - Migration unitaire plugin par plugin, le moteur de rĂ©conciliation ne prenant en charge que les crĂ©ateurs dĂ©jĂ idempotents.
Définition du fini
- Chaque problÚme d'idempotence listé dans les Issues liées est résolu selon la convention
ensure*. - La couche interface fournisseur (issue đĄ [REQUEST] - Abstraction plugins : interface fournisseur vs service externe #2427) dĂ©finit le contrat consommĂ© par le moteur dĂ©claratif.
- Un plugin pilote (keycloak ou registry) est migré vers un provider Alchemy.run complet (plan + reconcile + delete), avec tests de non-régression.
- Les créateurs idempotents restants sont migrés unitairement vers des descripteurs déclaratifs.
- La logique impérative des créateurs est remplacée par des descripteurs déclaratifs traités par Alchemy.run.
- Les tests liés à cette migration ont été ajoutés.
- La documentation liée à cette migration a été ajoutée (cf. https://github.com/cloud-pi-native/documentation).
- La communication avec les autres équipes impliquées par cette fonctionnalité a été faite.
Activity
shikanime commentedon Aug 28, 2026
Convergence du volet technique : Alchemy.run est un moteur d'infrastructure décrite en code en TypeScript sur Effect. Le contrat utile aux plugins est le provider : une ressource implémente
reconcile(convergent, forme observe â ensure â sync â return),delete,diffetread. Les points dĂ©terminants pour la migration :reconcileetdeletesont sĂ»rs Ă rejouer ; les courses AlreadyExists sont tolĂ©rĂ©es Ă l'intĂ©rieur de l'Ă©tape ensure.readassure l'adoption et la rĂ©cupĂ©ration d'Ă©tat aprĂšs un Ă©chec de persistance.ConsĂ©quence pour le Console : la convention
ensure*actuelle de la couche client devient l'implĂ©mentation du corps observe â ensure â sync du provider ; l'Ă©tape de relecture aprĂšs conflit y est naturelle. La migration est unitaire plugin par plugin (pilote : keycloak ou registry), et ne concerne que les crĂ©ateurs dĂ©jĂ idempotents.