feat(api) 3/7 : /api/status à cinq blocs et /api/action (champ d'API changé) #3

Closed
hermes-bot wants to merge 0 commits from hermes/api-rust-parite into main
Collaborator

Carte t_bd5b6420 — PVE Control 3/7 : API Rust à parité (nœud, LXC, Docker, températures, actions).

Champ d'API changé

GET /api/status sert désormais les cinq blocs du contrat du ticket 1 :
pve, lxc, docker, disk, temps. Le front (carte 4/7) en dépend :
prévenir svelte. La forme suit docs/COMPORTEMENT.md et
tests/fixtures/ ; chaque bloc a sa valeur de repli et la réponse reste 200,
comme le veut le contrat.

Ce que fait la branche

  • docker : /var/run/docker.sock via bollard, version d'API figée 1.44.
  • disk : topologie réelle de server.py (disque physique, écrit, alloué,
    arborescence avec l'excédent non récupéré), portée et testée.
  • temps : lecture du fichier déposé par l'hôte, noms CPU/NVMe/GPU.
  • POST /api/action : nœud, LXC, démarrage auto, Docker — toujours 200,
    ok porte le verdict.
  • GET /icone/<nom>.png : nom filtré, 404 nu sinon.
  • Les valeurs codées en dur de server.py sortent vers l'environnement
    (PVE_DOCKER_SOCKET, PVE_TEMPERATURES, PVE_ICONES, PVE_STOCKAGE_*,
    PVE_GROUPE_VOLUMES, PVE_PARTAGE_MONTAGE).

Deux écarts assumés

  • /api/status ne rend plus 502 sur panne amont : il reste 200 avec le repli
    du bloc, parce que le contrat du ticket 1 ne distingue pas une panne d'un
    état normal. Les bancs du socle qui figeaient le 502 sont mis à jour.
  • Une action Docker inconnue est refusée (trois actions seulement), là où
    server.py laissait passer la chaîne (fragilité 4 du relevé).

Preuves

cargo fmt --all -- --check                     # FMT_OK
cargo clippy --all-targets --locked -- -D warnings   # 0 avertissement
cargo build --release --locked                 # OK
cargo test --release --locked                  # 91 tests, 0 échec
cargo llvm-cov ... --fail-under-lines 80       # 93,35 % des lignes

Bancs : 48 tests unitaires pve-api, 3 de parité (tests/api_parite.rs),
6 du contrat ticket 1, 24 unitaires pve-client, 9 du faux Proxmox.

Caractérisation du ticket 1 rejouée contre le service Rust pointé sur un faux
Proxmox : 16/17 ; le seul échec est test_page_accueil — la page HTML
/ relève de la carte 4/7 (front Svelte).

Rien n'est déployé : server.py reste la référence en marche.

Carte `t_bd5b6420` — PVE Control 3/7 : API Rust à parité (nœud, LXC, Docker, températures, actions). ## Champ d'API changé `GET /api/status` sert désormais les **cinq blocs** du contrat du ticket 1 : `pve`, `lxc`, `docker`, `disk`, `temps`. Le front (carte 4/7) en dépend : **prévenir `svelte`**. La forme suit `docs/COMPORTEMENT.md` et `tests/fixtures/` ; chaque bloc a sa valeur de repli et la réponse reste 200, comme le veut le contrat. ## Ce que fait la branche - `docker` : `/var/run/docker.sock` via `bollard`, version d'API figée `1.44`. - `disk` : topologie réelle de `server.py` (disque physique, écrit, alloué, arborescence avec l'excédent non récupéré), portée et testée. - `temps` : lecture du fichier déposé par l'hôte, noms `CPU`/`NVMe`/`GPU`. - `POST /api/action` : nœud, LXC, démarrage auto, Docker — toujours 200, `ok` porte le verdict. - `GET /icone/<nom>.png` : nom filtré, 404 nu sinon. - Les valeurs codées en dur de `server.py` sortent vers l'environnement (`PVE_DOCKER_SOCKET`, `PVE_TEMPERATURES`, `PVE_ICONES`, `PVE_STOCKAGE_*`, `PVE_GROUPE_VOLUMES`, `PVE_PARTAGE_MONTAGE`). ## Deux écarts assumés - `/api/status` ne rend plus 502 sur panne amont : il reste 200 avec le repli du bloc, parce que le contrat du ticket 1 ne distingue pas une panne d'un état normal. Les bancs du socle qui figeaient le 502 sont mis à jour. - Une action Docker inconnue est refusée (trois actions seulement), là où `server.py` laissait passer la chaîne (fragilité 4 du relevé). ## Preuves cargo fmt --all -- --check # FMT_OK cargo clippy --all-targets --locked -- -D warnings # 0 avertissement cargo build --release --locked # OK cargo test --release --locked # 91 tests, 0 échec cargo llvm-cov ... --fail-under-lines 80 # 93,35 % des lignes Bancs : 48 tests unitaires `pve-api`, 3 de parité (`tests/api_parite.rs`), 6 du contrat ticket 1, 24 unitaires `pve-client`, 9 du faux Proxmox. Caractérisation du ticket 1 rejouée contre le service Rust pointé sur un faux Proxmox : **16/17** ; le seul échec est `test_page_accueil` — la page HTML `/` relève de la carte 4/7 (front Svelte). Rien n'est déployé : `server.py` reste la référence en marche.
Inventaire des routes de server.py (page /, /icone/<nom>.png, /api/status,
/api/action, 404 nus), de leurs entrees et sorties et des appels amont
Proxmox et Docker, releve le 2026-10-15 sur l'instance en marche
(http://192.168.1.70:8590, LXC 115).

- docs/COMPORTEMENT.md : une section par route, les appels amont, la
  configuration codee en dur a sortir du code et les fragilites observees.
- tests/caracterisation.py : banc stdlib qui interroge une instance en marche
  et la compare au contrat enregistre ; --enregistrer reecrit les fixtures.
  Sortie 0 vert, 1 contrat rompu, 2 service injoignable.
- tests/fixtures/ : reponses de reference anonymisees (vmid renumerotees,
  noms de conteneurs remplaces, volumes generiques).

17 tests, tous verts contre la version Python en marche ; 9 echecs et
6 erreurs quand le banc vise une autre implementation (forgejo:3000), ce qui
montre qu'il distingue reellement les contrats.
feat(socle): client Proxmox typé, service axum et CI Forgejo (2/7)
Some checks failed
CI (backend Rust) / Rust (backend) (push) Failing after 7s
CI (backend Rust) / Rust (backend) (pull_request) Failing after 21s
23093c8703
Ce socle remplace pve_ticket()/pve_api() de server.py : jeton d'API au lieu
d'un mot de passe root, billet gardé une heure au lieu d'une
réauthentification à chaque appel, erreurs typées au lieu du texte brut de
l'exception rendu à la page, et le nom du nœud devient un paramètre au lieu
d'être écrit dans neuf chemins.

- backend/ : espace Cargo à deux membres. pve-client (reqwest/rustls, serde,
  thiserror) porte l'authentification, le cache de billet et les appels ;
  pve-api (axum + tokio) porte le service et la configuration par variables
  d'environnement. Le mode jeton d'API est le mode par défaut ; le mode
  utilisateur/mot de passe reste possible en repli.
- Routes du socle : GET /api/sante (sans toucher Proxmox) et GET /api/status,
  qui ne sert pour l'instant que les blocs pve et lxc du contrat du ticket 1 ;
  disk, docker et temps viendront aux tickets suivants.
- 57 tests : unitaires sur les arrondis, le motif de durée de marche, le cache
  de billet et la configuration ; et, contre un faux Proxmox (wiremock)
  alimenté par les fixtures du relevé, la lecture de l'état du nœud, le
  billet demandé une seule fois, une configuration de conteneur illisible qui
  rend onboot null, et une panne amont qui rend 502 avec un message borné.
- .forgejo/workflows/ci.yml : cargo fmt --check, clippy -D warnings, test, et
  couverture cargo-llvm-cov (seuil 80 % sur la logique métier).
- README, CHANGELOG.md et .env.example mis à jour ; aucun secret dans le
  dépôt, .env.example ne porte que des noms de variables.
feat(api): parité 3/7 — /api/status à cinq blocs et /api/action
All checks were successful
CI (backend Rust) / Rust (backend) (push) Successful in 40s
CI (backend Rust) / Rust (backend) (pull_request) Successful in 40s
9dbf8203c6
CHAMP D'API CHANGÉ : /api/status sert désormais les cinq blocs du contrat
figé au ticket 1 — pve, lxc, docker, disk, temps. Le front (carte 4/7)
en dépend : prévenir `svelte`. La forme suit docs/COMPORTEMENT.md et
tests/fixtures/ ; les blocs ont chacun leur valeur de repli et la
réponse reste 200, comme le veut le contrat.

Cause et remède :

- Cause : le socle ne servait que pve et lxc, sans Docker, sans disque et
  sans températures ; les actions n'existaient pas.
- Remède : docker via /var/run/docker.sock (bollard, version d'API figée
  1.44) ; disk reprend la topologie réelle de server.py (disque physique,
  écrit, alloué, arbre avec l'excédent non récupéré) ; temps lit le
  fichier déposé par l'hôte ; POST /api/action traite nœud, LXC, démarrage
  auto et Docker en rendant toujours 200 ; GET /icone/<nom>.png sert une
  icône du disque avec un nom filtré.

Deux écarts assumés, mesurés :
- /api/status ne rend plus 502 sur panne amont : il reste 200 avec le
  repli du bloc, parce que le contrat du ticket 1 ne distingue pas une
  panne d'un état normal. Les bancs du socle qui figeaient le 502 sont
  mis à jour.
- une action Docker inconnue est refusée (trois actions seulement), là où
  server.py laissait passer la chaîne (fragilité 4 du relevé).

Les valeurs codées en dur de server.py sortent vers l'environnement :
PVE_DOCKER_SOCKET, PVE_TEMPERATURES, PVE_ICONES, PVE_STOCKAGE_RACINE,
PVE_STOCKAGE_POOL, PVE_GROUPE_VOLUMES, PVE_STOCKAGE_PARTAGE,
PVE_PARTAGE_MONTAGE.

Mesures : fmt et clippy verts, cargo build --release et
cargo test --release verts (91 tests), couverture 93,35 % des lignes.
Caractérisation du ticket 1 rejouée contre le service Rust : 16/17, seul
le test de la page HTML échoue (page servie par la carte 4/7).
Owner

Étiquette operateur posée par le chef de l'atelier — prête pour fusion manuelle par l'opérateur.

  • Relecture conforme (carte t_0057f711 done) : fmt, clippy -D warnings, 91 tests, couverture 93,35 %, aucun secret.
  • CI non mesurable : aucun exécutant Forgejo n'est rattaché à foXaCe/pve-control — les travaux restent « Waiting to run » (comme PR #2). Conformément à la règle de l'atelier pour un dépôt sans exécutant : fusion manuelle par l'opérateur.
  • Le front Svelte (carte 4/7, PR manquante) dépend du changement de /api/status (cinq blocs) livré ici : prévenir svelte.
Étiquette `operateur` posée par le chef de l'atelier — **prête pour fusion manuelle par l'opérateur**. - Relecture conforme (carte `t_0057f711` done) : fmt, clippy `-D warnings`, 91 tests, couverture 93,35 %, aucun secret. - CI non mesurable : aucun exécutant Forgejo n'est rattaché à `foXaCe/pve-control` — les travaux restent « Waiting to run » (comme PR #2). Conformément à la règle de l'atelier pour un dépôt sans exécutant : fusion manuelle par l'opérateur. - Le front Svelte (carte 4/7, PR manquante) dépend du changement de `/api/status` (cinq blocs) livré ici : prévenir `svelte`.
Owner

Contenu déjà intégré dans main (commits présents dans l'historique). PR fermée manuellement car l'API de merge refuse (tête déjà ancêtre de main). Relue et CI verte avant intégration.

Contenu déjà intégré dans `main` (commits présents dans l'historique). PR fermée manuellement car l'API de merge refuse (tête déjà ancêtre de main). Relue et CI verte avant intégration.
foXaCe closed this pull request 2026-10-16 21:49:18 +02:00
All checks were successful
CI (backend Rust) / Rust (backend) (push) Successful in 40s
CI (backend Rust) / Rust (backend) (pull_request) Successful in 40s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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
foXaCe/pve-control!3
No description provided.