blob: 0dd232516e1e6a4b60d3e8c70441e7bb422d6a31 [file] [log] [blame]
Girish Gowdru0c588b22019-04-23 23:24:56 -04001/*
Joey Armstrong11f5a572024-01-12 19:11:32 -05002 * Copyright 2018-2024 Open Networking Foundation (ONF) and the ONF Contributors
Girish Gowdru0c588b22019-04-23 23:24:56 -04003
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Girish Gowdru6a80bbd2019-07-02 07:36:09 -070016
praneeth nalmas55616d62023-02-06 09:19:18 +053017// Package core provides the utility for olt devices, flows and statistics
Scott Bakerdbd960e2020-02-28 08:57:51 -080018package core
Girish Gowdru0c588b22019-04-23 23:24:56 -040019
20import (
21 "context"
khenaidooefff76e2021-12-15 16:51:30 -050022 "fmt"
Akash Sonif49299a2024-04-25 12:06:37 +053023 "sync"
24 "time"
25
khenaidoo106c61a2021-08-11 18:05:46 -040026 conf "github.com/opencord/voltha-lib-go/v7/pkg/config"
27 "github.com/opencord/voltha-lib-go/v7/pkg/events/eventif"
28 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
29 "github.com/opencord/voltha-lib-go/v7/pkg/log"
Scott Bakerdbd960e2020-02-28 08:57:51 -080030 "github.com/opencord/voltha-openolt-adapter/internal/pkg/config"
Thomas Lee S94109f12020-03-03 16:39:29 +053031 "github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
khenaidooefff76e2021-12-15 16:51:30 -050032 "github.com/opencord/voltha-protos/v5/go/adapter_service"
khenaidoo106c61a2021-08-11 18:05:46 -040033 "github.com/opencord/voltha-protos/v5/go/common"
khenaidoodc2116e2021-10-19 17:33:19 -040034 ca "github.com/opencord/voltha-protos/v5/go/core_adapter"
khenaidoo106c61a2021-08-11 18:05:46 -040035 "github.com/opencord/voltha-protos/v5/go/extension"
khenaidoodc2116e2021-10-19 17:33:19 -040036 "github.com/opencord/voltha-protos/v5/go/health"
37 ia "github.com/opencord/voltha-protos/v5/go/inter_adapter"
38 "github.com/opencord/voltha-protos/v5/go/omci"
khenaidoo106c61a2021-08-11 18:05:46 -040039 "github.com/opencord/voltha-protos/v5/go/voltha"
nikesh.krishnan4d644532023-12-16 00:21:07 +053040 "google.golang.org/grpc/codes"
41 "google.golang.org/grpc/status"
bseeniva0b9cbcb2026-02-12 19:11:11 +053042 "google.golang.org/protobuf/types/known/emptypb"
Girish Gowdru0c588b22019-04-23 23:24:56 -040043)
44
praneeth nalmas55616d62023-02-06 09:19:18 +053045// OpenOLT structure holds the OLT information
Girish Gowdru0c588b22019-04-23 23:24:56 -040046type OpenOLT struct {
bseeniva0b9cbcb2026-02-12 19:11:11 +053047 adapter_service.UnimplementedAdapterServiceServer
Akash Kankanala041a2122024-10-16 15:49:22 +053048 eventProxy eventif.EventProxy
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053049 configManager *conf.ConfigManager
50 deviceHandlers map[string]*DeviceHandler
51 coreClient *vgrpc.Client
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053052 config *config.AdapterFlags
Akash Kankanala041a2122024-10-16 15:49:22 +053053 exitChannel chan struct{}
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053054 KVStoreAddress string
55 KVStoreType string
Akash Kankanala041a2122024-10-16 15:49:22 +053056 numOnus int
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053057 HeartbeatCheckInterval time.Duration
58 HeartbeatFailReportInterval time.Duration
59 GrpcTimeoutInterval time.Duration
Akash Kankanala041a2122024-10-16 15:49:22 +053060 rpcTimeout time.Duration
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053061 lockDeviceHandlersMap sync.RWMutex
62 enableONUStats bool
63 enableGemStats bool
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053064 CheckOnuDevExistenceAtOnuDiscovery bool
Sridhar Ravindraab785f22025-07-21 17:20:55 +053065 ForceOnuDiscIndProcessing bool
Girish Gowdru0c588b22019-04-23 23:24:56 -040066}
67
praneeth nalmas55616d62023-02-06 09:19:18 +053068// NewOpenOLT returns a new instance of OpenOLT
khenaidoo106c61a2021-08-11 18:05:46 -040069func NewOpenOLT(ctx context.Context,
70 coreClient *vgrpc.Client,
Himani Chawlacd407802020-12-10 12:08:59 +053071 eventProxy eventif.EventProxy, cfg *config.AdapterFlags, cm *conf.ConfigManager) *OpenOLT {
Girish Gowdru0c588b22019-04-23 23:24:56 -040072 var openOLT OpenOLT
khenaidooefff76e2021-12-15 16:51:30 -050073 openOLT.exitChannel = make(chan struct{})
Girish Gowdru0c588b22019-04-23 23:24:56 -040074 openOLT.deviceHandlers = make(map[string]*DeviceHandler)
Abhilash Laxmeshwarf9942e92020-01-07 15:32:44 +053075 openOLT.config = cfg
76 openOLT.numOnus = cfg.OnuNumber
khenaidoo106c61a2021-08-11 18:05:46 -040077 openOLT.coreClient = coreClient
Devmalya Paulfb990a52019-07-09 10:01:49 -040078 openOLT.eventProxy = eventProxy
Neha Sharma3f221ae2020-04-29 19:02:12 +000079 openOLT.KVStoreAddress = cfg.KVStoreAddress
Abhilash Laxmeshwarf9942e92020-01-07 15:32:44 +053080 openOLT.KVStoreType = cfg.KVStoreType
81 openOLT.HeartbeatCheckInterval = cfg.HeartbeatCheckInterval
82 openOLT.HeartbeatFailReportInterval = cfg.HeartbeatFailReportInterval
83 openOLT.GrpcTimeoutInterval = cfg.GrpcTimeoutInterval
Girish Gowdru0c588b22019-04-23 23:24:56 -040084 openOLT.lockDeviceHandlersMap = sync.RWMutex{}
Matteo Scandolodfa7a972020-11-06 13:03:40 -080085 openOLT.configManager = cm
Gamze Abakafcbd6e72020-12-17 13:25:16 +000086 openOLT.enableONUStats = cfg.EnableONUStats
87 openOLT.enableGemStats = cfg.EnableGEMStats
khenaidoo106c61a2021-08-11 18:05:46 -040088 openOLT.rpcTimeout = cfg.RPCTimeout
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053089 openOLT.CheckOnuDevExistenceAtOnuDiscovery = cfg.CheckOnuDevExistenceAtOnuDiscovery
Sridhar Ravindraab785f22025-07-21 17:20:55 +053090 openOLT.ForceOnuDiscIndProcessing = cfg.ForceOnuDiscIndProcessing
Girish Gowdru0c588b22019-04-23 23:24:56 -040091 return &openOLT
92}
93
praneeth nalmas55616d62023-02-06 09:19:18 +053094// Start starts (logs) the device manager
Girish Gowdru0c588b22019-04-23 23:24:56 -040095func (oo *OpenOLT) Start(ctx context.Context) error {
Neha Sharma96b7bf22020-06-15 10:37:32 +000096 logger.Info(ctx, "starting-device-manager")
97 logger.Info(ctx, "device-manager-started")
Girish Gowdru0c588b22019-04-23 23:24:56 -040098 return nil
99}
100
praneeth nalmas55616d62023-02-06 09:19:18 +0530101// Stop terminates the session
Girish Gowdru0c588b22019-04-23 23:24:56 -0400102func (oo *OpenOLT) Stop(ctx context.Context) error {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000103 logger.Info(ctx, "stopping-device-manager")
khenaidooefff76e2021-12-15 16:51:30 -0500104 close(oo.exitChannel)
105 // Stop the device handlers
106 oo.stopAllDeviceHandlers(ctx)
107
108 // Stop the core grpc client connection
109 if oo.coreClient != nil {
110 oo.coreClient.Stop(ctx)
111 }
112
Neha Sharma96b7bf22020-06-15 10:37:32 +0000113 logger.Info(ctx, "device-manager-stopped")
Girish Gowdru0c588b22019-04-23 23:24:56 -0400114 return nil
115}
116
Girish Gowdru0c588b22019-04-23 23:24:56 -0400117func (oo *OpenOLT) addDeviceHandlerToMap(agent *DeviceHandler) {
118 oo.lockDeviceHandlersMap.Lock()
119 defer oo.lockDeviceHandlersMap.Unlock()
Thomas Lee S985938d2020-05-04 11:40:41 +0530120 if _, exist := oo.deviceHandlers[agent.device.Id]; !exist {
121 oo.deviceHandlers[agent.device.Id] = agent
Girish Gowdru0c588b22019-04-23 23:24:56 -0400122 }
123}
124
125func (oo *OpenOLT) deleteDeviceHandlerToMap(agent *DeviceHandler) {
126 oo.lockDeviceHandlersMap.Lock()
127 defer oo.lockDeviceHandlersMap.Unlock()
Thomas Lee S985938d2020-05-04 11:40:41 +0530128 delete(oo.deviceHandlers, agent.device.Id)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400129}
130
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700131func (oo *OpenOLT) getDeviceHandler(deviceID string) *DeviceHandler {
Girish Gowdru0c588b22019-04-23 23:24:56 -0400132 oo.lockDeviceHandlersMap.Lock()
133 defer oo.lockDeviceHandlersMap.Unlock()
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700134 if agent, ok := oo.deviceHandlers[deviceID]; ok {
Girish Gowdru0c588b22019-04-23 23:24:56 -0400135 return agent
136 }
137 return nil
138}
139
khenaidooefff76e2021-12-15 16:51:30 -0500140func (oo *OpenOLT) stopAllDeviceHandlers(ctx context.Context) {
141 oo.lockDeviceHandlersMap.Lock()
142 defer oo.lockDeviceHandlersMap.Unlock()
143 for _, handler := range oo.deviceHandlers {
144 handler.Stop(ctx)
145 }
khenaidoo106c61a2021-08-11 18:05:46 -0400146}
147
148// AdoptDevice creates a new device handler if not present already and then adopts the device
bseeniva0b9cbcb2026-02-12 19:11:11 +0530149func (oo *OpenOLT) AdoptDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
Girish Gowdru0c588b22019-04-23 23:24:56 -0400150 if device == nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400151 return nil, olterrors.NewErrInvalidValue(log.Fields{"device": nil}, nil).Log()
Girish Gowdru0c588b22019-04-23 23:24:56 -0400152 }
divyadesai3af43e12020-08-18 07:10:54 +0000153 logger.Infow(ctx, "adopt-device", log.Fields{"device-id": device.Id})
Girish Gowdru0c588b22019-04-23 23:24:56 -0400154 var handler *DeviceHandler
155 if handler = oo.getDeviceHandler(device.Id); handler == nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400156 handler := NewDeviceHandler(oo.coreClient, oo.eventProxy, device, oo, oo.configManager, oo.config)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400157 oo.addDeviceHandlerToMap(handler)
khenaidoo106c61a2021-08-11 18:05:46 -0400158 go handler.AdoptDevice(log.WithSpanFromContext(context.Background(), ctx), device)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400159 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530160 return &emptypb.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400161}
162
praneeth nalmas55616d62023-02-06 09:19:18 +0530163// GetOfpDeviceInfo returns OFP information for the given device
khenaidoodc2116e2021-10-19 17:33:19 -0400164func (oo *OpenOLT) GetOfpDeviceInfo(ctx context.Context, device *voltha.Device) (*ca.SwitchCapability, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400165 logger.Infow(ctx, "get_ofp_device_info", log.Fields{"device-id": device.Id})
Girish Gowdru0c588b22019-04-23 23:24:56 -0400166 if handler := oo.getDeviceHandler(device.Id); handler != nil {
167 return handler.GetOfpDeviceInfo(device)
168 }
Girish Kumarf26e4882020-03-05 06:49:10 +0000169 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400170}
171
praneeth nalmas55616d62023-02-06 09:19:18 +0530172// ReconcileDevice unimplemented
bseeniva0b9cbcb2026-02-12 19:11:11 +0530173func (oo *OpenOLT) ReconcileDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530174 if device == nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400175 return nil, olterrors.NewErrInvalidValue(log.Fields{"device": nil}, nil)
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530176 }
divyadesai3af43e12020-08-18 07:10:54 +0000177 logger.Infow(ctx, "reconcile-device", log.Fields{"device-id": device.Id})
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530178 var handler *DeviceHandler
Akash Reddy Kankanala78b627f2026-01-12 08:18:21 +0000179 var dhCtx context.Context
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530180 if handler = oo.getDeviceHandler(device.Id); handler == nil {
Manindere49938d2021-03-19 00:23:24 +0530181 //Setting state to RECONCILING
Nandita Biradar1b590f12024-09-27 10:56:28 +0530182 // Fetch previous state
183 //here we are fetching the previous operation states of the device,so to check which operation state it was previously for proper transition and proper clean up of the resources.
184 PrevOperStatus := device.OperStatus
185
186 // Log previous state
187 logger.Infow(ctx, "previous-device-state", log.Fields{
188 "device-id": device.Id,
189 "previous-operStatus": PrevOperStatus,
190 "Device-connStatus": device.ConnectStatus,
191 })
khenaidoo106c61a2021-08-11 18:05:46 -0400192 cgClient, err := oo.coreClient.GetCoreServiceClient()
Manindere49938d2021-03-19 00:23:24 +0530193 if err != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400194 return nil, err
Manindere49938d2021-03-19 00:23:24 +0530195 }
khenaidoo106c61a2021-08-11 18:05:46 -0400196 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), oo.rpcTimeout)
197 defer cancel()
Nandita Biradar1b590f12024-09-27 10:56:28 +0530198 // Create DeviceStateFilter with new state
199 deviceStateFilter := &ca.DeviceStateFilter{
200 DeviceId: device.Id,
201 OperStatus: voltha.OperStatus_RECONCILING,
202 ConnStatus: device.ConnectStatus,
203 }
204
205 // Log the new state being set
206 logger.Infow(ctx, "setting-new-device-state", log.Fields{
207 "device-id": deviceStateFilter.DeviceId,
208 "new-operStatus": deviceStateFilter.OperStatus,
209 "new-connStatus": deviceStateFilter.ConnStatus,
210 })
khenaidoodc2116e2021-10-19 17:33:19 -0400211 if _, err := cgClient.DeviceStateUpdate(subCtx, &ca.DeviceStateFilter{
khenaidoo106c61a2021-08-11 18:05:46 -0400212 DeviceId: device.Id,
213 OperStatus: voltha.OperStatus_RECONCILING,
Akash Sonif49299a2024-04-25 12:06:37 +0530214 ConnStatus: voltha.ConnectStatus_UNREACHABLE,
khenaidoo106c61a2021-08-11 18:05:46 -0400215 }); err != nil {
216 return nil, olterrors.NewErrAdapter("device-update-failed", log.Fields{"device-id": device.Id}, err)
217 }
218
Akash Sonif49299a2024-04-25 12:06:37 +0530219 // The OperState and connection state of the device is set to RECONCILING and UNREACHABLE in the previous section. This also needs to be set on the
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700220 // locally cached copy of the device struct.
221 device.OperStatus = voltha.OperStatus_RECONCILING
Akash Sonif49299a2024-04-25 12:06:37 +0530222 device.ConnectStatus = voltha.ConnectStatus_UNREACHABLE
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700223 handler := NewDeviceHandler(oo.coreClient, oo.eventProxy, device, oo, oo.configManager, oo.config)
224 handler.adapterPreviouslyConnected = true
Nandita Biradar1b590f12024-09-27 10:56:28 +0530225 handler.prevOperStatus = PrevOperStatus
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700226 oo.addDeviceHandlerToMap(handler)
227 handler.transitionMap = NewTransitionMap(handler)
228
Akash Reddy Kankanala78b627f2026-01-12 08:18:21 +0000229 dhCtx, handler.transitionHandlerCancel = context.WithCancel(log.WithSpanFromContext(context.Background(), ctx))
230 go handler.transitionMap.Handle(dhCtx, DeviceInit)
nikesh.krishnan4d644532023-12-16 00:21:07 +0530231 } else {
232 logger.Warnf(ctx, "device-already-reconciled-or-active", log.Fields{"device-id": device.Id})
bseeniva0b9cbcb2026-02-12 19:11:11 +0530233 return &emptypb.Empty{}, status.Errorf(codes.AlreadyExists, "handler exists: %s", device.Id)
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530234 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530235 return &emptypb.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400236}
237
praneeth nalmas55616d62023-02-06 09:19:18 +0530238// DisableDevice disables the given device
bseeniva0b9cbcb2026-02-12 19:11:11 +0530239func (oo *OpenOLT) DisableDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000240 logger.Infow(ctx, "disable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400241 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400242 if err := handler.DisableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
243 return nil, err
244 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530245 return &emptypb.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400246 }
khenaidoo106c61a2021-08-11 18:05:46 -0400247 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400248}
249
praneeth nalmas55616d62023-02-06 09:19:18 +0530250// ReEnableDevice enables the olt device after disable
bseeniva0b9cbcb2026-02-12 19:11:11 +0530251func (oo *OpenOLT) ReEnableDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000252 logger.Infow(ctx, "reenable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400253 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400254 if err := handler.ReenableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
255 return nil, err
256 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530257 return &emptypb.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400258 }
khenaidoo106c61a2021-08-11 18:05:46 -0400259 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400260}
261
praneeth nalmas55616d62023-02-06 09:19:18 +0530262// RebootDevice reboots the given device
bseeniva0b9cbcb2026-02-12 19:11:11 +0530263func (oo *OpenOLT) RebootDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000264 logger.Infow(ctx, "reboot-device", log.Fields{"device-id": device.Id})
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400265 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400266 if err := handler.RebootDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
267 return nil, err
268 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530269 return &emptypb.Empty{}, nil
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400270 }
khenaidoo106c61a2021-08-11 18:05:46 -0400271 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400272}
273
praneeth nalmas55616d62023-02-06 09:19:18 +0530274// DeleteDevice deletes a device
bseeniva0b9cbcb2026-02-12 19:11:11 +0530275func (oo *OpenOLT) DeleteDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000276 logger.Infow(ctx, "delete-device", log.Fields{"device-id": device.Id})
Devmalya Paul495b94a2019-08-27 19:42:00 -0400277 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400278 if err := handler.DeleteDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
Gustavo Silva41af9122022-10-11 11:05:13 -0300279 return nil, err
Devmalya Paul495b94a2019-08-27 19:42:00 -0400280 }
Akash Soni5c76e272024-01-15 04:09:24 +0530281 // Initialize a ticker with a 2-second interval to periodically check the states
282 ticker := time.NewTicker(2 * time.Second)
283 defer ticker.Stop()
284
285 // Set a maximum timeout duration of 30 seconds for the loop
286 timeout := time.After(30 * time.Second)
287
288 for {
289 select {
290 case <-ticker.C:
291 // Check if all processes have stopped
292 if !handler.isHeartbeatCheckActive && !handler.isCollectorActive && !handler.isReadIndicationRoutineActive {
293 logger.Debugf(ctx, "delete-device-handler")
294 oo.deleteDeviceHandlerToMap(handler)
bseeniva0b9cbcb2026-02-12 19:11:11 +0530295 return &emptypb.Empty{}, nil
Akash Soni5c76e272024-01-15 04:09:24 +0530296 }
297 case <-timeout:
298 // Timeout exceeded
299 logger.Warnw(ctx, "delete-device-handler timeout exceeded", log.Fields{"device-id": device.Id})
300 oo.deleteDeviceHandlerToMap(handler) // Clean up anyway
bseeniva0b9cbcb2026-02-12 19:11:11 +0530301 return &emptypb.Empty{}, nil
Akash Soni5c76e272024-01-15 04:09:24 +0530302 }
303 }
Devmalya Paul495b94a2019-08-27 19:42:00 -0400304 }
khenaidoo106c61a2021-08-11 18:05:46 -0400305 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400306}
307
praneeth nalmas55616d62023-02-06 09:19:18 +0530308// UpdateFlowsIncrementally updates (add/remove) the flows on a given device
bseeniva0b9cbcb2026-02-12 19:11:11 +0530309func (oo *OpenOLT) UpdateFlowsIncrementally(ctx context.Context, incrFlows *ca.IncrementalFlows) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400310 logger.Infow(ctx, "update_flows_incrementally", log.Fields{"device-id": incrFlows.Device.Id, "flows": incrFlows.Flows, "flowMetadata": incrFlows.FlowMetadata})
311 if handler := oo.getDeviceHandler(incrFlows.Device.Id); handler != nil {
312 if err := handler.UpdateFlowsIncrementally(log.WithSpanFromContext(context.Background(), ctx), incrFlows.Device, incrFlows.Flows, incrFlows.Groups, incrFlows.FlowMetadata); err != nil {
313 return nil, err
314 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530315 return &emptypb.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400316 }
khenaidoo106c61a2021-08-11 18:05:46 -0400317 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": incrFlows.Device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400318}
319
praneeth nalmas55616d62023-02-06 09:19:18 +0530320// UpdatePmConfig returns PmConfigs nil or error
bseeniva0b9cbcb2026-02-12 19:11:11 +0530321func (oo *OpenOLT) UpdatePmConfig(ctx context.Context, configs *ca.PmConfigsInfo) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400322 logger.Debugw(ctx, "update_pm_config", log.Fields{"device-id": configs.DeviceId, "pm-configs": configs.PmConfigs})
323 if handler := oo.getDeviceHandler(configs.DeviceId); handler != nil {
324 handler.UpdatePmConfig(log.WithSpanFromContext(context.Background(), ctx), configs.PmConfigs)
bseeniva0b9cbcb2026-02-12 19:11:11 +0530325 return &emptypb.Empty{}, nil
Rohan Agrawalda5e0b22020-05-20 11:10:26 +0000326 }
khenaidoo106c61a2021-08-11 18:05:46 -0400327 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": configs.DeviceId}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400328}
329
praneeth nalmas55616d62023-02-06 09:19:18 +0530330// SendPacketOut sends packet out to the device
bseeniva0b9cbcb2026-02-12 19:11:11 +0530331func (oo *OpenOLT) SendPacketOut(ctx context.Context, packet *ca.PacketOut) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400332 logger.Debugw(ctx, "send_packet_out", log.Fields{"device-id": packet.DeviceId, "egress_port_no": packet.EgressPortNo, "pkt": packet.Packet})
333 if handler := oo.getDeviceHandler(packet.DeviceId); handler != nil {
334 if err := handler.PacketOut(log.WithSpanFromContext(context.Background(), ctx), packet.EgressPortNo, packet.Packet); err != nil {
335 return nil, err
336 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530337 return &emptypb.Empty{}, nil
manikkaraj k9eb6cac2019-05-09 12:32:03 -0400338 }
khenaidoo106c61a2021-08-11 18:05:46 -0400339 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": packet.DeviceId}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400340}
341
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530342// EnableOnuSerialNumber to Enable onu serial number
bseeniva0b9cbcb2026-02-12 19:11:11 +0530343func (oo *OpenOLT) EnableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon) (*emptypb.Empty, error) {
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530344 logger.Infow(ctx, "enable_onu_serial_number", log.Fields{"olt_device_id": device.OltDeviceId, "onu_serial_number": device.SerialNumber})
345 if err := oo.enableDisableOnuSerialNumber(log.WithSpanFromContext(context.Background(), ctx), device, true); err != nil {
346 return nil, err
347 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530348 return &emptypb.Empty{}, nil
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530349}
350
351// DisableOnuSerialNumber to Disable onu serial number
bseeniva0b9cbcb2026-02-12 19:11:11 +0530352func (oo *OpenOLT) DisableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon) (*emptypb.Empty, error) {
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530353 logger.Infow(ctx, "disable_onu_serial_number", log.Fields{"olt_device_id": device.OltDeviceId, "onu_serial_number": device.SerialNumber})
354 if err := oo.enableDisableOnuSerialNumber(log.WithSpanFromContext(context.Background(), ctx), device, false); err != nil {
355 return nil, err
356 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530357 return &emptypb.Empty{}, nil
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530358}
359
360// enableDisableOnuSerialNumber to Disable onu or Enable onu
361func (oo *OpenOLT) enableDisableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon, enable bool) error {
362 if device.OltDeviceId == nil {
363 return olterrors.NewErrInvalidValue(log.Fields{
364 "reason": "olt device id is required",
365 }, nil)
366 }
367 if device.SerialNumber == "" {
368 return olterrors.NewErrInvalidValue(log.Fields{
369 "reason": "onu_serial_number cannot be empty",
370 }, nil)
371 }
372 if device.Port == nil {
373 return olterrors.NewErrInvalidValue(log.Fields{
374 "reason": "pon port cannot be empty",
375 }, nil)
376 }
377 if handler := oo.getDeviceHandler(device.OltDeviceId.Id); handler != nil {
378 if enable {
379 if err := handler.EnableOnuSerialNumber(ctx, device); err != nil {
380 return olterrors.NewErrAdapter("error-occurred-during-enable-onu-serial-number", log.Fields{"device-id": device.OltDeviceId.Id, "sn": device.SerialNumber}, err)
381 }
382 } else {
383 if err := handler.DisableOnuSerialNumber(ctx, device); err != nil {
384 return olterrors.NewErrAdapter("error-occurred-during-disable-onu-serial-number", log.Fields{"device-id": device.OltDeviceId.Id, "sn": device.SerialNumber}, err)
385 }
386 }
387 return nil
388 }
389 return olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.OltDeviceId.Id}, nil)
390}
391
392// EnableOnuDevice to Enable onu
bseeniva0b9cbcb2026-02-12 19:11:11 +0530393func (oo *OpenOLT) EnableOnuDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530394 logger.Infow(ctx, "enable_onu", log.Fields{"onu_device_id": device.Id, "onu_serial_number": device.SerialNumber})
395 if err := oo.enableDisableOnuDevice(log.WithSpanFromContext(context.Background(), ctx), device, true); err != nil {
396 return nil, err
397 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530398 return &emptypb.Empty{}, nil
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530399}
400
401// DisableOnuDevice to Disable onu
bseeniva0b9cbcb2026-02-12 19:11:11 +0530402func (oo *OpenOLT) DisableOnuDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530403 logger.Infow(ctx, "disable_onu", log.Fields{"onu_device_id": device.Id, "onu_serial_number": device.SerialNumber})
404 if err := oo.enableDisableOnuDevice(log.WithSpanFromContext(context.Background(), ctx), device, false); err != nil {
405 return nil, err
406 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530407 return &emptypb.Empty{}, nil
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530408}
409
410// enableDisableOnuDevice to Disable onu or Enable onu
411func (oo *OpenOLT) enableDisableOnuDevice(ctx context.Context, device *voltha.Device, enable bool) error {
412 if device.ParentId == "" {
413 return olterrors.NewErrInvalidValue(log.Fields{
414 "reason": "olt device id is required",
415 }, nil)
416 }
417 if device.SerialNumber == "" {
418 return olterrors.NewErrInvalidValue(log.Fields{
419 "reason": "onu_serial_number cannot be empty",
420 }, nil)
421 }
422 if handler := oo.getDeviceHandler(device.ParentId); handler != nil {
423 if enable {
424 if err := handler.EnableOnu(ctx, device); err != nil {
425 return olterrors.NewErrAdapter("error-occurred-during-enable-onu", log.Fields{"device-id": device.ParentId, "sn": device.SerialNumber}, err)
426 }
427 } else {
428 if err := handler.DisableOnu(ctx, device); err != nil {
429 return olterrors.NewErrAdapter("error-occurred-during-disable-onu", log.Fields{"device-id": device.ParentId, "sn": device.SerialNumber}, err)
430 }
431 }
432 return nil
433 }
434 return olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.ParentId}, nil)
435}
436
khenaidoo106c61a2021-08-11 18:05:46 -0400437// EnablePort to Enable PON/NNI interface
bseeniva0b9cbcb2026-02-12 19:11:11 +0530438func (oo *OpenOLT) EnablePort(ctx context.Context, port *voltha.Port) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400439 logger.Infow(ctx, "enable_port", log.Fields{"device-id": port.DeviceId, "port": port})
440 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, true); err != nil {
441 return nil, err
442 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530443 return &emptypb.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400444}
445
khenaidoo106c61a2021-08-11 18:05:46 -0400446// DisablePort to Disable pon/nni interface
bseeniva0b9cbcb2026-02-12 19:11:11 +0530447func (oo *OpenOLT) DisablePort(ctx context.Context, port *voltha.Port) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400448 logger.Infow(ctx, "disable_port", log.Fields{"device-id": port.DeviceId, "port": port})
449 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, false); err != nil {
450 return nil, err
451 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530452 return &emptypb.Empty{}, nil
kesavand39e0aa32020-01-28 20:58:50 -0500453}
454
455// enableDisablePort to Disable pon or Enable PON interface
Neha Sharma96b7bf22020-06-15 10:37:32 +0000456func (oo *OpenOLT) enableDisablePort(ctx context.Context, deviceID string, port *voltha.Port, enablePort bool) error {
divyadesai3af43e12020-08-18 07:10:54 +0000457 logger.Infow(ctx, "enableDisablePort", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500458 if port == nil {
Thomas Lee S94109f12020-03-03 16:39:29 +0530459 return olterrors.NewErrInvalidValue(log.Fields{
David K. Bainbridge794735f2020-02-11 21:01:37 -0800460 "reason": "port cannot be nil",
461 "device-id": deviceID,
Girish Kumarf26e4882020-03-05 06:49:10 +0000462 "port": nil}, nil)
kesavand39e0aa32020-01-28 20:58:50 -0500463 }
464 if handler := oo.getDeviceHandler(deviceID); handler != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000465 logger.Debugw(ctx, "Enable_Disable_Port", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500466 if enablePort {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000467 if err := handler.EnablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000468 return olterrors.NewErrAdapter("error-occurred-during-enable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500469 }
470 } else {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000471 if err := handler.DisablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000472 return olterrors.NewErrAdapter("error-occurred-during-disable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500473 }
474 }
475 }
476 return nil
477}
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500478
praneeth nalmas55616d62023-02-06 09:19:18 +0530479// ChildDeviceLost deletes the ONU and its references from PONResources
bseeniva0b9cbcb2026-02-12 19:11:11 +0530480func (oo *OpenOLT) ChildDeviceLost(ctx context.Context, childDevice *voltha.Device) (*emptypb.Empty, error) {
Girish Gowdraa0870562021-03-11 14:30:14 -0800481 logger.Infow(ctx, "Child-device-lost", log.Fields{"parent-device-id": childDevice.ParentId, "child-device-id": childDevice.Id})
482 if handler := oo.getDeviceHandler(childDevice.ParentId); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400483 if err := handler.ChildDeviceLost(log.WithSpanFromContext(context.Background(), ctx), childDevice.ParentPortNo, childDevice.ProxyAddress.OnuId, childDevice.SerialNumber); err != nil {
484 return nil, err
485 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530486 return &emptypb.Empty{}, nil
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500487 }
khenaidoo106c61a2021-08-11 18:05:46 -0400488 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"parent-device-id": childDevice.ParentId}, nil).Log()
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500489}
Scott Baker24f83e22020-03-30 16:14:28 -0700490
khenaidoo106c61a2021-08-11 18:05:46 -0400491// GetExtValue retrieves a value on a particular ONU
khenaidoodc2116e2021-10-19 17:33:19 -0400492func (oo *OpenOLT) GetExtValue(ctx context.Context, extInfo *ca.GetExtValueMessage) (*extension.ReturnValues, error) {
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800493 var err error
khenaidoodc2116e2021-10-19 17:33:19 -0400494 resp := new(extension.ReturnValues)
khenaidoo106c61a2021-08-11 18:05:46 -0400495 logger.Infow(ctx, "get_ext_value", log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id})
496 if handler := oo.getDeviceHandler(extInfo.ParentDevice.Id); handler != nil {
497 if resp, err = handler.getExtValue(ctx, extInfo.ChildDevice, extInfo.ValueType); err != nil {
498 logger.Errorw(ctx, "error-occurred-during-get-ext-value",
499 log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id, "error": err})
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800500 return nil, err
501 }
502 }
503 return resp, nil
504}
kesavand62126212021-01-12 04:56:06 -0500505
praneeth nalmas55616d62023-02-06 09:19:18 +0530506// GetSingleValue handles get uni status on ONU and ondemand metric on OLT
khenaidoo106c61a2021-08-11 18:05:46 -0400507func (oo *OpenOLT) GetSingleValue(ctx context.Context, request *extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
508 logger.Infow(ctx, "single_get_value_request", log.Fields{"request": request})
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530509 var handler *DeviceHandler
510 var onuDevice *voltha.Device
kesavand62126212021-01-12 04:56:06 -0500511
512 errResp := func(status extension.GetValueResponse_Status,
513 reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
514 return &extension.SingleGetValueResponse{
515 Response: &extension.GetValueResponse{
516 Status: status,
517 ErrReason: reason,
518 },
519 }
520 }
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530521
522 switch request.GetRequest().GetRequest().(type) {
523 case *extension.GetValueRequest_OnuStatsFromOlt:
524 handler, onuDevice = oo.GetDeviceHandlerFromChild(ctx, request.TargetId)
525 default:
526 handler = oo.getDeviceHandler(request.TargetId)
527 }
528
529 if handler != nil {
kesavand62126212021-01-12 04:56:06 -0500530 switch reqType := request.GetRequest().GetRequest().(type) {
531 case *extension.GetValueRequest_OltPortInfo:
532 return handler.getOltPortCounters(ctx, reqType.OltPortInfo), nil
Himani Chawla2c8ae0f2021-05-18 23:27:00 +0530533 case *extension.GetValueRequest_OnuPonInfo:
534 return handler.getOnuPonCounters(ctx, reqType.OnuPonInfo), nil
Gamze Abaka85e9a142021-05-26 13:41:39 +0000535 case *extension.GetValueRequest_RxPower:
536 return handler.getRxPower(ctx, reqType.RxPower), nil
praneeth nalmas55616d62023-02-06 09:19:18 +0530537 case *extension.GetValueRequest_OltRxPower:
538 return handler.getPONRxPower(ctx, reqType.OltRxPower), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530539 case *extension.GetValueRequest_OffloadedAppsStats:
540 return handler.getOltOffloadStats(ctx, reqType.OffloadedAppsStats), nil
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530541 case *extension.GetValueRequest_OnuStatsFromOlt:
542 return handler.getOnuStatsFromOlt(ctx, reqType.OnuStatsFromOlt, onuDevice), nil
Akash Reddy Kankanalad9ec4822025-06-10 22:59:53 +0530543 case *extension.GetValueRequest_OltPonStats:
544 return handler.getPonPortStats(ctx, reqType.OltPonStats), nil
545 case *extension.GetValueRequest_OltNniStats:
546 return handler.getNniPortStats(ctx, reqType.OltNniStats), nil
kesavand62126212021-01-12 04:56:06 -0500547 default:
548 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
549 }
550 }
551
552 logger.Infow(ctx, "Single_get_value_request failed ", log.Fields{"request": request})
553 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE_ID), nil
554}
khenaidoo106c61a2021-08-11 18:05:46 -0400555
Akash Soni3bcf5e02024-12-03 08:01:48 +0530556// SetSingleValue is implemented
557func (oo *OpenOLT) SetSingleValue(ctx context.Context, request *extension.SingleSetValueRequest) (*extension.SingleSetValueResponse, error) {
558 logger.Infow(ctx, "single_set_value_request", log.Fields{"request": request})
559
560 errResp := func(status extension.SetValueResponse_Status,
561 reason extension.SetValueResponse_ErrorReason) *extension.SingleSetValueResponse {
562 return &extension.SingleSetValueResponse{
563 Response: &extension.SetValueResponse{
564 Status: status,
565 ErrReason: reason,
566 },
567 }
568 }
569 if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
570 switch reqType := request.GetRequest().GetRequest().(type) {
571 case *extension.SetValueRequest_AppOffloadConfig:
Akash Soni3c75ad72024-12-23 12:09:48 +0530572 return handler.setOltOffload(ctx, reqType.AppOffloadConfig), nil
573 case *extension.SetValueRequest_AppOffloadOnuConfig:
574 return handler.setOnuOffload(ctx, reqType.AppOffloadOnuConfig), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530575 default:
576 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_UNSUPPORTED), nil
577 }
578 }
579
580 logger.Infow(ctx, "Single_set_value_request failed ", log.Fields{"request": request})
581 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_INVALID_DEVICE_ID), nil
582}
583
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530584func (oo *OpenOLT) GetDeviceHandlerFromChild(ctx context.Context, deviceId string) (*DeviceHandler, *voltha.Device) {
585 oo.lockDeviceHandlersMap.Lock()
586 defer oo.lockDeviceHandlersMap.Unlock()
587
588 for parentId, handler := range oo.deviceHandlers {
589 devices, _ := handler.getChildDevicesFromCore(ctx, parentId)
590 if devices != nil {
591 for _, onuDevice := range devices.Items {
592 if onuDevice.Id == deviceId {
593 return handler, onuDevice
594 }
595 }
596 }
597 }
598 return nil, nil
599}
600
khenaidoo106c61a2021-08-11 18:05:46 -0400601/*
602 * OLT Inter-adapter service
603 */
604
kesavandb9f54fd2021-11-25 20:08:04 +0530605// ProxyOmciRequests proxies an onu sw download OMCI request from the child adapter
bseeniva0b9cbcb2026-02-12 19:11:11 +0530606func (oo *OpenOLT) ProxyOmciRequests(ctx context.Context, request *ia.OmciMessages) (*emptypb.Empty, error) {
kesavandb9f54fd2021-11-25 20:08:04 +0530607 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
608 if err := handler.ProxyOmciRequests(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530609 return nil, err
kesavandb9f54fd2021-11-25 20:08:04 +0530610 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530611 return &emptypb.Empty{}, nil
kesavandb9f54fd2021-11-25 20:08:04 +0530612 }
613 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
614}
615
khenaidoo106c61a2021-08-11 18:05:46 -0400616// ProxyOmciRequest proxies an OMCI request from the child adapter
bseeniva0b9cbcb2026-02-12 19:11:11 +0530617func (oo *OpenOLT) ProxyOmciRequest(ctx context.Context, request *ia.OmciMessage) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400618 logger.Debugw(ctx, "proxy-omci-request", log.Fields{"request": request})
619
620 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
621 if err := handler.ProxyOmciMessage(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530622 return nil, err
khenaidoo106c61a2021-08-11 18:05:46 -0400623 }
bseeniva0b9cbcb2026-02-12 19:11:11 +0530624 return &emptypb.Empty{}, nil
khenaidoo106c61a2021-08-11 18:05:46 -0400625 }
626 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
627}
628
629// GetTechProfileInstance returns an instance of a tech profile
khenaidoodc2116e2021-10-19 17:33:19 -0400630func (oo *OpenOLT) GetTechProfileInstance(ctx context.Context, request *ia.TechProfileInstanceRequestMessage) (*ia.TechProfileDownloadMessage, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400631 logger.Debugw(ctx, "getting-tech-profile-request", log.Fields{"request": request})
632
633 targetDeviceID := request.ParentDeviceId
634 if targetDeviceID == "" {
635 return nil, olterrors.NewErrNotFound("parent-id-empty", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
636 }
637 if handler := oo.getDeviceHandler(targetDeviceID); handler != nil {
638 return handler.GetTechProfileDownloadMessage(ctx, request)
639 }
640 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
khenaidoo106c61a2021-08-11 18:05:46 -0400641}
642
khenaidooefff76e2021-12-15 16:51:30 -0500643// GetHealthStatus is used by a OltAdapterService client to detect a connection
644// lost with the gRPC server hosting the OltAdapterService service
645func (oo *OpenOLT) GetHealthStatus(stream adapter_service.AdapterService_GetHealthStatusServer) error {
646 ctx := context.Background()
647 logger.Debugw(ctx, "receive-stream-connection", log.Fields{"stream": stream})
648
649 if stream == nil {
650 return fmt.Errorf("conn-is-nil %v", stream)
651 }
652 initialRequestTime := time.Now()
653 var remoteClient *common.Connection
654 var tempClient *common.Connection
655 var err error
656loop:
657 for {
658 tempClient, err = stream.Recv()
659 if err != nil {
660 logger.Warnw(ctx, "received-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
661 break loop
662 }
663 // Send a response back
664 err = stream.Send(&health.HealthStatus{State: health.HealthStatus_HEALTHY})
665 if err != nil {
666 logger.Warnw(ctx, "sending-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
667 break loop
668 }
669
670 remoteClient = tempClient
671 logger.Debugw(ctx, "received-keep-alive", log.Fields{"remote-client": remoteClient})
672
673 select {
674 case <-stream.Context().Done():
675 logger.Infow(ctx, "stream-keep-alive-context-done", log.Fields{"remote-client": remoteClient, "error": stream.Context().Err()})
676 break loop
677 case <-oo.exitChannel:
678 logger.Warnw(ctx, "received-stop", log.Fields{"remote-client": remoteClient, "initial-conn-time": initialRequestTime})
679 break loop
680 default:
681 }
682 }
683 logger.Errorw(ctx, "connection-down", log.Fields{"remote-client": remoteClient, "error": err, "initial-conn-time": initialRequestTime})
684 return err
685}
686
Akash Reddy Kankanala78b627f2026-01-12 08:18:21 +0000687// UpdateDevice updates the address of the OLT for now
bseeniva0b9cbcb2026-02-12 19:11:11 +0530688func (oo *OpenOLT) UpdateDevice(ctx context.Context, updateDeviceReq *voltha.UpdateDevice) (*emptypb.Empty, error) {
Akash Reddy Kankanala78b627f2026-01-12 08:18:21 +0000689 logger.Infow(ctx, "update-device", log.Fields{"device": updateDeviceReq})
690 if updateDeviceReq == nil {
691 return nil, fmt.Errorf("nil-device-config")
692 }
693 if updateDeviceReq.Address == nil {
694 return nil, fmt.Errorf("device-address-not-found")
695 }
696 if handler := oo.getDeviceHandler(updateDeviceReq.Id); handler != nil {
697 go handler.UpdateDevice(context.Background(), updateDeviceReq)
bseeniva0b9cbcb2026-02-12 19:11:11 +0530698 return &emptypb.Empty{}, nil
Akash Reddy Kankanala78b627f2026-01-12 08:18:21 +0000699 }
700
701 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": updateDeviceReq.Id}, nil).Log()
702}
703
khenaidoo106c61a2021-08-11 18:05:46 -0400704/*
705 *
706 * Unimplemented APIs
707 *
708 */
709
praneeth nalmas55616d62023-02-06 09:19:18 +0530710// SimulateAlarm is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400711func (oo *OpenOLT) SimulateAlarm(context.Context, *ca.SimulateAlarmMessage) (*voltha.OperationResp, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400712 return nil, olterrors.ErrNotImplemented
713}
714
praneeth nalmas55616d62023-02-06 09:19:18 +0530715// SetExtValue is unimplemented
bseeniva0b9cbcb2026-02-12 19:11:11 +0530716func (oo *OpenOLT) SetExtValue(context.Context, *ca.SetExtValueMessage) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400717 return nil, olterrors.ErrNotImplemented
718}
719
praneeth nalmas55616d62023-02-06 09:19:18 +0530720// StartOmciTest not implemented
khenaidoodc2116e2021-10-19 17:33:19 -0400721func (oo *OpenOLT) StartOmciTest(ctx context.Context, test *ca.OMCITest) (*omci.TestResponse, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400722 return nil, olterrors.ErrNotImplemented
723}
724
praneeth nalmas55616d62023-02-06 09:19:18 +0530725// SuppressEvent unimplemented
bseeniva0b9cbcb2026-02-12 19:11:11 +0530726func (oo *OpenOLT) SuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400727 return nil, olterrors.ErrNotImplemented
728}
729
praneeth nalmas55616d62023-02-06 09:19:18 +0530730// UnSuppressEvent unimplemented
bseeniva0b9cbcb2026-02-12 19:11:11 +0530731func (oo *OpenOLT) UnSuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400732 return nil, olterrors.ErrNotImplemented
733}
734
praneeth nalmas55616d62023-02-06 09:19:18 +0530735// DownloadImage is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400736func (oo *OpenOLT) DownloadImage(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400737 return nil, olterrors.ErrNotImplemented
738}
739
praneeth nalmas55616d62023-02-06 09:19:18 +0530740// GetImageDownloadStatus is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400741func (oo *OpenOLT) GetImageDownloadStatus(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400742 return nil, olterrors.ErrNotImplemented
743}
744
praneeth nalmas55616d62023-02-06 09:19:18 +0530745// CancelImageDownload is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400746func (oo *OpenOLT) CancelImageDownload(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400747 return nil, olterrors.ErrNotImplemented
748}
749
praneeth nalmas55616d62023-02-06 09:19:18 +0530750// ActivateImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400751func (oo *OpenOLT) ActivateImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400752 return nil, olterrors.ErrNotImplemented
753}
754
praneeth nalmas55616d62023-02-06 09:19:18 +0530755// RevertImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400756func (oo *OpenOLT) RevertImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400757 return nil, olterrors.ErrNotImplemented
758}
759
praneeth nalmas55616d62023-02-06 09:19:18 +0530760// DownloadOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400761func (oo *OpenOLT) DownloadOnuImage(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
762 return nil, olterrors.ErrNotImplemented
763}
764
praneeth nalmas55616d62023-02-06 09:19:18 +0530765// GetOnuImageStatus unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400766func (oo *OpenOLT) GetOnuImageStatus(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
767 return nil, olterrors.ErrNotImplemented
768}
769
praneeth nalmas55616d62023-02-06 09:19:18 +0530770// AbortOnuImageUpgrade unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400771func (oo *OpenOLT) AbortOnuImageUpgrade(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
772 return nil, olterrors.ErrNotImplemented
773}
774
praneeth nalmas55616d62023-02-06 09:19:18 +0530775// GetOnuImages unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400776func (oo *OpenOLT) GetOnuImages(ctx context.Context, deviceID *common.ID) (*voltha.OnuImages, error) {
777 return nil, olterrors.ErrNotImplemented
778}
779
praneeth nalmas55616d62023-02-06 09:19:18 +0530780// ActivateOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400781func (oo *OpenOLT) ActivateOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
782 return nil, olterrors.ErrNotImplemented
783}
784
praneeth nalmas55616d62023-02-06 09:19:18 +0530785// CommitOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400786func (oo *OpenOLT) CommitOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
787 return nil, olterrors.ErrNotImplemented
788}
789
790// UpdateFlowsBulk is unimplemented
bseeniva0b9cbcb2026-02-12 19:11:11 +0530791func (oo *OpenOLT) UpdateFlowsBulk(ctx context.Context, flows *ca.BulkFlows) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400792 return nil, olterrors.ErrNotImplemented
793}
794
praneeth nalmas55616d62023-02-06 09:19:18 +0530795// SelfTestDevice unimplemented
bseeniva0b9cbcb2026-02-12 19:11:11 +0530796func (oo *OpenOLT) SelfTestDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400797 return nil, olterrors.ErrNotImplemented
798}