[VOL-3084][VOL-3097] Added support for ONU Re-Discovery and OLT PON Port Disable/Enable

Change-Id: I21f20ffc5edc95652946007baffa4b22ecfd9b92
diff --git a/internal/bbsim/devices/olt.go b/internal/bbsim/devices/olt.go
index 4caf5b6..fae3dd5 100644
--- a/internal/bbsim/devices/olt.go
+++ b/internal/bbsim/devices/olt.go
@@ -677,11 +677,31 @@
 				msg, _ := message.Data.(PonIndicationMessage)
 				pon, _ := o.GetPonById(msg.PonPortID)
 				if msg.OperState == UP {
-					pon.OperState.Event("enable")
-					pon.InternalState.Event("enable")
+					if err := pon.OperState.Event("enable"); err != nil {
+						oltLogger.WithFields(log.Fields{
+							"IntfId": msg.PonPortID,
+							"Err": err,
+						}).Error("Can't Enable Oper state for PON Port")
+					}
+					if err := pon.InternalState.Event("enable"); err != nil {
+						oltLogger.WithFields(log.Fields{
+							"IntfId": msg.PonPortID,
+							"Err": err,
+						}).Error("Can't Enable Internal state for PON Port")
+					}
 				} else if msg.OperState == DOWN {
-					pon.OperState.Event("disable")
-					pon.InternalState.Event("disable")
+					if err := pon.OperState.Event("disable"); err != nil {
+						oltLogger.WithFields(log.Fields{
+							"IntfId": msg.PonPortID,
+							"Err": err,
+						}).Error("Can't Disable Oper state for PON Port")
+					}
+					if err := pon.InternalState.Event("disable"); err != nil {
+						oltLogger.WithFields(log.Fields{
+							"IntfId": msg.PonPortID,
+							"Err": err,
+						}).Error("Can't Disable Internal state for PON Port")
+					}
 				}
 			default:
 				oltLogger.Warnf("Received unknown message data %v for type %v in OLT Channel", message.Data, message.Type)
@@ -872,12 +892,33 @@
 		}).Error("Can't find Onu")
 	}
 
-	if err := _onu.InternalState.Event("initialize"); err != nil {
+	if err := _onu.InternalState.Event("disable"); err != nil {
 		oltLogger.WithFields(log.Fields{
 			"IntfId": _onu.PonPortID,
 			"OnuSn":  _onu.Sn(),
 			"OnuId":  _onu.ID,
-		}).Infof("Failed to transition ONU to initialized state: %s", err.Error())
+		}).Infof("Failed to transition ONU to disabled state: %s", err.Error())
+	}
+
+	time.Sleep(1 * time.Second)
+
+	// ONU Re-Discovery
+	if o.InternalState.Current() == "enabled" && pon.InternalState.Current() == "enabled" {
+		if err := _onu.InternalState.Event("initialize"); err != nil {
+			oltLogger.WithFields(log.Fields{
+				"IntfId": _onu.PonPortID,
+				"OnuSn":  _onu.Sn(),
+				"OnuId":  _onu.ID,
+			}).Infof("Failed to transition ONU to initialized state: %s", err.Error())
+		}
+
+		if err := _onu.InternalState.Event("discover"); err != nil {
+			oltLogger.WithFields(log.Fields{
+				"IntfId": _onu.PonPortID,
+				"OnuSn":  _onu.Sn(),
+				"OnuId":  _onu.ID,
+			}).Infof("Failed to transition ONU to discovered state: %s", err.Error())
+		}
 	}
 
 	return new(openolt.Empty), nil
@@ -919,19 +960,9 @@
 }
 
 func (o OltDevice) DisablePonIf(_ context.Context, intf *openolt.Interface) (*openolt.Empty, error) {
-	oltLogger.Errorf("DisablePonIf request received for PON %d", intf.IntfId)
+	oltLogger.Infof("DisablePonIf request received for PON %d", intf.IntfId)
 	ponID := intf.GetIntfId()
 	pon, _ := o.GetPonById(intf.IntfId)
-	errInternalState := pon.InternalState.Event("disable")
-	oltLogger.WithFields(log.Fields{
-		"IntfId": ponID,
-		"err":    errInternalState,
-	}).Error("Can't disable Internal state for PonPort")
-	errOperState := pon.OperState.Event("disable")
-	oltLogger.WithFields(log.Fields{
-		"IntfId": ponID,
-		"err":    errOperState,
-	}).Error("Can't disable Oper state for PonPort")
 
 	msg := Message{
 		Type: PonIndication,
@@ -965,19 +996,9 @@
 }
 
 func (o OltDevice) EnablePonIf(_ context.Context, intf *openolt.Interface) (*openolt.Empty, error) {
-	oltLogger.Errorf("EnablePonIf request received for PON %d", intf.IntfId)
+	oltLogger.Infof("EnablePonIf request received for PON %d", intf.IntfId)
 	ponID := intf.GetIntfId()
 	pon, _ := o.GetPonById(intf.IntfId)
-	errInternalState := pon.InternalState.Event("enable")
-	oltLogger.WithFields(log.Fields{
-		"IntfId": ponID,
-		"err":    errInternalState,
-	}).Error("Can't enable Internal state for PonPort")
-	errOperState := pon.OperState.Event("enable")
-	oltLogger.WithFields(log.Fields{
-		"IntfId": ponID,
-		"err":    errOperState,
-	}).Error("Can't enable Oper state for PonPort")
 
 	msg := Message{
 		Type: PonIndication,