@startuml seq_check title Flux CHECK — Peer A ↔ Peer B via oc-discovery skinparam sequenceMessageAlign center skinparam sequence { ArrowColor #333333 LifeLineBorderColor #888888 GroupBorderColor #777777 GroupBackgroundColor #FAFAFA NoteBackgroundColor #FFFDE7 NoteBorderColor #CCAA00 BoxBorderColor #555555 } skinparam ParticipantBackgroundColor #FFFFFF box "Peer A" #EAF3FB participant "oc-scheduler A" as SA participant "oc-discovery A" as DA end box box "Peer B" #EAF9EE participant "oc-discovery B" as DB participant "oc-scheduler B" as SB end box participant "Client" as Client ' ══════════════════════════════════════════════════════ == Alimentation continue du PlannerCache (fond permanent) == ' ══════════════════════════════════════════════════════ note over SA, SB Déclenché par : démarrage de SB, booking local créé, TTL planner expiré → refreshSelfPlanner() end note SB -> DB : **NATS PUB** · PROPALGATION_EVENT\nPB_PLANNER { peer_id, schedule, capacities } DB --> DA : **STREAM** · PropalgationMessage\n{ action: PB_PLANNER } DA -> SA : **NATS SUB** · PROPALGATION_EVENT\n[ FromApp = "oc-discovery" ] SA -> SA : storePlanner(PeerB.PeerID, planner)\n→ PlannerCache[PeerB.PeerID] = p ' ══════════════════════════════════════════════════════ == Flux CHECK (POST /oc/:wfID/check) == ' ══════════════════════════════════════════════════════ Client -> SA : POST /oc/:wfID/check\n?as_possible=true&preemption=false group ① Résolution du workflow SA -> SA : workflow.LoadOne(wfID) SA -> SA : collectBookingResources(wf)\n→ [ { peerID=B, resourceID, instanceID } ] end group ② Vérification locale contre le cache SA -> SA : checkResourceAvailability()\nPlannerCache[PeerB.PeerID].Check(res, inst, start, end) alt slot disponible SA -> SA : available = true else slot occupé SA -> SA : findNextSlot(window=5h, pas=15min)\n→ next_slot end end SA -> Client : **CheckResult**\n{ available, start, end, next_slot, warnings } note over Client, SB Aucun appel réseau pendant le check : tout est résolu depuis le PlannerCache local de A. oc-discovery n'intervient qu'en amont (fond continu). end note @enduml