title E2T Init flow participant E2 Manager as E2M participant E2 Terminator instance as E2T participant RanDisconnectionManager as RDM participant E2tAssociationManager as EAM participant E2TInstancesManager as E2TM participant RoutingManagerClient as RMC participant rNib DB as RNIB E2T->E2M: INIT {} E2M->E2TM: GetE2TInstance(e2tAddress) E2TM->RNIB: GetE2TInstance(e2tAddress) alt existing E2T RNIB->E2TM: E2TInstance {Address:...,AssociatedRanList:[...]} E2TM->E2M: E2TInstance alt state: TO_BE_DELETED note over E2M: Log it.\nSTOP else state: RM_FAILURE E2M->+E2TM: SetE2tInstanceState(RM_FAILURE, ACTIVE) alt error E2TM->E2M: error note over E2M: Log it.\nSTOP else success E2TM->-E2M: ok end note over E2M: Proceed as ACTIVE... else state: ACTIVE loop all associated RANs E2M->RDM: DisconnectRan RDM->RNIB: GetNodeb RNIB->RDM: ok alt RAN's connection status is SHUT_DOWN note over RDM: return else RAN's connection status is SHUTTING_DOWN RDM->RNIB: UpdateNodeb(SHUT_DOWN) else Can dissociate ran RDM->RNIB: UpdateNodeb(DISCONNECTED) RDM->+EAM: DissociateRan(ranName, e2tAddress) note over EAM: Detailed in another sequence diagram... EAM-->-RDM: ok end end else new E2T (error: ResourceNotFoundError) RNIB->E2TM: err ResourceNotFoundError E2TM->E2M: err ResourceNotFoundError E2M->+RMC: POST /handles/v1/e2t alt RM failure RMC->E2M: 4xx/5xx/TO note over E2M: Log it.\nSTOP else RM success RMC->-E2M: 201 end E2M->+E2TM: AddE2TInstance(et2Address) note over E2TM: Create E2tInstance:\nkeepAliveTimestamp = now\nstate = ACTIVE note over E2TM: Lock (atomic operation) E2TM->+RNIB: SaveE2TInstance(E2TInstance:
) RNIB-->-E2TM: ok E2TM->+RNIB: GetE2TAddresses RNIB-->-E2TM: []string note over E2TM: add e2t address to list E2TM->+RNIB: SaveE2TAddresses RNIB-->-E2TM: ok note over E2TM: Unlock E2TM-->-E2M: ok note over E2M: In case of save failure, log it #E2M->E2M: iterate orphan RANs (?) #counter (?) else error (InternalError) RNIB->-E2TM: err InternalError E2TM->E2M: err InternalError note over E2M: log error end