[VOL-5291] - On demand PON & NNI stats

Change-Id: I1950394b08b0a76968b7e68bffd310714c24a3f3
Signed-off-by: Akash Reddy Kankanala <akash.kankanala@radisys.com>
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index 2c18980..918d918 100755
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -3930,6 +3930,108 @@
 	return &resp
 }
 
+func (dh *DeviceHandler) getPonPortStats(ctx context.Context, ponStatsRequest *extension.GetPonStatsRequest) *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_OltPonStatsResponse{
+				OltPonStatsResponse: &extension.GetPonStatsResponse{},
+			},
+		},
+	}
+
+	portLabel := ponStatsRequest.GetPortLabel()
+	logger.Debugw(ctx, "getPonPortStats", log.Fields{"portLabel": portLabel, "device-id": dh.device.Id})
+
+	portInfo := strings.Split(portLabel, "-")
+	portNumber, err := strconv.ParseUint(portInfo[1], 10, 32)
+
+	if err != nil {
+		logger.Errorw(ctx, "getPonPortStats invalid portNumber ", log.Fields{"oltPortNumber": portInfo[1]})
+		return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_REQ_TYPE)
+	}
+
+	if portInfo[0] != "pon" {
+		logger.Errorw(ctx, "getPonPortStats invalid portType", log.Fields{"oltPortType": portInfo[0]})
+		return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_PORT_TYPE)
+	}
+
+	Interface := oop.Interface{IntfId: uint32(portNumber)}
+	ponStats, err := dh.Client.GetPonPortStatistics(ctx, &Interface)
+	if err != nil {
+		logger.Errorw(ctx, "error-while-getting-pon-port-stats", log.Fields{"IntfId": portNumber, "err": err})
+		return generateSingleGetValueErrorResponse(err)
+	}
+
+	ponPortStats := resp.Response.GetOltPonStatsResponse()
+	ponPortStats.PonPort = uint32(portNumber)
+	ponPortStats.PortStatistics = ponStats
+
+	logger.Infow(ctx, "getPonPortStats response ", log.Fields{"Response": resp})
+	return &resp
+}
+
+func (dh *DeviceHandler) getNniPortStats(ctx context.Context, nniStatsRequest *extension.GetNNIStatsRequest) *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_OltNniStatsResponse{
+				OltNniStatsResponse: &extension.GetNNIStatsResponse{},
+			},
+		},
+	}
+
+	portLabel := nniStatsRequest.GetPortLabel()
+	logger.Debugw(ctx, "getNniPortStats", log.Fields{"portLabel": portLabel, "device-id": dh.device.Id})
+
+	portInfo := strings.Split(portLabel, "-")
+	portNumber, err := strconv.ParseUint(portInfo[1], 10, 32)
+
+	if err != nil {
+		logger.Errorw(ctx, "getNniPortStats invalid portNumber ", log.Fields{"oltPortNumber": portInfo[1]})
+		return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_REQ_TYPE)
+	}
+
+	if portInfo[0] != "nni" {
+		logger.Errorw(ctx, "getNniPortStats invalid portType", log.Fields{"oltPortType": portInfo[0]})
+		return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_PORT_TYPE)
+	}
+
+	Interface := oop.Interface{IntfId: uint32(portNumber)}
+	nniStats, err := dh.Client.GetNniPortStatistics(ctx, &Interface)
+	if err != nil {
+		logger.Errorw(ctx, "error-while-getting-nni-port-stats", log.Fields{"PortNo": portNumber, "err": err})
+		return generateSingleGetValueErrorResponse(err)
+	}
+
+	nniPortStats := resp.Response.GetOltNniStatsResponse()
+	nniPortStats.NniPort = uint32(portNumber)
+	nniPortStats.PortStatistics = nniStats
+
+	logger.Infow(ctx, "getNniPortStats response ", log.Fields{"Response": resp})
+	return &resp
+}
+
 // nolint: unparam
 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 aa63387..c1372eb 100644
--- a/internal/pkg/core/openolt.go
+++ b/internal/pkg/core/openolt.go
@@ -440,6 +440,10 @@
 			return handler.getOltOffloadStats(ctx, reqType.OffloadedAppsStats), nil
 		case *extension.GetValueRequest_OnuStatsFromOlt:
 			return handler.getOnuStatsFromOlt(ctx, reqType.OnuStatsFromOlt, onuDevice), nil
+		case *extension.GetValueRequest_OltPonStats:
+			return handler.getPonPortStats(ctx, reqType.OltPonStats), nil
+		case *extension.GetValueRequest_OltNniStats:
+			return handler.getNniPortStats(ctx, reqType.OltNniStats), nil
 		default:
 			return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
 		}