SEBA-909 store flows and implement GetFlow API

Change-Id: If2c214f8be5808ef89e0521f75d03da49153dc2a
diff --git a/internal/bbsim/api/onus_handler.go b/internal/bbsim/api/onus_handler.go
index b9c697c..975b426 100644
--- a/internal/bbsim/api/onus_handler.go
+++ b/internal/bbsim/api/onus_handler.go
@@ -295,6 +295,38 @@
 	return res, nil
 }
 
+// GetFlows for OLT/ONUs
+func (s BBSimServer) GetFlows(ctx context.Context, req *bbsim.ONURequest) (*bbsim.Flows, error) {
+	logger.WithFields(log.Fields{
+		"OnuSn": req.SerialNumber,
+	}).Info("Received GetFlows request")
+
+	olt := devices.GetOLT()
+	res := &bbsim.Flows{}
+
+	if req.SerialNumber == "" {
+		for flowKey := range olt.Flows {
+			flow := olt.Flows[flowKey]
+			res.Flows = append(res.Flows, &flow)
+		}
+		res.FlowCount = uint32(len(olt.Flows))
+	} else {
+		onu, err := olt.FindOnuBySn(req.SerialNumber)
+		if err != nil {
+			logger.WithFields(log.Fields{
+				"OnuSn": req.SerialNumber,
+			}).Error("Can't get ONU in GetFlows request")
+			return nil, err
+		}
+		for _, flowKey := range onu.Flows {
+			flow := olt.Flows[flowKey]
+			res.Flows = append(res.Flows, &flow)
+		}
+		res.FlowCount = uint32(len(onu.Flows))
+	}
+	return res, nil
+}
+
 func (s BBSimServer) GetOnuTrafficSchedulers(ctx context.Context, req *bbsim.ONURequest) (*bbsim.ONUTrafficSchedulers, error) {
 	olt := devices.GetOLT()
 	ts := bbsim.ONUTrafficSchedulers{}