- TR-069 CWMP state machine hardening (14 phases): shared event utility, multi-event routing, GPN circuit breaker, IdleState GPN guard, expanded GPN fault codes, CriticalReadsState, ConfigEval GPN guard, task queue race condition fix, explicit error handling, terminal states (OperationalState/PartialOperationalState), consolidated reclassify, crash pattern detection, removed enqueueImmediate, state flow wiring - Fix SOAP Fault not processed by state machine (soap-env:Fault detection) - Fix GPN circuit breaker not persisting after session drops - Fix CriticalReadsState GPV response parsing (xsi:type normalization) - Fix CriticalReadsState not processing GPV response values - Skip SPV when device is already compliant (ProvisioningCode check) - Add Device.DeviceInfo.ModelName to critical reads GPV - Fix TypeError on DeviceDetail parameters view (null guards) - Log empty 204 responses in exchange trace UI - TR-181 catalog: type corrections and new entries (+6640 lines) - SequenceViewer: replace session-nav buttons with compact dropdown select - SequenceViewer: fix CPE/ACS lifeline headers wrapping to 2 lines - Add 20 unit tests for state machine fixes (SOAP Fault, GPN circuit breaker, CriticalReads, stale session, ConfigEval/ComplianceUpdate skips) Generated with [Continue](https://continue.dev) Co-Authored-By: Continue <noreply@continue.dev>
79 lines
3.5 KiB
Markdown
79 lines
3.5 KiB
Markdown
# Tâche : Refactoring State Machine — Session unique
|
|
|
|
## Objectif
|
|
|
|
Refactorer la `MainStateMachine` pour que tout le workflow d'onboarding se fasse en **une seule session CWMP**, sans déclencher de `ScheduleInform`.
|
|
|
|
## Flow attendu (session unique)
|
|
|
|
```
|
|
CPE → ACS : Inform (BOOTSTRAP)
|
|
ACS → CPE : InformResponse
|
|
CPE → ACS : POST vide
|
|
ACS → CPE : GetParameterNames
|
|
CPE → ACS : Fault (9003 si non supporté) OU GetParameterNamesResponse (si supporté)
|
|
ACS → CPE : GetParameterValues (lectures critiques)
|
|
CPE → ACS : GetParameterValuesResponse
|
|
ACS → CPE : SetParameterValues (ProvisioningCode + PeriodicInformInterval)
|
|
CPE → ACS : SetParameterValuesResponse
|
|
ACS → CPE : 204 (fin de session)
|
|
```
|
|
|
|
## Flow actuel (problème)
|
|
|
|
```
|
|
Session 1 (BOOTSTRAP):
|
|
Inform → InformResponse → Empty → SPV → SPVResponse → 204
|
|
|
|
Session 2 (SCHEDULED - déclenchée par ScheduleInform):
|
|
Inform → InformResponse → Empty → GPV → GPVResponse → GPN → Fault → 204
|
|
|
|
Session 3 (PERIODIC):
|
|
Inform → InformResponse → Empty → SPV → SPVResponse → 204
|
|
```
|
|
|
|
## Problèmes identifiés
|
|
|
|
1. **Le GPV critique est servi par la task queue AVANT la state machine** — le `continue()` dans `state_machine_manager.ts` servait les queued tasks en priorité sur la state machine (corrigé partiellement)
|
|
2. **L'ordre des états n'est pas optimal** — actuellement `IdleState → DiscoveringParams → ConfigEval → ComplianceUpdate → ExecutingCommands`, mais le GPV critique est hors de la state machine (dans la task queue)
|
|
3. **Le SCHEDULED est déclenché par l'équipement** suite au changement du PeriodicInformInterval — l'ACS ne l'envoie pas explicitement mais le CPE refait un Inform avec event SCHEDULED après avoir accepté le SPV
|
|
|
|
## Changements requis
|
|
|
|
### 1. Intégrer le GPV critique dans la state machine
|
|
|
|
Au lieu d'enqueuer le GPV via `manager.enqueueImmediate()` dans le controller, l'ajouter comme état dans la state machine :
|
|
|
|
```
|
|
IdleState → DiscoveringParametersState (GPN) → CriticalReadsState (GPV) → ConfigurationEvaluationState → ComplianceUpdateState (SPV) → ExecutingCommandsState → CompletedState
|
|
```
|
|
|
|
### 2. Ne pas retenter GPN si gpnStatus est déjà "unsupported"
|
|
|
|
Dans `IdleState`, vérifier `device.gpnStatus` :
|
|
- Si `'unsupported'` → skip directement à `CriticalReadsState`
|
|
- Si `'unknown'` ou `'supported'` → tenter GPN
|
|
|
|
### 3. Supprimer les enqueue critiques du controller
|
|
|
|
Retirer le bloc `enqueueImmediate(device, 'get_parameter_values', criticalPaths)` du `cwmp_controller.ts` — c'est la state machine qui gère.
|
|
|
|
## Fichiers impactés
|
|
|
|
| Fichier | Changement |
|
|
|---------|-----------|
|
|
| `app/services/cwmp/main_state_machine.ts` | Ajouter `CriticalReadsState`, réordonner les états |
|
|
| `app/services/cwmp/state_machine_manager.ts` | Simplifier `continue()` (plus de task queue priority) |
|
|
| `app/controllers/cwmp_controller.ts` | Retirer `enqueueImmediate` pour GPV |
|
|
| `tests/unit/services/main_state_machine.spec.ts` | Adapter les tests |
|
|
| `tests/unit/services/cwmp/main_state_machine_extended.spec.ts` | Adapter |
|
|
|
|
## Critères de succès
|
|
|
|
- [ ] Un BOOTSTRAP frais produit une seule session : `Inform → GPN → Fault/Response → GPV → SPV → 204`
|
|
- [ ] Un PERIODIC sur un device connu (gpnStatus=unsupported) : `Inform → SPV → 204` (pas de GPN)
|
|
- [ ] Pas de session SCHEDULED superflue (le GPV/GPN est fait dans la session BOOTSTRAP)
|
|
- [ ] Tous les tests unitaires passent
|
|
- [ ] Le genieacs-sim (Huawei, GPN supporté) continue de fonctionner
|
|
- [ ] Le simulateur Livebox (GPN non supporté) provisionne correctement en 1 session
|