alarm-go rmr init cleaned 59/9159/5
authorJuha Hyttinen <juha.hyttinen@nokia.com>
Mon, 3 Oct 2022 06:52:01 +0000 (09:52 +0300)
committerJuha Hyttinen <juha.hyttinen@nokia.com>
Thu, 6 Oct 2022 07:29:20 +0000 (10:29 +0300)
fallback to http if problems with rmr (rmr not inited / rmrsend fails / etc)

Issue-Id: RIC-943

Signed-off-by: Juha Hyttinen <juha.hyttinen@nokia.com>
Change-Id: Id04df2e760b5bfcc4578a141536d46b233eaee9f

alarm/alarm.go
alarm/types.go

index 77e9281..1cb26b4 100755 (executable)
@@ -46,37 +46,33 @@ import "C"
 // The identities are used when raising/clearing alarms, unless provided by the applications.
 func InitAlarm(mo, id string) (*RICAlarm, error) {
        r := &RICAlarm{
-               moId:  mo,
-               appId: id,
+               moId:        mo,
+               appId:       id,
+               managerUrl:  ALARM_MANAGER_HTTP_URL,
+               rmrEndpoint: ALARM_MANAGER_RMR_URL,
        }
 
        //
        // http service information (used in case of no rmr connectivity)
        //
-       namespace := os.Getenv("PLT_NAMESPACE")
-
        if os.Getenv("ALARM_MANAGER_URL") != "" {
                r.managerUrl = os.Getenv("ALARM_MANAGER_URL")
-       } else if namespace != "" {
-               r.managerUrl = fmt.Sprintf("http://service-%s-alarmmanager-http.%s:8080", namespace, namespace)
-       } else {
-               r.managerUrl = "http://127.0.0.1:8080"
        }
 
-       //
-       // rmr service
-       //
-       rmrservname := os.Getenv("ALARM_MANAGER_SERVICE_NAME")
-       rmrservport := os.Getenv("ALARM_MANAGER_SERVICE_PORT")
-
-       if rmrservname != "" && rmrservport != "" {
-               go InitRMR(r, rmrservname+":"+rmrservport)
-       } else if namespace != "" {
-               go InitRMR(r, fmt.Sprintf("service-%s-alarmmanager-rmr.%s:4560", namespace, namespace))
-       } else {
-               go InitRMR(r, "")
+       if os.Getenv("ALARM_MANAGER_SERVICE_NAME") != "" && os.Getenv("ALARM_MANAGER_SERVICE_PORT") != "" {
+               r.rmrEndpoint = fmt.Sprintf("%s:%s", os.Getenv("ALARM_MANAGER_SERVICE_NAME"), os.Getenv("ALARM_MANAGER_SERVICE_PORT"))
        }
 
+       if os.Getenv("ALARM_IF_RMR") == "" {
+               if r.moId == "my-pod" {
+                       r.rmrEndpoint = "127.0.0.1:4560"
+               } else if r.moId == "my-pod-lib" {
+                       r.rmrEndpoint = "127.0.0.1:4588"
+               }
+       }
+
+       go InitRMR(r)
+
        return r, nil
 }
 
@@ -153,6 +149,32 @@ func (r *RICAlarm) AlarmString(a AlarmMessage) string {
        return fmt.Sprintf(s, a.ManagedObjectId, a.ApplicationId, a.SpecificProblem, a.PerceivedSeverity, a.IdentifyingInfo)
 }
 
+func (r *RICAlarm) sendAlarmUpdateReqWithHttp(payload []byte) error {
+       url := fmt.Sprintf("%s/%s", r.managerUrl, "ric/v1/alarms")
+       resp, err := http.Post(url, "application/json", bytes.NewReader(payload))
+       if err != nil || resp == nil {
+               return fmt.Errorf("HttpError=Post failed with error: %v", err)
+       }
+       log.Printf("Alarm posted to %s [status=%d]", url, resp.StatusCode)
+       return nil
+}
+
+func (r *RICAlarm) sendAlarmUpdateReqWithRmr(payload []byte) error {
+       if r.rmrCtx == nil || !r.rmrReady {
+               return fmt.Errorf("RmrError=rmr not ready")
+       }
+       datap := C.CBytes(payload)
+       defer C.free(datap)
+       meid := C.CString("ric")
+       defer C.free(unsafe.Pointer(meid))
+
+       if state := C.rmrSend(r.rmrCtx, RIC_ALARM_UPDATE, datap, C.int(len(payload)), meid); state != C.RMR_OK {
+               return errors.New(fmt.Sprintf("RmrError=rmrSend failed with error: %d", state))
+       }
+       log.Printf("Alarm sent via rmr to %s", r.rmrEndpoint)
+       return nil
+}
+
 func (r *RICAlarm) sendAlarmUpdateReq(a AlarmMessage) error {
 
        payload, err := json.Marshal(a)
@@ -162,27 +184,26 @@ func (r *RICAlarm) sendAlarmUpdateReq(a AlarmMessage) error {
        }
        log.Println("Sending alarm: ", fmt.Sprintf("%s", payload))
 
-       if r.rmrCtx == nil || !r.rmrReady {
-               url := fmt.Sprintf("%s/%s", r.managerUrl, "ric/v1/alarms")
-               resp, err := http.Post(url, "application/json", bytes.NewReader(payload))
-               if err != nil || resp == nil {
-                       return fmt.Errorf("Unable to send alarm: %v", err)
+       // --
+       // Try rmr sending
+       // --
+       err = r.sendAlarmUpdateReqWithRmr(payload)
+
+       // --
+       // Try http posting if rmr is not done for some reason: rmrSend error, rmr not initialized yet etc.
+       // --
+       if err != nil {
+               if httperr := r.sendAlarmUpdateReqWithHttp(payload); httperr != nil {
+                       err = fmt.Errorf("%s and  %s", err.Error(), httperr.Error())
+               } else {
+                       err = nil
                }
-               log.Printf("Alarm posted to %s [status=%d]", url, resp.StatusCode)
-               return nil
        }
 
-       datap := C.CBytes(payload)
-       defer C.free(datap)
-       meid := C.CString("ric")
-       defer C.free(unsafe.Pointer(meid))
-
-       if state := C.rmrSend(r.rmrCtx, RIC_ALARM_UPDATE, datap, C.int(len(payload)), meid); state != C.RMR_OK {
-               log.Println("rmrSend failed with error: ", state)
-               return errors.New(fmt.Sprintf("rmrSend failed with error: %d", state))
+       if err != nil {
+               log.Printf("Alarm sent error %s", err.Error())
        }
-
-       return nil
+       return err
 }
 
 func (r *RICAlarm) ReceiveMessage(cb func(AlarmMessage)) error {
@@ -196,17 +217,9 @@ func (r *RICAlarm) ReceiveMessage(cb func(AlarmMessage)) error {
        return errors.New("rmrRcv failed!")
 }
 
-func InitRMR(r *RICAlarm, endpoint string) error {
+func InitRMR(r *RICAlarm) error {
        // Setup static RT for alarm system
-       if endpoint == "" {
-               if r.moId == "my-pod" {
-                       endpoint = "127.0.0.1:4560"
-               } else if r.moId == "my-pod-lib" {
-                       endpoint = "127.0.0.1:4588"
-               }
-       }
-
-       alarmRT := fmt.Sprintf("newrt|start\nrte|13111|%s\nnewrt|end\n", endpoint)
+       alarmRT := fmt.Sprintf("newrt|start\nrte|13111|%s\nnewrt|end\n", r.rmrEndpoint)
        alarmRTFile := "/tmp/alarm.rt"
 
        if err := ioutil.WriteFile(alarmRTFile, []byte(alarmRT), 0644); err != nil {
index 04a53c5..5954c73 100755 (executable)
@@ -21,6 +21,8 @@
 package alarm
 
 import (
+       "fmt"
+       "os"
        "sync"
        "unsafe"
 )
@@ -74,12 +76,13 @@ type AlarmConfigParams struct {
 
 // RICAlarm is an alarm instance
 type RICAlarm struct {
-       moId       string
-       appId      string
-       managerUrl string
-       rmrCtx     unsafe.Pointer
-       rmrReady   bool
-       mutex      sync.Mutex
+       moId        string
+       appId       string
+       managerUrl  string
+       rmrEndpoint string
+       rmrCtx      unsafe.Pointer
+       rmrReady    bool
+       mutex       sync.Mutex
 }
 
 const (
@@ -106,3 +109,9 @@ type AlarmDefinition struct {
 
 var RICAlarmDefinitions map[int]*AlarmDefinition
 var RICPerfAlarmObjects map[int]*Alarm
+
+var (
+       namespace                     = os.Getenv("PLT_NAMESPACE")
+       ALARM_MANAGER_HTTP_URL string = fmt.Sprintf("http://service-%s-alarmmanager-http.%s:8080", namespace, namespace)
+       ALARM_MANAGER_RMR_URL  string = fmt.Sprintf("service-%s-alarmmanager-rmr.%s:4560", namespace, namespace)
+)