- 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>
3.5 KiB
3.5 KiB
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
- Le GPV critique est servi par la task queue AVANT la state machine — le
continue()dansstate_machine_manager.tsservait les queued tasks en priorité sur la state machine (corrigé partiellement) - 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) - 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