[VOL-2778] Restart Auth and DHCP

Change-Id: I56bb900374b9be3cb5c668092acbeed55b69226b
diff --git a/internal/bbsim/api/onus_handler.go b/internal/bbsim/api/onus_handler.go
index fe42b35..332f237 100644
--- a/internal/bbsim/api/onus_handler.go
+++ b/internal/bbsim/api/onus_handler.go
@@ -282,19 +282,32 @@
 		return res, err
 	}
 
-	if err := onu.InternalState.Event("start_auth"); err != nil {
-		logger.WithFields(log.Fields{
-			"OnuId":  onu.ID,
-			"IntfId": onu.PonPortID,
-			"OnuSn":  onu.Sn(),
-		}).Errorf("Cannot restart authenticaton for ONU: %s", err.Error())
-		res.StatusCode = int32(codes.FailedPrecondition)
-		res.Message = err.Error()
-		return res, err
+	errors := []string{}
+	success := true
+
+	for _, s := range onu.Services {
+		service := s.(*devices.Service)
+		if service.NeedsEapol {
+			if err := service.EapolState.Event("start_auth"); err != nil {
+				logger.WithFields(log.Fields{
+					"OnuId":   onu.ID,
+					"IntfId":  onu.PonPortID,
+					"OnuSn":   onu.Sn(),
+					"Service": service.Name,
+				}).Errorf("Cannot restart authenticaton for Service: %s", err.Error())
+				errors = append(errors, fmt.Sprintf("%s: %s", service.Name, err.Error()))
+				success = false
+			}
+		}
 	}
 
-	res.StatusCode = int32(codes.OK)
-	res.Message = fmt.Sprintf("Authentication restarted for ONU %s.", onu.Sn())
+	if success {
+		res.StatusCode = int32(codes.OK)
+		res.Message = fmt.Sprintf("Authentication restarted for ONU %s.", onu.Sn())
+	} else {
+		res.StatusCode = int32(codes.FailedPrecondition)
+		res.Message = fmt.Sprintf("%v", errors)
+	}
 
 	return res, nil
 }
@@ -316,19 +329,33 @@
 		return res, err
 	}
 
-	if err := onu.InternalState.Event("start_dhcp"); err != nil {
-		logger.WithFields(log.Fields{
-			"OnuId":  onu.ID,
-			"IntfId": onu.PonPortID,
-			"OnuSn":  onu.Sn(),
-		}).Errorf("Cannot restart DHCP for ONU: %s", err.Error())
-		res.StatusCode = int32(codes.FailedPrecondition)
-		res.Message = err.Error()
-		return res, err
+	errors := []string{}
+	success := true
+
+	for _, s := range onu.Services {
+		service := s.(*devices.Service)
+		if service.NeedsDhcp {
+
+			if err := service.DHCPState.Event("start_dhcp"); err != nil {
+				logger.WithFields(log.Fields{
+					"OnuId":   onu.ID,
+					"IntfId":  onu.PonPortID,
+					"OnuSn":   onu.Sn(),
+					"Service": service.Name,
+				}).Errorf("Cannot restart DHCP for Service: %s", err.Error())
+				errors = append(errors, fmt.Sprintf("%s: %s", service.Name, err.Error()))
+				success = false
+			}
+		}
 	}
 
-	res.StatusCode = int32(codes.OK)
-	res.Message = fmt.Sprintf("DHCP restarted for ONU %s.", onu.Sn())
+	if success {
+		res.StatusCode = int32(codes.OK)
+		res.Message = fmt.Sprintf("DHCP restarted for ONU %s.", onu.Sn())
+	} else {
+		res.StatusCode = int32(codes.FailedPrecondition)
+		res.Message = fmt.Sprintf("%v", errors)
+	}
 
 	return res, nil
 }