blob: 6f1fd68fb3fe6554ffda04d0e2c06877fef57605 [file] [log] [blame]
Devmalya Paulfb990a52019-07-09 10:01:49 -04001/*
2 * Copyright 2018-present Open Networking Foundation
3
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Scott Bakerdbd960e2020-02-28 08:57:51 -080017// Package core provides APIs for the openOLT adapter
18package core
Devmalya Paulfb990a52019-07-09 10:01:49 -040019
20import (
Neha Sharma96b7bf22020-06-15 10:37:32 +000021 "context"
Devmalya Paula1efa642020-04-20 01:36:43 -040022 "errors"
Devmalya Paulfb990a52019-07-09 10:01:49 -040023 "fmt"
Naga Manjunath9546b912019-11-28 20:56:20 +053024 "strconv"
Naga Manjunatha8dc9372019-10-31 23:01:18 +053025
Esin Karamanccb714b2019-11-29 15:02:06 +000026 "github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
27 "github.com/opencord/voltha-lib-go/v3/pkg/log"
Thomas Lee S94109f12020-03-03 16:39:29 +053028 "github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
kesavand39e0aa32020-01-28 20:58:50 -050029 "github.com/opencord/voltha-protos/v3/go/common"
Esin Karamanccb714b2019-11-29 15:02:06 +000030 oop "github.com/opencord/voltha-protos/v3/go/openolt"
31 "github.com/opencord/voltha-protos/v3/go/voltha"
Devmalya Paulfb990a52019-07-09 10:01:49 -040032)
33
34const (
Devmalya Paul41a762d2020-03-01 18:56:54 -050035 onuDiscoveryEvent = "ONU_DISCOVERY"
36 onuLosEvent = "ONU_LOSS_OF_SIGNAL"
37 onuLobEvent = "ONU_LOSS_OF_BURST"
38 onuLopcMissEvent = "ONU_LOPC_MISS"
39 onuLopcMicErrorEvent = "ONU_LOPC_MIC_ERROR"
40 oltLosEvent = "OLT_LOSS_OF_SIGNAL"
41 oltIndicationDown = "OLT_DOWN_INDICATION"
42 onuDyingGaspEvent = "ONU_DYING_GASP"
43 onuSignalsFailEvent = "ONU_SIGNALS_FAIL"
44 onuStartupFailEvent = "ONU_STARTUP_FAIL"
45 onuSignalDegradeEvent = "ONU_SIGNAL_DEGRADE"
46 onuDriftOfWindowEvent = "ONU_DRIFT_OF_WINDOW"
47 onuActivationFailEvent = "ONU_ACTIVATION_FAIL"
48 onuProcessingErrorEvent = "ONU_PROCESSING_ERROR"
49 onuTiwiEvent = "ONU_TRANSMISSION_WARNING"
50 onuLossOmciEvent = "ONU_LOSS_OF_OMCI_CHANNEL"
51 onuLossOfKeySyncEvent = "ONU_LOSS_OF_KEY_SYNC"
52 onuLossOfFrameEvent = "ONU_LOSS_OF_FRAME"
53 onuLossOfPloamEvent = "ONU_LOSS_OF_PLOAM"
54 ponIntfDownIndiction = "OLT_PON_INTERFACE_DOWN"
55 onuDeactivationFailureEvent = "ONU_DEACTIVATION_FAILURE"
56 onuRemoteDefectIndication = "ONU_REMOTE_DEFECT"
57 onuLossOfGEMChannelDelineationEvent = "ONU_LOSS_OF_GEM_CHANNEL_DELINEATION"
58 onuPhysicalEquipmentErrorEvent = "ONU_PHYSICAL_EQUIPMENT_ERROR"
59 onuLossOfAcknowledgementEvent = "ONU_LOSS_OF_ACKNOWLEDGEMENT"
Devmalya Pauleb5294e2020-03-19 03:01:39 -040060 onuDifferentialReachExceededEvent = "ONU_DIFFERENTIAL_REACH_EXCEEDED"
Devmalya Paulfb990a52019-07-09 10:01:49 -040061)
62
63const (
64 pon = voltha.EventSubCategory_PON
65 olt = voltha.EventSubCategory_OLT
66 ont = voltha.EventSubCategory_ONT
67 onu = voltha.EventSubCategory_ONU
68 nni = voltha.EventSubCategory_NNI
69 service = voltha.EventCategory_SERVICE
70 security = voltha.EventCategory_SECURITY
71 equipment = voltha.EventCategory_EQUIPMENT
72 processing = voltha.EventCategory_PROCESSING
73 environment = voltha.EventCategory_ENVIRONMENT
74 communication = voltha.EventCategory_COMMUNICATION
75)
76
Naga Manjunath9546b912019-11-28 20:56:20 +053077const (
78 // statusCheckOn represents status check On
79 statusCheckOn = "on"
80 // statusCheckOff represents status check Off
81 statusCheckOff = "off"
82 // operationStateUp represents operation state Up
83 operationStateUp = "up"
84 // operationStateDown represents operation state Down
85 operationStateDown = "down"
86 // base10 represents base 10 conversion
87 base10 = 10
88)
89
Amit Ghosh502056b2020-07-15 09:15:48 +010090const (
91 // ContextOltOperState is for the operational state of the Olt in the context of the event
92 ContextOltOperState = "oper-state"
93 // ContextOnuOnuID is for the Onu Id in the context of the event
94 ContextOnuOnuID = "onu-id"
95 // ContextOnuPonIntfID is for the PON interface Id on which the Onu Event occurred
96 ContextOnuPonIntfID = "intf-id"
97 // ContextOnuSerialNumber is for the serial number of the ONU
98 ContextOnuSerialNumber = "serial-number"
99 // ContextOnuDeviceID is for the device id of the ONU generated by VOLTHA
100 ContextOnuDeviceID = "onu-device-id"
101 // ContextOltPonIntfID is for the PON interface Id on an OLT event
102 ContextOltPonIntfID = "intf-id"
103 // ContextOnuFailureReaseon is for the reason of failure of/at ONU indicated by the event
104 ContextOnuFailureReaseon = "fail-reason"
105 // ContextOnuDrift is for the drift of an ONU in the context of an event
106 ContextOnuDrift = "drift"
107 // ContextOnuNewEqd is for the New Eqd of an ONU in the context of an event
108 ContextOnuNewEqd = "new-eqd"
109 // ContextOnuInverseBitErrorRate is for the inverse bit error rate in the context of an ONU event
110 ContextOnuInverseBitErrorRate = "inverse-bit-error-rate"
111 // ContextOltPonIntfOperState is for the operational state of a PON port in the context of an OLT event
112 ContextOltPonIntfOperState = "oper-state"
113 // ContextOnuRemoteDefectIndicatorCount is for the rdi in the context of an ONU event
114 ContextOnuRemoteDefectIndicatorCount = "rdi-count"
115 // ContextOnuDelineationErrors is for the delineation errors if present in an ONU events context
116 ContextOnuDelineationErrors = "delineation-errors"
117 // ContextOnuDifferentialDistance is for the differential distance in an ONU event context
118 ContextOnuDifferentialDistance = "differential-distance"
119)
120
Devmalya Paulfb990a52019-07-09 10:01:49 -0400121// OpenOltEventMgr struct contains
122type OpenOltEventMgr struct {
kdarapu381c6902019-07-31 18:23:16 +0530123 eventProxy adapterif.EventProxy
Devmalya Paul90ca3012019-09-02 21:55:45 -0400124 handler *DeviceHandler
Devmalya Paulfb990a52019-07-09 10:01:49 -0400125}
126
127// NewEventMgr is a Function to get a new event manager struct for the OpenOLT to process and publish OpenOLT event
Devmalya Paul90ca3012019-09-02 21:55:45 -0400128func NewEventMgr(eventProxy adapterif.EventProxy, handler *DeviceHandler) *OpenOltEventMgr {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400129 var em OpenOltEventMgr
130 em.eventProxy = eventProxy
Devmalya Paul90ca3012019-09-02 21:55:45 -0400131 em.handler = handler
Devmalya Paulfb990a52019-07-09 10:01:49 -0400132 return &em
133}
134
135// ProcessEvents is function to process and publish OpenOLT event
Devmalya Paul41a762d2020-03-01 18:56:54 -0500136// nolint: gocyclo
Neha Sharma96b7bf22020-06-15 10:37:32 +0000137func (em *OpenOltEventMgr) ProcessEvents(ctx context.Context, alarmInd *oop.AlarmIndication, deviceID string, raisedTs int64) error {
Naga Manjunath9546b912019-11-28 20:56:20 +0530138 var err error
Devmalya Paulfb990a52019-07-09 10:01:49 -0400139 switch alarmInd.Data.(type) {
140 case *oop.AlarmIndication_LosInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000141 logger.Debugw(ctx, "received-los-indication", log.Fields{"alarm-ind": alarmInd})
142 err = em.oltLosIndication(ctx, alarmInd.GetLosInd(), deviceID, raisedTs)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400143 case *oop.AlarmIndication_OnuAlarmInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000144 logger.Debugw(ctx, "received-onu-alarm-indication ", log.Fields{"alarm-ind": alarmInd})
145 err = em.onuAlarmIndication(ctx, alarmInd.GetOnuAlarmInd(), deviceID, raisedTs)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400146 case *oop.AlarmIndication_DyingGaspInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000147 logger.Debugw(ctx, "received-dying-gasp-indication", log.Fields{"alarm-ind": alarmInd})
148 err = em.onuDyingGaspIndication(ctx, alarmInd.GetDyingGaspInd(), deviceID, raisedTs)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400149 case *oop.AlarmIndication_OnuActivationFailInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000150 logger.Debugw(ctx, "received-onu-activation-fail-indication ", log.Fields{"alarm-ind": alarmInd})
151 err = em.onuActivationFailIndication(ctx, alarmInd.GetOnuActivationFailInd(), deviceID, raisedTs)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400152 case *oop.AlarmIndication_OnuLossOmciInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000153 logger.Debugw(ctx, "received-onu-loss-omci-indication ", log.Fields{"alarm-ind": alarmInd})
154 err = em.onuLossOmciIndication(ctx, alarmInd.GetOnuLossOmciInd(), deviceID, raisedTs)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400155 case *oop.AlarmIndication_OnuDriftOfWindowInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000156 logger.Debugw(ctx, "received-onu-drift-of-window-indication ", log.Fields{"alarm-ind": alarmInd})
157 err = em.onuDriftOfWindowIndication(ctx, alarmInd.GetOnuDriftOfWindowInd(), deviceID, raisedTs)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400158 case *oop.AlarmIndication_OnuSignalDegradeInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000159 logger.Debugw(ctx, "received-onu-signal-degrade-indication ", log.Fields{"alarm-ind": alarmInd})
160 err = em.onuSignalDegradeIndication(ctx, alarmInd.GetOnuSignalDegradeInd(), deviceID, raisedTs)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400161 case *oop.AlarmIndication_OnuSignalsFailInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000162 logger.Debugw(ctx, "received-onu-signal-fail-indication ", log.Fields{"alarm-ind": alarmInd})
163 err = em.onuSignalsFailIndication(ctx, alarmInd.GetOnuSignalsFailInd(), deviceID, raisedTs)
Naga Manjunathf6f74642020-01-13 21:37:28 +0530164 case *oop.AlarmIndication_OnuStartupFailInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000165 logger.Debugw(ctx, "received-onu-startup-fail-indication ", log.Fields{"alarm-ind": alarmInd})
166 err = em.onuStartupFailedIndication(ctx, alarmInd.GetOnuStartupFailInd(), deviceID, raisedTs)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400167 case *oop.AlarmIndication_OnuTiwiInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000168 logger.Debugw(ctx, "received-onu-transmission-warning-indication ", log.Fields{"alarm-ind": alarmInd})
169 logger.Warnw(ctx, "not-implemented-yet", log.Fields{"alarm-ind": "Onu-Transmission-indication"})
Naga Manjunath9546b912019-11-28 20:56:20 +0530170 case *oop.AlarmIndication_OnuLossOfSyncFailInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000171 logger.Debugw(ctx, "received-onu-loss-of-sync-fail-indication ", log.Fields{"alarm-ind": alarmInd})
172 err = em.onuLossOfSyncIndication(ctx, alarmInd.GetOnuLossOfSyncFailInd(), deviceID, raisedTs)
Naga Manjunath9546b912019-11-28 20:56:20 +0530173 case *oop.AlarmIndication_OnuItuPonStatsInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000174 logger.Debugw(ctx, "received-onu-itu-pon-stats-indication ", log.Fields{"alarm-ind": alarmInd})
175 err = em.onuItuPonStatsIndication(ctx, alarmInd.GetOnuItuPonStatsInd(), deviceID, raisedTs)
Devmalya Paul1abc34e2020-02-04 20:48:06 -0500176 case *oop.AlarmIndication_OnuDeactivationFailureInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000177 logger.Debugw(ctx, "received-onu-deactivation-failure-indication ", log.Fields{"alarm-ind": alarmInd})
178 err = em.onuDeactivationFailureIndication(ctx, alarmInd.GetOnuDeactivationFailureInd(), deviceID, raisedTs)
Devmalya Paul41a762d2020-03-01 18:56:54 -0500179 case *oop.AlarmIndication_OnuLossGemDelineationInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000180 logger.Debugw(ctx, "received-onu-loss-of-gem-channel-delineation-indication ", log.Fields{"alarm-ind": alarmInd})
181 err = em.onuLossOfGEMChannelDelineationIndication(ctx, alarmInd.GetOnuLossGemDelineationInd(), deviceID, raisedTs)
Devmalya Paul41a762d2020-03-01 18:56:54 -0500182 case *oop.AlarmIndication_OnuPhysicalEquipmentErrorInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000183 logger.Debugw(ctx, "received-onu-physical-equipment-error-indication ", log.Fields{"alarm-ind": alarmInd})
184 err = em.onuPhysicalEquipmentErrorIndication(ctx, alarmInd.GetOnuPhysicalEquipmentErrorInd(), deviceID, raisedTs)
Devmalya Paul41a762d2020-03-01 18:56:54 -0500185 case *oop.AlarmIndication_OnuLossOfAckInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000186 logger.Debugw(ctx, "received-onu-loss-of-acknowledgement-indication ", log.Fields{"alarm-ind": alarmInd})
187 err = em.onuLossOfAcknowledgementIndication(ctx, alarmInd.GetOnuLossOfAckInd(), deviceID, raisedTs)
Devmalya Pauleb5294e2020-03-19 03:01:39 -0400188 case *oop.AlarmIndication_OnuDiffReachExceededInd:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000189 logger.Debugw(ctx, "received-onu-differential-reach-exceeded-indication ", log.Fields{"alarm-ind": alarmInd})
190 err = em.onuDifferentialReachExceededIndication(ctx, alarmInd.GetOnuDiffReachExceededInd(), deviceID, raisedTs)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400191 default:
Thomas Lee S94109f12020-03-03 16:39:29 +0530192 err = olterrors.NewErrInvalidValue(log.Fields{"indication-type": alarmInd}, nil)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400193 }
Naga Manjunath9546b912019-11-28 20:56:20 +0530194 if err != nil {
Thomas Lee S94109f12020-03-03 16:39:29 +0530195 return olterrors.NewErrCommunication("publish-message", log.Fields{"indication-type": alarmInd}, err).Log()
Naga Manjunath9546b912019-11-28 20:56:20 +0530196 }
David K. Bainbridge794735f2020-02-11 21:01:37 -0800197 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400198}
199
Daniele Rossi051466a2019-07-26 13:39:37 +0000200// oltUpDownIndication handles Up and Down state of an OLT
Neha Sharma96b7bf22020-06-15 10:37:32 +0000201func (em *OpenOltEventMgr) oltUpDownIndication(ctx context.Context, oltIndication *oop.OltIndication, deviceID string, raisedTs int64) error {
Daniele Rossi051466a2019-07-26 13:39:37 +0000202 var de voltha.DeviceEvent
203 context := make(map[string]string)
204 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100205 context[ContextOltOperState] = oltIndication.OperState
Daniele Rossi051466a2019-07-26 13:39:37 +0000206 /* Populating device event body */
207 de.Context = context
208 de.ResourceId = deviceID
Naga Manjunath9546b912019-11-28 20:56:20 +0530209 if oltIndication.OperState == operationStateDown {
Daniele Rossi051466a2019-07-26 13:39:37 +0000210 de.DeviceEventName = fmt.Sprintf("%s_%s", oltIndicationDown, "RAISE_EVENT")
Naga Manjunath9546b912019-11-28 20:56:20 +0530211 } else if oltIndication.OperState == operationStateUp {
Daniele Rossi051466a2019-07-26 13:39:37 +0000212 de.DeviceEventName = fmt.Sprintf("%s_%s", oltIndicationDown, "CLEAR_EVENT")
213 }
214 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000215 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, olt, raisedTs); err != nil {
Girish Kumarf26e4882020-03-05 06:49:10 +0000216 return olterrors.NewErrCommunication("send-olt-event", log.Fields{"device-id": deviceID}, err)
Daniele Rossi051466a2019-07-26 13:39:37 +0000217 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000218 logger.Debugw(ctx, "olt-updown-event-sent-to-kafka", log.Fields{})
Naga Manjunath9546b912019-11-28 20:56:20 +0530219 return nil
Daniele Rossi051466a2019-07-26 13:39:37 +0000220}
221
Devmalya Paulfb990a52019-07-09 10:01:49 -0400222// OnuDiscoveryIndication is an exported method to handle ONU discovery event
Neha Sharma96b7bf22020-06-15 10:37:32 +0000223func (em *OpenOltEventMgr) OnuDiscoveryIndication(ctx context.Context, onuDisc *oop.OnuDiscIndication, oltDeviceID string, onuDeviceID string, OnuID uint32, serialNumber string, raisedTs int64) error {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400224 var de voltha.DeviceEvent
225 context := make(map[string]string)
226 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100227 context[ContextOnuOnuID] = strconv.FormatUint(uint64(OnuID), base10)
228 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(onuDisc.IntfId), base10)
229 context[ContextOnuSerialNumber] = serialNumber
230 context[ContextOnuDeviceID] = onuDeviceID
Devmalya Paulfb990a52019-07-09 10:01:49 -0400231 /* Populating device event body */
232 de.Context = context
Amit Ghosh75f0e292020-05-14 11:31:54 +0100233 de.ResourceId = oltDeviceID
Devmalya Paulfb990a52019-07-09 10:01:49 -0400234 de.DeviceEventName = fmt.Sprintf("%s_%s", onuDiscoveryEvent, "RAISE_EVENT")
235 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000236 if err := em.eventProxy.SendDeviceEvent(ctx, &de, equipment, pon, raisedTs); err != nil {
Shrey Baid26912972020-04-16 21:02:31 +0530237 return olterrors.NewErrCommunication("send-onu-discovery-event",
238 log.Fields{
239 "serial-number": serialNumber,
240 "intf-id": onuDisc.IntfId}, err)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400241 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000242 logger.Debugw(ctx, "onu-discovery-event-sent-to-kafka",
Shrey Baid26912972020-04-16 21:02:31 +0530243 log.Fields{
244 "serial-number": serialNumber,
245 "intf-id": onuDisc.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530246 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400247}
248
Neha Sharma96b7bf22020-06-15 10:37:32 +0000249func (em *OpenOltEventMgr) oltLosIndication(ctx context.Context, oltLos *oop.LosIndication, deviceID string, raisedTs int64) error {
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530250 var err error = nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400251 var de voltha.DeviceEvent
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530252 var alarmInd oop.OnuAlarmIndication
253 ponIntdID := PortNoToIntfID(oltLos.IntfId, voltha.Port_PON_OLT)
254
Devmalya Paulfb990a52019-07-09 10:01:49 -0400255 context := make(map[string]string)
256 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100257 context[ContextOltPonIntfID] = strconv.FormatUint(uint64(oltLos.IntfId), base10)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400258 /* Populating device event body */
259 de.Context = context
260 de.ResourceId = deviceID
Naga Manjunath9546b912019-11-28 20:56:20 +0530261 if oltLos.Status == statusCheckOn {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400262 de.DeviceEventName = fmt.Sprintf("%s_%s", oltLosEvent, "RAISE_EVENT")
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530263
264 /* When PON cable disconnected from OLT, it was expected OnuAlarmIndication
265 with "los_status: on" should be raised for each Onu connected to the PON
266 but BAL does not raise this Alarm hence manually sending OnuLosRaise event
267 for all the ONU's connected to PON on receiving LoSIndication for PON */
268 em.handler.onus.Range(func(Onukey interface{}, onuInCache interface{}) bool {
269 if onuInCache.(*OnuDevice).intfID == ponIntdID {
270 alarmInd.IntfId = ponIntdID
271 alarmInd.OnuId = onuInCache.(*OnuDevice).onuID
272 alarmInd.LosStatus = statusCheckOn
Neha Sharma96b7bf22020-06-15 10:37:32 +0000273 err = em.onuAlarmIndication(ctx, &alarmInd, deviceID, raisedTs)
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530274 }
275 return true
276 })
277 if err != nil {
278 /* Return if any error encountered while processing ONU LoS Event*/
279 return err
280 }
Devmalya Paulfb990a52019-07-09 10:01:49 -0400281 } else {
282 de.DeviceEventName = fmt.Sprintf("%s_%s", oltLosEvent, "CLEAR_EVENT")
283 }
284 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000285 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, olt, raisedTs); err != nil {
Naga Manjunath9546b912019-11-28 20:56:20 +0530286 return err
Devmalya Paulfb990a52019-07-09 10:01:49 -0400287 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000288 logger.Debugw(ctx, "olt-los-event-sent-to-kafka", log.Fields{"intf-id": oltLos.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530289 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400290}
291
Amit Ghosh502056b2020-07-15 09:15:48 +0100292func (em *OpenOltEventMgr) populateContextWithSerialDeviceID(context map[string]string, intfID, onuID uint32) {
293 var serialNumber = ""
294 var onuDeviceID = ""
295 onu := em.handler.formOnuKey(intfID, onuID)
Naga Manjunatha8dc9372019-10-31 23:01:18 +0530296 if onu, ok := em.handler.onus.Load(onu); ok {
297 serialNumber = onu.(*OnuDevice).serialNumber
Amit Ghosh502056b2020-07-15 09:15:48 +0100298 onuDeviceID = onu.(*OnuDevice).deviceID
Devmalya Paul90ca3012019-09-02 21:55:45 -0400299 }
Amit Ghosh502056b2020-07-15 09:15:48 +0100300
301 context[ContextOnuSerialNumber] = serialNumber
302 context[ContextOnuDeviceID] = onuDeviceID
303}
304
305func (em *OpenOltEventMgr) onuDyingGaspIndication(ctx context.Context, dgi *oop.DyingGaspIndication, deviceID string, raisedTs int64) error {
306 var de voltha.DeviceEvent
307 context := make(map[string]string)
308 /* Populating event context */
309 em.populateContextWithSerialDeviceID(context, dgi.IntfId, dgi.OnuId)
310
311 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(dgi.IntfId), base10)
312 context[ContextOnuOnuID] = strconv.FormatUint(uint64(dgi.OnuId), base10)
313
Devmalya Paulfb990a52019-07-09 10:01:49 -0400314 /* Populating device event body */
315 de.Context = context
316 de.ResourceId = deviceID
Thomas Lee Sf68399e2020-02-11 15:41:38 +0530317 de.DeviceEventName = fmt.Sprintf("%s_%s", onuDyingGaspEvent, "EVENT")
Devmalya Paulfb990a52019-07-09 10:01:49 -0400318 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000319 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, pon, raisedTs); err != nil {
Naga Manjunath9546b912019-11-28 20:56:20 +0530320 return err
Devmalya Paulfb990a52019-07-09 10:01:49 -0400321 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000322 logger.Debugw(ctx, "onu-dying-gasp-event-sent-to-kafka", log.Fields{"intf-id": dgi.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530323 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400324}
325
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530326//wasLosRaised checks whether los raised already. If already raised returns true else false
Neha Sharma96b7bf22020-06-15 10:37:32 +0000327func (em *OpenOltEventMgr) wasLosRaised(ctx context.Context, onuAlarm *oop.OnuAlarmIndication) bool {
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530328 onuKey := em.handler.formOnuKey(onuAlarm.IntfId, onuAlarm.OnuId)
329 if onuInCache, ok := em.handler.onus.Load(onuKey); ok {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000330 logger.Debugw(ctx, "onu-device-found-in-cache.", log.Fields{"intfID": onuAlarm.IntfId, "onuID": onuAlarm.OnuId})
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530331
332 if onuAlarm.LosStatus == statusCheckOn {
333 if onuInCache.(*OnuDevice).losRaised {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000334 logger.Warnw(ctx, "onu-los-raised-already", log.Fields{"onu_id": onuAlarm.OnuId,
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530335 "intf_id": onuAlarm.IntfId, "LosStatus": onuAlarm.LosStatus})
336 return true
337 }
338 return false
339 }
340 }
341 return true
342}
343
344//wasLosCleared checks whether los cleared already. If already cleared returns true else false
Neha Sharma96b7bf22020-06-15 10:37:32 +0000345func (em *OpenOltEventMgr) wasLosCleared(ctx context.Context, onuAlarm *oop.OnuAlarmIndication) bool {
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530346 onuKey := em.handler.formOnuKey(onuAlarm.IntfId, onuAlarm.OnuId)
347 if onuInCache, ok := em.handler.onus.Load(onuKey); ok {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000348 logger.Debugw(ctx, "onu-device-found-in-cache.", log.Fields{"intfID": onuAlarm.IntfId, "onuID": onuAlarm.OnuId})
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530349
350 if onuAlarm.LosStatus == statusCheckOff {
351 if !onuInCache.(*OnuDevice).losRaised {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000352 logger.Warnw(ctx, "onu-los-cleared-already", log.Fields{"onu_id": onuAlarm.OnuId,
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530353 "intf_id": onuAlarm.IntfId, "LosStatus": onuAlarm.LosStatus})
354 return true
355 }
356 return false
357 }
358 }
359 return true
360}
361
362func (em *OpenOltEventMgr) getDeviceEventName(onuAlarm *oop.OnuAlarmIndication) string {
363 var deviceEventName string
364 if onuAlarm.LosStatus == statusCheckOn {
365 deviceEventName = fmt.Sprintf("%s_%s", onuLosEvent, "RAISE_EVENT")
366 } else if onuAlarm.LosStatus == statusCheckOff {
367 deviceEventName = fmt.Sprintf("%s_%s", onuLosEvent, "CLEAR_EVENT")
368 } else if onuAlarm.LobStatus == statusCheckOn {
369 deviceEventName = fmt.Sprintf("%s_%s", onuLobEvent, "RAISE_EVENT")
370 } else if onuAlarm.LobStatus == statusCheckOff {
371 deviceEventName = fmt.Sprintf("%s_%s", onuLobEvent, "CLEAR_EVENT")
372 } else if onuAlarm.LopcMissStatus == statusCheckOn {
373 deviceEventName = fmt.Sprintf("%s_%s", onuLopcMissEvent, "RAISE_EVENT")
374 } else if onuAlarm.LopcMissStatus == statusCheckOff {
375 deviceEventName = fmt.Sprintf("%s_%s", onuLopcMissEvent, "CLEAR_EVENT")
376 } else if onuAlarm.LopcMicErrorStatus == statusCheckOn {
377 deviceEventName = fmt.Sprintf("%s_%s", onuLopcMicErrorEvent, "RAISE_EVENT")
378 } else if onuAlarm.LopcMicErrorStatus == statusCheckOff {
379 deviceEventName = fmt.Sprintf("%s_%s", onuLopcMicErrorEvent, "CLEAR_EVENT")
380 } else if onuAlarm.LofiStatus == statusCheckOn {
381 deviceEventName = fmt.Sprintf("%s_%s", onuLossOfFrameEvent, "RAISE_EVENT")
382 } else if onuAlarm.LofiStatus == statusCheckOff {
383 deviceEventName = fmt.Sprintf("%s_%s", onuLossOfFrameEvent, "CLEAR_EVENT")
384 } else if onuAlarm.LoamiStatus == statusCheckOn {
385 deviceEventName = fmt.Sprintf("%s_%s", onuLossOfPloamEvent, "RAISE_EVENT")
386 } else if onuAlarm.LoamiStatus == statusCheckOff {
387 deviceEventName = fmt.Sprintf("%s_%s", onuLossOfPloamEvent, "CLEAR_EVENT")
388 }
389 return deviceEventName
390}
391
Neha Sharma96b7bf22020-06-15 10:37:32 +0000392func (em *OpenOltEventMgr) onuAlarmIndication(ctx context.Context, onuAlarm *oop.OnuAlarmIndication, deviceID string, raisedTs int64) error {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400393 var de voltha.DeviceEvent
Amit Ghosh502056b2020-07-15 09:15:48 +0100394
Devmalya Paulfb990a52019-07-09 10:01:49 -0400395 context := make(map[string]string)
396 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100397 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(onuAlarm.IntfId), base10)
398 context[ContextOnuOnuID] = strconv.FormatUint(uint64(onuAlarm.OnuId), base10)
399 em.populateContextWithSerialDeviceID(context, onuAlarm.IntfId, onuAlarm.OnuId)
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530400
Devmalya Paulfb990a52019-07-09 10:01:49 -0400401 /* Populating device event body */
402 de.Context = context
403 de.ResourceId = deviceID
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530404 de.DeviceEventName = em.getDeviceEventName(onuAlarm)
405
406 switch onuAlarm.LosStatus {
407 case statusCheckOn:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000408 if em.wasLosRaised(ctx, onuAlarm) {
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530409 /* No need to raise Onu Los Event as it might have already raised
410 or Onu might have deleted */
411 return nil
412 }
413 onuKey := em.handler.formOnuKey(onuAlarm.IntfId, onuAlarm.OnuId)
414 if onuInCache, ok := em.handler.onus.Load(onuKey); ok {
415 /* Update onu device with LoS raised state as true */
416 em.handler.onus.Store(onuKey, NewOnuDevice(onuInCache.(*OnuDevice).deviceID, onuInCache.(*OnuDevice).deviceType,
417 onuInCache.(*OnuDevice).serialNumber, onuInCache.(*OnuDevice).onuID, onuInCache.(*OnuDevice).intfID,
418 onuInCache.(*OnuDevice).proxyDeviceID, true))
419 }
420 case statusCheckOff:
Neha Sharma96b7bf22020-06-15 10:37:32 +0000421 if em.wasLosCleared(ctx, onuAlarm) {
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530422 /* No need to clear Onu Los Event as it might have already cleared
423 or Onu might have deleted */
424 return nil
425 }
426 onuKey := em.handler.formOnuKey(onuAlarm.IntfId, onuAlarm.OnuId)
427 if onuInCache, ok := em.handler.onus.Load(onuKey); ok {
428 /* Update onu device with LoS raised state as false */
429 em.handler.onus.Store(onuKey, NewOnuDevice(onuInCache.(*OnuDevice).deviceID, onuInCache.(*OnuDevice).deviceType,
430 onuInCache.(*OnuDevice).serialNumber, onuInCache.(*OnuDevice).onuID, onuInCache.(*OnuDevice).intfID,
431 onuInCache.(*OnuDevice).proxyDeviceID, false))
432 }
Devmalya Paulfb990a52019-07-09 10:01:49 -0400433 }
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530434
Devmalya Paulfb990a52019-07-09 10:01:49 -0400435 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000436 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, onu, raisedTs); err != nil {
Naga Manjunath9546b912019-11-28 20:56:20 +0530437 return err
Devmalya Paulfb990a52019-07-09 10:01:49 -0400438 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000439 logger.Debugw(ctx, "onu-los-event-sent-to-kafka", log.Fields{"onu-id": onuAlarm.OnuId, "intf-id": onuAlarm.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530440 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400441}
442
Neha Sharma96b7bf22020-06-15 10:37:32 +0000443func (em *OpenOltEventMgr) onuActivationFailIndication(ctx context.Context, oaf *oop.OnuActivationFailureIndication, deviceID string, raisedTs int64) error {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400444 var de voltha.DeviceEvent
445 context := make(map[string]string)
446 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100447 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(oaf.IntfId), base10)
448 context[ContextOnuOnuID] = strconv.FormatUint(uint64(oaf.OnuId), base10)
449 context[ContextOnuFailureReaseon] = strconv.FormatUint(uint64(oaf.FailReason), base10)
450
451 em.populateContextWithSerialDeviceID(context, oaf.IntfId, oaf.OnuId)
452
Devmalya Paulfb990a52019-07-09 10:01:49 -0400453 /* Populating device event body */
454 de.Context = context
455 de.ResourceId = deviceID
456 de.DeviceEventName = fmt.Sprintf("%s_%s", onuActivationFailEvent, "RAISE_EVENT")
457 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000458 if err := em.eventProxy.SendDeviceEvent(ctx, &de, equipment, pon, raisedTs); err != nil {
Naga Manjunath9546b912019-11-28 20:56:20 +0530459 return err
Devmalya Paulfb990a52019-07-09 10:01:49 -0400460 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000461 logger.Debugw(ctx, "onu-activation-failure-event-sent-to-kafka", log.Fields{"onu-id": oaf.OnuId, "intf-id": oaf.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530462 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400463}
464
Neha Sharma96b7bf22020-06-15 10:37:32 +0000465func (em *OpenOltEventMgr) onuLossOmciIndication(ctx context.Context, onuLossOmci *oop.OnuLossOfOmciChannelIndication, deviceID string, raisedTs int64) error {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400466 var de voltha.DeviceEvent
467 context := make(map[string]string)
468 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100469 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(onuLossOmci.IntfId), base10)
470 context[ContextOnuOnuID] = strconv.FormatUint(uint64(onuLossOmci.OnuId), base10)
471
472 em.populateContextWithSerialDeviceID(context, onuLossOmci.IntfId, onuLossOmci.OnuId)
473
Devmalya Paulfb990a52019-07-09 10:01:49 -0400474 /* Populating device event body */
475 de.Context = context
476 de.ResourceId = deviceID
Naga Manjunath9546b912019-11-28 20:56:20 +0530477 if onuLossOmci.Status == statusCheckOn {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400478 de.DeviceEventName = fmt.Sprintf("%s_%s", onuLossOmciEvent, "RAISE_EVENT")
479 } else {
480 de.DeviceEventName = fmt.Sprintf("%s_%s", onuLossOmciEvent, "CLEAR_EVENT")
481 }
482 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000483 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, pon, raisedTs); err != nil {
Naga Manjunath9546b912019-11-28 20:56:20 +0530484 return err
Devmalya Paulfb990a52019-07-09 10:01:49 -0400485 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000486 logger.Debugw(ctx, "onu-loss-of-omci-channel-event-sent-to-kafka", log.Fields{"onu-id": onuLossOmci.OnuId, "intf-id": onuLossOmci.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530487 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400488}
489
Neha Sharma96b7bf22020-06-15 10:37:32 +0000490func (em *OpenOltEventMgr) onuDriftOfWindowIndication(ctx context.Context, onuDriftWindow *oop.OnuDriftOfWindowIndication, deviceID string, raisedTs int64) error {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400491 var de voltha.DeviceEvent
492 context := make(map[string]string)
493 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100494 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(onuDriftWindow.IntfId), base10)
495 context[ContextOnuOnuID] = strconv.FormatUint(uint64(onuDriftWindow.OnuId), base10)
496 context[ContextOnuDrift] = strconv.FormatUint(uint64(onuDriftWindow.Drift), base10)
497 context[ContextOnuNewEqd] = strconv.FormatUint(uint64(onuDriftWindow.NewEqd), base10)
498
499 em.populateContextWithSerialDeviceID(context, onuDriftWindow.IntfId, onuDriftWindow.OnuId)
500
Devmalya Paulfb990a52019-07-09 10:01:49 -0400501 /* Populating device event body */
502 de.Context = context
503 de.ResourceId = deviceID
Naga Manjunath9546b912019-11-28 20:56:20 +0530504 if onuDriftWindow.Status == statusCheckOn {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400505 de.DeviceEventName = fmt.Sprintf("%s_%s", onuDriftOfWindowEvent, "RAISE_EVENT")
506 } else {
507 de.DeviceEventName = fmt.Sprintf("%s_%s", onuDriftOfWindowEvent, "CLEAR_EVENT")
508 }
509 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000510 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, pon, raisedTs); err != nil {
Naga Manjunath9546b912019-11-28 20:56:20 +0530511 return err
Devmalya Paulfb990a52019-07-09 10:01:49 -0400512 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000513 logger.Debugw(ctx, "onu-drift-of-window-event-sent-to-kafka", log.Fields{"onu-id": onuDriftWindow.OnuId, "intf-id": onuDriftWindow.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530514 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400515}
516
Neha Sharma96b7bf22020-06-15 10:37:32 +0000517func (em *OpenOltEventMgr) onuSignalDegradeIndication(ctx context.Context, onuSignalDegrade *oop.OnuSignalDegradeIndication, deviceID string, raisedTs int64) error {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400518 var de voltha.DeviceEvent
519 context := make(map[string]string)
520 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100521 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(onuSignalDegrade.IntfId), base10)
522 context[ContextOnuOnuID] = strconv.FormatUint(uint64(onuSignalDegrade.OnuId), base10)
523 context[ContextOnuInverseBitErrorRate] = strconv.FormatUint(uint64(onuSignalDegrade.InverseBitErrorRate), base10)
524
525 em.populateContextWithSerialDeviceID(context, onuSignalDegrade.IntfId, onuSignalDegrade.OnuId)
526
Devmalya Paulfb990a52019-07-09 10:01:49 -0400527 /* Populating device event body */
528 de.Context = context
529 de.ResourceId = deviceID
Naga Manjunath9546b912019-11-28 20:56:20 +0530530 if onuSignalDegrade.Status == statusCheckOn {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400531 de.DeviceEventName = fmt.Sprintf("%s_%s", onuSignalDegradeEvent, "RAISE_EVENT")
532 } else {
533 de.DeviceEventName = fmt.Sprintf("%s_%s", onuSignalDegradeEvent, "CLEAR_EVENT")
534 }
535 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000536 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, pon, raisedTs); err != nil {
Naga Manjunath9546b912019-11-28 20:56:20 +0530537 return err
Devmalya Paulfb990a52019-07-09 10:01:49 -0400538 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000539 logger.Debugw(ctx, "onu-signal-degrade-event-sent-to-kafka", log.Fields{"onu-id": onuSignalDegrade.OnuId, "intf-id": onuSignalDegrade.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530540 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400541}
542
Neha Sharma96b7bf22020-06-15 10:37:32 +0000543func (em *OpenOltEventMgr) onuSignalsFailIndication(ctx context.Context, onuSignalsFail *oop.OnuSignalsFailureIndication, deviceID string, raisedTs int64) error {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400544 var de voltha.DeviceEvent
545 context := make(map[string]string)
546 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100547 em.populateContextWithSerialDeviceID(context, onuSignalsFail.IntfId, onuSignalsFail.OnuId)
548
549 context[ContextOnuOnuID] = strconv.FormatUint(uint64(onuSignalsFail.OnuId), base10)
550 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(onuSignalsFail.IntfId), base10)
551 context[ContextOnuInverseBitErrorRate] = strconv.FormatUint(uint64(onuSignalsFail.InverseBitErrorRate), base10)
Devmalya Paulfb990a52019-07-09 10:01:49 -0400552 /* Populating device event body */
553 de.Context = context
554 de.ResourceId = deviceID
Naga Manjunath9546b912019-11-28 20:56:20 +0530555 if onuSignalsFail.Status == statusCheckOn {
Devmalya Paulfb990a52019-07-09 10:01:49 -0400556 de.DeviceEventName = fmt.Sprintf("%s_%s", onuSignalsFailEvent, "RAISE_EVENT")
557 } else {
558 de.DeviceEventName = fmt.Sprintf("%s_%s", onuSignalsFailEvent, "CLEAR_EVENT")
559 }
560 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000561 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, pon, raisedTs); err != nil {
Naga Manjunath9546b912019-11-28 20:56:20 +0530562 return err
Devmalya Paulfb990a52019-07-09 10:01:49 -0400563 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000564 logger.Debugw(ctx, "onu-signals-fail-event-sent-to-kafka", log.Fields{"onu-id": onuSignalsFail.OnuId, "intf-id": onuSignalsFail.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530565 return nil
566}
567
Neha Sharma96b7bf22020-06-15 10:37:32 +0000568func (em *OpenOltEventMgr) onuStartupFailedIndication(ctx context.Context, onuStartupFail *oop.OnuStartupFailureIndication, deviceID string, raisedTs int64) error {
Naga Manjunathf6f74642020-01-13 21:37:28 +0530569 var de voltha.DeviceEvent
570 context := make(map[string]string)
571 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100572 em.populateContextWithSerialDeviceID(context, onuStartupFail.IntfId, onuStartupFail.OnuId)
573
574 context[ContextOnuOnuID] = strconv.FormatUint(uint64(onuStartupFail.OnuId), base10)
575 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(onuStartupFail.IntfId), base10)
Naga Manjunathf6f74642020-01-13 21:37:28 +0530576
577 /* Populating device event body */
578 de.Context = context
579 de.ResourceId = deviceID
580 if onuStartupFail.Status == statusCheckOn {
581 de.DeviceEventName = fmt.Sprintf("%s_%s", onuStartupFailEvent, "RAISE_EVENT")
582 } else {
583 de.DeviceEventName = fmt.Sprintf("%s_%s", onuStartupFailEvent, "CLEAR_EVENT")
584 }
585 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000586 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, pon, raisedTs); err != nil {
Naga Manjunathf6f74642020-01-13 21:37:28 +0530587 return err
588 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000589 logger.Debugw(ctx, "onu-startup-fail-event-sent-to-kafka", log.Fields{"onu-id": onuStartupFail.OnuId, "intf-id": onuStartupFail.IntfId})
Naga Manjunathf6f74642020-01-13 21:37:28 +0530590 return nil
591}
592
Neha Sharma96b7bf22020-06-15 10:37:32 +0000593func (em *OpenOltEventMgr) onuLossOfSyncIndication(ctx context.Context, onuLOKI *oop.OnuLossOfKeySyncFailureIndication, deviceID string, raisedTs int64) error {
Naga Manjunath9546b912019-11-28 20:56:20 +0530594 var de voltha.DeviceEvent
595 context := make(map[string]string)
596 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100597 em.populateContextWithSerialDeviceID(context, onuLOKI.IntfId, onuLOKI.OnuId)
598
599 context[ContextOnuOnuID] = strconv.FormatUint(uint64(onuLOKI.OnuId), base10)
600 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(onuLOKI.IntfId), base10)
Naga Manjunath9546b912019-11-28 20:56:20 +0530601 /* Populating device event body */
602 de.Context = context
603 de.ResourceId = deviceID
604 if onuLOKI.Status == statusCheckOn {
605 de.DeviceEventName = fmt.Sprintf("%s_%s", onuLossOfKeySyncEvent, "RAISE_EVENT")
606 } else {
607 de.DeviceEventName = fmt.Sprintf("%s_%s", onuLossOfKeySyncEvent, "CLEAR_EVENT")
608 }
609
610 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000611 if err := em.eventProxy.SendDeviceEvent(ctx, &de, security, onu, raisedTs); err != nil {
Naga Manjunath9546b912019-11-28 20:56:20 +0530612 return err
613 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000614 logger.Debugw(ctx, "onu-loss-of-key-sync-event-sent-to-kafka", log.Fields{"onu-id": onuLOKI.OnuId, "intf-id": onuLOKI.IntfId})
Naga Manjunath9546b912019-11-28 20:56:20 +0530615 return nil
Devmalya Paulfb990a52019-07-09 10:01:49 -0400616}
kesavand39e0aa32020-01-28 20:58:50 -0500617
618// oltIntfOperIndication handles Up and Down state of an OLT PON ports
Neha Sharma96b7bf22020-06-15 10:37:32 +0000619func (em *OpenOltEventMgr) oltIntfOperIndication(ctx context.Context, ifindication *oop.IntfOperIndication, deviceID string, raisedTs int64) error {
Kent Hagermanf1db18b2020-07-08 13:38:15 -0400620 portNo := IntfIDToPortNo(ifindication.IntfId, voltha.Port_PON_OLT)
621 if port, err := em.handler.coreProxy.GetDevicePort(ctx, deviceID, portNo); err != nil {
622 logger.Warnw(ctx, "Error while fetching port object", log.Fields{"device-id": deviceID, "error": err})
623 } else if port.AdminState != common.AdminState_ENABLED {
624 logger.Debugw(ctx, "port-disable/enable-event-not-generated--the-port-is-not-enabled-by-operator", log.Fields{"device-id": deviceID, "port": port})
625 return nil
kesavand39e0aa32020-01-28 20:58:50 -0500626 }
627 /* Populating event context */
Kent Hagermanf1db18b2020-07-08 13:38:15 -0400628 context := map[string]string{ContextOltPonIntfOperState: ifindication.GetOperState()}
kesavand39e0aa32020-01-28 20:58:50 -0500629 /* Populating device event body */
Kent Hagermanf1db18b2020-07-08 13:38:15 -0400630 var de voltha.DeviceEvent
kesavand39e0aa32020-01-28 20:58:50 -0500631 de.Context = context
632 de.ResourceId = deviceID
633
634 if ifindication.GetOperState() == operationStateDown {
635 de.DeviceEventName = fmt.Sprintf("%s_%s", ponIntfDownIndiction, "RAISE_EVENT")
636 } else if ifindication.OperState == operationStateUp {
637 de.DeviceEventName = fmt.Sprintf("%s_%s", ponIntfDownIndiction, "CLEAR_EVENT")
638 }
639 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000640 if err := em.eventProxy.SendDeviceEvent(ctx, &de, communication, olt, raisedTs); err != nil {
Devmalya Paul24400472020-03-12 19:26:02 -0400641 return olterrors.NewErrCommunication("send-olt-intf-oper-status-event", log.Fields{"device-id": deviceID, "intf-id": ifindication.IntfId, "oper-state": ifindication.OperState}, err).Log()
kesavand39e0aa32020-01-28 20:58:50 -0500642 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000643 logger.Debug(ctx, "sent-olt-intf-oper-status-event-to-kafka")
Devmalya Paul24400472020-03-12 19:26:02 -0400644 return nil
kesavand39e0aa32020-01-28 20:58:50 -0500645}
Devmalya Paul1abc34e2020-02-04 20:48:06 -0500646
Neha Sharma96b7bf22020-06-15 10:37:32 +0000647func (em *OpenOltEventMgr) onuDeactivationFailureIndication(ctx context.Context, onuDFI *oop.OnuDeactivationFailureIndication, deviceID string, raisedTs int64) error {
Devmalya Paul1abc34e2020-02-04 20:48:06 -0500648 var de voltha.DeviceEvent
649 context := make(map[string]string)
650 /* Populating event context */
Amit Ghosh502056b2020-07-15 09:15:48 +0100651 em.populateContextWithSerialDeviceID(context, onuDFI.IntfId, onuDFI.OnuId)
652
653 context[ContextOnuOnuID] = strconv.FormatUint(uint64(onuDFI.OnuId), base10)
654 context[ContextOnuPonIntfID] = strconv.FormatUint(uint64(onuDFI.IntfId), base10)
Devmalya Paul1abc34e2020-02-04 20:48:06 -0500655 /* Populating device event body */
656 de.Context = context
657 de.ResourceId = deviceID
Devmalya Paula1efa642020-04-20 01:36:43 -0400658 if onuDFI.Status == statusCheckOn {
659 de.DeviceEventName = fmt.Sprintf("%s_%s", onuDeactivationFailureEvent, "RAISE_EVENT")
660 } else {
661 de.DeviceEventName = fmt.Sprintf("%s_%s", onuDeactivationFailureEvent, "CLEAR_EVENT")
662 }
Devmalya Paul1abc34e2020-02-04 20:48:06 -0500663 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000664 if err := em.eventProxy.SendDeviceEvent(ctx, &de, equipment, onu, raisedTs); err != nil {
Devmalya Paul1abc34e2020-02-04 20:48:06 -0500665 return err
666 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000667 logger.Debugw(ctx, "onu-deactivation-failure-event-sent-to-kafka", log.Fields{"onu-id": onuDFI.OnuId, "intf-id": onuDFI.IntfId})
Devmalya Paul1abc34e2020-02-04 20:48:06 -0500668 return nil
669}
Amit Ghosh502056b2020-07-15 09:15:48 +0100670
Neha Sharma96b7bf22020-06-15 10:37:32 +0000671func (em *OpenOltEventMgr) onuRemoteDefectIndication(ctx context.Context, onuID uint32, intfID uint32, rdiCount uint64, status string, deviceID string, raisedTs int64) error {
Devmalya Paul6f063a62020-02-19 19:19:06 -0500672 /* Populating event context */
673 context := map[string]string{
Amit Ghosh502056b2020-07-15 09:15:48 +0100674 ContextOnuOnuID: strconv.FormatUint(uint64(onuID), base10),
675 ContextOnuPonIntfID: strconv.FormatUint(uint64(intfID), base10),
676 ContextOnuRemoteDefectIndicatorCount: strconv.FormatUint(rdiCount, base10),
Devmalya Paul6f063a62020-02-19 19:19:06 -0500677 }
Amit Ghosh502056b2020-07-15 09:15:48 +0100678 em.populateContextWithSerialDeviceID(context, intfID, onuID)
679
Devmalya Paul6f063a62020-02-19 19:19:06 -0500680 /* Populating device event body */
681 de := &voltha.DeviceEvent{
Devmalya Paula1efa642020-04-20 01:36:43 -0400682 Context: context,
683 ResourceId: deviceID,
684 }
685 if status == statusCheckOn {
686 de.DeviceEventName = fmt.Sprintf("%s_%s", onuRemoteDefectIndication, "RAISE_EVENT")
687 } else {
688 de.DeviceEventName = fmt.Sprintf("%s_%s", onuRemoteDefectIndication, "CLEAR_EVENT")
Devmalya Paul6f063a62020-02-19 19:19:06 -0500689 }
690 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000691 if err := em.eventProxy.SendDeviceEvent(ctx, de, equipment, onu, raisedTs); err != nil {
Devmalya Paul6f063a62020-02-19 19:19:06 -0500692 return err
693 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000694 logger.Debugw(ctx, "onu-remote-defect-event-sent-to-kafka", log.Fields{"onu-id": onuID, "intf-id": intfID})
Devmalya Paula1efa642020-04-20 01:36:43 -0400695 return nil
696}
697
Neha Sharma96b7bf22020-06-15 10:37:32 +0000698func (em *OpenOltEventMgr) onuItuPonStatsIndication(ctx context.Context, onuIPS *oop.OnuItuPonStatsIndication, deviceID string, raisedTs int64) error {
Devmalya Paula1efa642020-04-20 01:36:43 -0400699 onuDevice, found := em.handler.onus.Load(em.handler.formOnuKey(onuIPS.IntfId, onuIPS.OnuId))
700 if !found {
701 return errors.New("unknown-onu-device")
702 }
703 if onuIPS.GetRdiErrorInd().Status == statusCheckOn {
704 if !onuDevice.(*OnuDevice).rdiRaised {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000705 if err := em.onuRemoteDefectIndication(ctx, onuIPS.OnuId, onuIPS.IntfId, onuIPS.GetRdiErrorInd().RdiErrorCount, statusCheckOn, deviceID, raisedTs); err != nil {
Devmalya Paula1efa642020-04-20 01:36:43 -0400706 return err
707 }
708 onuDevice.(*OnuDevice).rdiRaised = true
709 return nil
710 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000711 logger.Debugw(ctx, "onu-remote-defect-already-raised", log.Fields{"onu-id": onuIPS.OnuId, "intf-id": onuIPS.IntfId})
Devmalya Paula1efa642020-04-20 01:36:43 -0400712 } else {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000713 if err := em.onuRemoteDefectIndication(ctx, onuIPS.OnuId, onuIPS.IntfId, onuIPS.GetRdiErrorInd().RdiErrorCount, statusCheckOff, deviceID, raisedTs); err != nil {
Devmalya Paula1efa642020-04-20 01:36:43 -0400714 return err
715 }
716 onuDevice.(*OnuDevice).rdiRaised = false
717 }
Devmalya Paul41a762d2020-03-01 18:56:54 -0500718 return nil
719}
720
Neha Sharma96b7bf22020-06-15 10:37:32 +0000721func (em *OpenOltEventMgr) onuLossOfGEMChannelDelineationIndication(ctx context.Context, onuGCD *oop.OnuLossOfGEMChannelDelineationIndication, deviceID string, raisedTs int64) error {
Devmalya Paul41a762d2020-03-01 18:56:54 -0500722 /* Populating event context */
723 context := map[string]string{
Amit Ghosh502056b2020-07-15 09:15:48 +0100724 ContextOnuOnuID: strconv.FormatUint(uint64(onuGCD.OnuId), base10),
725 ContextOnuPonIntfID: strconv.FormatUint(uint64(onuGCD.IntfId), base10),
726 ContextOnuDelineationErrors: strconv.FormatUint(uint64(onuGCD.DelineationErrors), base10),
Devmalya Paul41a762d2020-03-01 18:56:54 -0500727 }
Amit Ghosh502056b2020-07-15 09:15:48 +0100728 em.populateContextWithSerialDeviceID(context, onuGCD.IntfId, onuGCD.OnuId)
729
Devmalya Paul41a762d2020-03-01 18:56:54 -0500730 /* Populating device event body */
731 de := &voltha.DeviceEvent{
732 Context: context,
733 ResourceId: deviceID,
734 }
735 if onuGCD.Status == statusCheckOn {
736 de.DeviceEventName = fmt.Sprintf("%s_%s", onuLossOfGEMChannelDelineationEvent, "RAISE_EVENT")
737 } else {
738 de.DeviceEventName = fmt.Sprintf("%s_%s", onuLossOfGEMChannelDelineationEvent, "CLEAR_EVENT")
739 }
740 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000741 if err := em.eventProxy.SendDeviceEvent(ctx, de, communication, onu, raisedTs); err != nil {
Devmalya Paul41a762d2020-03-01 18:56:54 -0500742 return err
743 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000744 logger.Debugw(ctx, "onu-loss-of-gem-channel-delineation-event-sent-to-kafka", log.Fields{"onu-id": onuGCD.OnuId, "intf-id": onuGCD.IntfId})
Devmalya Paul41a762d2020-03-01 18:56:54 -0500745 return nil
746}
747
Neha Sharma96b7bf22020-06-15 10:37:32 +0000748func (em *OpenOltEventMgr) onuPhysicalEquipmentErrorIndication(ctx context.Context, onuErr *oop.OnuPhysicalEquipmentErrorIndication, deviceID string, raisedTs int64) error {
Devmalya Paul41a762d2020-03-01 18:56:54 -0500749 /* Populating event context */
750 context := map[string]string{
Amit Ghosh502056b2020-07-15 09:15:48 +0100751 ContextOnuOnuID: strconv.FormatUint(uint64(onuErr.OnuId), base10),
752 ContextOnuPonIntfID: strconv.FormatUint(uint64(onuErr.IntfId), base10),
Devmalya Paul41a762d2020-03-01 18:56:54 -0500753 }
Amit Ghosh502056b2020-07-15 09:15:48 +0100754 em.populateContextWithSerialDeviceID(context, onuErr.IntfId, onuErr.OnuId)
Devmalya Paul41a762d2020-03-01 18:56:54 -0500755 /* Populating device event body */
756 de := &voltha.DeviceEvent{
757 Context: context,
758 ResourceId: deviceID,
759 }
760 if onuErr.Status == statusCheckOn {
761 de.DeviceEventName = fmt.Sprintf("%s_%s", onuPhysicalEquipmentErrorEvent, "RAISE_EVENT")
762 } else {
763 de.DeviceEventName = fmt.Sprintf("%s_%s", onuPhysicalEquipmentErrorEvent, "CLEAR_EVENT")
764 }
765 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000766 if err := em.eventProxy.SendDeviceEvent(ctx, de, equipment, onu, raisedTs); err != nil {
Devmalya Paul41a762d2020-03-01 18:56:54 -0500767 return err
768 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000769 logger.Debugw(ctx, "onu-physical-equipment-error-event-sent-to-kafka", log.Fields{"onu-id": onuErr.OnuId, "intf-id": onuErr.IntfId})
Devmalya Paul41a762d2020-03-01 18:56:54 -0500770 return nil
771}
772
Neha Sharma96b7bf22020-06-15 10:37:32 +0000773func (em *OpenOltEventMgr) onuLossOfAcknowledgementIndication(ctx context.Context, onuLOA *oop.OnuLossOfAcknowledgementIndication, deviceID string, raisedTs int64) error {
Devmalya Paul41a762d2020-03-01 18:56:54 -0500774 /* Populating event context */
775 context := map[string]string{
Amit Ghosh502056b2020-07-15 09:15:48 +0100776 ContextOnuOnuID: strconv.FormatUint(uint64(onuLOA.OnuId), base10),
777 ContextOnuPonIntfID: strconv.FormatUint(uint64(onuLOA.IntfId), base10),
Devmalya Paul41a762d2020-03-01 18:56:54 -0500778 }
Amit Ghosh502056b2020-07-15 09:15:48 +0100779 em.populateContextWithSerialDeviceID(context, onuLOA.IntfId, onuLOA.OnuId)
780
Devmalya Paul41a762d2020-03-01 18:56:54 -0500781 /* Populating device event body */
782 de := &voltha.DeviceEvent{
783 Context: context,
784 ResourceId: deviceID,
785 }
786 if onuLOA.Status == statusCheckOn {
787 de.DeviceEventName = fmt.Sprintf("%s_%s", onuLossOfAcknowledgementEvent, "RAISE_EVENT")
788 } else {
789 de.DeviceEventName = fmt.Sprintf("%s_%s", onuLossOfAcknowledgementEvent, "CLEAR_EVENT")
790 }
791 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000792 if err := em.eventProxy.SendDeviceEvent(ctx, de, equipment, onu, raisedTs); err != nil {
Devmalya Paul41a762d2020-03-01 18:56:54 -0500793 return err
794 }
Neha Sharma96b7bf22020-06-15 10:37:32 +0000795 logger.Debugw(ctx, "onu-physical-equipment-error-event-sent-to-kafka", log.Fields{"onu-id": onuLOA.OnuId, "intf-id": onuLOA.IntfId})
Devmalya Paul6f063a62020-02-19 19:19:06 -0500796 return nil
797}
Devmalya Pauleb5294e2020-03-19 03:01:39 -0400798
Neha Sharma96b7bf22020-06-15 10:37:32 +0000799func (em *OpenOltEventMgr) onuDifferentialReachExceededIndication(ctx context.Context, onuDRE *oop.OnuDifferentialReachExceededIndication, deviceID string, raisedTs int64) error {
Devmalya Pauleb5294e2020-03-19 03:01:39 -0400800 /* Populating event context */
801 context := map[string]string{
Amit Ghosh502056b2020-07-15 09:15:48 +0100802 ContextOnuOnuID: strconv.FormatUint(uint64(onuDRE.OnuId), base10),
803 ContextOnuPonIntfID: strconv.FormatUint(uint64(onuDRE.IntfId), base10),
804 ContextOnuDifferentialDistance: strconv.FormatUint(uint64(onuDRE.Distance), base10),
Devmalya Pauleb5294e2020-03-19 03:01:39 -0400805 }
Amit Ghosh502056b2020-07-15 09:15:48 +0100806 em.populateContextWithSerialDeviceID(context, onuDRE.IntfId, onuDRE.OnuId)
807
Devmalya Pauleb5294e2020-03-19 03:01:39 -0400808 /* Populating device event body */
809 de := &voltha.DeviceEvent{
810 Context: context,
811 ResourceId: deviceID,
812 }
813 if onuDRE.Status == statusCheckOn {
814 de.DeviceEventName = fmt.Sprintf("%s_%s", onuDifferentialReachExceededEvent, "RAISE_EVENT")
815 } else {
816 de.DeviceEventName = fmt.Sprintf("%s_%s", onuDifferentialReachExceededEvent, "CLEAR_EVENT")
817 }
818 /* Send event to KAFKA */
Neha Sharma96b7bf22020-06-15 10:37:32 +0000819 if err := em.eventProxy.SendDeviceEvent(ctx, de, equipment, onu, raisedTs); err != nil {
Devmalya Pauleb5294e2020-03-19 03:01:39 -0400820 return err
821 }
Shrey Baid26912972020-04-16 21:02:31 +0530822 log.Debugw("onu-differential-reach-exceeded–event-sent-to-kafka", log.Fields{"onu-id": onuDRE.OnuId, "intf-id": onuDRE.IntfId})
Devmalya Pauleb5294e2020-03-19 03:01:39 -0400823 return nil
824}