View status of individual ONUs using PON interface and ONU IDs

Change-Id: I5fb4cd9246b2ed29a5384579203ebc2d96e506a9
diff --git a/core/grpc_service.go b/core/grpc_service.go
index 38f9539..a225fd9 100644
--- a/core/grpc_service.go
+++ b/core/grpc_service.go
@@ -159,6 +159,24 @@
 	return new(openolt.Empty), nil
 }
 
+func (s *Server) GetOnuInfo(c context.Context, onu *openolt.Onu) (*openolt.OnuIndication, error){
+	logger.Debug("Olt receives GetOnuInfo() intfID: %d, onuID: %d", onu.IntfId, onu.OnuId)
+
+	if onu.IntfId > (s.Olt.NumPonIntf-1){
+		logger.Error("PON ID %d out of bounds. %d ports total", onu.IntfId, s.Olt.NumPonIntf)
+		return nil, status.Errorf(codes.OutOfRange, "PON ID %d out of bounds. %d ports total (indexing starts at 0)", onu.IntfId, s.Olt.NumPonIntf)
+	} else if nonus:=len(s.Onumap[onu.IntfId]); int(onu.OnuId) > nonus-1{
+		logger.Error("ONU ID %d out of bounds. %d onus total", onu.OnuId, s.Olt.NumPonIntf)
+		return nil, status.Errorf(codes.OutOfRange, "ONU ID %d out of bounds. %d ONUs total (indexing starts at 0)", onu.OnuId, nonus)
+	} else{
+		stat := new(openolt.OnuIndication)
+		stat.IntfId = onu.IntfId
+		stat.OnuId = onu.OnuId
+		stat.OperState = "up"
+		return stat, nil
+	}
+}
+
 // OmciMsgOut receives OMCI messages from voltha
 func (s *Server) OmciMsgOut(c context.Context, msg *openolt.OmciMsg) (*openolt.Empty, error) {
 	logger.Debug("OLT %d receives OmciMsgOut to IF %v (ONU-ID: %v) pkt:%x.", s.Olt.ID, msg.IntfId, msg.OnuId, msg.Pkt)
@@ -320,7 +338,7 @@
 
 func (s *Server) GetPonIf(c context.Context, intf *openolt.Interface) (*openolt.IntfIndication, error){
 	logger.Debug("OLT %d receives GetPonIf().", s.Olt.ID)
-	stat := new(openolt.IntfIndication)
+	stat:=new(openolt.IntfIndication)
 
 	if intf.IntfId > (s.Olt.NumPonIntf-1){
 		logger.Error("PON ID %d out of bounds. %d ports total", intf.IntfId, s.Olt.NumPonIntf)