Skip to content

fix(registry): read the REGISTRY project-robot leaf and restore the historic secrets contract - #2817

Merged
shikanime merged 3 commits into
mainfrom
fix/registry-robot-secrets-2527
Oct 19, 2026
Merged

shikanime merged 3 commits into
mainfrom
fix/registry-robot-secrets-2527

Conversation

@shikanime

@shikanime shikanime commented Oct 5, 2026 •

Copy link
Copy Markdown
Member

Pourquoi

Le groupe de secrets REGISTRY disparaît entièrement des secrets de projet : VaultClientService.readRegistrySecrets lit le dossier REGISTRY au lieu de la feuille REGISTRY/project-robot, et KV v2 répond 404 sur une lecture de préfixe. Le contrat historique du plugin harbor (Registry base path inconditionnel, identifiants du robot conditionnés à publishProjectRobot, message de repli) était perdu au passage.

Quoi

  • readRegistrySecrets lit désormais la feuille REGISTRY/project-robot, la même feuille qu'écrit le module registry.
  • La résolution projet/admin de publishProjectRobot suit le patron nexus is<X>Enabled : méthode privée isProjectRobotEnabled côté lecteur, même expression harbor historique inlinée côté écriture (syncProject) — la valeur projet explicite gagne dans les deux sens, sinon le réglage admin s'applique, y compris quand le projet est sur default. Les deux moitiés ne peuvent plus diverger.
  • RegistryPluginService.secrets restitue le contrat historique : Registry base path inconditionnel, identifiants du robot seulement si publishProjectRobot est activé, message de repli historique quand le robot manque dans Vault.
  • Tests : lecture et absence de la feuille côté vault ; chemin de base seul, identifiants, repli et résolution admin (réglage absent et default) côté plugin ; provisionnement du robot depuis le réglage admin côté écriture.

Références

Fixes #2527
Related: #2527

@shikanime shikanime added the bug Something isn't working label Oct 5, 2026
@shikanime shikanime self-assigned this Oct 5, 2026
@shikanime shikanime added this to the 9.27.0 milestone Oct 5, 2026
@github-actions github-actions Bot added the built label Oct 5, 2026
@shikanime
shikanime marked this pull request as ready for review October 5, 2026 13:38
@shikanime
shikanime requested a review from a team as a code owner October 5, 2026 13:38
@shikanime
shikanime marked this pull request as draft October 5, 2026 13:39
@shikanime
shikanime marked this pull request as ready for review October 5, 2026 13:45
@shikanime shikanime modified the milestones: 9.27.0, 10.0.0 Oct 5, 2026
@shikanime
shikanime marked this pull request as draft October 6, 2026 08:00
Comment thread apps/server-nestjs/src/modules/registry/registry-plugin.service.ts Outdated
@shikanime

Copy link
Copy Markdown
Member Author

Revue complète : le correctif est pertinent. La lecture sur la feuille REGISTRY/project-robot est alignée au chemin écrit par ensureRobotSecret, le chemin de base reste inconditionnel, et le message de repli reprend verbatim celui du plugin harbor historique — le contrat de l'issue #2527 est restauré sans élargir le périmètre (un seul appelant de readRegistrySecrets, vérifié).

Un seul commentaire non bloquant sur l'exactitude d'un commentaire de code. Les tests couvrent désormais le 404 Vault et chaque branche de résolution, c'est exactement ce que ce module demandait.

@shikanime shikanime modified the milestones: 10.0.0, 9.28.0 Oct 6, 2026
@shikanime
shikanime marked this pull request as ready for review October 6, 2026 10:40
@shikanime
shikanime marked this pull request as draft October 6, 2026 10:42
Comment thread apps/server-nestjs/src/modules/registry/registry-plugin.service.ts Outdated

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le correctif lit bien la feuille REGISTRY/project-robot, mais la résolution de DEFAULT ne préserve pas le contrat historique : les secrets disparaissent alors que le défaut global les active. La branche est aussi en retard d’un commit sur main et doit être rebasée avant une nouvelle revue.

@shikanime
shikanime force-pushed the fix/registry-robot-secrets-2527 branch from 5e36413 to ba6160c Compare October 8, 2026 12:25

