PV de livraison - Edu-Kit - Sprint 4
Version : 4.0.0 | Date de livraison : 17/05/2026 | Statut : Livraison concluante
Sprint : Sprint 4 (01/05/2026 - 17/05/2026)
Sommaire
- Version de l’application
- Équipe
- Environnement de livraison
- Composants techniques livrés
- Backlog du Sprint 4
- Recette - État final des tests
- Bugs connus
- Lexique
1. Version de l’application
| Champ | Valeur |
|---|---|
| Version | 4.0.0 |
| Sprint | Sprint 4 |
| Date de livraison | 17/05/2026 |
| Période du sprint | 01/05/2026 - 17/05/2026 |
Cette version correspond à la quatrième livraison incrémentale du projet Edu-Kit. Le numéro de version suit la convention [numéro de sprint].0.0, chaque sprint constituant un incrément produit complet. L’ensemble des user stories engagées au Sprint Planning a été livré et validé avant la date de clôture du sprint.
2. Équipe
| Membre | Rôle |
|---|---|
| Gabriel ARNAUD | Développeur |
| Adrien LAMBERT | Développeur |
| Leandre MOREAU | Développeur |
| Anthony ARNOUX | Ops |
| Benoit PRONGUE | Ops |
| Lucie BELAIR | Ops |
| Elias MERTZEISEN | Ops |
3. Environnement de livraison
| Composant | URL | Notes |
|---|---|---|
| Application web (front-end) | https://app.edu-kit.fr |
SPA Angular 21 - accessible depuis l’extérieur |
| OrgService API | https://api.edu-kit.fr/organization-service |
API REST + gRPC |
| VmService API | https://api.edu-kit.fr/vm-service |
API REST + gRPC |
| Keycloak (SSO) | https://auth.edu-kit.fr |
Serveur d’authentification |
| Documentation | https://docs.edu-kit.fr |
Site Jekyll généré depuis Edukit-Documentation |
| Grafana (monitoring) | https://grafana.edu-kit.fr |
Tableaux de bord Loki, Prometheus, Tempo - à confirmer |
4. Composants techniques livrés
4.1 Services applicatifs
| Composant | Dépôt | Technologie | Rôle |
|---|---|---|---|
| OrgService | Edukit-OrgService |
.NET 9 / C# - Clean Architecture + CQRS | Gestion des organisations, utilisateurs, groupes, environnements et sessions de travail |
| VmService | Edukit-VM |
.NET 9 / C# - Clean Architecture + CQRS | Provisionnement Proxmox, cycle de vie des VMs, distribution de credentials par email |
| Edukit-Front | Edukit-Front |
Angular 21 / TypeScript | Interface utilisateur (SPA) - gestion des séances, VMs, utilisateurs ; temps réel via SignalR |
4.2 Infrastructure
| Composant | Technologie | Version | Rôle |
|---|---|---|---|
| Base de données | PostgreSQL | 16 | Persistance des données OrgService et VmService |
| Broker de messages | RabbitMQ | 3.x | Communication asynchrone inter-services (événement VmCredentialIssued) |
| Authentification | Keycloak | 26 | SSO OIDC/PKCE - 4 rôles : superadmin, admin, teacher, student |
| Hyperviseur | Proxmox VE | 8.x | Virtualisation des machines étudiantes (KVM) |
| Métriques | Prometheus | - | Collecte des métriques applicatives et système |
| Logs | Loki | - | Agrégation des journaux applicatifs |
| Traces | Tempo | - | Tracing distribué (OpenTelemetry) |
| Observabilité | Grafana | - | Tableaux de bord métriques, logs et traces |
| Agent de collecte | Grafana Alloy | - | Collecte et transmission des logs sur chaque nœud |
| Sécurité réseau | CrowdSec | - | Détection et blocage automatique des intrusions |
| Chaos engineering | Chaos Mesh | - | Tests de résilience de l’infrastructure |
| Registry | Harbor | - | Registre privé d’images Docker |
| CI/CD | Azure DevOps | - | Pipelines de build, test, analyse SonarQube et déploiement |
4.3 Nouvelles fonctionnalités livrées dans ce sprint
| Composant | Fonctionnalité livrée |
|---|---|
| OrgService | Cycle de vie complet des sessions de travail (WorkSession) : création, démarrage, pause/reprise, complétion, annulation, consultation et historique des transitions |
| OrgService | Démarrage automatique d’une séance selon planification (Quartz.NET) |
| OrgService | Clôture automatique d’une séance selon planification (Quartz.NET) |
| OrgService | Consommation de l’événement inter-services VmCredentialIssued : décryptage AES-256-GCM + envoi email SMTP via MailKit |
| OrgService | Template d’email d’accès VM bilingue texte/HTML avec commande SSH intégrée et encodage sécurisé anti-XSS |
| VmService | Sagas de cycle de vie des VMs : VmStartSaga, VmStopSaga, VmDestroySaga (via Wolverine) |
| VmService | Opérations batch sur un environnement : démarrage, arrêt et suppression de toutes les VMs |
| VmService | Provisionnement individuel d’une VM pour un étudiant ciblé |
| VmService | Réinitialisation des credentials VM via qemu-guest-agent + re-publication de l’événement VmCredentialIssued |
| VmService | Nouvelle tentative de provisionnement (RetryVmCreation) sur VM en état Failed |
| VmService | Service d’autorisation pour le hub SignalR (VmStatusHubAuthorizationService) |
| VmService | Câblage OpenTelemetry OTLP (traces, métriques, logs) |
| Edukit-Front | Composant UserManagement (liste paginée des utilisateurs) avec test de composant |
| Edukit-Front | Intégration SignalR (VmStatusHubService) - mise à jour temps réel du statut des VMs |
| Edukit-Front | Icône d’erreur sur la grille VM avec message de détail (tooltip) |
| Edukit-Front | Paramétrage de l’automatisation du démarrage et de la fin de séance (case à cocher) |
| Infrastructure | Stack d’observabilité complète : Grafana + Loki + Prometheus + Tempo + OpenTelemetry + Grafana Alloy |
| Infrastructure | Mise en production de la gestion des réseaux par environnement de travail (Mikrotik) |
| Infrastructure | Installation et configuration de CrowdSec (détection d’intrusions) |
5. Backlog du Sprint 4
Les estimations sont exprimées en heures et correspondent aux valeurs saisies lors du Sprint Planning dans Azure DevOps. Aucun suivi d’écart post-livraison n’a été formalisé dans les work items ; seule l’estimation initiale est donc reportée ici.
5.1 Tableau récapitulatif
| ID | User Story | Estimation initiale (h) | Statut |
|---|---|---|---|
| #79 | Se connecter en SSH à une VM | 9 | Partiellement livrée |
| #88 | Déclencher le reset d’un élève | 6 | Terminée |
| #89 | Déclencher le reset de toute la classe | 6 | Terminée |
| #108 | Voir si la machine d’un élève est allumée | 2 | Terminée |
| #109 | Voir si une machine est en erreur | 2 | Terminée |
| #128 | Filtrer les séances | 3 | Terminée |
| #644 | Voir l’état global d’une séance | 3 | Terminée |
| #645 | Créer les machines pour un seul élève | 14 | Terminée |
| #649 | Afficher les identifiants de connexion (élève) | 3 | Terminée |
| #650 | Supprimer les machines pour un seul élève | 3 | Terminée |
| #651 | Démarrage des VMs lors du démarrage d’une séance | 6 | Terminée |
| #652 | Démarrage d’une séance automatiquement selon planification | 8 | Terminée |
| #653 | Clôturer une séance automatiquement selon la planification | 8 | Terminée |
| #654 | Éteindre les VMs automatiquement lors de la clôture d’une séance | 6 | Terminée |
| #678 | Paramétrer l’automatisation du démarrage d’une séance | 3 | Terminée |
| #679 | Paramétrer l’automatisation de la fin d’une séance | 3 | Terminée |
| Total | 85 h | 15 / 16 terminées |
Charge du sprint : 85 heures estimées au Sprint Planning - 15 user stories terminées sur 16 (US #79 partiellement livrée). Toutes les user stories terminées ont atteint le statut Done conformément à la Definition of Done avant la date de clôture du sprint.
5.2 Détail des User Stories
US #79 - Se connecter en SSH à une VM
| Composant : Edukit-Front / VmService | Estimation : 9 h | Statut : Partiellement livrée |
Description :
En tant qu’élève, je veux pouvoir me connecter en SSH à une VM qui m’est attribuée, afin de pouvoir utiliser la machine dans le cadre de mes travaux pratiques.
Critères d’acceptation :
- L’hôte (adresse IP ou nom DNS) et le port SSH sont affichés clairement pour chaque VM attribuée à l’élève.
- Les identifiants de connexion (nom d’utilisateur et mot de passe) sont visibles sur demande de l’élève.
- Un bouton “Copier” est disponible pour copier la commande SSH complète dans le presse-papiers.
- La commande SSH prête à l’emploi est générée et affichée (ex. :
ssh user@host -p port).
Note de livraison : La connexion SSH vers les VMs est fonctionnelle côté infrastructure. L’intégration dans l’interface applicative (accès aux informations de connexion depuis l’espace élève) n’est pas encore finalisée à la date de livraison. Cette US est considérée partiellement livrée et fera l’objet d’une complétion au sprint suivant.
US #88 - Déclencher le reset d’un élève
| Composant : Edukit-Front / VmService | Estimation : 6 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux déclencher la réinitialisation (reset) de la VM d’un élève spécifique, afin de résoudre un blocage ou de lui permettre de recommencer son travail sur une machine dans un état connu.
Critères d’acceptation :
- L’enseignant peut sélectionner un élève dans la liste et déclencher la réinitialisation de sa VM.
- Une confirmation explicite est demandée avant l’exécution du reset (prévention des actions accidentelles).
- L’élève est notifié du reset de sa machine (notification ou mise à jour visible dans l’interface).
- Les nouvelles credentials VM sont régénérées et envoyées à l’élève par email après le reset.
- L’opération est traçable dans l’historique de la VM.
US #89 - Déclencher le reset de toute la classe
| Composant : Edukit-Front / VmService | Estimation : 6 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux déclencher la réinitialisation (reset) des VMs de l’ensemble des élèves d’une séance, afin de permettre à toute la classe de recommencer un TP depuis un état initial connu.
Critères d’acceptation :
- L’enseignant peut déclencher un reset global depuis la vue de gestion d’une séance.
- Une confirmation explicite est demandée avant l’exécution du reset collectif.
- L’opération s’applique à toutes les VMs actives de la séance.
- Un récapitulatif du résultat (nombre de succès / nombre d’échecs) est affiché à l’issue de l’opération.
- Les élèves sont notifiés individuellement du reset de leur machine.
US #108 - Voir si la machine d’un élève est allumée
| Composant : Edukit-Front / VmService | Estimation : 2 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux voir, pour chaque élève de ma séance, si sa machine virtuelle est allumée ou non, afin de suivre l’état de participation et d’avancement du groupe.
Critères d’acceptation :
- L’état d’allumage (allumée / éteinte / en cours de démarrage) est visible pour chaque élève dans la vue de la séance.
- La liste des états se met à jour en temps réel (via SignalR) sans rechargement de page.
- L’indicateur d’état est clair et lisible (icône ou badge coloré).
US #109 - Voir si une machine est en erreur
| Composant : Edukit-Front / VmService | Estimation : 2 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux être informé visuellement si la machine virtuelle d’un élève est en état d’erreur, afin de pouvoir intervenir rapidement et débloquer l’élève concerné.
Critères d’acceptation :
- Une erreur sur la VM d’un élève est signalée visuellement par une icône distincte (ex. : icône d’erreur rouge) dans la grille de la séance.
- Le détail de l’erreur est accessible via un tooltip ou un panneau de détail.
- L’état d’erreur est mis à jour en temps réel (via SignalR).
US #128 - Filtrer les séances
| Composant : Edukit-Front / OrgService | Estimation : 3 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux filtrer la liste de mes séances de travail selon plusieurs critères (cours associé, période, statut), afin de retrouver rapidement les séances qui m’intéressent sans avoir à parcourir l’intégralité de la liste.
Critères d’acceptation :
- Les filtres disponibles sont : cours associé, statut de la séance (planifiée, en cours, terminée), et période (plage de dates).
- Les filtres sont cumulables : on peut les combiner simultanément.
- Un bouton « Réinitialiser » permet de revenir à la liste complète en un clic.
- Le nombre de séances correspondant au filtre actif est affiché (compteur de résultats).
- Un message explicite est affiché si aucune séance ne correspond aux critères de filtrage.
US #644 - Voir l’état global d’une séance
| Composant : Edukit-Front / OrgService / VmService | Estimation : 3 h | Statut : Terminée |
Description :
En tant qu’enseignant (ou administrateur/superadministrateur), je veux voir un résumé agrégé de l’état global d’une séance de travail - indiquant le nombre de VMs créées, en cours d’exécution, arrêtées, en erreur ou en cours de création - afin de savoir d’un coup d’œil si tout fonctionne correctement pour l’ensemble de la classe.
Critères d’acceptation :
- Un tableau de bord affiche, pour la séance sélectionnée, le nombre total d’élèves et le nombre de VMs par statut (Creating, Running, Stopped, Error, Deleted).
- Un endpoint dédié
GET /work-sessions/{id}/statusest exposé côté OrgService et retourne l’agrégat. - L’accès à cet endpoint est réservé aux rôles
teacher,adminetsuperadmin. - L’affichage se met à jour automatiquement (polling ou SignalR) sans rechargement de page.
US #645 - Créer les machines pour un seul élève
| Composant : Edukit-Front / OrgService / VmService | Estimation : 14 h | Statut : Terminée |
Description :
En tant qu’enseignant (ou administrateur/superadministrateur), je veux créer la machine virtuelle pour un élève spécifique au sein d’un environnement de travail, afin de provisionner ou de re-provisionner individuellement son poste sans affecter les autres élèves.
Critères d’acceptation :
- L’élève ciblé doit être membre du groupe associé à l’environnement de travail.
- Si une VM existe déjà pour cet élève avec un statut autre que
DeletedouError, la requête est rejetée avec un code HTTP 400 (provisionnement doublon interdit). - La commande crée un enregistrement
VirtualMachineen statutCreatingdans la base de données et publie un événementCreateVmsur RabbitMQ. - Le provisionnement complet suit le pattern SAGA (via Wolverine) : la VM est créée sur Proxmox, les credentials sont générés puis transmis à OrgService via l’événement
VmCredentialIssued. - L’élève est notifié par email lorsque sa VM est prête, avec ses identifiants de connexion et la commande SSH.
- L’opération est idempotente et traçable via OpenTelemetry.
US #649 - Afficher les identifiants de connexion (élève)
| Composant : Edukit-Front / VmService | Estimation : 3 h | Statut : Terminée |
Description :
En tant qu’élève, je veux pouvoir afficher les identifiants de connexion de la machine virtuelle qui m’est attribuée, afin de pouvoir me connecter à ma machine sans avoir à retrouver un email précédent.
Critères d’acceptation :
- L’élève peut consulter, depuis son espace, l’adresse IP/hôte, le port SSH, le nom d’utilisateur et le mot de passe de sa VM.
- Les informations sont uniquement visibles pour les VMs attribuées à l’élève connecté.
- Un bouton de copie dans le presse-papiers est disponible pour chaque identifiant.
- L’accès est refusé si aucune VM n’est attribuée à l’élève ou si la VM est dans un état non opérationnel (ex. :
Creating,Deleted).
US #650 - Supprimer les machines pour un seul élève
| Composant : Edukit-Front / OrgService / VmService | Estimation : 3 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux pouvoir supprimer la machine virtuelle d’un élève spécifique au sein d’un environnement de travail, afin de libérer des ressources sur le serveur Proxmox sans avoir à supprimer les machines de toute la classe.
Critères d’acceptation :
- L’enseignant peut sélectionner un élève et déclencher la suppression de sa VM depuis l’interface.
- Une confirmation explicite est demandée avant l’exécution (prévention des suppressions accidentelles).
- L’opération suit le pattern SAGA (
VmDestroySaga) : la VM est détruite sur Proxmox et son enregistrement passe au statutDeleteden base de données. - L’espace libéré sur l’hyperviseur Proxmox est récupéré.
- L’opération est idempotente : si la VM est déjà dans l’état
Deleted, aucune erreur n’est levée.
US #651 - Démarrage des VMs lors du démarrage d’une séance
| Composant : OrgService / VmService | Estimation : 6 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux que les machines virtuelles des élèves démarrent automatiquement lorsque je démarre une séance de travail, afin que les postes soient opérationnels dès le début du cours sans intervention manuelle.
Critères d’acceptation :
- Lorsqu’une séance passe au statut « En cours », OrgService appelle VmService via gRPC pour déclencher le démarrage de toutes les VMs de l’environnement.
- VmService publie les événements
StartVmsur RabbitMQ ; les workers consomment ces événements et envoient les commandes de démarrage à Proxmox. - L’opération est idempotente : si une VM est déjà en cours d’exécution, aucune erreur n’est levée.
- Un mécanisme de retry automatique est en place en cas d’échec transitoire.
- Chaque étape est tracée via OpenTelemetry (traçabilité complète de la chaîne).
US #652 - Démarrage d’une séance automatiquement selon planification
| Composant : OrgService | Estimation : 8 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux que ma séance de travail démarre automatiquement à la date et l’heure planifiées, afin d’économiser des ressources serveur (les VMs ne sont allumées que lorsque le cours commence) et de ne pas avoir à intervenir manuellement.
Critères d’acceptation :
- La séance démarre automatiquement à la valeur
date_debutconfigurée lors de la création. - Un job Quartz.NET est planifié au moment de la création de la séance.
- Au redémarrage de l’application, les jobs sont rechargés depuis la base de données (persistance des jobs Quartz).
- L’opération est idempotente : si la séance est déjà démarrée, le job ne déclenche pas d’erreur.
- Si
date_debutest dans le passé au moment de la création, la séance démarre immédiatement. - Ce comportement ne s’active que si l’option « Démarrage automatique » est activée (voir US #678).
US #653 - Clôturer une séance automatiquement selon la planification
| Composant : OrgService | Estimation : 8 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux que ma séance de travail se clôture automatiquement à la date et l’heure de fin planifiées, afin d’économiser des ressources serveur et de ne pas avoir à intervenir manuellement en fin de cours.
Critères d’acceptation :
- La séance se clôture automatiquement à la valeur
date_finconfigurée. - Un job Quartz.NET est planifié à la création de la séance.
- Les jobs sont rechargés depuis la base de données au redémarrage de l’application.
- L’opération est idempotente : si la séance est déjà terminée, le job ne déclenche pas d’erreur.
- Si une clôture anticipée a été effectuée manuellement, le déclenchement automatique est ignoré.
- Ce comportement ne s’active que si l’option « Fin automatique » est activée (voir US #679).
US #654 - Éteindre les VMs automatiquement lors de la clôture d’une séance
| Composant : OrgService / VmService | Estimation : 6 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux que les machines virtuelles des élèves s’éteignent automatiquement lorsque la séance se clôture, afin d’économiser des ressources serveur sans avoir à intervenir manuellement en fin de cours.
Critères d’acceptation :
- Lorsqu’une séance passe au statut « Terminée », OrgService appelle VmService via gRPC pour déclencher l’arrêt de toutes les VMs de l’environnement.
- VmService publie les événements
StopVm(et/ouDestroyVmselon la configuration) sur RabbitMQ ; les workers envoient les commandes correspondantes à Proxmox. - L’opération est idempotente : si une VM est déjà éteinte ou supprimée, aucune erreur n’est levée.
- Un mécanisme de retry automatique est en place en cas d’échec transitoire.
- Chaque étape est tracée via OpenTelemetry.
US #678 - Paramétrer l’automatisation du démarrage d’une séance
| Composant : Edukit-Front / OrgService | Estimation : 3 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux choisir si le démarrage d’une séance doit se faire automatiquement ou manuellement, afin d’avoir la flexibilité d’adapter le comportement à chaque cours.
Critères d’acceptation :
- Le formulaire de création/édition d’une séance inclut une case à cocher « Démarrage automatique ».
- La case est décochée par défaut (démarrage manuel par défaut).
- La valeur est persistée en base de données avec la séance.
- Si la case est cochée (ON) : un job Quartz.NET est planifié pour déclencher le démarrage à
date_debut. - Si la case est décochée (OFF) : aucun job n’est créé pour le démarrage.
- Modifier le paramètre après création (ON → OFF ou OFF → ON) crée ou supprime le job en conséquence.
- L’opération est idempotente et les jobs sont rechargés au redémarrage de l’application.
US #679 - Paramétrer l’automatisation de la fin d’une séance
| Composant : Edukit-Front / OrgService | Estimation : 3 h | Statut : Terminée |
Description :
En tant qu’enseignant, je veux choisir si la clôture d’une séance doit se faire automatiquement ou manuellement, afin d’avoir la flexibilité d’adapter le comportement à chaque cours.
Critères d’acceptation :
- Le formulaire de création/édition d’une séance inclut une case à cocher « Fin automatique ».
- La case est décochée par défaut (clôture manuelle par défaut).
- La valeur est persistée en base de données avec la séance.
- Si la case est cochée (ON) : un job Quartz.NET est planifié pour déclencher la clôture à
date_fin. - Si la case est décochée (OFF) : aucun job n’est créé pour la clôture automatique.
- Modifier le paramètre après création (ON → OFF ou OFF → ON) crée ou supprime le job en conséquence.
- L’opération est idempotente et les jobs sont rechargés au redémarrage de l’application.
6. Recette - État final des tests
6.1 Tests unitaires
Les tests unitaires s’exécutent entièrement en mémoire, sans aucune dépendance externe (pas de Docker, pas de base de données réelle). Toutes les dépendances sont substituées par des mocks (bibliothèque Moq).
| Composant | Fichiers de test | Tests exécutés | Réussis | Échoués | Ignorés |
|---|---|---|---|---|---|
| OrgService | 97 | 509 | 509 | 0 | 0 |
| VmService | 85 | 517 | 517 | 0 | 0 |
| Edukit-Front | 2 | 4 | 4 | 0 | 0 |
| Total | 184 | 1 030 | 1 030 | 0 | 0 |
Le Sprint 4 a contribué environ 252 nouveaux tests à la suite cumulée (153 OrgService + 98 VmService + 1 front). L’intégralité des 1 030 tests unitaires est en succès à la date de livraison.
6.2 Tests d’infrastructure (VmService)
Les tests d’infrastructure vérifient les adaptateurs vers les systèmes externes (Proxmox HTTP, gRPC) en simulant leurs réponses via des intercepteurs HTTP et des mocks gRPC. Aucune connexion réseau réelle n’est établie lors de l’exécution.
| Fichiers de test | Tests exécutés | Réussis | Échoués |
|---|---|---|---|
| 11 | 89 | 89 | 0 |
Ce sprint a ajouté 11 nouveaux tests d’infrastructure :
VmLifecycleServiceTests(démarrage via Proxmox) etVmLifecycleServiceDestroyTests(destruction via Proxmox).
6.3 Tests manuels
La validation manuelle est réalisée sur l’environnement de développement local avant l’ouverture de chaque pull request. Les résultats sont consignés dans la section « Testing Notes » de chaque PR sur Azure DevOps.
| Fonctionnalité testée | Outil | Résultat | Observations |
|---|---|---|---|
| Session de travail - cycle complet (création → démarrage → complétion) | Insomnia (collection partagée) (:5100) |
Réussi | Transitions d’état validées |
| Session de travail - annulation | Insomnia (collection partagée) (:5100) |
Réussi | |
| Envoi d’email de credentials VM | Interface Angular + Mailpit | Réussi | Email reçu avec commande SSH et mot de passe |
| Réinitialisation credential VM | Insomnia (collection partagée) (:5200) |
Réussi | Compteur CredentialResetCount incrémenté |
| Démarrage batch d’un environnement | Insomnia (collection partagée) | Réussi | Mises à jour temps réel visibles via SignalR |
| Arrêt batch d’un environnement | Insomnia (collection partagée) | Réussi | |
| Destruction batch d’un environnement | Insomnia (collection partagée) | Réussi | VMs passées à l’état Destroyed |
| Retry provisionnement sur VM en échec | Insomnia (collection partagée) + Angular | Réussi | VM repassée à Pending puis reprovisionnée |
| Affichage de la liste des utilisateurs | Interface Angular (:4200) |
Réussi | Tableau paginé affiché correctement |
| Temps réel SignalR - mise à jour statut VM | Interface Angular | Réussi | Statut mis à jour sans rechargement de page |
6.4 Analyse statique - SonarQube
| Critère | Résultat | Seuil | Statut |
|---|---|---|---|
| Quality Gate global | Grade A | Grade A | Réussi |
| Couverture de code - OrgService | ≥ 60 % | ≥ 60 % | Réussi |
| Couverture de code - VmService | ≥ 60 % | ≥ 60 % | Réussi |
| Couverture de code - Edukit-Front | < 40 % | ≥ 40 % (objectif) | Non atteint - non bloquant |
| Nouvelles violations sécurité | 0 | 0 | Réussi |
| Nouvelles violations fiabilité | 0 | 0 | Réussi |
| Nouvelles violations maintenabilité | Informatif | - | Informatif |
| Commentaires SonarQube sur PR traités | Oui | Oui | Réussi |
6.5 Pipeline CI/CD - Azure DevOps
| Étape | Statut |
|---|---|
| Build - OrgService + VmService + Edukit-Front | Réussi |
Tests unitaires (dotnet test) |
Réussi |
Tests d’infrastructure (dotnet test) |
Réussi |
Tests frontend (npx ng test - Vitest + jsdom) |
Réussi |
| Collecte couverture (coverlet → SonarQube Cloud) | Réussi |
| Analyse SonarQube - Quality Gate | Réussi |
L’ensemble du pipeline est au vert. Chaque pull request fusionnée dans
maina reçu au minimum une approbation de reviewer et a satisfait l’intégralité des critères de livraison définis dans la stratégie de test.
7. Bugs connus
7.1 Bugs corrigés et livrés dans ce sprint
| ID | Description | Composant | Criticité | Statut |
|---|---|---|---|---|
| #694 | Nom de l’utilisateur non affiché lors d’une modification automatique de séance | OrgService / Front | Mineur | Corrigé et livré |
| #696 | Nom de l’utilisateur non affiché lors d’une modification automatique de séance (doublon) | OrgService / Front | Mineur | Corrigé et livré |
| #697 | Statut de création incorrect dans l’historique d’une session | OrgService | Mineur | Corrigé et livré |
| #718 | Absence de limite maximale sur les ressources d’un OsTemplate - un utilisateur pouvait saisir des valeurs arbitraires |
VmService | Mineur | Corrigé et livré |
| #738 | Libellé de message incorrect lors d’une modification automatique de séance | OrgService / Front | Mineur | Corrigé et livré |
| #744 | Problème de sauvegarde (backup) sur l’hyperviseur Proxmox | Infrastructure | Mineur | Corrigé et livré |
7.2 Bugs ouverts (non résolus à la livraison)
Aucun bug fonctionnel ouvert à la date de livraison.
7.3 Anomalies qualité persistantes
Ces anomalies sont issues du rapport de test qualité et font l’objet d’un suivi dans la feuille de route qualité.
| ID | Description | Composant | Criticité | Statut |
|---|---|---|---|---|
| AN-001 | Couverture de test frontend insuffisante : 4 tests pour l’ensemble du projet Angular (guards, services et composants non couverts) | Edukit-Front | Mineur | Ouvert - extension Vitest planifiée à court terme |
| AN-002 | Absence de tests end-to-end : aucun parcours utilisateur complet automatisé (connexion Keycloak → provisionnement VM → session) | Tous | Mineur | Ouvert - Playwright planifié à moyen terme |
| AN-003 | Keycloak non couvert par des tests automatisés - pannes d’authentification détectées uniquement en validation manuelle | Tous | Mineur | Ouvert - infrastructure externe, validation manuelle systématique |
| AN-004 | Asymétrie InfrastructureTests : OrgService ne dispose pas de projet de tests d’infrastructure (vs. VmService : 11 fichiers) |
OrgService | Mineur | Ouvert - ajout planifié à court terme |
7.4 Récapitulatif
| Criticité | Total | Corrigés et livrés | En cours | Non analysés | Ouverts (qualité) |
|---|---|---|---|---|---|
| Bloquant | 0 | 0 | 0 | 0 | 0 |
| Critique | 0 | 0 | 0 | 0 | 0 |
| Majeur | 0 | 0 | 0 | 0 | 0 |
| Mineur | 10 | 6 | 0 | 0 | 4 |
Aucune anomalie bloquante ou critique n’est ouverte à la date de livraison. La livraison est concluante.
8. Lexique
| Terme | Définition |
|---|---|
| AES-256-GCM | Algorithme de chiffrement symétrique authentifié utilisé pour transporter de façon sécurisée le credential VM entre VmService et OrgService via RabbitMQ |
| Batch | Traitement groupé - opération appliquée simultanément à l’ensemble des ressources d’un périmètre (ex. : démarrer toutes les VMs d’un environnement) |
| BDD | Behavior-Driven Development - approche de développement consistant à décrire le comportement attendu du logiciel sous forme de scénarios (Gherkin : Given / When / Then) avant d’implémenter la fonctionnalité |
| CI/CD | Continuous Integration / Continuous Delivery - automatisation du build, des tests et du déploiement à chaque modification de code |
| Clean Architecture | Architecture logicielle organisant le code en couches concentriques (Domain → Application → Infrastructure → API) avec des dépendances orientées vers le centre |
| CQRS | Command Query Responsibility Segregation - pattern séparant les opérations d’écriture (Commands) des opérations de lecture (Queries) |
| E2E | End-to-End - test automatisé du parcours complet d’un utilisateur à travers toutes les couches du système |
| gRPC | Protocole d’appel de procédure à distance haute performance basé sur HTTP/2 et Protocol Buffers, utilisé pour la communication synchrone entre OrgService et VmService |
| Idempotence | Propriété d’une opération produisant le même résultat qu’elle soit exécutée une ou plusieurs fois, garantissant la sécurité des rejeux en cas de retry |
| Mock | Objet simulé remplaçant une dépendance réelle lors d’un test, permettant de contrôler son comportement et de vérifier les interactions |
| OIDC / PKCE | OpenID Connect / Proof Key for Code Exchange - flux d’authentification sécurisé utilisé par Keycloak pour émettre des tokens JWT |
| OpenTelemetry | Standard open-source pour la collecte de métriques, logs et traces distribués, utilisé pour l’observabilité de l’ensemble de la plateforme |
| Proxmox VE | Hyperviseur open-source de virtualisation (VMs KVM) sur lequel sont déployées les machines étudiantes |
| qemu-guest-agent | Agent s’exécutant à l’intérieur de la VM permettant à l’hyperviseur Proxmox d’y envoyer des commandes (notamment set-user-password pour la réinitialisation des credentials) |
| Quality Gate | Ensemble de critères de qualité configurés dans SonarQube dont le non-respect bloque automatiquement le merge d’une pull request |
| Quartz.NET | Bibliothèque .NET de planification de tâches (scheduler) utilisée pour les démarrages et clôtures automatiques de séances |
| RabbitMQ | Broker de messages open-source utilisé pour la communication asynchrone entre OrgService et VmService |
| Saga | Pattern de gestion de processus longs et distribués via une séquence d’étapes avec mécanisme de compensation en cas d’échec |
| SignalR | Bibliothèque ASP.NET Core permettant des communications temps réel entre le serveur et les clients via WebSocket |
| SPA | Single Page Application - application web dont le rendu est géré côté client ; Edukit-Front est une SPA Angular |
| Estimation en heures | Unité d’estimation utilisée par l’équipe pour chiffrer la charge de travail d’une user story lors du Sprint Planning, exprimée en heures et saisie dans le champ Story Points d’Azure DevOps |
| SSO | Single Sign-On - mécanisme d’authentification centralisée permettant à un utilisateur de se connecter une seule fois pour accéder à plusieurs services |
| User Story | Fonctionnalité décrite du point de vue de l’utilisateur final (format : En tant que… je veux… afin de…), servant d’unité de planification et de livraison dans la méthode Scrum |
| Wolverine | Bibliothèque .NET de messaging (RabbitMQ) et d’implémentation de sagas, utilisée dans OrgService et VmService |