From cfb2daa67fe50e31a4a1c768635543f81713fe01 Mon Sep 17 00:00:00 2001 From: Juha Hyttinen Date: Mon, 3 Oct 2022 09:52:01 +0300 Subject: [PATCH] alarm-go rmr init cleaned fallback to http if problems with rmr (rmr not inited / rmrsend fails / etc) Issue-Id: RIC-943 Signed-off-by: Juha Hyttinen Change-Id: Id04df2e760b5bfcc4578a141536d46b233eaee9f --- alarm/alarm.go | 107 ++++++++++++++++++++++++++++++++------------------------- alarm/types.go | 21 +++++++---- 2 files changed, 75 insertions(+), 53 deletions(-) diff --git a/alarm/alarm.go b/alarm/alarm.go index 77e9281..1cb26b4 100755 --- a/alarm/alarm.go +++ b/alarm/alarm.go @@ -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 { diff --git a/alarm/types.go b/alarm/types.go index 04a53c5..5954c73 100755 --- a/alarm/types.go +++ b/alarm/types.go @@ -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) +) -- 2.16.6