Skip to content

fix(server-nestjs): make Registry create paths idempotent - #2625

Closed
shikanime wants to merge 2 commits into
mainfrom
fix/registry-create-idempotent
Closed

fix(server-nestjs): make Registry create paths idempotent#2625
shikanime wants to merge 2 commits into
mainfrom
fix/registry-create-idempotent

Conversation

@shikanime

@shikanime shikanime commented Aug 28, 2026

Copy link
Copy Markdown
Member

Issues liées

#2620 (fermer délibérément après la fusion)


Quel est le comportement actuel ?

Lors d'une synchronisation concurrente (cron + événement), deux appels peuvent tenter de créer la même ressource Harbor en parallèle. Le POST perdant reçoit une erreur 409 (conflit) et la synchronisation échoue avec une erreur.

Quatre chemins de création sont concernés : la création de projet, l'ajout d'un membre de groupe, la création d'un robot et la création d'une stratégie de rétention. Chacun était protégé par un GET d'existence préalable dans la couche métier, mais sous une course cette garde ne suffisait pas.

Comportement attendu

L'idempotence est encapsulée dans le service client (registry-client.service.ts) sous un motif ensure* create-first : on tente la création ; si la ressource existe déjà (409), on la met à jour puis on relit l'état courant. La synchronisation devient idempotente face à la course.

Changements

  • registry-client.service.ts expose ensureProject, ensureGroupMember, ensureRobot et ensureRetention : chaque méthode tente la création, puis réconcilie sur un 409.
  • Création de projet : un 409 est toléré, la ressource est relue puis retournée.
  • Ajout de membre de groupe : un 409 est ignoré, le membre existe désormais.
  • Création de robot : un 409 renvoie null, la couche métier déclenche une rotation pour obtenir un secret frais.
  • Stratégie de rétention : un 409 déclenche une relecture puis une mise à jour.
  • La couche métier (registry.service.ts) est simplifiée : elle appelle les méthodes ensure* et ne gère plus les statuts 409 elle-même.
  • Ajout de tests unitaires (client et service) couvrant les collisions sur la création de projet, de robot et le retour de l'existant.

@shikanime
shikanime force-pushed the fix/registry-create-idempotent branch 2 times, most recently from 1cb3ff2 to e87970f Compare August 28, 2026 11:01
@github-actions github-actions Bot added the built label Aug 28, 2026
@shikanime
shikanime force-pushed the fix/registry-create-idempotent branch 3 times, most recently from 2c732bd to 9eeaba3 Compare August 28, 2026 14:20
@shikanime
shikanime changed the base branch from main to fix/uniformize-error-guards August 28, 2026 14:22
Comment on lines +233 to +244
@@ -253,14 +241,7 @@ export class RegistryService {
harborRuleCount: this.harborConfig.ruleCount,
harborRetentionCron: this.harborConfig.retentionCron,
})
const retentionId = await this.client.getRetentionId(project.slug)
span?.setAttribute('registry.retention.exists', !!retentionId)
const result = retentionId
? await this.client.updateRetention(retentionId, policy)
: await this.client.createRetention(policy)
if (result.status >= 300) {
throw new Error(`Harbor retention policy failed (${result.status})`)
}
await this.client.ensureRetention(project.slug, policy)

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.

Remove this function, just directly call this.client.ensureRetention

Base automatically changed from fix/uniformize-error-guards to main August 28, 2026 15:54
@cloud-pi-native-sonarqube

Copy link
Copy Markdown

@shikanime
shikanime force-pushed the fix/registry-create-idempotent branch from 853eb26 to d117bd7 Compare August 28, 2026 16:10
StephaneTrebel and others added 2 commits August 28, 2026 18:26
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: Ie0abe96c02dfa5421e7e787bc4d8ad1f6a6a6964
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I6e86475b1c00e5b9a5b0a15cc8f5e1736a6a6964
@shikanime
shikanime force-pushed the fix/registry-create-idempotent branch from eeedb12 to e1cbb2d Compare August 28, 2026 16:27
@shikanime
shikanime marked this pull request as ready for review August 28, 2026 16:27
@shikanime
shikanime requested a review from a team as a code owner August 28, 2026 16:27
@shikanime shikanime closed this Aug 28, 2026
@shikanime
shikanime deleted the fix/registry-create-idempotent branch August 28, 2026 16:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants