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/VERSION b/VERSION
index cc2fbe8..e91d9be 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-4.3.2
+4.3.3
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 {
diff --git a/internal/pkg/core/openolt.go b/internal/pkg/core/openolt.go
index 8a41a01..77d607c 100644
--- a/internal/pkg/core/openolt.go
+++ b/internal/pkg/core/openolt.go
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-//Package core provides the utility for olt devices, flows and statistics
+// Package core provides the utility for olt devices, flows and statistics
 package core
 
 import (
@@ -40,7 +40,7 @@
 	"github.com/opencord/voltha-protos/v5/go/voltha"
 )
 
-//OpenOLT structure holds the OLT information
+// OpenOLT structure holds the OLT information
 type OpenOLT struct {
 	configManager                      *conf.ConfigManager
 	deviceHandlers                     map[string]*DeviceHandler
@@ -61,7 +61,7 @@
 	CheckOnuDevExistenceAtOnuDiscovery bool
 }
 
-//NewOpenOLT returns a new instance of OpenOLT
+// NewOpenOLT returns a new instance of OpenOLT
 func NewOpenOLT(ctx context.Context,
 	coreClient *vgrpc.Client,
 	eventProxy eventif.EventProxy, cfg *config.AdapterFlags, cm *conf.ConfigManager) *OpenOLT {
@@ -86,14 +86,14 @@
 	return &openOLT
 }
 
-//Start starts (logs) the device manager
+// Start starts (logs) the device manager
 func (oo *OpenOLT) Start(ctx context.Context) error {
 	logger.Info(ctx, "starting-device-manager")
 	logger.Info(ctx, "device-manager-started")
 	return nil
 }
 
-//Stop terminates the session
+// Stop terminates the session
 func (oo *OpenOLT) Stop(ctx context.Context) error {
 	logger.Info(ctx, "stopping-device-manager")
 	close(oo.exitChannel)
@@ -155,7 +155,7 @@
 	return &empty.Empty{}, nil
 }
 
-//GetOfpDeviceInfo returns OFP information for the given device
+// GetOfpDeviceInfo returns OFP information for the given device
 func (oo *OpenOLT) GetOfpDeviceInfo(ctx context.Context, device *voltha.Device) (*ca.SwitchCapability, error) {
 	logger.Infow(ctx, "get_ofp_device_info", log.Fields{"device-id": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -164,7 +164,7 @@
 	return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
 }
 
-//ReconcileDevice unimplemented
+// ReconcileDevice unimplemented
 func (oo *OpenOLT) ReconcileDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
 	if device == nil {
 		return nil, olterrors.NewErrInvalidValue(log.Fields{"device": nil}, nil)
@@ -200,7 +200,7 @@
 	return &empty.Empty{}, nil
 }
 
-//DisableDevice disables the given device
+// DisableDevice disables the given device
 func (oo *OpenOLT) DisableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
 	logger.Infow(ctx, "disable-device", log.Fields{"device-id": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -212,7 +212,7 @@
 	return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
 }
 
-//ReEnableDevice enables the olt device after disable
+// ReEnableDevice enables the olt device after disable
 func (oo *OpenOLT) ReEnableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
 	logger.Infow(ctx, "reenable-device", log.Fields{"device-id": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -224,7 +224,7 @@
 	return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
 }
 
-//RebootDevice reboots the given device
+// RebootDevice reboots the given device
 func (oo *OpenOLT) RebootDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
 	logger.Infow(ctx, "reboot-device", log.Fields{"device-id": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -237,7 +237,7 @@
 
 }
 
-//DeleteDevice deletes a device
+// DeleteDevice deletes a device
 func (oo *OpenOLT) DeleteDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
 	logger.Infow(ctx, "delete-device", log.Fields{"device-id": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -250,7 +250,7 @@
 	return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
 }
 
-//UpdateFlowsIncrementally updates (add/remove) the flows on a given device
+// UpdateFlowsIncrementally updates (add/remove) the flows on a given device
 func (oo *OpenOLT) UpdateFlowsIncrementally(ctx context.Context, incrFlows *ca.IncrementalFlows) (*empty.Empty, error) {
 	logger.Infow(ctx, "update_flows_incrementally", log.Fields{"device-id": incrFlows.Device.Id, "flows": incrFlows.Flows, "flowMetadata": incrFlows.FlowMetadata})
 	if handler := oo.getDeviceHandler(incrFlows.Device.Id); handler != nil {
@@ -262,7 +262,7 @@
 	return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": incrFlows.Device.Id}, nil)
 }
 
-//UpdatePmConfig returns PmConfigs nil or error
+// UpdatePmConfig returns PmConfigs nil or error
 func (oo *OpenOLT) UpdatePmConfig(ctx context.Context, configs *ca.PmConfigsInfo) (*empty.Empty, error) {
 	logger.Debugw(ctx, "update_pm_config", log.Fields{"device-id": configs.DeviceId, "pm-configs": configs.PmConfigs})
 	if handler := oo.getDeviceHandler(configs.DeviceId); handler != nil {
@@ -272,7 +272,7 @@
 	return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": configs.DeviceId}, nil)
 }
 
-//SendPacketOut sends packet out to the device
+// SendPacketOut sends packet out to the device
 func (oo *OpenOLT) SendPacketOut(ctx context.Context, packet *ca.PacketOut) (*empty.Empty, error) {
 	logger.Debugw(ctx, "send_packet_out", log.Fields{"device-id": packet.DeviceId, "egress_port_no": packet.EgressPortNo, "pkt": packet.Packet})
 	if handler := oo.getDeviceHandler(packet.DeviceId); handler != nil {
@@ -327,7 +327,7 @@
 	return nil
 }
 
-//ChildDeviceLost deletes the ONU and its references from PONResources
+// ChildDeviceLost deletes the ONU and its references from PONResources
 func (oo *OpenOLT) ChildDeviceLost(ctx context.Context, childDevice *voltha.Device) (*empty.Empty, error) {
 	logger.Infow(ctx, "Child-device-lost", log.Fields{"parent-device-id": childDevice.ParentId, "child-device-id": childDevice.Id})
 	if handler := oo.getDeviceHandler(childDevice.ParentId); handler != nil {
@@ -354,7 +354,7 @@
 	return resp, nil
 }
 
-//GetSingleValue handles get uni status on ONU and ondemand metric on OLT
+// GetSingleValue handles get uni status on ONU and ondemand metric on OLT
 func (oo *OpenOLT) GetSingleValue(ctx context.Context, request *extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
 	logger.Infow(ctx, "single_get_value_request", log.Fields{"request": request})
 
@@ -375,6 +375,8 @@
 			return handler.getOnuPonCounters(ctx, reqType.OnuPonInfo), nil
 		case *extension.GetValueRequest_RxPower:
 			return handler.getRxPower(ctx, reqType.RxPower), nil
+		case *extension.GetValueRequest_OltRxPower:
+			return handler.getPONRxPower(ctx, reqType.OltRxPower), nil
 		default:
 			return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
 		}
@@ -477,87 +479,87 @@
  *
  */
 
-//SimulateAlarm is unimplemented
+// SimulateAlarm is unimplemented
 func (oo *OpenOLT) SimulateAlarm(context.Context, *ca.SimulateAlarmMessage) (*voltha.OperationResp, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//SetExtValue is unimplemented
+// SetExtValue is unimplemented
 func (oo *OpenOLT) SetExtValue(context.Context, *ca.SetExtValueMessage) (*empty.Empty, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//SetSingleValue is unimplemented
+// SetSingleValue is unimplemented
 func (oo *OpenOLT) SetSingleValue(context.Context, *extension.SingleSetValueRequest) (*extension.SingleSetValueResponse, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//StartOmciTest not implemented
+// StartOmciTest not implemented
 func (oo *OpenOLT) StartOmciTest(ctx context.Context, test *ca.OMCITest) (*omci.TestResponse, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//SuppressEvent unimplemented
+// SuppressEvent unimplemented
 func (oo *OpenOLT) SuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//UnSuppressEvent  unimplemented
+// UnSuppressEvent  unimplemented
 func (oo *OpenOLT) UnSuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//DownloadImage is unimplemented
+// DownloadImage is unimplemented
 func (oo *OpenOLT) DownloadImage(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//GetImageDownloadStatus is unimplemented
+// GetImageDownloadStatus is unimplemented
 func (oo *OpenOLT) GetImageDownloadStatus(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//CancelImageDownload is unimplemented
+// CancelImageDownload is unimplemented
 func (oo *OpenOLT) CancelImageDownload(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//ActivateImageUpdate is unimplemented
+// ActivateImageUpdate is unimplemented
 func (oo *OpenOLT) ActivateImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//RevertImageUpdate is unimplemented
+// RevertImageUpdate is unimplemented
 func (oo *OpenOLT) RevertImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//DownloadOnuImage unimplemented
+// DownloadOnuImage unimplemented
 func (oo *OpenOLT) DownloadOnuImage(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//GetOnuImageStatus unimplemented
+// GetOnuImageStatus unimplemented
 func (oo *OpenOLT) GetOnuImageStatus(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//AbortOnuImageUpgrade unimplemented
+// AbortOnuImageUpgrade unimplemented
 func (oo *OpenOLT) AbortOnuImageUpgrade(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//GetOnuImages unimplemented
+// GetOnuImages unimplemented
 func (oo *OpenOLT) GetOnuImages(ctx context.Context, deviceID *common.ID) (*voltha.OnuImages, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//ActivateOnuImage unimplemented
+// ActivateOnuImage unimplemented
 func (oo *OpenOLT) ActivateOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
 	return nil, olterrors.ErrNotImplemented
 }
 
-//CommitOnuImage unimplemented
+// CommitOnuImage unimplemented
 func (oo *OpenOLT) CommitOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
 	return nil, olterrors.ErrNotImplemented
 }
@@ -567,7 +569,7 @@
 	return nil, olterrors.ErrNotImplemented
 }
 
-//SelfTestDevice unimplemented
+// SelfTestDevice unimplemented
 func (oo *OpenOLT) SelfTestDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
 	return nil, olterrors.ErrNotImplemented
 }