@shikanime shikanime left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict : Changements demandés — deux points bloquants sur la résolution publishProjectRobot (revue postée en commentaire, l'auteur ne pouvant pas officiellement request-changer sa propre PR).

La lecture de la feuille REGISTRY/project-robot est correcte et alignée sur le chemin écrit par ensureRobotSecret (appelant unique de readRegistrySecrets, vérifié), et les tests couvrent proprement le 404 Vault, le message de repli historique verbatim et chaque branche de résolution côté projet. En revanche, le point de StephaneTrebel tient toujours sur ba6160c — DEFAULT ne délègue pas au réglage global — et la description annonce une « résolution identique à l'écriture » alors que syncProject ne lit pas la config admin : restaurer la moitié lecture sans la moitié écriture recrée la contradiction que #2532 documente déjà côté Nexus. Détail de maison au passage : la branche a 46 commits de retard sur main, à rebaser avant nouvelle revue.

Security scan : clean sur les lignes ajoutées.

Comment thread apps/server-nestjs/src/modules/registry/registry-plugin.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/registry/registry-plugin.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/registry/registry-plugin.service.ts Outdated
@shikanime
shikanime force-pushed the fix/registry-robot-secrets-2527 branch from ba6160c to 11c626f Compare October 15, 2026 12:55
@shikanime
shikanime force-pushed the fix/registry-robot-secrets-2527 branch 2 times, most recently from 8300ef5 to 22aff14 Compare October 15, 2026 13:59
@shikanime
shikanime marked this pull request as ready for review October 15, 2026 14:33

@shikanime shikanime left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revue adversariale contre le plugin harbor historique (plugins/harbor/src/functions.ts:getProjectSecrets), sandbox au head 22aff14b.

Verdict : changements demandés — un point bloquant, le correctif central est bon.

Le contrat historique est restauré à l'identique : chemin de base inconditionnel, identifiants conditionnés, message de repli verbatim, chemin Vault REGISTRY/project-robot identique octet pour octet à celui écrit par ensureRobotSecret. La table de vérité de la résolution projet/admin est équivalente à l'expression harbor sur ENABLED / DISABLED / DEFAULT / absent, côté lecture comme côté écriture. 58 tests unitaires verts, eslint vert, aucun Unicode bidirectionnel dans le diff.

Bloquant — test/project-secrets.e2e-spec.ts contredit la nouvelle contrat. La spec écrit la feuille REGISTRY nue (ligne 144) et attend REGISTRY_ROBOT_SECRET dans secrets.REGISTRY (ligne 170) ; la spec « no Vault secrets » attend l'absence totale de REGISTRY (ligne 122). Sous le nouveau lecteur les deux échouent : la feuille de groupe n'est plus lue, et le chemin de base n'est plus jamais vide. La gate unit CI ne la lance pas — describe.runIf(E2E) — donc le vert actuel est un angle mort ; run-tests.sh -e la cassera. Écrire REGISTRY/project-robot et activer publishProjectRobot sur le projet fixture.

Non bloquant — « les deux moitiés ne peuvent plus diverger » est sur-affirmé. L'expression de résolution est dupliquée verbatim dans registry-plugin.service.ts et registry.service.ts ; deux copies peuvent dériver. Un helper partagé (projectValue, adminValue) rendrait l'affirmation vraie.

Nit — readRegistrySecrets(slug, robotName) n'a qu'un appelant, toujours ROBOT_NAME_PROJECT. Le paramètre est de la généralité spéculative.

Comment thread apps/server-nestjs/src/modules/registry/registry-plugin.service.ts
Comment thread apps/server-nestjs/src/modules/vault/vault-client.service.ts Outdated
@shikanime

Copy link
Copy Markdown
Member Author

F1 corrigé dans 5b2e649 : la spec e2e écrit désormais la feuille REGISTRY/project-robot, le projet fixture active publishProjectRobot, et le cas sans secrets attend le chemin de base inconditionnel avec le message de repli historique. Nettoyage des feuilles ajouté au groups de cleanup. F2/F3 laissés tels quels — non bloquants.

Comment thread apps/server-nestjs/src/modules/vault/vault-client.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/registry/registry-plugin.service.ts
StephaneTrebel
StephaneTrebel previously approved these changes Oct 16, 2026

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

La correction restaure le contrat Vault/Harbor et les tests couvrent les chemins de lecture, le repli et la résolution projet/admin ; la DoD de l’issue liée est satisfaite (2/2). CI et Quality Gate sont verts sur le head courant. Deux nits non bloquants sont laissés en commentaires inline.

@shikanime

Copy link
Copy Markdown
Member Author

Les deux sujets traités sur le head 2571349f :

Résolution dupliquée — RegistryService.syncProject consomme désormais RegistryPluginService.isProjectRobotEnabled (passée publique) ; l'expression specificallyEnabled(project) || (default && specificallyEnabled(admin)) n'existe plus qu'à un seul endroit (registry-plugin.service.ts:150).

Paramètre spéculatif — readRegistrySecrets(slug, robotName) devient readProjectRobotRegistrySecrets(slug), la feuille REGISTRY/project-robot est codée en dur dans le chemin (vault-client.service.ts:209) — seul appelant, valeur unique.

Tests : 70/70 locaux sur registry + vault.

@shikanime
shikanime force-pushed the fix/registry-robot-secrets-2527 branch from 2571349 to 17993b9 Compare October 16, 2026 15:07

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aucun finding après revue du diff et du contexte déclaré.

@github-project-automation github-project-automation Bot moved this from Hypotheses to Refinement in Cloud Pi Native Oct 16, 2026
shikanime and others added 3 commits October 19, 2026 11:04
…istoric secrets contract

KV v2 cannot read a folder prefix, so VaultClientService.readRegistrySecrets
queried the REGISTRY folder and always returned an empty record; the whole
group then vanished from the project secrets UI. Read the REGISTRY/project-robot
leaf instead, matching the leaf written by the registry module.

RegistryPluginService.secrets regains the historic contract: Registry base path
is returned unconditionally, robot credentials only when publishProjectRobot is
enabled, and the historic fallback message when the robot is enabled but
missing from Vault.

The project/admin resolution follows the nexus is<X>Enabled pattern: the
reader goes through a private isProjectRobotEnabled method and the writer
(syncProject) applies the same legacy harbor expression inline — an explicit
project value wins either way, otherwise the admin setting applies, including
a project set to "default" — so the two halves cannot drift apart anymore.

readRegistrySecrets takes the robot name as a parameter instead of importing
registry constants into the vault module, keeping the vault client free of
module-level dependencies like its sibling readXxxSecrets wrappers.

Fixes #2527

Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I8547cac6a8a7f67c167ef5b68a20b2176a6a6964
…istoric secrets contract

KV v2 cannot read a folder prefix, so VaultClientService.readRegistrySecrets
queried the REGISTRY folder and always returned an empty record; the whole
group then vanished from the project secrets UI. Read the REGISTRY/project-robot
leaf instead, matching the leaf written by the registry module.

RegistryPluginService.secrets regains the historic contract: Registry base path
is returned unconditionally, robot credentials only when publishProjectRobot is
enabled, and the historic fallback message when the robot is enabled but
missing from Vault.

The project/admin resolution follows the nexus is<X>Enabled pattern: the
reader goes through a private isProjectRobotEnabled method and the writer
(syncProject) applies the same legacy harbor expression inline — an explicit
project value wins either way, otherwise the admin setting applies, including
a project set to "default" — so the two halves cannot drift apart anymore.

readRegistrySecrets takes the robot name as a parameter instead of importing
registry constants into the vault module, keeping the vault client free of
module-level dependencies like its sibling readXxxSecrets wrappers.

The project-secrets e2e spec now mirrors the new contract: the fixture project
enables publishProjectRobot, the robot secret is written to the
REGISTRY/project-robot leaf, and the no-secrets case expects the unconditional
base path with the historic fallback message.

Fixes #2527

Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I8547cac6a8a7f67c167ef5b68a20b2176a6a6964
…botName param

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: Ia368570fb46f70f97a1c7326f4d5b75f6a6a6964
@shikanime
shikanime force-pushed the fix/registry-robot-secrets-2527 branch from 17993b9 to c3d9a4e Compare October 19, 2026 09:05
@cloud-pi-native-sonarqube

Copy link
Copy Markdown

@shikanime
shikanime added this pull request to the merge queue Oct 19, 2026
Merged via the queue into main with commit 593b38d Oct 19, 2026
34 checks passed
@shikanime
shikanime deleted the fix/registry-robot-secrets-2527 branch October 19, 2026 16:28
@github-project-automation github-project-automation Bot moved this from Refinement to Done in Cloud Pi Native Oct 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working built

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🐛 [BUG] - Le groupe de secrets REGISTRY est vide : lecture du dossier au lieu de REGISTRY/<robot>

2 participants