Skip to content

💡 [REQUEST] - Migration des plugins vers une approche dĂ©clarative #2087

Open
6 of 6 issues completed
Open

Description

@shikanime

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 :

  1. 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Ă©.
  2. 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 un has already been taken) et fait Ă©chouer la synchronisation entiĂšre. Six de ces failles ont Ă©tĂ© constatĂ©es (issues liĂ©es ci-dessous).
  3. 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

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, read pour 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 ; reconcile et delete sont sĂ»rs Ă  rejouer (suppression d'une ressource dĂ©jĂ  absente = succĂšs).
  • Adoption / rĂ©cupĂ©ration d'Ă©tat — read retrouve 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 corps observe → ensure → sync du 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

  1. self-assigned this
    on Apr 14, 2026
  2. shikanime commented on Aug 28, 2026

    @shikanime
    MemberAuthor

    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, diff et read. Les points dĂ©terminants pour la migration :

    • Le nom physique est dĂ©terministe (stack/stage/id logique) : la retry retrouve la ressource dĂ©jĂ  créée sans lecture prĂ©alable redondante.
    • reconcile et delete sont sĂ»rs Ă  rejouer ; les courses AlreadyExists sont tolĂ©rĂ©es Ă  l'intĂ©rieur de l'Ă©tape ensure.
    • read assure 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.

  3. added this to the 10.0.0 milestone on Oct 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestto refineNeed to be refine by PO

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions