blob: cc11caab4c75369914694fa5781ddb57be39e2a7 [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
178 if handler = oo.getDeviceHandler(device.Id); handler == nil {
Manindere49938d2021-03-19 00:23:24 +0530179 //Setting state to RECONCILING
Nandita Biradar1b590f12024-09-27 10:56:28 +0530180 // Fetch previous state
181 //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.
182 PrevOperStatus := device.OperStatus
183
184 // Log previous state
185 logger.Infow(ctx, "previous-device-state", log.Fields{
186 "device-id": device.Id,
187 "previous-operStatus": PrevOperStatus,
188 "Device-connStatus": device.ConnectStatus,
189 })
khenaidoo106c61a2021-08-11 18:05:46 -0400190 cgClient, err := oo.coreClient.GetCoreServiceClient()
Manindere49938d2021-03-19 00:23:24 +0530191 if err != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400192 return nil, err
Manindere49938d2021-03-19 00:23:24 +0530193 }
khenaidoo106c61a2021-08-11 18:05:46 -0400194 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), oo.rpcTimeout)
195 defer cancel()
Nandita Biradar1b590f12024-09-27 10:56:28 +0530196 // Create DeviceStateFilter with new state
197 deviceStateFilter := &ca.DeviceStateFilter{
198 DeviceId: device.Id,
199 OperStatus: voltha.OperStatus_RECONCILING,
200 ConnStatus: device.ConnectStatus,
201 }
202
203 // Log the new state being set
204 logger.Infow(ctx, "setting-new-device-state", log.Fields{
205 "device-id": deviceStateFilter.DeviceId,
206 "new-operStatus": deviceStateFilter.OperStatus,
207 "new-connStatus": deviceStateFilter.ConnStatus,
208 })
khenaidoodc2116e2021-10-19 17:33:19 -0400209 if _, err := cgClient.DeviceStateUpdate(subCtx, &ca.DeviceStateFilter{
khenaidoo106c61a2021-08-11 18:05:46 -0400210 DeviceId: device.Id,
211 OperStatus: voltha.OperStatus_RECONCILING,
Akash Sonif49299a2024-04-25 12:06:37 +0530212 ConnStatus: voltha.ConnectStatus_UNREACHABLE,
khenaidoo106c61a2021-08-11 18:05:46 -0400213 }); err != nil {
214 return nil, olterrors.NewErrAdapter("device-update-failed", log.Fields{"device-id": device.Id}, err)
215 }
216
Akash Sonif49299a2024-04-25 12:06:37 +0530217 // 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 -0700218 // locally cached copy of the device struct.
219 device.OperStatus = voltha.OperStatus_RECONCILING
Akash Sonif49299a2024-04-25 12:06:37 +0530220 device.ConnectStatus = voltha.ConnectStatus_UNREACHABLE
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700221 handler := NewDeviceHandler(oo.coreClient, oo.eventProxy, device, oo, oo.configManager, oo.config)
222 handler.adapterPreviouslyConnected = true
Nandita Biradar1b590f12024-09-27 10:56:28 +0530223 handler.prevOperStatus = PrevOperStatus
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700224 oo.addDeviceHandlerToMap(handler)
225 handler.transitionMap = NewTransitionMap(handler)
226
Nandita Biradar1b590f12024-09-27 10:56:28 +0530227 go handler.transitionMap.Handle(log.WithSpanFromContext(context.Background(), ctx), DeviceInit)
nikesh.krishnan4d644532023-12-16 00:21:07 +0530228 } else {
229 logger.Warnf(ctx, "device-already-reconciled-or-active", log.Fields{"device-id": device.Id})
230 return &empty.Empty{}, status.Errorf(codes.AlreadyExists, "handler exists: %s", device.Id)
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530231 }
khenaidoo106c61a2021-08-11 18:05:46 -0400232 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400233}
234
praneeth nalmas55616d62023-02-06 09:19:18 +0530235// DisableDevice disables the given device
khenaidoo106c61a2021-08-11 18:05:46 -0400236func (oo *OpenOLT) DisableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000237 logger.Infow(ctx, "disable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400238 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400239 if err := handler.DisableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
240 return nil, err
241 }
242 return &empty.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400243 }
khenaidoo106c61a2021-08-11 18:05:46 -0400244 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400245}
246
praneeth nalmas55616d62023-02-06 09:19:18 +0530247// ReEnableDevice enables the olt device after disable
khenaidoo106c61a2021-08-11 18:05:46 -0400248func (oo *OpenOLT) ReEnableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000249 logger.Infow(ctx, "reenable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400250 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400251 if err := handler.ReenableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
252 return nil, err
253 }
254 return &empty.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400255 }
khenaidoo106c61a2021-08-11 18:05:46 -0400256 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400257}
258
praneeth nalmas55616d62023-02-06 09:19:18 +0530259// RebootDevice reboots the given device
khenaidoo106c61a2021-08-11 18:05:46 -0400260func (oo *OpenOLT) RebootDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000261 logger.Infow(ctx, "reboot-device", log.Fields{"device-id": device.Id})
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400262 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400263 if err := handler.RebootDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
264 return nil, err
265 }
266 return &empty.Empty{}, nil
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400267 }
khenaidoo106c61a2021-08-11 18:05:46 -0400268 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400269}
270
praneeth nalmas55616d62023-02-06 09:19:18 +0530271// DeleteDevice deletes a device
khenaidoo106c61a2021-08-11 18:05:46 -0400272func (oo *OpenOLT) DeleteDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000273 logger.Infow(ctx, "delete-device", log.Fields{"device-id": device.Id})
Devmalya Paul495b94a2019-08-27 19:42:00 -0400274 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400275 if err := handler.DeleteDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
Gustavo Silva41af9122022-10-11 11:05:13 -0300276 return nil, err
Devmalya Paul495b94a2019-08-27 19:42:00 -0400277 }
Akash Soni5c76e272024-01-15 04:09:24 +0530278 // Initialize a ticker with a 2-second interval to periodically check the states
279 ticker := time.NewTicker(2 * time.Second)
280 defer ticker.Stop()
281
282 // Set a maximum timeout duration of 30 seconds for the loop
283 timeout := time.After(30 * time.Second)
284
285 for {
286 select {
287 case <-ticker.C:
288 // Check if all processes have stopped
289 if !handler.isHeartbeatCheckActive && !handler.isCollectorActive && !handler.isReadIndicationRoutineActive {
290 logger.Debugf(ctx, "delete-device-handler")
291 oo.deleteDeviceHandlerToMap(handler)
292 return &empty.Empty{}, nil
293 }
294 case <-timeout:
295 // Timeout exceeded
296 logger.Warnw(ctx, "delete-device-handler timeout exceeded", log.Fields{"device-id": device.Id})
297 oo.deleteDeviceHandlerToMap(handler) // Clean up anyway
298 return &empty.Empty{}, nil
299 }
300 }
Devmalya Paul495b94a2019-08-27 19:42:00 -0400301 }
khenaidoo106c61a2021-08-11 18:05:46 -0400302 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400303}
304
praneeth nalmas55616d62023-02-06 09:19:18 +0530305// UpdateFlowsIncrementally updates (add/remove) the flows on a given device
khenaidoodc2116e2021-10-19 17:33:19 -0400306func (oo *OpenOLT) UpdateFlowsIncrementally(ctx context.Context, incrFlows *ca.IncrementalFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400307 logger.Infow(ctx, "update_flows_incrementally", log.Fields{"device-id": incrFlows.Device.Id, "flows": incrFlows.Flows, "flowMetadata": incrFlows.FlowMetadata})
308 if handler := oo.getDeviceHandler(incrFlows.Device.Id); handler != nil {
309 if err := handler.UpdateFlowsIncrementally(log.WithSpanFromContext(context.Background(), ctx), incrFlows.Device, incrFlows.Flows, incrFlows.Groups, incrFlows.FlowMetadata); err != nil {
310 return nil, err
311 }
312 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400313 }
khenaidoo106c61a2021-08-11 18:05:46 -0400314 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": incrFlows.Device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400315}
316
praneeth nalmas55616d62023-02-06 09:19:18 +0530317// UpdatePmConfig returns PmConfigs nil or error
khenaidoodc2116e2021-10-19 17:33:19 -0400318func (oo *OpenOLT) UpdatePmConfig(ctx context.Context, configs *ca.PmConfigsInfo) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400319 logger.Debugw(ctx, "update_pm_config", log.Fields{"device-id": configs.DeviceId, "pm-configs": configs.PmConfigs})
320 if handler := oo.getDeviceHandler(configs.DeviceId); handler != nil {
321 handler.UpdatePmConfig(log.WithSpanFromContext(context.Background(), ctx), configs.PmConfigs)
322 return &empty.Empty{}, nil
Rohan Agrawalda5e0b22020-05-20 11:10:26 +0000323 }
khenaidoo106c61a2021-08-11 18:05:46 -0400324 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": configs.DeviceId}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400325}
326
praneeth nalmas55616d62023-02-06 09:19:18 +0530327// SendPacketOut sends packet out to the device
khenaidoodc2116e2021-10-19 17:33:19 -0400328func (oo *OpenOLT) SendPacketOut(ctx context.Context, packet *ca.PacketOut) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400329 logger.Debugw(ctx, "send_packet_out", log.Fields{"device-id": packet.DeviceId, "egress_port_no": packet.EgressPortNo, "pkt": packet.Packet})
330 if handler := oo.getDeviceHandler(packet.DeviceId); handler != nil {
331 if err := handler.PacketOut(log.WithSpanFromContext(context.Background(), ctx), packet.EgressPortNo, packet.Packet); err != nil {
332 return nil, err
333 }
334 return &empty.Empty{}, nil
manikkaraj k9eb6cac2019-05-09 12:32:03 -0400335 }
khenaidoo106c61a2021-08-11 18:05:46 -0400336 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": packet.DeviceId}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400337}
338
balaji.nagarajan68f56e82025-07-04 15:16:01 +0530339// EnableOnuSerialNumber to Enable onu serial number
340func (oo *OpenOLT) EnableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon) (*empty.Empty, error) {
341 logger.Infow(ctx, "enable_onu_serial_number", log.Fields{"olt_device_id": device.OltDeviceId, "onu_serial_number": device.SerialNumber})
342 if err := oo.enableDisableOnuSerialNumber(log.WithSpanFromContext(context.Background(), ctx), device, true); err != nil {
343 return nil, err
344 }
345 return &empty.Empty{}, nil
346}
347
348// DisableOnuSerialNumber to Disable onu serial number
349func (oo *OpenOLT) DisableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon) (*empty.Empty, error) {
350 logger.Infow(ctx, "disable_onu_serial_number", log.Fields{"olt_device_id": device.OltDeviceId, "onu_serial_number": device.SerialNumber})
351 if err := oo.enableDisableOnuSerialNumber(log.WithSpanFromContext(context.Background(), ctx), device, false); err != nil {
352 return nil, err
353 }
354 return &empty.Empty{}, nil
355}
356
357// enableDisableOnuSerialNumber to Disable onu or Enable onu
358func (oo *OpenOLT) enableDisableOnuSerialNumber(ctx context.Context, device *voltha.OnuSerialNumberOnOLTPon, enable bool) error {
359 if device.OltDeviceId == nil {
360 return olterrors.NewErrInvalidValue(log.Fields{
361 "reason": "olt device id is required",
362 }, nil)
363 }
364 if device.SerialNumber == "" {
365 return olterrors.NewErrInvalidValue(log.Fields{
366 "reason": "onu_serial_number cannot be empty",
367 }, nil)
368 }
369 if device.Port == nil {
370 return olterrors.NewErrInvalidValue(log.Fields{
371 "reason": "pon port cannot be empty",
372 }, nil)
373 }
374 if handler := oo.getDeviceHandler(device.OltDeviceId.Id); handler != nil {
375 if enable {
376 if err := handler.EnableOnuSerialNumber(ctx, device); err != nil {
377 return olterrors.NewErrAdapter("error-occurred-during-enable-onu-serial-number", log.Fields{"device-id": device.OltDeviceId.Id, "sn": device.SerialNumber}, err)
378 }
379 } else {
380 if err := handler.DisableOnuSerialNumber(ctx, device); err != nil {
381 return olterrors.NewErrAdapter("error-occurred-during-disable-onu-serial-number", log.Fields{"device-id": device.OltDeviceId.Id, "sn": device.SerialNumber}, err)
382 }
383 }
384 return nil
385 }
386 return olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.OltDeviceId.Id}, nil)
387}
388
389// EnableOnuDevice to Enable onu
390func (oo *OpenOLT) EnableOnuDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
391 logger.Infow(ctx, "enable_onu", log.Fields{"onu_device_id": device.Id, "onu_serial_number": device.SerialNumber})
392 if err := oo.enableDisableOnuDevice(log.WithSpanFromContext(context.Background(), ctx), device, true); err != nil {
393 return nil, err
394 }
395 return &empty.Empty{}, nil
396}
397
398// DisableOnuDevice to Disable onu
399func (oo *OpenOLT) DisableOnuDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
400 logger.Infow(ctx, "disable_onu", log.Fields{"onu_device_id": device.Id, "onu_serial_number": device.SerialNumber})
401 if err := oo.enableDisableOnuDevice(log.WithSpanFromContext(context.Background(), ctx), device, false); err != nil {
402 return nil, err
403 }
404 return &empty.Empty{}, nil
405}
406
407// enableDisableOnuDevice to Disable onu or Enable onu
408func (oo *OpenOLT) enableDisableOnuDevice(ctx context.Context, device *voltha.Device, enable bool) error {
409 if device.ParentId == "" {
410 return olterrors.NewErrInvalidValue(log.Fields{
411 "reason": "olt device id is required",
412 }, nil)
413 }
414 if device.SerialNumber == "" {
415 return olterrors.NewErrInvalidValue(log.Fields{
416 "reason": "onu_serial_number cannot be empty",
417 }, nil)
418 }
419 if handler := oo.getDeviceHandler(device.ParentId); handler != nil {
420 if enable {
421 if err := handler.EnableOnu(ctx, device); err != nil {
422 return olterrors.NewErrAdapter("error-occurred-during-enable-onu", log.Fields{"device-id": device.ParentId, "sn": device.SerialNumber}, err)
423 }
424 } else {
425 if err := handler.DisableOnu(ctx, device); err != nil {
426 return olterrors.NewErrAdapter("error-occurred-during-disable-onu", log.Fields{"device-id": device.ParentId, "sn": device.SerialNumber}, err)
427 }
428 }
429 return nil
430 }
431 return olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.ParentId}, nil)
432}
433
khenaidoo106c61a2021-08-11 18:05:46 -0400434// EnablePort to Enable PON/NNI interface
435func (oo *OpenOLT) EnablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
436 logger.Infow(ctx, "enable_port", log.Fields{"device-id": port.DeviceId, "port": port})
437 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, true); err != nil {
438 return nil, err
439 }
440 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400441}
442
khenaidoo106c61a2021-08-11 18:05:46 -0400443// DisablePort to Disable pon/nni interface
444func (oo *OpenOLT) DisablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
445 logger.Infow(ctx, "disable_port", log.Fields{"device-id": port.DeviceId, "port": port})
446 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, false); err != nil {
447 return nil, err
448 }
449 return &empty.Empty{}, nil
kesavand39e0aa32020-01-28 20:58:50 -0500450}
451
452// enableDisablePort to Disable pon or Enable PON interface
Neha Sharma96b7bf22020-06-15 10:37:32 +0000453func (oo *OpenOLT) enableDisablePort(ctx context.Context, deviceID string, port *voltha.Port, enablePort bool) error {
divyadesai3af43e12020-08-18 07:10:54 +0000454 logger.Infow(ctx, "enableDisablePort", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500455 if port == nil {
Thomas Lee S94109f12020-03-03 16:39:29 +0530456 return olterrors.NewErrInvalidValue(log.Fields{
David K. Bainbridge794735f2020-02-11 21:01:37 -0800457 "reason": "port cannot be nil",
458 "device-id": deviceID,
Girish Kumarf26e4882020-03-05 06:49:10 +0000459 "port": nil}, nil)
kesavand39e0aa32020-01-28 20:58:50 -0500460 }
461 if handler := oo.getDeviceHandler(deviceID); handler != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000462 logger.Debugw(ctx, "Enable_Disable_Port", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500463 if enablePort {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000464 if err := handler.EnablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000465 return olterrors.NewErrAdapter("error-occurred-during-enable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500466 }
467 } else {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000468 if err := handler.DisablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000469 return olterrors.NewErrAdapter("error-occurred-during-disable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500470 }
471 }
472 }
473 return nil
474}
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500475
praneeth nalmas55616d62023-02-06 09:19:18 +0530476// ChildDeviceLost deletes the ONU and its references from PONResources
khenaidoo106c61a2021-08-11 18:05:46 -0400477func (oo *OpenOLT) ChildDeviceLost(ctx context.Context, childDevice *voltha.Device) (*empty.Empty, error) {
Girish Gowdraa0870562021-03-11 14:30:14 -0800478 logger.Infow(ctx, "Child-device-lost", log.Fields{"parent-device-id": childDevice.ParentId, "child-device-id": childDevice.Id})
479 if handler := oo.getDeviceHandler(childDevice.ParentId); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400480 if err := handler.ChildDeviceLost(log.WithSpanFromContext(context.Background(), ctx), childDevice.ParentPortNo, childDevice.ProxyAddress.OnuId, childDevice.SerialNumber); err != nil {
481 return nil, err
482 }
483 return &empty.Empty{}, nil
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500484 }
khenaidoo106c61a2021-08-11 18:05:46 -0400485 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"parent-device-id": childDevice.ParentId}, nil).Log()
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500486}
Scott Baker24f83e22020-03-30 16:14:28 -0700487
khenaidoo106c61a2021-08-11 18:05:46 -0400488// GetExtValue retrieves a value on a particular ONU
khenaidoodc2116e2021-10-19 17:33:19 -0400489func (oo *OpenOLT) GetExtValue(ctx context.Context, extInfo *ca.GetExtValueMessage) (*extension.ReturnValues, error) {
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800490 var err error
khenaidoodc2116e2021-10-19 17:33:19 -0400491 resp := new(extension.ReturnValues)
khenaidoo106c61a2021-08-11 18:05:46 -0400492 logger.Infow(ctx, "get_ext_value", log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id})
493 if handler := oo.getDeviceHandler(extInfo.ParentDevice.Id); handler != nil {
494 if resp, err = handler.getExtValue(ctx, extInfo.ChildDevice, extInfo.ValueType); err != nil {
495 logger.Errorw(ctx, "error-occurred-during-get-ext-value",
496 log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id, "error": err})
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800497 return nil, err
498 }
499 }
500 return resp, nil
501}
kesavand62126212021-01-12 04:56:06 -0500502
praneeth nalmas55616d62023-02-06 09:19:18 +0530503// GetSingleValue handles get uni status on ONU and ondemand metric on OLT
khenaidoo106c61a2021-08-11 18:05:46 -0400504func (oo *OpenOLT) GetSingleValue(ctx context.Context, request *extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
505 logger.Infow(ctx, "single_get_value_request", log.Fields{"request": request})
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530506 var handler *DeviceHandler
507 var onuDevice *voltha.Device
kesavand62126212021-01-12 04:56:06 -0500508
509 errResp := func(status extension.GetValueResponse_Status,
510 reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
511 return &extension.SingleGetValueResponse{
512 Response: &extension.GetValueResponse{
513 Status: status,
514 ErrReason: reason,
515 },
516 }
517 }
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530518
519 switch request.GetRequest().GetRequest().(type) {
520 case *extension.GetValueRequest_OnuStatsFromOlt:
521 handler, onuDevice = oo.GetDeviceHandlerFromChild(ctx, request.TargetId)
522 default:
523 handler = oo.getDeviceHandler(request.TargetId)
524 }
525
526 if handler != nil {
kesavand62126212021-01-12 04:56:06 -0500527 switch reqType := request.GetRequest().GetRequest().(type) {
528 case *extension.GetValueRequest_OltPortInfo:
529 return handler.getOltPortCounters(ctx, reqType.OltPortInfo), nil
Himani Chawla2c8ae0f2021-05-18 23:27:00 +0530530 case *extension.GetValueRequest_OnuPonInfo:
531 return handler.getOnuPonCounters(ctx, reqType.OnuPonInfo), nil
Gamze Abaka85e9a142021-05-26 13:41:39 +0000532 case *extension.GetValueRequest_RxPower:
533 return handler.getRxPower(ctx, reqType.RxPower), nil
praneeth nalmas55616d62023-02-06 09:19:18 +0530534 case *extension.GetValueRequest_OltRxPower:
535 return handler.getPONRxPower(ctx, reqType.OltRxPower), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530536 case *extension.GetValueRequest_OffloadedAppsStats:
537 return handler.getOltOffloadStats(ctx, reqType.OffloadedAppsStats), nil
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530538 case *extension.GetValueRequest_OnuStatsFromOlt:
539 return handler.getOnuStatsFromOlt(ctx, reqType.OnuStatsFromOlt, onuDevice), nil
Akash Reddy Kankanalad9ec4822025-06-10 22:59:53 +0530540 case *extension.GetValueRequest_OltPonStats:
541 return handler.getPonPortStats(ctx, reqType.OltPonStats), nil
542 case *extension.GetValueRequest_OltNniStats:
543 return handler.getNniPortStats(ctx, reqType.OltNniStats), nil
kesavand62126212021-01-12 04:56:06 -0500544 default:
545 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
546 }
547 }
548
549 logger.Infow(ctx, "Single_get_value_request failed ", log.Fields{"request": request})
550 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE_ID), nil
551}
khenaidoo106c61a2021-08-11 18:05:46 -0400552
Akash Soni3bcf5e02024-12-03 08:01:48 +0530553// SetSingleValue is implemented
554func (oo *OpenOLT) SetSingleValue(ctx context.Context, request *extension.SingleSetValueRequest) (*extension.SingleSetValueResponse, error) {
555 logger.Infow(ctx, "single_set_value_request", log.Fields{"request": request})
556
557 errResp := func(status extension.SetValueResponse_Status,
558 reason extension.SetValueResponse_ErrorReason) *extension.SingleSetValueResponse {
559 return &extension.SingleSetValueResponse{
560 Response: &extension.SetValueResponse{
561 Status: status,
562 ErrReason: reason,
563 },
564 }
565 }
566 if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
567 switch reqType := request.GetRequest().GetRequest().(type) {
568 case *extension.SetValueRequest_AppOffloadConfig:
Akash Soni3c75ad72024-12-23 12:09:48 +0530569 return handler.setOltOffload(ctx, reqType.AppOffloadConfig), nil
570 case *extension.SetValueRequest_AppOffloadOnuConfig:
571 return handler.setOnuOffload(ctx, reqType.AppOffloadOnuConfig), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530572 default:
573 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_UNSUPPORTED), nil
574 }
575 }
576
577 logger.Infow(ctx, "Single_set_value_request failed ", log.Fields{"request": request})
578 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_INVALID_DEVICE_ID), nil
579}
580
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530581func (oo *OpenOLT) GetDeviceHandlerFromChild(ctx context.Context, deviceId string) (*DeviceHandler, *voltha.Device) {
582 oo.lockDeviceHandlersMap.Lock()
583 defer oo.lockDeviceHandlersMap.Unlock()
584
585 for parentId, handler := range oo.deviceHandlers {
586 devices, _ := handler.getChildDevicesFromCore(ctx, parentId)
587 if devices != nil {
588 for _, onuDevice := range devices.Items {
589 if onuDevice.Id == deviceId {
590 return handler, onuDevice
591 }
592 }
593 }
594 }
595 return nil, nil
596}
597
khenaidoo106c61a2021-08-11 18:05:46 -0400598/*
599 * OLT Inter-adapter service
600 */
601
kesavandb9f54fd2021-11-25 20:08:04 +0530602// ProxyOmciRequests proxies an onu sw download OMCI request from the child adapter
603func (oo *OpenOLT) ProxyOmciRequests(ctx context.Context, request *ia.OmciMessages) (*empty.Empty, error) {
604 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
605 if err := handler.ProxyOmciRequests(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530606 return nil, err
kesavandb9f54fd2021-11-25 20:08:04 +0530607 }
608 return &empty.Empty{}, nil
609 }
610 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
611}
612
khenaidoo106c61a2021-08-11 18:05:46 -0400613// ProxyOmciRequest proxies an OMCI request from the child adapter
khenaidoodc2116e2021-10-19 17:33:19 -0400614func (oo *OpenOLT) ProxyOmciRequest(ctx context.Context, request *ia.OmciMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400615 logger.Debugw(ctx, "proxy-omci-request", log.Fields{"request": request})
616
617 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
618 if err := handler.ProxyOmciMessage(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530619 return nil, err
khenaidoo106c61a2021-08-11 18:05:46 -0400620 }
621 return &empty.Empty{}, nil
622 }
623 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
624}
625
626// GetTechProfileInstance returns an instance of a tech profile
khenaidoodc2116e2021-10-19 17:33:19 -0400627func (oo *OpenOLT) GetTechProfileInstance(ctx context.Context, request *ia.TechProfileInstanceRequestMessage) (*ia.TechProfileDownloadMessage, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400628 logger.Debugw(ctx, "getting-tech-profile-request", log.Fields{"request": request})
629
630 targetDeviceID := request.ParentDeviceId
631 if targetDeviceID == "" {
632 return nil, olterrors.NewErrNotFound("parent-id-empty", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
633 }
634 if handler := oo.getDeviceHandler(targetDeviceID); handler != nil {
635 return handler.GetTechProfileDownloadMessage(ctx, request)
636 }
637 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 -0400638}
639
khenaidooefff76e2021-12-15 16:51:30 -0500640// GetHealthStatus is used by a OltAdapterService client to detect a connection
641// lost with the gRPC server hosting the OltAdapterService service
642func (oo *OpenOLT) GetHealthStatus(stream adapter_service.AdapterService_GetHealthStatusServer) error {
643 ctx := context.Background()
644 logger.Debugw(ctx, "receive-stream-connection", log.Fields{"stream": stream})
645
646 if stream == nil {
647 return fmt.Errorf("conn-is-nil %v", stream)
648 }
649 initialRequestTime := time.Now()
650 var remoteClient *common.Connection
651 var tempClient *common.Connection
652 var err error
653loop:
654 for {
655 tempClient, err = stream.Recv()
656 if err != nil {
657 logger.Warnw(ctx, "received-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
658 break loop
659 }
660 // Send a response back
661 err = stream.Send(&health.HealthStatus{State: health.HealthStatus_HEALTHY})
662 if err != nil {
663 logger.Warnw(ctx, "sending-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
664 break loop
665 }
666
667 remoteClient = tempClient
668 logger.Debugw(ctx, "received-keep-alive", log.Fields{"remote-client": remoteClient})
669
670 select {
671 case <-stream.Context().Done():
672 logger.Infow(ctx, "stream-keep-alive-context-done", log.Fields{"remote-client": remoteClient, "error": stream.Context().Err()})
673 break loop
674 case <-oo.exitChannel:
675 logger.Warnw(ctx, "received-stop", log.Fields{"remote-client": remoteClient, "initial-conn-time": initialRequestTime})
676 break loop
677 default:
678 }
679 }
680 logger.Errorw(ctx, "connection-down", log.Fields{"remote-client": remoteClient, "error": err, "initial-conn-time": initialRequestTime})
681 return err
682}
683
khenaidoo106c61a2021-08-11 18:05:46 -0400684/*
685 *
686 * Unimplemented APIs
687 *
688 */
689
praneeth nalmas55616d62023-02-06 09:19:18 +0530690// SimulateAlarm is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400691func (oo *OpenOLT) SimulateAlarm(context.Context, *ca.SimulateAlarmMessage) (*voltha.OperationResp, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400692 return nil, olterrors.ErrNotImplemented
693}
694
praneeth nalmas55616d62023-02-06 09:19:18 +0530695// SetExtValue is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400696func (oo *OpenOLT) SetExtValue(context.Context, *ca.SetExtValueMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400697 return nil, olterrors.ErrNotImplemented
698}
699
praneeth nalmas55616d62023-02-06 09:19:18 +0530700// StartOmciTest not implemented
khenaidoodc2116e2021-10-19 17:33:19 -0400701func (oo *OpenOLT) StartOmciTest(ctx context.Context, test *ca.OMCITest) (*omci.TestResponse, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400702 return nil, olterrors.ErrNotImplemented
703}
704
praneeth nalmas55616d62023-02-06 09:19:18 +0530705// SuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400706func (oo *OpenOLT) SuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
707 return nil, olterrors.ErrNotImplemented
708}
709
praneeth nalmas55616d62023-02-06 09:19:18 +0530710// UnSuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400711func (oo *OpenOLT) UnSuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
712 return nil, olterrors.ErrNotImplemented
713}
714
praneeth nalmas55616d62023-02-06 09:19:18 +0530715// DownloadImage is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400716func (oo *OpenOLT) DownloadImage(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400717 return nil, olterrors.ErrNotImplemented
718}
719
praneeth nalmas55616d62023-02-06 09:19:18 +0530720// GetImageDownloadStatus is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400721func (oo *OpenOLT) GetImageDownloadStatus(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400722 return nil, olterrors.ErrNotImplemented
723}
724
praneeth nalmas55616d62023-02-06 09:19:18 +0530725// CancelImageDownload is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400726func (oo *OpenOLT) CancelImageDownload(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400727 return nil, olterrors.ErrNotImplemented
728}
729
praneeth nalmas55616d62023-02-06 09:19:18 +0530730// ActivateImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400731func (oo *OpenOLT) ActivateImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400732 return nil, olterrors.ErrNotImplemented
733}
734
praneeth nalmas55616d62023-02-06 09:19:18 +0530735// RevertImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400736func (oo *OpenOLT) RevertImageUpdate(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// DownloadOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400741func (oo *OpenOLT) DownloadOnuImage(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
742 return nil, olterrors.ErrNotImplemented
743}
744
praneeth nalmas55616d62023-02-06 09:19:18 +0530745// GetOnuImageStatus unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400746func (oo *OpenOLT) GetOnuImageStatus(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
747 return nil, olterrors.ErrNotImplemented
748}
749
praneeth nalmas55616d62023-02-06 09:19:18 +0530750// AbortOnuImageUpgrade unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400751func (oo *OpenOLT) AbortOnuImageUpgrade(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
752 return nil, olterrors.ErrNotImplemented
753}
754
praneeth nalmas55616d62023-02-06 09:19:18 +0530755// GetOnuImages unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400756func (oo *OpenOLT) GetOnuImages(ctx context.Context, deviceID *common.ID) (*voltha.OnuImages, error) {
757 return nil, olterrors.ErrNotImplemented
758}
759
praneeth nalmas55616d62023-02-06 09:19:18 +0530760// ActivateOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400761func (oo *OpenOLT) ActivateOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
762 return nil, olterrors.ErrNotImplemented
763}
764
praneeth nalmas55616d62023-02-06 09:19:18 +0530765// CommitOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400766func (oo *OpenOLT) CommitOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
767 return nil, olterrors.ErrNotImplemented
768}
769
770// UpdateFlowsBulk is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400771func (oo *OpenOLT) UpdateFlowsBulk(ctx context.Context, flows *ca.BulkFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400772 return nil, olterrors.ErrNotImplemented
773}
774
praneeth nalmas55616d62023-02-06 09:19:18 +0530775// SelfTestDevice unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400776func (oo *OpenOLT) SelfTestDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
777 return nil, olterrors.ErrNotImplemented
778}