VOL-4029 Fetch ONU stats on demand

Change-Id: I7248ab65f320858e9bdf9bdf6a60a27a734b8640
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index d998dbb..493c83a 100644
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -2581,3 +2581,40 @@
 	}
 	return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INTERNAL_ERROR)
 }
+
+func (dh *DeviceHandler) getOnuPonCounters(ctx context.Context, onuPonInfo *extension.GetOnuCountersRequest) *extension.SingleGetValueResponse {
+
+	singleValResp := extension.SingleGetValueResponse{
+		Response: &extension.GetValueResponse{
+			Response: &extension.GetValueResponse_OnuPonCounters{
+				OnuPonCounters: &extension.GetOnuCountersResponse{},
+			},
+		},
+	}
+
+	errResp := func(status extension.GetValueResponse_Status,
+		reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
+		return &extension.SingleGetValueResponse{
+			Response: &extension.GetValueResponse{
+				Status:    status,
+				ErrReason: reason,
+			},
+		}
+	}
+	intfID := onuPonInfo.IntfId
+	onuID := onuPonInfo.OnuId
+	onuKey := dh.formOnuKey(intfID, onuID)
+
+	if _, ok := dh.onus.Load(onuKey); !ok {
+		logger.Errorw(ctx, "get-onui-pon-counters-request-invalid-request-received", log.Fields{"intfID": intfID, "onuID": onuID})
+		return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE)
+	}
+	logger.Debugw(ctx, "get-onui-pon-counters-request-received", log.Fields{"intfID": intfID, "onuID": onuID})
+	cmnni := dh.portStats.collectOnDemandOnuStats(ctx, intfID, onuID)
+	if cmnni == nil {
+		return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INTERNAL_ERROR)
+	}
+	dh.portStats.updateGetOnuPonCountersResponse(ctx, &singleValResp, cmnni)
+	return &singleValResp
+
+}