[SEBA-836] BBSim Reflector

Change-Id: Ib4ae5a2c24880dc62209bebb81188eca5f57865d
diff --git a/internal/bbr/devices/validate.go b/internal/bbr/devices/validate.go
new file mode 100644
index 0000000..cb2551f
--- /dev/null
+++ b/internal/bbr/devices/validate.go
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package devices
+
+import (
+	"context"
+	"fmt"
+	"github.com/opencord/bbsim/api/bbsim"
+	log "github.com/sirupsen/logrus"
+	"google.golang.org/grpc"
+	"time"
+)
+
+func ValidateAndClose(olt *OltMock) {
+
+	// connect to the BBSim control APIs to check that all the ONUs are in the correct state
+	client, conn := ApiConnect(olt.BBSimIp, olt.BBSimApiPort)
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+	defer cancel()
+
+	onus, err := client.GetONUs(ctx, &bbsim.Empty{})
+
+	if err != nil {
+		log.WithFields(log.Fields{
+			"error": err,
+		}).Fatalf("Can't reach BBSim API")
+	}
+
+	expectedState := "dhcp_ack_received"
+
+	res := true
+	for _, onu := range onus.Items {
+		if onu.InternalState != expectedState {
+			res = false
+			log.WithFields(log.Fields{
+				"OnuSN":         onu.SerialNumber,
+				"OnuId":         onu.ID,
+				"InternalState": onu.InternalState,
+				"ExpectedSatte": expectedState,
+			}).Error("Not matching expected state")
+		}
+	}
+
+	if res == true {
+		log.WithFields(log.Fields{
+			"ExpectedState": expectedState,
+		}).Infof("%d ONUs matching expected state", len(onus.Items))
+	}
+
+	olt.conn.Close()
+}
+
+func ApiConnect(ip string, port string) (bbsim.BBSimClient, *grpc.ClientConn) {
+	server := fmt.Sprintf("%s:%s", ip, port)
+	conn, err := grpc.Dial(server, grpc.WithInsecure())
+
+	if err != nil {
+		log.Fatalf("did not connect: %v", err)
+		return nil, conn
+	}
+	return bbsim.NewBBSimClient(conn), conn
+}