blob: ddd331f5fde3fcfbcb867d9020e1bf8f13c57844 [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 "github.com/golang/protobuf/ptypes/empty"
27 conf "github.com/opencord/voltha-lib-go/v7/pkg/config"
28 "github.com/opencord/voltha-lib-go/v7/pkg/events/eventif"
29 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
30 "github.com/opencord/voltha-lib-go/v7/pkg/log"
Scott Bakerdbd960e2020-02-28 08:57:51 -080031 "github.com/opencord/voltha-openolt-adapter/internal/pkg/config"
Thomas Lee S94109f12020-03-03 16:39:29 +053032 "github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
khenaidooefff76e2021-12-15 16:51:30 -050033 "github.com/opencord/voltha-protos/v5/go/adapter_service"
khenaidoo106c61a2021-08-11 18:05:46 -040034 "github.com/opencord/voltha-protos/v5/go/common"
khenaidoodc2116e2021-10-19 17:33:19 -040035 ca "github.com/opencord/voltha-protos/v5/go/core_adapter"
khenaidoo106c61a2021-08-11 18:05:46 -040036 "github.com/opencord/voltha-protos/v5/go/extension"
khenaidoodc2116e2021-10-19 17:33:19 -040037 "github.com/opencord/voltha-protos/v5/go/health"
38 ia "github.com/opencord/voltha-protos/v5/go/inter_adapter"
39 "github.com/opencord/voltha-protos/v5/go/omci"
khenaidoo106c61a2021-08-11 18:05:46 -040040 "github.com/opencord/voltha-protos/v5/go/voltha"
nikesh.krishnan4d644532023-12-16 00:21:07 +053041 "google.golang.org/grpc/codes"
42 "google.golang.org/grpc/status"
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 {
Akash Kankanala041a2122024-10-16 15:49:22 +053047 eventProxy eventif.EventProxy
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053048 configManager *conf.ConfigManager
49 deviceHandlers map[string]*DeviceHandler
50 coreClient *vgrpc.Client
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053051 config *config.AdapterFlags
Akash Kankanala041a2122024-10-16 15:49:22 +053052 exitChannel chan struct{}
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053053 KVStoreAddress string
54 KVStoreType string
Akash Kankanala041a2122024-10-16 15:49:22 +053055 numOnus int
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053056 HeartbeatCheckInterval time.Duration
57 HeartbeatFailReportInterval time.Duration
58 GrpcTimeoutInterval time.Duration
Akash Kankanala041a2122024-10-16 15:49:22 +053059 rpcTimeout time.Duration
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053060 lockDeviceHandlersMap sync.RWMutex
61 enableONUStats bool
62 enableGemStats bool
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053063 CheckOnuDevExistenceAtOnuDiscovery bool
Sridhar Ravindraab785f22025-07-21 17:20:55 +053064 ForceOnuDiscIndProcessing bool
Girish Gowdru0c588b22019-04-23 23:24:56 -040065}
66
praneeth nalmas55616d62023-02-06 09:19:18 +053067// NewOpenOLT returns a new instance of OpenOLT
khenaidoo106c61a2021-08-11 18:05:46 -040068func NewOpenOLT(ctx context.Context,
69 coreClient *vgrpc.Client,
Himani Chawlacd407802020-12-10 12:08:59 +053070 eventProxy eventif.EventProxy, cfg *config.AdapterFlags, cm *conf.ConfigManager) *OpenOLT {
Girish Gowdru0c588b22019-04-23 23:24:56 -040071 var openOLT OpenOLT
khenaidooefff76e2021-12-15 16:51:30 -050072 openOLT.exitChannel = make(chan struct{})
Girish Gowdru0c588b22019-04-23 23:24:56 -040073 openOLT.deviceHandlers = make(map[string]*DeviceHandler)
Abhilash Laxmeshwarf9942e92020-01-07 15:32:44 +053074 openOLT.config = cfg
75 openOLT.numOnus = cfg.OnuNumber
khenaidoo106c61a2021-08-11 18:05:46 -040076 openOLT.coreClient = coreClient
Devmalya Paulfb990a52019-07-09 10:01:49 -040077 openOLT.eventProxy = eventProxy
Neha Sharma3f221ae2020-04-29 19:02:12 +000078 openOLT.KVStoreAddress = cfg.KVStoreAddress
Abhilash Laxmeshwarf9942e92020-01-07 15:32:44 +053079 openOLT.KVStoreType = cfg.KVStoreType
80 openOLT.HeartbeatCheckInterval = cfg.HeartbeatCheckInterval
81 openOLT.HeartbeatFailReportInterval = cfg.HeartbeatFailReportInterval
82 openOLT.GrpcTimeoutInterval = cfg.GrpcTimeoutInterval
Girish Gowdru0c588b22019-04-23 23:24:56 -040083 openOLT.lockDeviceHandlersMap = sync.RWMutex{}
Matteo Scandolodfa7a972020-11-06 13:03:40 -080084 openOLT.configManager = cm
Gamze Abakafcbd6e72020-12-17 13:25:16 +000085 openOLT.enableONUStats = cfg.EnableONUStats
86 openOLT.enableGemStats = cfg.EnableGEMStats
khenaidoo106c61a2021-08-11 18:05:46 -040087 openOLT.rpcTimeout = cfg.RPCTimeout
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053088 openOLT.CheckOnuDevExistenceAtOnuDiscovery = cfg.CheckOnuDevExistenceAtOnuDiscovery
Sridhar Ravindraab785f22025-07-21 17:20:55 +053089 openOLT.ForceOnuDiscIndProcessing = cfg.ForceOnuDiscIndProcessing
Girish Gowdru0c588b22019-04-23 23:24:56 -040090 return &openOLT
91}
92
praneeth nalmas55616d62023-02-06 09:19:18 +053093// Start starts (logs) the device manager
Girish Gowdru0c588b22019-04-23 23:24:56 -040094func (oo *OpenOLT) Start(ctx context.Context) error {
Neha Sharma96b7bf22020-06-15 10:37:32 +000095 logger.Info(ctx, "starting-device-manager")
96 logger.Info(ctx, "device-manager-started")
Girish Gowdru0c588b22019-04-23 23:24:56 -040097 return nil
98}
99
praneeth nalmas55616d62023-02-06 09:19:18 +0530100// Stop terminates the session
Girish Gowdru0c588b22019-04-23 23:24:56 -0400101func (oo *OpenOLT) Stop(ctx context.Context) error {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000102 logger.Info(ctx, "stopping-device-manager")
khenaidooefff76e2021-12-15 16:51:30 -0500103 close(oo.exitChannel)
104 // Stop the device handlers
105 oo.stopAllDeviceHandlers(ctx)
106
107 // Stop the core grpc client connection
108 if oo.coreClient != nil {
109 oo.coreClient.Stop(ctx)
110 }
111
Neha Sharma96b7bf22020-06-15 10:37:32 +0000112 logger.Info(ctx, "device-manager-stopped")
Girish Gowdru0c588b22019-04-23 23:24:56 -0400113 return nil
114}
115
Girish Gowdru0c588b22019-04-23 23:24:56 -0400116func (oo *OpenOLT) addDeviceHandlerToMap(agent *DeviceHandler) {
117 oo.lockDeviceHandlersMap.Lock()
118 defer oo.lockDeviceHandlersMap.Unlock()
Thomas Lee S985938d2020-05-04 11:40:41 +0530119 if _, exist := oo.deviceHandlers[agent.device.Id]; !exist {
120 oo.deviceHandlers[agent.device.Id] = agent
Girish Gowdru0c588b22019-04-23 23:24:56 -0400121 }
122}
123
124func (oo *OpenOLT) deleteDeviceHandlerToMap(agent *DeviceHandler) {
125 oo.lockDeviceHandlersMap.Lock()
126 defer oo.lockDeviceHandlersMap.Unlock()
Thomas Lee S985938d2020-05-04 11:40:41 +0530127 delete(oo.deviceHandlers, agent.device.Id)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400128}
129
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700130func (oo *OpenOLT) getDeviceHandler(deviceID string) *DeviceHandler {
Girish Gowdru0c588b22019-04-23 23:24:56 -0400131 oo.lockDeviceHandlersMap.Lock()
132 defer oo.lockDeviceHandlersMap.Unlock()
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700133 if agent, ok := oo.deviceHandlers[deviceID]; ok {
Girish Gowdru0c588b22019-04-23 23:24:56 -0400134 return agent
135 }
136 return nil
137}
138
khenaidooefff76e2021-12-15 16:51:30 -0500139func (oo *OpenOLT) stopAllDeviceHandlers(ctx context.Context) {
140 oo.lockDeviceHandlersMap.Lock()
141 defer oo.lockDeviceHandlersMap.Unlock()
142 for _, handler := range oo.deviceHandlers {
143 handler.Stop(ctx)
144 }
khenaidoo106c61a2021-08-11 18:05:46 -0400145}
146
147// AdoptDevice creates a new device handler if not present already and then adopts the device
148func (oo *OpenOLT) AdoptDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
Girish Gowdru0c588b22019-04-23 23:24:56 -0400149 if device == nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400150 return nil, olterrors.NewErrInvalidValue(log.Fields{"device": nil}, nil).Log()
Girish Gowdru0c588b22019-04-23 23:24:56 -0400151 }
divyadesai3af43e12020-08-18 07:10:54 +0000152 logger.Infow(ctx, "adopt-device", log.Fields{"device-id": device.Id})
Girish Gowdru0c588b22019-04-23 23:24:56 -0400153 var handler *DeviceHandler
154 if handler = oo.getDeviceHandler(device.Id); handler == nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400155 handler := NewDeviceHandler(oo.coreClient, oo.eventProxy, device, oo, oo.configManager, oo.config)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400156 oo.addDeviceHandlerToMap(handler)
khenaidoo106c61a2021-08-11 18:05:46 -0400157 go handler.AdoptDevice(log.WithSpanFromContext(context.Background(), ctx), device)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400158 }
khenaidoo106c61a2021-08-11 18:05:46 -0400159 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400160}
161
praneeth nalmas55616d62023-02-06 09:19:18 +0530162// GetOfpDeviceInfo returns OFP information for the given device
khenaidoodc2116e2021-10-19 17:33:19 -0400163func (oo *OpenOLT) GetOfpDeviceInfo(ctx context.Context, device *voltha.Device) (*ca.SwitchCapability, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400164 logger.Infow(ctx, "get_ofp_device_info", log.Fields{"device-id": device.Id})
Girish Gowdru0c588b22019-04-23 23:24:56 -0400165 if handler := oo.getDeviceHandler(device.Id); handler != nil {
166 return handler.GetOfpDeviceInfo(device)
167 }
Girish Kumarf26e4882020-03-05 06:49:10 +0000168 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400169}
170
praneeth nalmas55616d62023-02-06 09:19:18 +0530171// ReconcileDevice unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400172func (oo *OpenOLT) ReconcileDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530173 if device == nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400174 return nil, olterrors.NewErrInvalidValue(log.Fields{"device": nil}, nil)
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530175 }
divyadesai3af43e12020-08-18 07:10:54 +0000176 logger.Infow(ctx, "reconcile-device", log.Fields{"device-id": device.Id})
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530177 var handler *DeviceHandler
Akash Reddy Kankanala78b627f2026-01-12 08:18:21 +0000178 var dhCtx context.Context
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530179 if handler = oo.getDeviceHandler(device.Id); handler == nil {
Manindere49938d2021-03-19 00:23:24 +0530180 //Setting state to RECONCILING
Nandita Biradar1b590f12024-09-27 10:56:28 +0530181 // Fetch previous state
182 //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.
183 PrevOperStatus := device.OperStatus
184
185 // Log previous state
186 logger.Infow(ctx, "previous-device-state", log.Fields{
187 "device-id": device.Id,
188 "previous-operStatus": PrevOperStatus,
189 "Device-connStatus": device.ConnectStatus,
190 })
khenaidoo106c61a2021-08-11 18:05:46 -0400191 cgClient, err := oo.coreClient.GetCoreServiceClient()
Manindere49938d2021-03-19 00:23:24 +0530192 if err != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400193 return nil, err
Manindere49938d2021-03-19 00:23:24 +0530194 }
khenaidoo106c61a2021-08-11 18:05:46 -0400195 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), oo.rpcTimeout)
196 defer cancel()
Nandita Biradar1b590f12024-09-27 10:56:28 +0530197 // Create DeviceStateFilter with new state
198 deviceStateFilter := &ca.DeviceStateFilter{
199 DeviceId: device.Id,
200 OperStatus: voltha.OperStatus_RECONCILING,
201 ConnStatus: device.ConnectStatus,
202 }
203
204 // Log the new state being set
205 logger.Infow(ctx, "setting-new-device-state", log.Fields{
206 "device-id": deviceStateFilter.DeviceId,
207 "new-operStatus": deviceStateFilter.OperStatus,
208 "new-connStatus": deviceStateFilter.ConnStatus,
209 })
khenaidoodc2116e2021-10-19 17:33:19 -0400210 if _, err := cgClient.DeviceStateUpdate(subCtx, &ca.DeviceStateFilter{
khenaidoo106c61a2021-08-11 18:05:46 -0400211 DeviceId: device.Id,
212 OperStatus: voltha.OperStatus_RECONCILING,
Akash Sonif49299a2024-04-25 12:06:37 +0530213 ConnStatus: voltha.ConnectStatus_UNREACHABLE,
khenaidoo106c61a2021-08-11 18:05:46 -0400214 }); err != nil {
215 return nil, olterrors.NewErrAdapter("device-update-failed", log.Fields{"device-id": device.Id}, err)
216 }
217
Akash Sonif49299a2024-04-25 12:06:37 +0530218 // 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 -0700219 // locally cached copy of the device struct.
220 device.OperStatus = voltha.OperStatus_RECONCILING
Akash Sonif49299a2024-04-25 12:06:37 +0530221 device.ConnectStatus = voltha.ConnectStatus_UNREACHABLE
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700222 handler := NewDeviceHandler(oo.coreClient, oo.eventProxy, device, oo, oo.configManager, oo.config)
223 handler.adapterPreviouslyConnected = true
Nandita Biradar1b590f12024-09-27 10:56:28 +0530224 handler.prevOperStatus = PrevOperStatus
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700225 oo.addDeviceHandlerToMap(handler)
226 handler.transitionMap = NewTransitionMap(handler)
227
Akash Reddy Kankanala78b627f2026-01-12 08:18:21 +0000228 dhCtx, handler.transitionHandlerCancel = context.WithCancel(log.WithSpanFromContext(context.Background(), ctx))
229 go handler.transitionMap.Handle(dhCtx, DeviceInit)
nikesh.krishnan4d644532023-12-16 00:21:07 +0530230 } else {
231 logger.Warnf(ctx, "device-already-reconciled-or-active", log.Fields{"device-id": device.Id})
232 return &empty.Empty{}, status.Errorf(codes.AlreadyExists, "handler exists: %s", device.Id)
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530233 }
khenaidoo106c61a2021-08-11 18:05:46 -0400234 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400235}
236
praneeth nalmas55616d62023-02-06 09:19:18 +0530237// DisableDevice disables the given device
khenaidoo106c61a2021-08-11 18:05:46 -0400238func (oo *OpenOLT) DisableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000239 logger.Infow(ctx, "disable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400240 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400241 if err := handler.DisableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
242 return nil, err
243 }
244 return &empty.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400245 }
khenaidoo106c61a2021-08-11 18:05:46 -0400246 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400247}
248
praneeth nalmas55616d62023-02-06 09:19:18 +0530249// ReEnableDevice enables the olt device after disable
khenaidoo106c61a2021-08-11 18:05:46 -0400250func (oo *OpenOLT) ReEnableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000251 logger.Infow(ctx, "reenable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400252 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400253 if err := handler.ReenableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
254 return nil, err
255 }
256 return &empty.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400257 }
khenaidoo106c61a2021-08-11 18:05:46 -0400258 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400259}
260
praneeth nalmas55616d62023-02-06 09:19:18 +0530261// RebootDevice reboots the given device
khenaidoo106c61a2021-08-11 18:05:46 -0400262func (oo *OpenOLT) RebootDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000263 logger.Infow(ctx, "reboot-device", log.Fields{"device-id": device.Id})
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400264 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400265 if err := handler.RebootDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
266 return nil, err
267 }
268 return &empty.Empty{}, nil
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400269 }
khenaidoo106c61a2021-08-11 18:05:46 -0400270 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400271}
272
praneeth nalmas55616d62023-02-06 09:19:18 +0530273// DeleteDevice deletes a device
khenaidoo106c61a2021-08-11 18:05:46 -0400274func (oo *OpenOLT) DeleteDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000275 logger.Infow(ctx, "delete-device", log.Fields{"device-id": device.Id})
Devmalya Paul495b94a2019-08-27 19:42:00 -0400276 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400277 if err := handler.DeleteDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
Gustavo Silva41af9122022-10-11 11:05:13 -0300278 return nil, err
Devmalya Paul495b94a2019-08-27 19:42:00 -0400279 }
Akash Soni5c76e272024-01-15 04:09:24 +0530280 // Initialize a ticker with a 2-second interval to periodically check the states
281 ticker := time.NewTicker(2 * time.Second)
282 defer ticker.Stop()
283
284 // Set a maximum timeout duration of 30 seconds for the loop
285 timeout := time.After(30 * time.Second)
286
287 for {
288 select {
289 case <-ticker.C:
290 // Check if all processes have stopped
291 if !handler.isHeartbeatCheckActive && !handler.isCollectorActive && !handler.isReadIndicationRoutineActive {
292 logger.Debugf(ctx, "delete-device-handler")
293 oo.deleteDeviceHandlerToMap(handler)
294 return &empty.Empty{}, nil
295 }
296 case <-timeout:
297 // Timeout exceeded
298 logger.Warnw(ctx, "delete-device-handler timeout exceeded", log.Fields{"device-id": device.Id})
299 oo.deleteDeviceHandlerToMap(handler) // Clean up anyway
300 return &empty.Empty{}, nil
301 }
302 }
Devmalya Paul495b94a2019-08-27 19:42:00 -0400303 }
khenaidoo106c61a2021-08-11 18:05:46 -0400304 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400305}
306
praneeth nalmas55616d62023-02-06 09:19:18 +0530307// UpdateFlowsIncrementally updates (add/remove) the flows on a given device
khenaidoodc2116e2021-10-19 17:33:19 -0400308func (oo *OpenOLT) UpdateFlowsIncrementally(ctx context.Context, incrFlows *ca.IncrementalFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400309 logger.Infow(ctx, "update_flows_incrementally", log.Fields{"device-id": incrFlows.Device.Id, "flows": incrFlows.Flows, "flowMetadata": incrFlows.FlowMetadata})
310 if handler := oo.getDeviceHandler(incrFlows.Device.Id); handler != nil {
311 if err := handler.UpdateFlowsIncrementally(log.WithSpanFromContext(context.Background(), ctx), incrFlows.Device, incrFlows.Flows, incrFlows.Groups, incrFlows.FlowMetadata); err != nil {
312 return nil, err
313 }
314 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400315 }
khenaidoo106c61a2021-08-11 18:05:46 -0400316 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": incrFlows.Device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400317}
318
praneeth nalmas55616d62023-02-06 09:19:18 +0530319// UpdatePmConfig returns PmConfigs nil or error
khenaidoodc2116e2021-10-19 17:33:19 -0400320func (oo *OpenOLT) UpdatePmConfig(ctx context.Context, configs *ca.PmConfigsInfo) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400321 logger.Debugw(ctx, "update_pm_config", log.Fields{"device-id": configs.DeviceId, "pm-configs": configs.PmConfigs})
322 if handler := oo.getDeviceHandler(configs.DeviceId); handler != nil {
323 handler.UpdatePmConfig(log.WithSpanFromContext(context.Background(), ctx), configs.PmConfigs)
324 return &empty.Empty{}, nil
Rohan Agrawalda5e0b22020-05-20 11:10:26 +0000325 }
khenaidoo106c61a2021-08-11 18:05:46 -0400326 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": configs.DeviceId}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400327}
328
praneeth nalmas55616d62023-02-06 09:19:18 +0530329// SendPacketOut sends packet out to the device
khenaidoodc2116e2021-10-19 17:33:19 -0400330func (oo *OpenOLT) SendPacketOut(ctx context.Context, packet *ca.PacketOut) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400331 logger.Debugw(ctx, "send_packet_out", log.Fields{"device-id": packet.DeviceId, "egress_port_no": packet.EgressPortNo, "pkt": packet.Packet})
332 if handler := oo.getDeviceHandler(packet.DeviceId); handler != nil {
333 if err := handler.PacketOut(log.WithSpanFromContext(context.Background(), ctx), packet.EgressPortNo, packet.Packet); err != nil {
334 return nil, err
335 }
336 return &empty.Empty{}, nil
manikkaraj k9eb6cac2019-05-09 12:32:03 -0400337 }
khenaidoo106c61a2021-08-11 18:05:46 -0400338 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": packet.DeviceId}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400339}
340
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530341// EnableOnuSerialNumber to Enable onu serial number
342func (oo *OpenOLT) EnableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon) (*empty.Empty, error) {
343 logger.Infow(ctx, "enable_onu_serial_number", log.Fields{"olt_device_id": device.OltDeviceId, "onu_serial_number": device.SerialNumber})
344 if err := oo.enableDisableOnuSerialNumber(log.WithSpanFromContext(context.Background(), ctx), device, true); err != nil {
345 return nil, err
346 }
347 return &empty.Empty{}, nil
348}
349
350// DisableOnuSerialNumber to Disable onu serial number
351func (oo *OpenOLT) DisableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon) (*empty.Empty, error) {
352 logger.Infow(ctx, "disable_onu_serial_number", log.Fields{"olt_device_id": device.OltDeviceId, "onu_serial_number": device.SerialNumber})
353 if err := oo.enableDisableOnuSerialNumber(log.WithSpanFromContext(context.Background(), ctx), device, false); err != nil {
354 return nil, err
355 }
356 return &empty.Empty{}, nil
357}
358
359// enableDisableOnuSerialNumber to Disable onu or Enable onu
360func (oo *OpenOLT) enableDisableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon, enable bool) error {
361 if device.OltDeviceId == nil {
362 return olterrors.NewErrInvalidValue(log.Fields{
363 "reason": "olt device id is required",
364 }, nil)
365 }
366 if device.SerialNumber == "" {
367 return olterrors.NewErrInvalidValue(log.Fields{
368 "reason": "onu_serial_number cannot be empty",
369 }, nil)
370 }
371 if device.Port == nil {
372 return olterrors.NewErrInvalidValue(log.Fields{
373 "reason": "pon port cannot be empty",
374 }, nil)
375 }
376 if handler := oo.getDeviceHandler(device.OltDeviceId.Id); handler != nil {
377 if enable {
378 if err := handler.EnableOnuSerialNumber(ctx, device); err != nil {
379 return olterrors.NewErrAdapter("error-occurred-during-enable-onu-serial-number", log.Fields{"device-id": device.OltDeviceId.Id, "sn": device.SerialNumber}, err)
380 }
381 } else {
382 if err := handler.DisableOnuSerialNumber(ctx, device); err != nil {
383 return olterrors.NewErrAdapter("error-occurred-during-disable-onu-serial-number", log.Fields{"device-id": device.OltDeviceId.Id, "sn": device.SerialNumber}, err)
384 }
385 }
386 return nil
387 }
388 return olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.OltDeviceId.Id}, nil)
389}
390
391// EnableOnuDevice to Enable onu
392func (oo *OpenOLT) EnableOnuDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
393 logger.Infow(ctx, "enable_onu", log.Fields{"onu_device_id": device.Id, "onu_serial_number": device.SerialNumber})
394 if err := oo.enableDisableOnuDevice(log.WithSpanFromContext(context.Background(), ctx), device, true); err != nil {
395 return nil, err
396 }
397 return &empty.Empty{}, nil
398}
399
400// DisableOnuDevice to Disable onu
401func (oo *OpenOLT) DisableOnuDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
402 logger.Infow(ctx, "disable_onu", log.Fields{"onu_device_id": device.Id, "onu_serial_number": device.SerialNumber})
403 if err := oo.enableDisableOnuDevice(log.WithSpanFromContext(context.Background(), ctx), device, false); err != nil {
404 return nil, err
405 }
406 return &empty.Empty{}, nil
407}
408
409// enableDisableOnuDevice to Disable onu or Enable onu
410func (oo *OpenOLT) enableDisableOnuDevice(ctx context.Context, device *voltha.Device, enable bool) error {
411 if device.ParentId == "" {
412 return olterrors.NewErrInvalidValue(log.Fields{
413 "reason": "olt device id is required",
414 }, nil)
415 }
416 if device.SerialNumber == "" {
417 return olterrors.NewErrInvalidValue(log.Fields{
418 "reason": "onu_serial_number cannot be empty",
419 }, nil)
420 }
421 if handler := oo.getDeviceHandler(device.ParentId); handler != nil {
422 if enable {
423 if err := handler.EnableOnu(ctx, device); err != nil {
424 return olterrors.NewErrAdapter("error-occurred-during-enable-onu", log.Fields{"device-id": device.ParentId, "sn": device.SerialNumber}, err)
425 }
426 } else {
427 if err := handler.DisableOnu(ctx, device); err != nil {
428 return olterrors.NewErrAdapter("error-occurred-during-disable-onu", log.Fields{"device-id": device.ParentId, "sn": device.SerialNumber}, err)
429 }
430 }
431 return nil
432 }
433 return olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.ParentId}, nil)
434}
435
khenaidoo106c61a2021-08-11 18:05:46 -0400436// EnablePort to Enable PON/NNI interface
437func (oo *OpenOLT) EnablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
438 logger.Infow(ctx, "enable_port", log.Fields{"device-id": port.DeviceId, "port": port})
439 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, true); err != nil {
440 return nil, err
441 }
442 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400443}
444
khenaidoo106c61a2021-08-11 18:05:46 -0400445// DisablePort to Disable pon/nni interface
446func (oo *OpenOLT) DisablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
447 logger.Infow(ctx, "disable_port", log.Fields{"device-id": port.DeviceId, "port": port})
448 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, false); err != nil {
449 return nil, err
450 }
451 return &empty.Empty{}, nil
kesavand39e0aa32020-01-28 20:58:50 -0500452}
453
454// enableDisablePort to Disable pon or Enable PON interface
Neha Sharma96b7bf22020-06-15 10:37:32 +0000455func (oo *OpenOLT) enableDisablePort(ctx context.Context, deviceID string, port *voltha.Port, enablePort bool) error {
divyadesai3af43e12020-08-18 07:10:54 +0000456 logger.Infow(ctx, "enableDisablePort", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500457 if port == nil {
Thomas Lee S94109f12020-03-03 16:39:29 +0530458 return olterrors.NewErrInvalidValue(log.Fields{
David K. Bainbridge794735f2020-02-11 21:01:37 -0800459 "reason": "port cannot be nil",
460 "device-id": deviceID,
Girish Kumarf26e4882020-03-05 06:49:10 +0000461 "port": nil}, nil)
kesavand39e0aa32020-01-28 20:58:50 -0500462 }
463 if handler := oo.getDeviceHandler(deviceID); handler != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000464 logger.Debugw(ctx, "Enable_Disable_Port", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500465 if enablePort {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000466 if err := handler.EnablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000467 return olterrors.NewErrAdapter("error-occurred-during-enable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500468 }
469 } else {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000470 if err := handler.DisablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000471 return olterrors.NewErrAdapter("error-occurred-during-disable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500472 }
473 }
474 }
475 return nil
476}
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500477
praneeth nalmas55616d62023-02-06 09:19:18 +0530478// ChildDeviceLost deletes the ONU and its references from PONResources
khenaidoo106c61a2021-08-11 18:05:46 -0400479func (oo *OpenOLT) ChildDeviceLost(ctx context.Context, childDevice *voltha.Device) (*empty.Empty, error) {
Girish Gowdraa0870562021-03-11 14:30:14 -0800480 logger.Infow(ctx, "Child-device-lost", log.Fields{"parent-device-id": childDevice.ParentId, "child-device-id": childDevice.Id})
481 if handler := oo.getDeviceHandler(childDevice.ParentId); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400482 if err := handler.ChildDeviceLost(log.WithSpanFromContext(context.Background(), ctx), childDevice.ParentPortNo, childDevice.ProxyAddress.OnuId, childDevice.SerialNumber); err != nil {
483 return nil, err
484 }
485 return &empty.Empty{}, nil
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500486 }
khenaidoo106c61a2021-08-11 18:05:46 -0400487 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"parent-device-id": childDevice.ParentId}, nil).Log()
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500488}
Scott Baker24f83e22020-03-30 16:14:28 -0700489
khenaidoo106c61a2021-08-11 18:05:46 -0400490// GetExtValue retrieves a value on a particular ONU
khenaidoodc2116e2021-10-19 17:33:19 -0400491func (oo *OpenOLT) GetExtValue(ctx context.Context, extInfo *ca.GetExtValueMessage) (*extension.ReturnValues, error) {
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800492 var err error
khenaidoodc2116e2021-10-19 17:33:19 -0400493 resp := new(extension.ReturnValues)
khenaidoo106c61a2021-08-11 18:05:46 -0400494 logger.Infow(ctx, "get_ext_value", log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id})
495 if handler := oo.getDeviceHandler(extInfo.ParentDevice.Id); handler != nil {
496 if resp, err = handler.getExtValue(ctx, extInfo.ChildDevice, extInfo.ValueType); err != nil {
497 logger.Errorw(ctx, "error-occurred-during-get-ext-value",
498 log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id, "error": err})
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800499 return nil, err
500 }
501 }
502 return resp, nil
503}
kesavand62126212021-01-12 04:56:06 -0500504
praneeth nalmas55616d62023-02-06 09:19:18 +0530505// GetSingleValue handles get uni status on ONU and ondemand metric on OLT
khenaidoo106c61a2021-08-11 18:05:46 -0400506func (oo *OpenOLT) GetSingleValue(ctx context.Context, request *extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
507 logger.Infow(ctx, "single_get_value_request", log.Fields{"request": request})
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530508 var handler *DeviceHandler
509 var onuDevice *voltha.Device
kesavand62126212021-01-12 04:56:06 -0500510
511 errResp := func(status extension.GetValueResponse_Status,
512 reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
513 return &extension.SingleGetValueResponse{
514 Response: &extension.GetValueResponse{
515 Status: status,
516 ErrReason: reason,
517 },
518 }
519 }
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530520
521 switch request.GetRequest().GetRequest().(type) {
522 case *extension.GetValueRequest_OnuStatsFromOlt:
523 handler, onuDevice = oo.GetDeviceHandlerFromChild(ctx, request.TargetId)
524 default:
525 handler = oo.getDeviceHandler(request.TargetId)
526 }
527
528 if handler != nil {
kesavand62126212021-01-12 04:56:06 -0500529 switch reqType := request.GetRequest().GetRequest().(type) {
530 case *extension.GetValueRequest_OltPortInfo:
531 return handler.getOltPortCounters(ctx, reqType.OltPortInfo), nil
Himani Chawla2c8ae0f2021-05-18 23:27:00 +0530532 case *extension.GetValueRequest_OnuPonInfo:
533 return handler.getOnuPonCounters(ctx, reqType.OnuPonInfo), nil
Gamze Abaka85e9a142021-05-26 13:41:39 +0000534 case *extension.GetValueRequest_RxPower:
535 return handler.getRxPower(ctx, reqType.RxPower), nil
praneeth nalmas55616d62023-02-06 09:19:18 +0530536 case *extension.GetValueRequest_OltRxPower:
537 return handler.getPONRxPower(ctx, reqType.OltRxPower), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530538 case *extension.GetValueRequest_OffloadedAppsStats:
539 return handler.getOltOffloadStats(ctx, reqType.OffloadedAppsStats), nil
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530540 case *extension.GetValueRequest_OnuStatsFromOlt:
541 return handler.getOnuStatsFromOlt(ctx, reqType.OnuStatsFromOlt, onuDevice), nil
Akash Reddy Kankanalad9ec4822025-06-10 22:59:53 +0530542 case *extension.GetValueRequest_OltPonStats:
543 return handler.getPonPortStats(ctx, reqType.OltPonStats), nil
544 case *extension.GetValueRequest_OltNniStats:
545 return handler.getNniPortStats(ctx, reqType.OltNniStats), nil
kesavand62126212021-01-12 04:56:06 -0500546 default:
547 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
548 }
549 }
550
551 logger.Infow(ctx, "Single_get_value_request failed ", log.Fields{"request": request})
552 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE_ID), nil
553}
khenaidoo106c61a2021-08-11 18:05:46 -0400554
Akash Soni3bcf5e02024-12-03 08:01:48 +0530555// SetSingleValue is implemented
556func (oo *OpenOLT) SetSingleValue(ctx context.Context, request *extension.SingleSetValueRequest) (*extension.SingleSetValueResponse, error) {
557 logger.Infow(ctx, "single_set_value_request", log.Fields{"request": request})
558
559 errResp := func(status extension.SetValueResponse_Status,
560 reason extension.SetValueResponse_ErrorReason) *extension.SingleSetValueResponse {
561 return &extension.SingleSetValueResponse{
562 Response: &extension.SetValueResponse{
563 Status: status,
564 ErrReason: reason,
565 },
566 }
567 }
568 if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
569 switch reqType := request.GetRequest().GetRequest().(type) {
570 case *extension.SetValueRequest_AppOffloadConfig:
Akash Soni3c75ad72024-12-23 12:09:48 +0530571 return handler.setOltOffload(ctx, reqType.AppOffloadConfig), nil
572 case *extension.SetValueRequest_AppOffloadOnuConfig:
573 return handler.setOnuOffload(ctx, reqType.AppOffloadOnuConfig), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530574 default:
575 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_UNSUPPORTED), nil
576 }
577 }
578
579 logger.Infow(ctx, "Single_set_value_request failed ", log.Fields{"request": request})
580 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_INVALID_DEVICE_ID), nil
581}
582
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530583func (oo *OpenOLT) GetDeviceHandlerFromChild(ctx context.Context, deviceId string) (*DeviceHandler, *voltha.Device) {
584 oo.lockDeviceHandlersMap.Lock()
585 defer oo.lockDeviceHandlersMap.Unlock()
586
587 for parentId, handler := range oo.deviceHandlers {
588 devices, _ := handler.getChildDevicesFromCore(ctx, parentId)
589 if devices != nil {
590 for _, onuDevice := range devices.Items {
591 if onuDevice.Id == deviceId {
592 return handler, onuDevice
593 }
594 }
595 }
596 }
597 return nil, nil
598}
599
khenaidoo106c61a2021-08-11 18:05:46 -0400600/*
601 * OLT Inter-adapter service
602 */
603
kesavandb9f54fd2021-11-25 20:08:04 +0530604// ProxyOmciRequests proxies an onu sw download OMCI request from the child adapter
605func (oo *OpenOLT) ProxyOmciRequests(ctx context.Context, request *ia.OmciMessages) (*empty.Empty, error) {
606 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
607 if err := handler.ProxyOmciRequests(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530608 return nil, err
kesavandb9f54fd2021-11-25 20:08:04 +0530609 }
610 return &empty.Empty{}, nil
611 }
612 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
613}
614
khenaidoo106c61a2021-08-11 18:05:46 -0400615// ProxyOmciRequest proxies an OMCI request from the child adapter
khenaidoodc2116e2021-10-19 17:33:19 -0400616func (oo *OpenOLT) ProxyOmciRequest(ctx context.Context, request *ia.OmciMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400617 logger.Debugw(ctx, "proxy-omci-request", log.Fields{"request": request})
618
619 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
620 if err := handler.ProxyOmciMessage(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530621 return nil, err
khenaidoo106c61a2021-08-11 18:05:46 -0400622 }
623 return &empty.Empty{}, nil
624 }
625 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
626}
627
628// GetTechProfileInstance returns an instance of a tech profile
khenaidoodc2116e2021-10-19 17:33:19 -0400629func (oo *OpenOLT) GetTechProfileInstance(ctx context.Context, request *ia.TechProfileInstanceRequestMessage) (*ia.TechProfileDownloadMessage, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400630 logger.Debugw(ctx, "getting-tech-profile-request", log.Fields{"request": request})
631
632 targetDeviceID := request.ParentDeviceId
633 if targetDeviceID == "" {
634 return nil, olterrors.NewErrNotFound("parent-id-empty", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
635 }
636 if handler := oo.getDeviceHandler(targetDeviceID); handler != nil {
637 return handler.GetTechProfileDownloadMessage(ctx, request)
638 }
639 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 -0400640}
641
khenaidooefff76e2021-12-15 16:51:30 -0500642// GetHealthStatus is used by a OltAdapterService client to detect a connection
643// lost with the gRPC server hosting the OltAdapterService service
644func (oo *OpenOLT) GetHealthStatus(stream adapter_service.AdapterService_GetHealthStatusServer) error {
645 ctx := context.Background()
646 logger.Debugw(ctx, "receive-stream-connection", log.Fields{"stream": stream})
647
648 if stream == nil {
649 return fmt.Errorf("conn-is-nil %v", stream)
650 }
651 initialRequestTime := time.Now()
652 var remoteClient *common.Connection
653 var tempClient *common.Connection
654 var err error
655loop:
656 for {
657 tempClient, err = stream.Recv()
658 if err != nil {
659 logger.Warnw(ctx, "received-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
660 break loop
661 }
662 // Send a response back
663 err = stream.Send(&health.HealthStatus{State: health.HealthStatus_HEALTHY})
664 if err != nil {
665 logger.Warnw(ctx, "sending-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
666 break loop
667 }
668
669 remoteClient = tempClient
670 logger.Debugw(ctx, "received-keep-alive", log.Fields{"remote-client": remoteClient})
671
672 select {
673 case <-stream.Context().Done():
674 logger.Infow(ctx, "stream-keep-alive-context-done", log.Fields{"remote-client": remoteClient, "error": stream.Context().Err()})
675 break loop
676 case <-oo.exitChannel:
677 logger.Warnw(ctx, "received-stop", log.Fields{"remote-client": remoteClient, "initial-conn-time": initialRequestTime})
678 break loop
679 default:
680 }
681 }
682 logger.Errorw(ctx, "connection-down", log.Fields{"remote-client": remoteClient, "error": err, "initial-conn-time": initialRequestTime})
683 return err
684}
685
Akash Reddy Kankanala78b627f2026-01-12 08:18:21 +0000686// UpdateDevice updates the address of the OLT for now
687func (oo *OpenOLT) UpdateDevice(ctx context.Context, updateDeviceReq *voltha.UpdateDevice) (*empty.Empty, error) {
688 logger.Infow(ctx, "update-device", log.Fields{"device": updateDeviceReq})
689 if updateDeviceReq == nil {
690 return nil, fmt.Errorf("nil-device-config")
691 }
692 if updateDeviceReq.Address == nil {
693 return nil, fmt.Errorf("device-address-not-found")
694 }
695 if handler := oo.getDeviceHandler(updateDeviceReq.Id); handler != nil {
696 go handler.UpdateDevice(context.Background(), updateDeviceReq)
697 return &empty.Empty{}, nil
698 }
699
700 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": updateDeviceReq.Id}, nil).Log()
701}
702
khenaidoo106c61a2021-08-11 18:05:46 -0400703/*
704 *
705 * Unimplemented APIs
706 *
707 */
708
praneeth nalmas55616d62023-02-06 09:19:18 +0530709// SimulateAlarm is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400710func (oo *OpenOLT) SimulateAlarm(context.Context, *ca.SimulateAlarmMessage) (*voltha.OperationResp, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400711 return nil, olterrors.ErrNotImplemented
712}
713
praneeth nalmas55616d62023-02-06 09:19:18 +0530714// SetExtValue is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400715func (oo *OpenOLT) SetExtValue(context.Context, *ca.SetExtValueMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400716 return nil, olterrors.ErrNotImplemented
717}
718
praneeth nalmas55616d62023-02-06 09:19:18 +0530719// StartOmciTest not implemented
khenaidoodc2116e2021-10-19 17:33:19 -0400720func (oo *OpenOLT) StartOmciTest(ctx context.Context, test *ca.OMCITest) (*omci.TestResponse, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400721 return nil, olterrors.ErrNotImplemented
722}
723
praneeth nalmas55616d62023-02-06 09:19:18 +0530724// SuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400725func (oo *OpenOLT) SuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
726 return nil, olterrors.ErrNotImplemented
727}
728
praneeth nalmas55616d62023-02-06 09:19:18 +0530729// UnSuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400730func (oo *OpenOLT) UnSuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
731 return nil, olterrors.ErrNotImplemented
732}
733
praneeth nalmas55616d62023-02-06 09:19:18 +0530734// DownloadImage is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400735func (oo *OpenOLT) DownloadImage(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400736 return nil, olterrors.ErrNotImplemented
737}
738
praneeth nalmas55616d62023-02-06 09:19:18 +0530739// GetImageDownloadStatus is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400740func (oo *OpenOLT) GetImageDownloadStatus(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400741 return nil, olterrors.ErrNotImplemented
742}
743
praneeth nalmas55616d62023-02-06 09:19:18 +0530744// CancelImageDownload is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400745func (oo *OpenOLT) CancelImageDownload(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400746 return nil, olterrors.ErrNotImplemented
747}
748
praneeth nalmas55616d62023-02-06 09:19:18 +0530749// ActivateImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400750func (oo *OpenOLT) ActivateImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400751 return nil, olterrors.ErrNotImplemented
752}
753
praneeth nalmas55616d62023-02-06 09:19:18 +0530754// RevertImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400755func (oo *OpenOLT) RevertImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400756 return nil, olterrors.ErrNotImplemented
757}
758
praneeth nalmas55616d62023-02-06 09:19:18 +0530759// DownloadOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400760func (oo *OpenOLT) DownloadOnuImage(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
761 return nil, olterrors.ErrNotImplemented
762}
763
praneeth nalmas55616d62023-02-06 09:19:18 +0530764// GetOnuImageStatus unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400765func (oo *OpenOLT) GetOnuImageStatus(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
766 return nil, olterrors.ErrNotImplemented
767}
768
praneeth nalmas55616d62023-02-06 09:19:18 +0530769// AbortOnuImageUpgrade unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400770func (oo *OpenOLT) AbortOnuImageUpgrade(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
771 return nil, olterrors.ErrNotImplemented
772}
773
praneeth nalmas55616d62023-02-06 09:19:18 +0530774// GetOnuImages unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400775func (oo *OpenOLT) GetOnuImages(ctx context.Context, deviceID *common.ID) (*voltha.OnuImages, error) {
776 return nil, olterrors.ErrNotImplemented
777}
778
praneeth nalmas55616d62023-02-06 09:19:18 +0530779// ActivateOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400780func (oo *OpenOLT) ActivateOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
781 return nil, olterrors.ErrNotImplemented
782}
783
praneeth nalmas55616d62023-02-06 09:19:18 +0530784// CommitOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400785func (oo *OpenOLT) CommitOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
786 return nil, olterrors.ErrNotImplemented
787}
788
789// UpdateFlowsBulk is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400790func (oo *OpenOLT) UpdateFlowsBulk(ctx context.Context, flows *ca.BulkFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400791 return nil, olterrors.ErrNotImplemented
792}
793
praneeth nalmas55616d62023-02-06 09:19:18 +0530794// SelfTestDevice unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400795func (oo *OpenOLT) SelfTestDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
796 return nil, olterrors.ErrNotImplemented
797}