feat(ports): sous-commande release et champ hosts dans allocate_port.py #2

Merged
a.aitbendra merged 1 commit from feat/allocate-port-release into main 2026-10-30 13:37:25 -04:00
Owner

Patch proposé pour e2ip-platform/core : sous-commande release et champ hosts

Statut : brouillon, non poussé. À relire avant toute branche ou pull request.

Contenu

  1. release --app <nom> (scripts/allocate_port.py) : retire l'allocation d'une application du registre, avec le même protocole qu'allocate (synchronisation, écriture atomique, commit, push, retry borné). Code retour 6 si l'application n'a pas d'allocation.
  2. Garde d'arbre propre : release refuse de s'exécuter si le dépôt contient des modifications non commitées (code retour 4). Le rollback sur échec de push (reset --hard HEAD~1) ne peut ainsi supprimer que son propre commit.
  3. Champ optionnel hosts : liste de noms d'hôtes sur lesquels l'application doit tourner. Validé au chargement (code retour 5 si mal formé). Préservé par allocate et release. Utilisé par la réconciliation de apps/port-allocator.
  4. Tests (tests/test_release_and_hosts.py) : 10 tests, tous verts sous Python 3.10. Ils couvrent la libération, la réattribution du port libéré, les cas d'erreur, le mode --dry-run, la validation de hosts, la préservation du champ et la garde d'arbre sale.

Points relevés dans le script existant (non corrigés dans ce patch)

  • allocate : rollback destructif. En cas d'échec de push, allocate exécute git reset --hard HEAD~1 sans vérifier que l'arbre est propre. Des modifications locales non commitées peuvent être perdues. Correction recommandée : appliquer la même garde worktree_clean que release. Hors périmètre de ce patch, à valider séparément.
  • Push direct sur main. Le script pousse directement sur la branche. La branche main de core est protégée (décision de la plateforme : flux par pull request). Le push échouera en pratique. Il faudra soit ouvrir une pull request automatiquement, soit exécuter le script par un compte autorisé à pousser.
  • Champ _generated_at ajouté à chaque écriture. Il est toléré par le chargement, mais il crée des diffs inutiles à chaque allocation.
  • Champ world forcé à git-ci dans allocate, même pour un statut legacy. Incohérent avec le registre existant.
  • Le workflow allocate-port.yml et la modification de cd-deploy.yml ne sont pas inclus ici. Ils ne sont pas encore sur la forge.

Hors périmètre de ce patch

  • Ajouter hosts aux entrées sbj-magasin et ideahub dans ports.json : à faire dans une modification séparée, une fois ce patch validé.
  • Corriger la documentation PROJECT-STATE.md §2.1 et la skill noops-deploy pour conf.d.

Comment vérifier

cd patches/core
python3 -m unittest discover -s tests -v
diff -u allocate_port.py.orig allocate_port.py   # ou : allocate_port.patch

Journal et audit

Le script journalise chaque exécution dans --log-dir (logs/ par défaut). Les tests vérifient qu'un journal est bien produit lors d'une libération.

🤖 Generated with Claude Code

