[VOL-5452]: Onu Disable/Enable Olt adapter

Change-Id: I681ff5fc407b90ab7cf75a2386a82f8e996e488b
Signed-off-by: balaji.nagarajan <balaji.nagarajan@radisys.com>
diff --git a/internal/pkg/core/openolt.go b/internal/pkg/core/openolt.go
index 0df5140..cc11caa 100644
--- a/internal/pkg/core/openolt.go
+++ b/internal/pkg/core/openolt.go
@@ -336,6 +336,101 @@
 	return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": packet.DeviceId}, nil)
 }
 
+// EnableOnuSerialNumber to Enable onu serial number
+func (oo *OpenOLT) EnableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon) (*empty.Empty, error) {
+	logger.Infow(ctx, "enable_onu_serial_number", log.Fields{"olt_device_id": device.OltDeviceId, "onu_serial_number": device.SerialNumber})
+	if err := oo.enableDisableOnuSerialNumber(log.WithSpanFromContext(context.Background(), ctx), device, true); err != nil {
+		return nil, err
+	}
+	return &empty.Empty{}, nil
+}
+
+// DisableOnuSerialNumber to Disable onu serial number
+func (oo *OpenOLT) DisableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon) (*empty.Empty, error) {
+	logger.Infow(ctx, "disable_onu_serial_number", log.Fields{"olt_device_id": device.OltDeviceId, "onu_serial_number": device.SerialNumber})
+	if err := oo.enableDisableOnuSerialNumber(log.WithSpanFromContext(context.Background(), ctx), device, false); err != nil {
+		return nil, err
+	}
+	return &empty.Empty{}, nil
+}
+
+// enableDisableOnuSerialNumber to Disable onu or Enable onu
+func (oo *OpenOLT) enableDisableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon, enable bool) error {
+	if device.OltDeviceId == nil {
+		return olterrors.NewErrInvalidValue(log.Fields{
+			"reason": "olt device id is required",
+		}, nil)
+	}
+	if device.SerialNumber == "" {
+		return olterrors.NewErrInvalidValue(log.Fields{
+			"reason": "onu_serial_number cannot be empty",
+		}, nil)
+	}
+	if device.Port == nil {
+		return olterrors.NewErrInvalidValue(log.Fields{
+			"reason": "pon port cannot be empty",
+		}, nil)
+	}
+	if handler := oo.getDeviceHandler(device.OltDeviceId.Id); handler != nil {
+		if enable {
+			if err := handler.EnableOnuSerialNumber(ctx, device); err != nil {
+				return olterrors.NewErrAdapter("error-occurred-during-enable-onu-serial-number", log.Fields{"device-id": device.OltDeviceId.Id, "sn": device.SerialNumber}, err)
+			}
+		} else {
+			if err := handler.DisableOnuSerialNumber(ctx, device); err != nil {
+				return olterrors.NewErrAdapter("error-occurred-during-disable-onu-serial-number", log.Fields{"device-id": device.OltDeviceId.Id, "sn": device.SerialNumber}, err)
+			}
+		}
+		return nil
+	}
+	return olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.OltDeviceId.Id}, nil)
+}
+
+// EnableOnuDevice to Enable onu
+func (oo *OpenOLT) EnableOnuDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
+	logger.Infow(ctx, "enable_onu", log.Fields{"onu_device_id": device.Id, "onu_serial_number": device.SerialNumber})
+	if err := oo.enableDisableOnuDevice(log.WithSpanFromContext(context.Background(), ctx), device, true); err != nil {
+		return nil, err
+	}
+	return &empty.Empty{}, nil
+}
+
+// DisableOnuDevice to Disable onu
+func (oo *OpenOLT) DisableOnuDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
+	logger.Infow(ctx, "disable_onu", log.Fields{"onu_device_id": device.Id, "onu_serial_number": device.SerialNumber})
+	if err := oo.enableDisableOnuDevice(log.WithSpanFromContext(context.Background(), ctx), device, false); err != nil {
+		return nil, err
+	}
+	return &empty.Empty{}, nil
+}
+
+// enableDisableOnuDevice to Disable onu or Enable onu
+func (oo *OpenOLT) enableDisableOnuDevice(ctx context.Context, device *voltha.Device, enable bool) error {
+	if device.ParentId == "" {
+		return olterrors.NewErrInvalidValue(log.Fields{
+			"reason": "olt device id is required",
+		}, nil)
+	}
+	if device.SerialNumber == "" {
+		return olterrors.NewErrInvalidValue(log.Fields{
+			"reason": "onu_serial_number cannot be empty",
+		}, nil)
+	}
+	if handler := oo.getDeviceHandler(device.ParentId); handler != nil {
+		if enable {
+			if err := handler.EnableOnu(ctx, device); err != nil {
+				return olterrors.NewErrAdapter("error-occurred-during-enable-onu", log.Fields{"device-id": device.ParentId, "sn": device.SerialNumber}, err)
+			}
+		} else {
+			if err := handler.DisableOnu(ctx, device); err != nil {
+				return olterrors.NewErrAdapter("error-occurred-during-disable-onu", log.Fields{"device-id": device.ParentId, "sn": device.SerialNumber}, err)
+			}
+		}
+		return nil
+	}
+	return olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.ParentId}, nil)
+}
+
 // EnablePort to Enable PON/NNI interface
 func (oo *OpenOLT) EnablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
 	logger.Infow(ctx, "enable_port", log.Fields{"device-id": port.DeviceId, "port": port})