[VOL-4080] Extend GetExtValue api to read transceiver rx-power on demand.

Change-Id: I3b9728f9eeb9c5b17df41774d21bd16ddc7b69c0
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index 493c83a..43a588c 100644
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -2618,3 +2618,56 @@
 	return &singleValResp
 
 }
+
+func (dh *DeviceHandler) getRxPower(ctx context.Context, rxPowerRequest *extension.GetRxPowerRequest) *extension.SingleGetValueResponse {
+
+	Onu := oop.Onu{IntfId: rxPowerRequest.IntfId, OnuId: rxPowerRequest.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)
+	}
+	return &extension.SingleGetValueResponse{
+		Response: &extension.GetValueResponse{
+			Status: extension.GetValueResponse_OK,
+			Response: &extension.GetValueResponse_RxPower{
+				RxPower: &extension.GetRxPowerResponse{
+					IntfId:     rxPowerRequest.IntfId,
+					OnuId:      rxPowerRequest.OnuId,
+					Status:     rxPower.Status,
+					FailReason: rxPower.FailReason.String(),
+					RxPower:    rxPower.RxPowerMeanDbm,
+				},
+			},
+		},
+	}
+}
+
+func generateSingleGetValueErrorResponse(err error) *extension.SingleGetValueResponse {
+	errResp := func(status extension.GetValueResponse_Status,
+		reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
+		return &extension.SingleGetValueResponse{
+			Response: &extension.GetValueResponse{
+				Status:    status,
+				ErrReason: reason,
+			},
+		}
+	}
+
+	if err != nil {
+		if e, ok := status.FromError(err); ok {
+			switch e.Code() {
+			case codes.Internal:
+				return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INTERNAL_ERROR)
+			case codes.DeadlineExceeded:
+				return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_TIMEOUT)
+			case codes.Unimplemented:
+				return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED)
+			case codes.NotFound:
+				return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE)
+			}
+		}
+	}
+
+	return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_REASON_UNDEFINED)
+}