VOL-2324 Alarm - ONU Itu Pon Stats
This commit addresses two U.S i.e VOL-895 and VOL-2324,
where ONU remote defect alarm is raised according to the
data present in the OnuItuPonStatsInd
Change-Id: I1fdc7566fe74e9b376ed2053db01caaeba373979
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index a008e65..09df67e 100644
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -31,8 +31,6 @@
"github.com/opencord/voltha-lib-go/v3/pkg/flows"
- "google.golang.org/grpc/codes"
-
"github.com/cenkalti/backoff/v3"
"github.com/gogo/protobuf/proto"
"github.com/golang/protobuf/ptypes"
@@ -47,6 +45,7 @@
oop "github.com/opencord/voltha-protos/v3/go/openolt"
"github.com/opencord/voltha-protos/v3/go/voltha"
"google.golang.org/grpc"
+ "google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
@@ -116,6 +115,7 @@
proxyDeviceID string
uniPorts map[uint32]struct{}
losRaised bool
+ rdiRaised bool
}
var pmNames = []string{
@@ -2199,6 +2199,15 @@
dh.onus.Store(onuKey, onuDevice)
}
+// setOnuITUPonAlarmConfig sets the parameters in the openolt agent for raising the ONU ITU PON alarms.
+func (dh *DeviceHandler) setOnuITUPonAlarmConfig(config *oop.OnuItuPonAlarm) error {
+ if _, err := dh.Client.OnuItuPonAlarmSet(context.Background(), config); err != nil {
+ return err
+ }
+ logger.Debugw("onu-itu-pon-alarm-config-set-successful", log.Fields{"config": config})
+ return nil
+}
+
func (dh *DeviceHandler) getExtValue(device *voltha.Device, value voltha.ValueType_Type) (*voltha.ReturnValues, error) {
var err error
var sn *oop.SerialNumber
diff --git a/internal/pkg/core/openolt_eventmgr.go b/internal/pkg/core/openolt_eventmgr.go
index 4b6d12d..a11d3f7 100644
--- a/internal/pkg/core/openolt_eventmgr.go
+++ b/internal/pkg/core/openolt_eventmgr.go
@@ -19,6 +19,7 @@
import (
ctx "context"
+ "errors"
"fmt"
"strconv"
@@ -140,10 +141,7 @@
err = em.onuLossOfSyncIndication(alarmInd.GetOnuLossOfSyncFailInd(), deviceID, raisedTs)
case *oop.AlarmIndication_OnuItuPonStatsInd:
logger.Debugw("received-onu-itu-pon-stats-indication ", log.Fields{"alarm-ind": alarmInd})
- logger.Warnw("not-implemented-yet", log.Fields{"alarm-ind": alarmInd})
- case *oop.AlarmIndication_OnuRemoteDefectInd:
- logger.Debugw("received-onu-remote-defect-indication ", log.Fields{"alarm-ind": alarmInd})
- err = em.onuRemoteDefectIndication(alarmInd.GetOnuRemoteDefectInd(), deviceID, raisedTs)
+ err = em.onuItuPonStatsIndication(alarmInd.GetOnuItuPonStatsInd(), deviceID, raisedTs)
case *oop.AlarmIndication_OnuDeactivationFailureInd:
logger.Debugw("received-onu-deactivation-failure-indication ", log.Fields{"alarm-ind": alarmInd})
err = em.onuDeactivationFailureIndication(alarmInd.GetOnuDeactivationFailureInd(), deviceID, raisedTs)
@@ -608,12 +606,14 @@
/* Populating event context */
context["onu-id"] = strconv.FormatUint(uint64(onuDFI.OnuId), base10)
context["intf-id"] = strconv.FormatUint(uint64(onuDFI.IntfId), base10)
- context["failure-reason"] = strconv.FormatUint(uint64(onuDFI.FailReason), base10)
/* Populating device event body */
de.Context = context
de.ResourceId = deviceID
- de.DeviceEventName = onuDeactivationFailureEvent
-
+ if onuDFI.Status == statusCheckOn {
+ de.DeviceEventName = fmt.Sprintf("%s_%s", onuDeactivationFailureEvent, "RAISE_EVENT")
+ } else {
+ de.DeviceEventName = fmt.Sprintf("%s_%s", onuDeactivationFailureEvent, "CLEAR_EVENT")
+ }
/* Send event to KAFKA */
if err := em.eventProxy.SendDeviceEvent(&de, equipment, onu, raisedTs); err != nil {
return err
@@ -621,25 +621,51 @@
logger.Debugw("onu-deactivation-failure-event-sent-to-kafka", log.Fields{"onu-id": onuDFI.OnuId, "intf-id": onuDFI.IntfId})
return nil
}
-
-func (em *OpenOltEventMgr) onuRemoteDefectIndication(onuRDI *oop.OnuRemoteDefectIndication, deviceID string, raisedTs int64) error {
+func (em *OpenOltEventMgr) onuRemoteDefectIndication(onuID uint32, intfID uint32, rdiCount uint64, status string, deviceID string, raisedTs int64) error {
/* Populating event context */
context := map[string]string{
- "onu-id": strconv.FormatUint(uint64(onuRDI.OnuId), base10),
- "intf-id": strconv.FormatUint(uint64(onuRDI.IntfId), base10),
- "rdi-errors": strconv.FormatUint(uint64(onuRDI.RdiErrors), base10),
+ "onu-id": strconv.FormatUint(uint64(onuID), base10),
+ "intf-id": strconv.FormatUint(uint64(intfID), base10),
+ "rdi-count": strconv.FormatUint(rdiCount, base10),
}
/* Populating device event body */
de := &voltha.DeviceEvent{
- Context: context,
- ResourceId: deviceID,
- DeviceEventName: onuRemoteDefectIndication,
+ Context: context,
+ ResourceId: deviceID,
+ }
+ if status == statusCheckOn {
+ de.DeviceEventName = fmt.Sprintf("%s_%s", onuRemoteDefectIndication, "RAISE_EVENT")
+ } else {
+ de.DeviceEventName = fmt.Sprintf("%s_%s", onuRemoteDefectIndication, "CLEAR_EVENT")
}
/* Send event to KAFKA */
if err := em.eventProxy.SendDeviceEvent(de, equipment, onu, raisedTs); err != nil {
return err
}
- logger.Debugw("onu-remote-defect-event-sent-to-kafka", log.Fields{"onu-id": onuRDI.OnuId, "intf-id": onuRDI.IntfId})
+ logger.Debugw("onu-remote-defect-event-sent-to-kafka", log.Fields{"onu-id": onuID, "intf-id": intfID})
+ return nil
+}
+
+func (em *OpenOltEventMgr) onuItuPonStatsIndication(onuIPS *oop.OnuItuPonStatsIndication, deviceID string, raisedTs int64) error {
+ onuDevice, found := em.handler.onus.Load(em.handler.formOnuKey(onuIPS.IntfId, onuIPS.OnuId))
+ if !found {
+ return errors.New("unknown-onu-device")
+ }
+ if onuIPS.GetRdiErrorInd().Status == statusCheckOn {
+ if !onuDevice.(*OnuDevice).rdiRaised {
+ if err := em.onuRemoteDefectIndication(onuIPS.OnuId, onuIPS.IntfId, onuIPS.GetRdiErrorInd().RdiErrorCount, statusCheckOn, deviceID, raisedTs); err != nil {
+ return err
+ }
+ onuDevice.(*OnuDevice).rdiRaised = true
+ return nil
+ }
+ logger.Debugw("onu-remote-defect-already-raised", log.Fields{"onu-id": onuIPS.OnuId, "intf-id": onuIPS.IntfId})
+ } else {
+ if err := em.onuRemoteDefectIndication(onuIPS.OnuId, onuIPS.IntfId, onuIPS.GetRdiErrorInd().RdiErrorCount, statusCheckOff, deviceID, raisedTs); err != nil {
+ return err
+ }
+ onuDevice.(*OnuDevice).rdiRaised = false
+ }
return nil
}
diff --git a/internal/pkg/core/openolt_eventmgr_test.go b/internal/pkg/core/openolt_eventmgr_test.go
index f73e234..ebbf976 100644
--- a/internal/pkg/core/openolt_eventmgr_test.go
+++ b/internal/pkg/core/openolt_eventmgr_test.go
@@ -124,9 +124,11 @@
{"ProcessEvents-", args{alarmInd: &oop.AlarmIndication{Data: &oop.AlarmIndication_OnuLossOfSyncFailInd{OnuLossOfSyncFailInd: &oop.OnuLossOfKeySyncFailureIndication{IntfId: 1, OnuId: 3, Status: "off"}}}, deviceID: "olt", raisedTs: time.Now().Unix()}},
// AlarmIndication_onuDeactivationFailureInd
- {"ProcessEvents-", args{alarmInd: &oop.AlarmIndication{Data: &oop.AlarmIndication_OnuDeactivationFailureInd{OnuDeactivationFailureInd: &oop.OnuDeactivationFailureIndication{IntfId: 1, OnuId: 3, FailReason: 2}}}, deviceID: "olt", raisedTs: time.Now().Unix()}},
- // AlarmIndication_onuRemoteDefectInd
- {"ProcessEvents-", args{alarmInd: &oop.AlarmIndication{Data: &oop.AlarmIndication_OnuRemoteDefectInd{OnuRemoteDefectInd: &oop.OnuRemoteDefectIndication{IntfId: 1, OnuId: 3, RdiErrors: 3}}}, deviceID: "olt", raisedTs: time.Now().Unix()}},
+ {"ProcessEvents-", args{alarmInd: &oop.AlarmIndication{Data: &oop.AlarmIndication_OnuDeactivationFailureInd{OnuDeactivationFailureInd: &oop.OnuDeactivationFailureIndication{IntfId: 1, OnuId: 3, Status: "on"}}}, deviceID: "olt", raisedTs: time.Now().Unix()}},
+ {"ProcessEvents-", args{alarmInd: &oop.AlarmIndication{Data: &oop.AlarmIndication_OnuDeactivationFailureInd{OnuDeactivationFailureInd: &oop.OnuDeactivationFailureIndication{IntfId: 1, OnuId: 3, Status: "off"}}}, deviceID: "olt", raisedTs: time.Now().Unix()}},
+ // AlarmIndication_onuItuPonStatsIndication
+ {"ProcessEvents-", args{alarmInd: &oop.AlarmIndication{Data: &oop.AlarmIndication_OnuItuPonStatsInd{OnuItuPonStatsInd: &oop.OnuItuPonStatsIndication{IntfId: 1, OnuId: 3, Stats: &oop.OnuItuPonStatsIndication_RdiErrorInd{RdiErrorInd: &oop.RdiErrorIndication{RdiErrorCount: 4, Status: "on"}}}}}, deviceID: "olt", raisedTs: time.Now().Unix()}},
+ {"ProcessEvents-", args{alarmInd: &oop.AlarmIndication{Data: &oop.AlarmIndication_OnuItuPonStatsInd{OnuItuPonStatsInd: &oop.OnuItuPonStatsIndication{IntfId: 1, OnuId: 3, Stats: &oop.OnuItuPonStatsIndication_RdiErrorInd{RdiErrorInd: &oop.RdiErrorIndication{RdiErrorCount: 0, Status: "off"}}}}}, deviceID: "olt", raisedTs: time.Now().Unix()}},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {