Revert "[VOL-4518] remove flowKey and use only flowID for OLT and ONU flow cache since flowID's are unique"

This reverts commit d444598f453757cc0b9fb4ad7295dc1726a69c3f.

Change-Id: I449099e083d363db5834dc6c56330af3fd0ce921
diff --git a/VERSION b/VERSION
index 4dae298..5ad2491 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.10.1
+1.10.2
diff --git a/internal/bbsim/api/onus_handler.go b/internal/bbsim/api/onus_handler.go
index e5228cb..2638bf5 100644
--- a/internal/bbsim/api/onus_handler.go
+++ b/internal/bbsim/api/onus_handler.go
@@ -578,7 +578,7 @@
 	res := &bbsim.Flows{}
 
 	if req.SerialNumber == "" {
-		olt.Flows.Range(func(flowId, flow interface{}) bool {
+		olt.Flows.Range(func(flowKey, flow interface{}) bool {
 			flowObj := flow.(openolt.Flow)
 			res.Flows = append(res.Flows, &flowObj)
 			return true
@@ -592,12 +592,12 @@
 			}).Error("Can't get ONU in GetFlows request")
 			return nil, err
 		}
-		for _, flowId := range onu.FlowIds {
-			flow, _ := olt.Flows.Load(flowId)
+		for _, flowKey := range onu.Flows {
+			flow, _ := olt.Flows.Load(flowKey)
 			flowObj := flow.(openolt.Flow)
 			res.Flows = append(res.Flows, &flowObj)
 		}
-		res.FlowCount = uint32(len(onu.FlowIds))
+		res.FlowCount = uint32(len(onu.Flows))
 	}
 	return res, nil
 }
diff --git a/internal/bbsim/devices/olt.go b/internal/bbsim/devices/olt.go
index 931bd6d..8520bf2 100644
--- a/internal/bbsim/devices/olt.go
+++ b/internal/bbsim/devices/olt.go
@@ -1032,8 +1032,10 @@
 		"PortNo":    flow.PortNo,
 	}).Tracef("OLT receives FlowAdd")
 
+	flowKey := FlowKey{}
 	if !o.enablePerf {
-		o.Flows.Store(flow.FlowId, *flow)
+		flowKey = FlowKey{ID: flow.FlowId, Direction: flow.FlowType}
+		olt.Flows.Store(flowKey, *flow)
 	}
 
 	if flow.AccessIntfId == -1 {
@@ -1092,8 +1094,9 @@
 		}
 
 		if !o.enablePerf {
+			onu.Flows = append(onu.Flows, flowKey)
 			// Generate event on first flow for ONU
-			if len(onu.FlowIds) == 0 {
+			if len(onu.Flows) == 1 {
 				publishEvent("Flow-add-received", int32(onu.PonPortID), int32(onu.ID), onu.Sn())
 			}
 		}
@@ -1148,8 +1151,13 @@
 	olt.freeAllocId(flow)
 
 	if !o.enablePerf { // remove only if flow were stored
+		flowKey := FlowKey{
+			ID:        flow.FlowId,
+			Direction: flow.FlowType,
+		}
+
 		// Check if flow exists
-		storedFlowIntf, ok := o.Flows.Load(flow.FlowId)
+		storedFlowIntf, ok := o.Flows.Load(flowKey)
 		if !ok {
 			oltLogger.Errorf("Flow %v not found", flow)
 			return new(openolt.Empty), status.Errorf(codes.NotFound, "Flow not found")
@@ -1178,11 +1186,12 @@
 				}).Error("ONU-not-found")
 				return new(openolt.Empty), nil
 			}
+			onu.DeleteFlow(flowKey)
 			publishEvent("Flow-remove-received", int32(onu.PonPortID), int32(onu.ID), onu.Sn())
 		}
 
 		// delete from olt flows
-		o.Flows.Delete(flow.FlowId)
+		o.Flows.Delete(flowKey)
 	}
 
 	if flow.AccessIntfId == -1 {
diff --git a/internal/bbsim/devices/onu.go b/internal/bbsim/devices/onu.go
index 53f6564..cfc7099 100644
--- a/internal/bbsim/devices/onu.go
+++ b/internal/bbsim/devices/onu.go
@@ -93,6 +93,11 @@
 	BbrOnuStateDhcpFlowSent  = "dhcp_flow_sent"
 )
 
+type FlowKey struct {
+	ID        uint64
+	Direction string
+}
+
 type Onu struct {
 	ID                  uint32
 	PonPortID           uint32
@@ -105,6 +110,7 @@
 	// ONU State
 	UniPorts  []UniPortIf
 	PotsPorts []PotsPortIf
+	Flows     []FlowKey
 	FlowIds   []uint64 // keep track of the flows we currently have in the ONU
 
 	OperState    *fsm.FSM
@@ -155,7 +161,7 @@
 		seqNumber:                     0,
 		DoneChannel:                   make(chan bool, 1),
 		DiscoveryRetryDelay:           60 * time.Second, // this is used to send OnuDiscoveryIndications until an activate call is received
-		FlowIds:                       []uint64{},
+		Flows:                         []FlowKey{},
 		DiscoveryDelay:                delay,
 		MibDataSync:                   0,
 		ImageSoftwareExpectedSections: 0, // populated during OMCI StartSoftwareDownloadRequest
@@ -374,7 +380,7 @@
 // cleanupOnuState this method is to clean the local state when the ONU is disabled
 func (o *Onu) cleanupOnuState() {
 	// clean the ONU state
-	o.FlowIds = []uint64{}
+	o.Flows = []FlowKey{}
 	o.PonPort.removeOnuId(o.ID)
 	o.PonPort.removeAllocId(o.SerialNumber)
 	o.PonPort.removeGemPortBySn(o.SerialNumber)
@@ -1742,12 +1748,15 @@
 	}).Info("Sent DHCP Flow")
 }
 
-// DeleteFlow method search and delete flowId from the onu flowIds slice
-func (onu *Onu) DeleteFlow(id uint64) {
-	for pos, flowId := range onu.FlowIds {
-		if flowId == id {
-			// delete the flowId by shifting all flowIds by one
-			onu.FlowIds = append(onu.FlowIds[:pos], onu.FlowIds[pos+1:]...)
+// DeleteFlow method search and delete flowKey from the onu flows slice
+func (onu *Onu) DeleteFlow(key FlowKey) {
+	for pos, flowKey := range onu.Flows {
+		if flowKey == key {
+			// delete the flowKey by shifting all flowKeys by one
+			onu.Flows = append(onu.Flows[:pos], onu.Flows[pos+1:]...)
+			t := make([]FlowKey, len(onu.Flows))
+			copy(t, onu.Flows)
+			onu.Flows = t
 			break
 		}
 	}
diff --git a/internal/bbsim/devices/onu_state_machine_test.go b/internal/bbsim/devices/onu_state_machine_test.go
index a324d81..c1f6d8e 100644
--- a/internal/bbsim/devices/onu_state_machine_test.go
+++ b/internal/bbsim/devices/onu_state_machine_test.go
@@ -40,7 +40,10 @@
 	onu.InternalState.SetState(OnuStateEnabled)
 	assert.Equal(t, onu.InternalState.Current(), OnuStateEnabled)
 
-	onu.FlowIds = []uint64{1, 2}
+	onu.Flows = []FlowKey{
+		{ID: 1, Direction: "upstream"},
+		{ID: 2, Direction: "downstream"},
+	}
 	key := omcilib.OnuAlarmInfoMapKey{
 		MeInstance: 257,
 		MeClassID:  me.PhysicalPathTerminationPointEthernetUniClassID,
@@ -54,7 +57,7 @@
 	assert.Equal(t, onu.InternalState.Current(), OnuStateDisabled)
 
 	assert.Equal(t, len(onu.onuAlarmsInfo), 0)
-	assert.Equal(t, len(onu.FlowIds), 0)
+	assert.Equal(t, len(onu.Flows), 0)
 	assert.Equal(t, len(onu.PonPort.AllocatedOnuIds), 0)
 	assert.Equal(t, len(onu.PonPort.AllocatedAllocIds), 0)
 	assert.Equal(t, len(onu.PonPort.AllocatedGemPorts), 0)