# Patch proposé pour `e2ip-platform/core` : sous-commande `release` et champ `hosts` Statut : **brouillon, non poussé.** À relire avant toute branche ou pull request. ## Contenu 1. **`release --app <nom>`** (`scripts/allocate_port.py`) : retire l'allocation d'une application du registre, avec le même protocole qu'`allocate` (synchronisation, écriture atomique, commit, push, retry borné). Code retour 6 si l'application n'a pas d'allocation. 2. **Garde d'arbre propre** : `release` refuse de s'exécuter si le dépôt contient des modifications non commitées (code retour 4). Le rollback sur échec de push (`reset --hard HEAD~1`) ne peut ainsi supprimer que son propre commit. 3. **Champ optionnel `hosts`** : liste de noms d'hôtes sur lesquels l'application doit tourner. Validé au chargement (code retour 5 si mal formé). Préservé par `allocate` et `release`. Utilisé par la réconciliation de `apps/port-allocator`. 4. **Tests** (`tests/test_release_and_hosts.py`) : 10 tests, tous verts sous Python 3.10. Ils couvrent la libération, la réattribution du port libéré, les cas d'erreur, le mode `--dry-run`, la validation de `hosts`, la préservation du champ et la garde d'arbre sale. ## Points relevés dans le script existant (non corrigés dans ce patch) - **`allocate` : rollback destructif.** En cas d'échec de push, `allocate` exécute `git reset --hard HEAD~1` sans vérifier que l'arbre est propre. Des modifications locales non commitées peuvent être perdues. Correction recommandée : appliquer la même garde `worktree_clean` que `release`. Hors périmètre de ce patch, à valider séparément. - **Push direct sur `main`.** Le script pousse directement sur la branche. La branche `main` de `core` est protégée (décision de la plateforme : flux par pull request). Le push échouera en pratique. Il faudra soit ouvrir une pull request automatiquement, soit exécuter le script par un compte autorisé à pousser. - **Champ `_generated_at`** ajouté à chaque écriture. Il est toléré par le chargement, mais il crée des diffs inutiles à chaque allocation. - **Champ `world` forcé à `git-ci`** dans `allocate`, même pour un statut `legacy`. Incohérent avec le registre existant. - **Le workflow `allocate-port.yml` et la modification de `cd-deploy.yml`** ne sont pas inclus ici. Ils ne sont pas encore sur la forge. ## Hors périmètre de ce patch - Ajouter `hosts` aux entrées `sbj-magasin` et `ideahub` dans `ports.json` : à faire dans une modification séparée, une fois ce patch validé. - Corriger la documentation `PROJECT-STATE.md` §2.1 et la skill `noops-deploy` pour `conf.d`. ## Comment vérifier ```bash cd patches/core python3 -m unittest discover -s tests -v diff -u allocate_port.py.orig allocate_port.py # ou : allocate_port.patch ``` ## Journal et audit Le script journalise chaque exécution dans `--log-dir` (`logs/` par défaut). Les tests vérifient qu'un journal est bien produit lors d'une libération. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(ports): sous-commande release et champ hosts dans allocate_port.py
Some checks failed
cd-deploy.yml / feat(ports): sous-commande release et champ hosts dans allocate_port.py (push) Failing after 0s
ci-build.yml / feat(ports): sous-commande release et champ hosts dans allocate_port.py (push) Failing after 0s
selftest.yml / feat(ports): sous-commande release et champ hosts dans allocate_port.py (push) Failing after 0s
cd-deploy.yml / feat(ports): sous-commande release et champ hosts dans allocate_port.py (pull_request) Failing after 0s
ci-build.yml / feat(ports): sous-commande release et champ hosts dans allocate_port.py (pull_request) Failing after 0s
selftest.yml / feat(ports): sous-commande release et champ hosts dans allocate_port.py (pull_request) Failing after 0s
cd-deploy.yml / Merge pull request 'feat(ports): sous-commande release et champ hosts dans allocate_port.py' (#2) from feat/allocate-port-release into main (pull_request) Failing after 0s
ci-build.yml / Merge pull request 'feat(ports): sous-commande release et champ hosts dans allocate_port.py' (#2) from feat/allocate-port-release into main (pull_request) Failing after 0s
selftest.yml / Merge pull request 'feat(ports): sous-commande release et champ hosts dans allocate_port.py' (#2) from feat/allocate-port-release into main (pull_request) Failing after 0s
11d6f5d87e
Ajoute release (libération d'un port, même protocole que allocate, garde d'arbre propre), le champ optionnel hosts validé au chargement, et 10 tests. Voir PR.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mg44v6AGS6CWq562JP5n9V
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
e2ip-platform/Core!2
No description provided.