Merge "alarm manager to manage predefined platform alarm definitions in a json file...
authorAbukar Mohamed <abukar.mohamed@nokia.com>
Fri, 25 Sep 2020 10:19:09 +0000 (10:19 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Fri, 25 Sep 2020 10:19:09 +0000 (10:19 +0000)
build/Dockerfile
build/build_ubuntu.sh
build/run.sh
definitions/alarm-definition.json [new file with mode: 0755]
manager/cmd/manager.go
manager/cmd/manager_test.go

index b774e02..6572c49 100755 (executable)
@@ -37,6 +37,7 @@ COPY --from=ubuntu-alarm-manager /go/src/am/build/run.sh /
 COPY --from=ubuntu-alarm-manager /go/src/am/manager/alarm-manager /
 COPY --from=ubuntu-alarm-manager /go/src/am/config/* /
 COPY --from=ubuntu-alarm-manager /usr/local/lib /usr/local/lib
+COPY --from=ubuntu-alarm-manager /go/src/am/definitions/* / 
 
 RUN ldconfig
 
index 29b9d77..3136eca 100755 (executable)
@@ -42,6 +42,9 @@ export PATH=$GOPATH/bin:$PATH
 export CFG_FILE=../config/config-file.json
 export RMR_SEED_RT=../config/uta_rtg.rt
 
+# xApp stuff
+export DEF_FILE=../definitions/alarm-definition.json
+
 GO111MODULE=on GO_ENABLED=0 GOOS=linux
 
 # setup version tag
index db9e0e3..1e1ad85 100755 (executable)
@@ -24,5 +24,6 @@
 #
 export RMR_SEED_RT=./uta_rtg.rt
 export RMR_SRC_ID="service-ricplt-alarmmanager-rmr.ricplt"
+export DEF_FILE=./alarm-definition.json
 
 exec ./alarm-manager -f ./config-file.json
diff --git a/definitions/alarm-definition.json b/definitions/alarm-definition.json
new file mode 100755 (executable)
index 0000000..96d255f
--- /dev/null
@@ -0,0 +1,40 @@
+{
+    "alarmdefinitions" : [
+        {
+            "alarmId" : 8004,
+            "alarmText" : "RIC ROUTING TABLE DISTRIBUTION FAILED",
+            "eventType" : "Processing error",
+            "operationInstructions" : "Not defined"
+        },
+        {
+            "alarmId" : 8005,
+            "alarmText" : "TCP CONNECTIVITY LOST TO DBAAS",
+            "eventType" : "Communication error",
+            "operationInstructions" : "Not defined"
+        },
+        {
+            "alarmId" : 8006,
+            "alarmText" : "E2 CONNECTIVITY LOST TO G-NODEB",
+            "eventType" : "Communication error",
+            "operationInstructions" : "Not defined"
+        },
+        {
+            "alarmId" : 8007,
+            "alarmText" : "E2 CONNECTIVITY LOST TO E-NODEB",
+            "eventType" : "Communication error",
+            "operationInstructions" : "Not defined"
+        },
+        {
+            "alarmId" : 8008,
+            "alarmText" : "ACTIVE ALARM EXCEED MAX THRESHOLD",
+            "eventType" : "storage warning",
+            "operationInstructions" : "Clear alarms or raise threshold"
+        },
+        {
+            "alarmId" : 8009,
+            "alarmText" : "ALARM HISTORY EXCEED MAX THRESHOLD",
+            "eventType" : "storage warning",
+            "operationInstructions" : "Clear alarms or raise threshold"
+        }
+   ]
+}
index 564a2d4..6e67672 100755 (executable)
@@ -24,16 +24,16 @@ import (
        "encoding/json"
        "fmt"
        "time"
-
+        "os"
+       "gerrit.o-ran-sc.org/r/ric-plt/alarm-go/alarm"
+       app "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
        clientruntime "github.com/go-openapi/runtime/client"
        "github.com/go-openapi/strfmt"
        "github.com/prometheus/alertmanager/api/v2/client"
        "github.com/prometheus/alertmanager/api/v2/client/alert"
        "github.com/prometheus/alertmanager/api/v2/models"
        "github.com/spf13/viper"
-
-       "gerrit.o-ran-sc.org/r/ric-plt/alarm-go/alarm"
-       app "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
+       "io/ioutil"
 )
 
 func (a *AlarmManager) StartAlertTimer() {
@@ -225,6 +225,36 @@ func (a *AlarmManager) ConfigChangeCB(configparam string) {
        return
 }
 
+func (a *AlarmManager) ReadAlarmDefinitionFromJson() {
+
+       filename := os.Getenv("DEF_FILE")
+       file, err := ioutil.ReadFile(filename)
+       if err == nil {
+               data := RicAlarmDefinitions{}
+               err = json.Unmarshal([]byte(file), &data)
+               if err == nil {
+                       for _, alarmDefinition := range data.AlarmDefinitions {
+                               _, exists := alarm.RICAlarmDefinitions[alarmDefinition.AlarmId]
+                               if exists {
+                                       app.Logger.Error("ReadAlarmDefinitionFromJson: alarm definition already exists for %v", alarmDefinition.AlarmId)
+                               } else {
+                                       app.Logger.Debug("ReadAlarmDefinitionFromJson: alarm  %v", alarmDefinition.AlarmId)
+                                       ricAlarmDefintion := new(alarm.AlarmDefinition)
+                                       ricAlarmDefintion.AlarmId = alarmDefinition.AlarmId
+                                       ricAlarmDefintion.AlarmText = alarmDefinition.AlarmText
+                                       ricAlarmDefintion.EventType = alarmDefinition.EventType
+                                       ricAlarmDefintion.OperationInstructions = alarmDefinition.OperationInstructions
+                                       alarm.RICAlarmDefinitions[alarmDefinition.AlarmId] = ricAlarmDefintion
+                               }
+                       }
+               } else {
+                       app.Logger.Error("json.Unmarshal failed with error %v", err)
+               }
+       } else {
+               app.Logger.Error("ioutil.ReadFile failed with error %v", err)
+       }
+}
+
 func (a *AlarmManager) Run(sdlcheck bool) {
        app.Logger.SetMdc("alarmManager", fmt.Sprintf("%s:%s", Version, Hash))
        app.SetReadyCB(func(d interface{}) { a.rmrReady = true }, true)
@@ -232,6 +262,7 @@ func (a *AlarmManager) Run(sdlcheck bool) {
        app.AddConfigChangeListener(a.ConfigChangeCB)
 
        alarm.RICAlarmDefinitions = make(map[int]*alarm.AlarmDefinition)
+       a.ReadAlarmDefinitionFromJson()
 
        app.Resource.InjectRoute("/ric/v1/alarms", a.RaiseAlarm, "POST")
        app.Resource.InjectRoute("/ric/v1/alarms", a.ClearAlarm, "DELETE")
index 838de79..883b112 100755 (executable)
@@ -50,7 +50,7 @@ func TestMain(M *testing.M) {
        os.Setenv("ALARM_IF_RMR", "true")
        alarmManager = NewAlarmManager("localhost:9093", 500)
        go alarmManager.Run(false)
-       time.Sleep(time.Duration(2) * time.Second)
+       time.Sleep(time.Duration(10) * time.Second)
 
        // Wait until RMR is up-and-running
        for !xapp.Rmr.IsReady() {
@@ -65,6 +65,22 @@ func TestMain(M *testing.M) {
        os.Exit(M.Run())
 }
 
+func TestGetPreDefinedAlarmDefinitions(t *testing.T) {
+       xapp.Logger.Info("TestGetPreDefinedAlarmDefinitions")
+       var alarmDefinition alarm.AlarmDefinition
+       req, _ := http.NewRequest("GET", "/ric/v1/alarms/define", nil)
+       vars := map[string]string{"alarmId": strconv.FormatUint(8004, 10)}
+       req = mux.SetURLVars(req, vars)
+       handleFunc := http.HandlerFunc(alarmManager.GetAlarmDefinition)
+       response := executeRequest(req, handleFunc)
+       checkResponseCode(t, http.StatusOK, response.Code)
+       json.NewDecoder(response.Body).Decode(&alarmDefinition)
+       xapp.Logger.Info("alarm definition = %v", alarmDefinition)
+       if alarmDefinition.AlarmId != alarm.RIC_RT_DISTRIBUTION_FAILED || alarmDefinition.AlarmText != "RIC ROUTING TABLE DISTRIBUTION FAILED" {
+               t.Errorf("Incorrect alarm definition")
+       }
+}
+
 func TestSetAlarmDefinitions(t *testing.T) {
        xapp.Logger.Info("TestSetAlarmDefinitions")
        var alarm8004Definition alarm.AlarmDefinition
@@ -95,13 +111,13 @@ func TestSetAlarmDefinitions(t *testing.T) {
        alarm8008Definition.AlarmId = alarm.ACTIVE_ALARM_EXCEED_MAX_THRESHOLD
        alarm8008Definition.AlarmText = "ACTIVE ALARM EXCEED MAX THRESHOLD"
        alarm8008Definition.EventType = "storage warning"
-       alarm8008Definition.OperationInstructions = "clear alarms or raise threshold"
+       alarm8008Definition.OperationInstructions = "Clear alarms or raise threshold"
 
        var alarm8009Definition alarm.AlarmDefinition
        alarm8009Definition.AlarmId = alarm.ALARM_HISTORY_EXCEED_MAX_THRESHOLD
        alarm8009Definition.AlarmText = "ALARM HISTORY EXCEED MAX THRESHOLD"
        alarm8009Definition.EventType = "storage warning"
-       alarm8009Definition.OperationInstructions = "clear alarms or raise threshold"
+       alarm8009Definition.OperationInstructions = "Clear alarms or raise threshold"
 
        pbodyParams := RicAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarm8004Definition, &alarm8005Definition, &alarm8006Definition, &alarm8007Definition, &alarm8008Definition, &alarm8009Definition}}
        pbodyEn, _ := json.Marshal(pbodyParams)