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
}