VOL-4878: Implementation at the open olt adaptor to fetch the Rx Power levels for ONUs from an OLT
Change-Id: If92c57f96ccd9452bc1edab725cc5e48cc250d72
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index 610f3e3..66e2133 100644
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -3424,6 +3424,102 @@
}
}
+func (dh *DeviceHandler) getPONRxPower(ctx context.Context, OltRxPowerRequest *extension.GetOltRxPowerRequest) *extension.SingleGetValueResponse {
+
+ errResp := func(status extension.GetValueResponse_Status,
+ reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
+ return &extension.SingleGetValueResponse{
+ Response: &extension.GetValueResponse{
+ Status: status,
+ ErrReason: reason,
+ },
+ }
+ }
+
+ resp := extension.SingleGetValueResponse{
+ Response: &extension.GetValueResponse{
+ Status: extension.GetValueResponse_OK,
+ Response: &extension.GetValueResponse_OltRxPower{
+ OltRxPower: &extension.GetOltRxPowerResponse{},
+ },
+ },
+ }
+
+ logger.Debugw(ctx, "getPONRxPower", log.Fields{"portLabel": OltRxPowerRequest.PortLabel, "OnuSerialNumber": OltRxPowerRequest.OnuSn, "device-id": dh.device.Id})
+ portLabel := OltRxPowerRequest.PortLabel
+ serialNumber := OltRxPowerRequest.OnuSn
+
+ portInfo := strings.Split(portLabel, "-")
+ portNumber, err := strconv.ParseUint(portInfo[1], 10, 32)
+
+ if err != nil {
+ logger.Errorw(ctx, "getPONRxPower invalid portNumber ", log.Fields{"oltPortNumber": portInfo[1]})
+ return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_REQ_TYPE)
+ }
+
+ if portInfo[0] != "pon" {
+ logger.Errorw(ctx, "getPONRxPower invalid portType", log.Fields{"oltPortType": portInfo[0]})
+ return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_PORT_TYPE)
+ }
+ ponIntdID := plt.PortNoToIntfID((uint32)(portNumber), voltha.Port_PON_OLT)
+
+ if serialNumber != "" {
+
+ onuDev := dh.getChildDevice(ctx, serialNumber, (uint32)(portNumber))
+ if onuDev != nil {
+
+ Onu := oop.Onu{IntfId: uint32(portNumber), OnuId: onuDev.onuID}
+ rxPower, err := dh.Client.GetPonRxPower(ctx, &Onu)
+ if err != nil {
+
+ logger.Errorw(ctx, "error-while-getting-rx-power", log.Fields{"Onu": Onu, "err": err})
+ return generateSingleGetValueErrorResponse(err)
+
+ }
+
+ rxPowerValue := extension.RxPower{}
+ rxPowerValue.OnuSn = onuDev.serialNumber
+ rxPowerValue.Status = rxPower.GetStatus()
+ rxPowerValue.RxPower = rxPower.GetRxPowerMeanDbm()
+ rxPowerValue.FailReason = rxPower.GetFailReason().String()
+
+ resp.Response.GetOltRxPower().RxPower = append(resp.Response.GetOltRxPower().RxPower, &rxPowerValue)
+
+ } else {
+
+ logger.Errorw(ctx, "getPONRxPower invalid Device", log.Fields{"portLabel": portLabel, "serialNumber": serialNumber})
+ return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE)
+ }
+
+ } else {
+
+ dh.onus.Range(func(Onukey interface{}, onuInCache interface{}) bool {
+ if onuInCache.(*OnuDevice).intfID == ponIntdID {
+
+ Onu := oop.Onu{IntfId: ponIntdID, OnuId: onuInCache.(*OnuDevice).onuID}
+ rxPower, err := dh.Client.GetPonRxPower(ctx, &Onu)
+ if err != nil {
+ logger.Errorw(ctx, "error-while-getting-rx-power, however considering to proceed further with other ONUs on PON", log.Fields{"Onu": Onu, "err": err})
+ } else {
+
+ rxPowerValue := extension.RxPower{}
+ rxPowerValue.OnuSn = onuInCache.(*OnuDevice).serialNumber
+ rxPowerValue.Status = rxPower.GetStatus()
+ rxPowerValue.RxPower = rxPower.GetRxPowerMeanDbm()
+ rxPowerValue.FailReason = rxPower.GetFailReason().String()
+
+ resp.Response.GetOltRxPower().RxPower = append(resp.Response.GetOltRxPower().RxPower, &rxPowerValue)
+ }
+
+ }
+ logger.Infow(ctx, "getPONRxPower response ", log.Fields{"Response": resp})
+ return true
+ })
+ }
+ logger.Infow(ctx, "getPONRxPower response ", log.Fields{"Response": resp})
+ return &resp
+}
+
func generateSingleGetValueErrorResponse(err error) *extension.SingleGetValueResponse {
errResp := func(status extension.GetValueResponse_Status,
reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {