[VOL-5292] Implementation for fetching the GEM port history Data from the ONT

Change-Id: I4cf22555cbd13bcd5e49e620c8aa8b67cbd2891c
Signed-off-by: Akash Reddy Kankanala <akash.kankanala@radisys.com>
diff --git a/internal/pkg/pmmgr/onu_metrics_manager.go b/internal/pkg/pmmgr/onu_metrics_manager.go
index 11c6435..b60e5f3 100755
--- a/internal/pkg/pmmgr/onu_metrics_manager.go
+++ b/internal/pkg/pmmgr/onu_metrics_manager.go
@@ -4050,3 +4050,62 @@
 	defer mm.OnuMetricsManagerLock.Unlock()
 	mm.deviceDeletionInProgress = true
 }
+
+// Obtain the ONU GEM counters for the ONU device
+func (mm *OnuMetricsManager) GetONUGEMCounters(ctx context.Context) *extension.SingleGetValueResponse {
+
+	resp := extension.SingleGetValueResponse{
+		Response: &extension.GetValueResponse{
+			Status: extension.GetValueResponse_OK,
+			Response: &extension.GetValueResponse_OnuAllocGemStatsResponse{
+				OnuAllocGemStatsResponse: &extension.GetOnuAllocGemHistoryResponse{},
+			},
+		},
+	}
+
+	if mm.GetdeviceDeletionInProgress() {
+		logger.Infow(ctx, "device already deleted, return", log.Fields{"curr-state": mm.PAdaptFsm.PFsm.Current, "deviceID": mm.deviceID})
+		return nil
+	}
+
+	mm.OnuMetricsManagerLock.RLock()
+	defer mm.OnuMetricsManagerLock.RUnlock()
+
+	gemtoAllocId := mm.pDeviceHandler.GetOnuTP().GetGEMportToAllocIDMappingForONU(ctx, mm.deviceID)
+	allocIDtoGem := make(map[uint16][]uint16)
+	for key, value := range gemtoAllocId {
+		allocIDtoGem[value] = append(allocIDtoGem[value], key)
+	}
+
+	for allocID, gemSlice := range allocIDtoGem {
+		logger.Infow(ctx, "AllocID", log.Fields{"alloc-id": allocID})
+		allocIdGemData := extension.OnuAllocGemHistoryData{
+			OnuAllocIdInfo: &extension.OnuAllocHistoryData{},
+			GemPortInfo:    []*extension.OnuGemPortHistoryData{},
+		}
+		allocIdGemData.OnuAllocIdInfo.AllocId = uint32(allocID)
+
+		// Loop through each element in the slice
+		for _, gem := range gemSlice {
+			logger.Debugw(ctx, "Collecting stats for Gem: ", log.Fields{"GEMID": gem})
+			if metricInfo := mm.collectGemHistoryData(ctx, gem); metricInfo != nil {
+				logger.Infow(ctx, "Metricinfo for GEM", log.Fields{"GEMID": gem, "metricInfo": metricInfo})
+				gemHistoryData := extension.OnuGemPortHistoryData{}
+				gemHistoryData.GemId = uint32(gem)
+				gemHistoryData.TransmittedGEMFrames = uint32(metricInfo.GetMetrics()["transmitted_gem_frames"])
+				gemHistoryData.ReceivedGEMFrames = uint32(metricInfo.GetMetrics()["received_gem_frames"])
+				gemHistoryData.ReceivedPayloadBytes = uint32(metricInfo.GetMetrics()["received_payload_bytes"])
+				gemHistoryData.TransmittedPayloadBytes = uint32(metricInfo.GetMetrics()["transmitted_payload_bytes"])
+				gemHistoryData.EncryptionKeyErrors = uint32(metricInfo.GetMetrics()["encryption_key_errors"])
+				allocIdGemData.GemPortInfo = append(allocIdGemData.GemPortInfo, &gemHistoryData)
+				logger.Debugw(ctx, " allocIdGemData value ", log.Fields{"AllocIDGemData": allocIdGemData})
+
+			}
+		}
+		resp.Response.GetOnuAllocGemStatsResponse().OnuAllocGemHistoryData = append(resp.Response.GetOnuAllocGemStatsResponse().OnuAllocGemHistoryData, &allocIdGemData)
+	}
+
+	logger.Debugw(ctx, "Request to fetch GEM Performance Counters  ", log.Fields{"device-id": mm.deviceID, "response": resp})
+	return &resp
+
+}