package control
import (
+ "encoding/json"
"fmt"
- "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
"strings"
"sync"
+
+ "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
)
type XappRnibIf struct {
}
type E2IfState struct {
- mutex sync.Mutex
- control *Control
- NbIdMap map[string]string
+ mutex sync.Mutex
+ control *Control
+ NbIdMap map[string]string
+ NbIdStatusMap map[string]string
}
func (e *E2IfState) Init(c *Control) {
e.control = c
e.NbIdMap = make(map[string]string, 0)
+ e.NbIdStatusMap = make(map[string]string, 0)
e.ReadE2ConfigurationFromRnib()
- e.SubscribeChannels()
+ err := e.SubscribeChannels()
+ if err != nil {
+ xapp.Logger.Error("Init(): SubscribeChannels() failed: %v", err)
+ }
+}
+
+func (e *E2IfState) GetE2NodesJson() []byte {
+
+ e.mutex.Lock()
+ defer e.mutex.Unlock()
+
+ // Map contains something like this{"RAN_NAME_1":"RAN_NAME_1","RAN_NAME_11":"RAN_NAME_11","RAN_NAME_2":"RAN_NAME_2"}
+ var ranNameList []string
+ for _, ranName := range e.NbIdMap {
+ ranNameList = append(ranNameList, ranName)
+ }
+
+ e2NodesJson, err := json.Marshal(ranNameList)
+ if err != nil {
+ xapp.Logger.Error("GetE2Node() json.Marshal error: %v", err)
+ }
+ return e2NodesJson
+}
+
+func (e *E2IfState) GetAllE2Nodes() map[string]string {
+
+ e.mutex.Lock()
+ defer e.mutex.Unlock()
+ return e.NbIdMap
}
func (e *E2IfState) NotificationCb(ch string, events ...string) {
}
xapp.Logger.Debug("E2 CONNECTED. NbId=%s", nbId)
e.NbIdMap[nbId] = nbId
+ e.NbIdStatusMap[nbId] = "CONNECTED"
} else if strings.Contains(events[0], "_DISCONNECTED") {
e.control.UpdateCounter(cE2StateChangedToDown)
nbId, err := ExtractNbiIdFromString(events[0])
}
xapp.Logger.Debug("E2 DISCONNECTED. NbId=%s", nbId)
if _, ok := e.NbIdMap[nbId]; ok {
+ e.NbIdStatusMap[nbId] = "DISCONNECTED"
delete(e.NbIdMap, nbId)
e.control.registry.DeleteAllE2Subscriptions(nbId, e.control)
}
+ } else if strings.Contains(events[0], "_UNDER_RESET") {
+ xapp.Logger.Debug("NotificationCb UNDER_RESET len(nbId) == 0 ")
+ e.control.UpdateCounter(cE2StateUnderReset)
+ nbId, err := ExtractNbiIdFromString(events[0])
+ if err != nil {
+ xapp.Logger.Error("NotificationCb _UNDER_RESET %v ", err)
+ return
+ }
+ e.NbIdStatusMap[nbId] = "UNDER_RESET"
+ xapp.Logger.Debug("E2 Under Reset. NbId=%s", nbId)
+ if _, ok := e.NbIdMap[nbId]; ok {
+ e.control.registry.DeleteAllE2Subscriptions(nbId, e.control)
+ }
}
}
}
}
+func (e *E2IfState) IsE2ConnectionUnderReset(nbId *string) bool {
+
+ if status := e.NbIdStatusMap[*nbId]; status == "UNDER_RESET" {
+ return true
+ } else {
+ return false
+ }
+}
+
func ExtractNbiIdFromString(s string) (string, error) {
// Expected string formats are below
} else if strings.Contains(s, "_DISCONNECTED") {
splitStringTbl := strings.Split(s, "_DISCONNECTED")
nbId = splitStringTbl[0]
+ } else if strings.Contains(s, "_UNDER_RESET") {
+ splitStringTbl := strings.Split(s, "_UNDER_RESET")
+ nbId = splitStringTbl[0]
}
if len(nbId) == 0 {
return "", fmt.Errorf("ExtractNbiIdFromString(): len(nbId) == 0 ")