blob: 88e3efe2ecafb26ebce56d86c206a0f68a8b8efa [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 {
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053047 configManager *conf.ConfigManager
48 deviceHandlers map[string]*DeviceHandler
49 coreClient *vgrpc.Client
50 eventProxy eventif.EventProxy
51 config *config.AdapterFlags
52 numOnus int
53 KVStoreAddress string
54 KVStoreType string
55 exitChannel chan struct{}
56 HeartbeatCheckInterval time.Duration
57 HeartbeatFailReportInterval time.Duration
58 GrpcTimeoutInterval time.Duration
59 lockDeviceHandlersMap sync.RWMutex
60 enableONUStats bool
61 enableGemStats bool
62 rpcTimeout time.Duration
63 CheckOnuDevExistenceAtOnuDiscovery bool
Girish Gowdru0c588b22019-04-23 23:24:56 -040064}
65
praneeth nalmas55616d62023-02-06 09:19:18 +053066// NewOpenOLT returns a new instance of OpenOLT
khenaidoo106c61a2021-08-11 18:05:46 -040067func NewOpenOLT(ctx context.Context,
68 coreClient *vgrpc.Client,
Himani Chawlacd407802020-12-10 12:08:59 +053069 eventProxy eventif.EventProxy, cfg *config.AdapterFlags, cm *conf.ConfigManager) *OpenOLT {
Girish Gowdru0c588b22019-04-23 23:24:56 -040070 var openOLT OpenOLT
khenaidooefff76e2021-12-15 16:51:30 -050071 openOLT.exitChannel = make(chan struct{})
Girish Gowdru0c588b22019-04-23 23:24:56 -040072 openOLT.deviceHandlers = make(map[string]*DeviceHandler)
Abhilash Laxmeshwarf9942e92020-01-07 15:32:44 +053073 openOLT.config = cfg
74 openOLT.numOnus = cfg.OnuNumber
khenaidoo106c61a2021-08-11 18:05:46 -040075 openOLT.coreClient = coreClient
Devmalya Paulfb990a52019-07-09 10:01:49 -040076 openOLT.eventProxy = eventProxy
Neha Sharma3f221ae2020-04-29 19:02:12 +000077 openOLT.KVStoreAddress = cfg.KVStoreAddress
Abhilash Laxmeshwarf9942e92020-01-07 15:32:44 +053078 openOLT.KVStoreType = cfg.KVStoreType
79 openOLT.HeartbeatCheckInterval = cfg.HeartbeatCheckInterval
80 openOLT.HeartbeatFailReportInterval = cfg.HeartbeatFailReportInterval
81 openOLT.GrpcTimeoutInterval = cfg.GrpcTimeoutInterval
Girish Gowdru0c588b22019-04-23 23:24:56 -040082 openOLT.lockDeviceHandlersMap = sync.RWMutex{}
Matteo Scandolodfa7a972020-11-06 13:03:40 -080083 openOLT.configManager = cm
Gamze Abakafcbd6e72020-12-17 13:25:16 +000084 openOLT.enableONUStats = cfg.EnableONUStats
85 openOLT.enableGemStats = cfg.EnableGEMStats
khenaidoo106c61a2021-08-11 18:05:46 -040086 openOLT.rpcTimeout = cfg.RPCTimeout
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +053087 openOLT.CheckOnuDevExistenceAtOnuDiscovery = cfg.CheckOnuDevExistenceAtOnuDiscovery
Girish Gowdru0c588b22019-04-23 23:24:56 -040088 return &openOLT
89}
90
praneeth nalmas55616d62023-02-06 09:19:18 +053091// Start starts (logs) the device manager
Girish Gowdru0c588b22019-04-23 23:24:56 -040092func (oo *OpenOLT) Start(ctx context.Context) error {
Neha Sharma96b7bf22020-06-15 10:37:32 +000093 logger.Info(ctx, "starting-device-manager")
94 logger.Info(ctx, "device-manager-started")
Girish Gowdru0c588b22019-04-23 23:24:56 -040095 return nil
96}
97
praneeth nalmas55616d62023-02-06 09:19:18 +053098// Stop terminates the session
Girish Gowdru0c588b22019-04-23 23:24:56 -040099func (oo *OpenOLT) Stop(ctx context.Context) error {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000100 logger.Info(ctx, "stopping-device-manager")
khenaidooefff76e2021-12-15 16:51:30 -0500101 close(oo.exitChannel)
102 // Stop the device handlers
103 oo.stopAllDeviceHandlers(ctx)
104
105 // Stop the core grpc client connection
106 if oo.coreClient != nil {
107 oo.coreClient.Stop(ctx)
108 }
109
Neha Sharma96b7bf22020-06-15 10:37:32 +0000110 logger.Info(ctx, "device-manager-stopped")
Girish Gowdru0c588b22019-04-23 23:24:56 -0400111 return nil
112}
113
Girish Gowdru0c588b22019-04-23 23:24:56 -0400114func (oo *OpenOLT) addDeviceHandlerToMap(agent *DeviceHandler) {
115 oo.lockDeviceHandlersMap.Lock()
116 defer oo.lockDeviceHandlersMap.Unlock()
Thomas Lee S985938d2020-05-04 11:40:41 +0530117 if _, exist := oo.deviceHandlers[agent.device.Id]; !exist {
118 oo.deviceHandlers[agent.device.Id] = agent
Girish Gowdru0c588b22019-04-23 23:24:56 -0400119 }
120}
121
122func (oo *OpenOLT) deleteDeviceHandlerToMap(agent *DeviceHandler) {
123 oo.lockDeviceHandlersMap.Lock()
124 defer oo.lockDeviceHandlersMap.Unlock()
Thomas Lee S985938d2020-05-04 11:40:41 +0530125 delete(oo.deviceHandlers, agent.device.Id)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400126}
127
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700128func (oo *OpenOLT) getDeviceHandler(deviceID string) *DeviceHandler {
Girish Gowdru0c588b22019-04-23 23:24:56 -0400129 oo.lockDeviceHandlersMap.Lock()
130 defer oo.lockDeviceHandlersMap.Unlock()
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700131 if agent, ok := oo.deviceHandlers[deviceID]; ok {
Girish Gowdru0c588b22019-04-23 23:24:56 -0400132 return agent
133 }
134 return nil
135}
136
khenaidooefff76e2021-12-15 16:51:30 -0500137func (oo *OpenOLT) stopAllDeviceHandlers(ctx context.Context) {
138 oo.lockDeviceHandlersMap.Lock()
139 defer oo.lockDeviceHandlersMap.Unlock()
140 for _, handler := range oo.deviceHandlers {
141 handler.Stop(ctx)
142 }
khenaidoo106c61a2021-08-11 18:05:46 -0400143}
144
145// AdoptDevice creates a new device handler if not present already and then adopts the device
146func (oo *OpenOLT) AdoptDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
Girish Gowdru0c588b22019-04-23 23:24:56 -0400147 if device == nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400148 return nil, olterrors.NewErrInvalidValue(log.Fields{"device": nil}, nil).Log()
Girish Gowdru0c588b22019-04-23 23:24:56 -0400149 }
divyadesai3af43e12020-08-18 07:10:54 +0000150 logger.Infow(ctx, "adopt-device", log.Fields{"device-id": device.Id})
Girish Gowdru0c588b22019-04-23 23:24:56 -0400151 var handler *DeviceHandler
152 if handler = oo.getDeviceHandler(device.Id); handler == nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400153 handler := NewDeviceHandler(oo.coreClient, oo.eventProxy, device, oo, oo.configManager, oo.config)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400154 oo.addDeviceHandlerToMap(handler)
khenaidoo106c61a2021-08-11 18:05:46 -0400155 go handler.AdoptDevice(log.WithSpanFromContext(context.Background(), ctx), device)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400156 }
khenaidoo106c61a2021-08-11 18:05:46 -0400157 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400158}
159
praneeth nalmas55616d62023-02-06 09:19:18 +0530160// GetOfpDeviceInfo returns OFP information for the given device
khenaidoodc2116e2021-10-19 17:33:19 -0400161func (oo *OpenOLT) GetOfpDeviceInfo(ctx context.Context, device *voltha.Device) (*ca.SwitchCapability, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400162 logger.Infow(ctx, "get_ofp_device_info", log.Fields{"device-id": device.Id})
Girish Gowdru0c588b22019-04-23 23:24:56 -0400163 if handler := oo.getDeviceHandler(device.Id); handler != nil {
164 return handler.GetOfpDeviceInfo(device)
165 }
Girish Kumarf26e4882020-03-05 06:49:10 +0000166 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400167}
168
praneeth nalmas55616d62023-02-06 09:19:18 +0530169// ReconcileDevice unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400170func (oo *OpenOLT) ReconcileDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530171 if device == nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400172 return nil, olterrors.NewErrInvalidValue(log.Fields{"device": nil}, nil)
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530173 }
divyadesai3af43e12020-08-18 07:10:54 +0000174 logger.Infow(ctx, "reconcile-device", log.Fields{"device-id": device.Id})
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530175 var handler *DeviceHandler
176 if handler = oo.getDeviceHandler(device.Id); handler == nil {
Manindere49938d2021-03-19 00:23:24 +0530177 //Setting state to RECONCILING
Nandita Biradar1b590f12024-09-27 10:56:28 +0530178 // Fetch previous state
179 //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.
180 PrevOperStatus := device.OperStatus
181
182 // Log previous state
183 logger.Infow(ctx, "previous-device-state", log.Fields{
184 "device-id": device.Id,
185 "previous-operStatus": PrevOperStatus,
186 "Device-connStatus": device.ConnectStatus,
187 })
khenaidoo106c61a2021-08-11 18:05:46 -0400188 cgClient, err := oo.coreClient.GetCoreServiceClient()
Manindere49938d2021-03-19 00:23:24 +0530189 if err != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400190 return nil, err
Manindere49938d2021-03-19 00:23:24 +0530191 }
khenaidoo106c61a2021-08-11 18:05:46 -0400192 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), oo.rpcTimeout)
193 defer cancel()
Nandita Biradar1b590f12024-09-27 10:56:28 +0530194 // Create DeviceStateFilter with new state
195 deviceStateFilter := &ca.DeviceStateFilter{
196 DeviceId: device.Id,
197 OperStatus: voltha.OperStatus_RECONCILING,
198 ConnStatus: device.ConnectStatus,
199 }
200
201 // Log the new state being set
202 logger.Infow(ctx, "setting-new-device-state", log.Fields{
203 "device-id": deviceStateFilter.DeviceId,
204 "new-operStatus": deviceStateFilter.OperStatus,
205 "new-connStatus": deviceStateFilter.ConnStatus,
206 })
khenaidoodc2116e2021-10-19 17:33:19 -0400207 if _, err := cgClient.DeviceStateUpdate(subCtx, &ca.DeviceStateFilter{
khenaidoo106c61a2021-08-11 18:05:46 -0400208 DeviceId: device.Id,
209 OperStatus: voltha.OperStatus_RECONCILING,
Akash Sonif49299a2024-04-25 12:06:37 +0530210 ConnStatus: voltha.ConnectStatus_UNREACHABLE,
khenaidoo106c61a2021-08-11 18:05:46 -0400211 }); err != nil {
212 return nil, olterrors.NewErrAdapter("device-update-failed", log.Fields{"device-id": device.Id}, err)
213 }
214
Akash Sonif49299a2024-04-25 12:06:37 +0530215 // 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 -0700216 // locally cached copy of the device struct.
217 device.OperStatus = voltha.OperStatus_RECONCILING
Akash Sonif49299a2024-04-25 12:06:37 +0530218 device.ConnectStatus = voltha.ConnectStatus_UNREACHABLE
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700219 handler := NewDeviceHandler(oo.coreClient, oo.eventProxy, device, oo, oo.configManager, oo.config)
220 handler.adapterPreviouslyConnected = true
Nandita Biradar1b590f12024-09-27 10:56:28 +0530221 handler.prevOperStatus = PrevOperStatus
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700222 oo.addDeviceHandlerToMap(handler)
223 handler.transitionMap = NewTransitionMap(handler)
224
Nandita Biradar1b590f12024-09-27 10:56:28 +0530225 go handler.transitionMap.Handle(log.WithSpanFromContext(context.Background(), ctx), DeviceInit)
nikesh.krishnan4d644532023-12-16 00:21:07 +0530226 } else {
227 logger.Warnf(ctx, "device-already-reconciled-or-active", log.Fields{"device-id": device.Id})
228 return &empty.Empty{}, status.Errorf(codes.AlreadyExists, "handler exists: %s", device.Id)
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530229 }
khenaidoo106c61a2021-08-11 18:05:46 -0400230 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400231}
232
praneeth nalmas55616d62023-02-06 09:19:18 +0530233// DisableDevice disables the given device
khenaidoo106c61a2021-08-11 18:05:46 -0400234func (oo *OpenOLT) DisableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000235 logger.Infow(ctx, "disable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400236 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400237 if err := handler.DisableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
238 return nil, err
239 }
240 return &empty.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400241 }
khenaidoo106c61a2021-08-11 18:05:46 -0400242 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400243}
244
praneeth nalmas55616d62023-02-06 09:19:18 +0530245// ReEnableDevice enables the olt device after disable
khenaidoo106c61a2021-08-11 18:05:46 -0400246func (oo *OpenOLT) ReEnableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000247 logger.Infow(ctx, "reenable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400248 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400249 if err := handler.ReenableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
250 return nil, err
251 }
252 return &empty.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400253 }
khenaidoo106c61a2021-08-11 18:05:46 -0400254 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400255}
256
praneeth nalmas55616d62023-02-06 09:19:18 +0530257// RebootDevice reboots the given device
khenaidoo106c61a2021-08-11 18:05:46 -0400258func (oo *OpenOLT) RebootDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000259 logger.Infow(ctx, "reboot-device", log.Fields{"device-id": device.Id})
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400260 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400261 if err := handler.RebootDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
262 return nil, err
263 }
264 return &empty.Empty{}, nil
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400265 }
khenaidoo106c61a2021-08-11 18:05:46 -0400266 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
267
Girish Gowdru0c588b22019-04-23 23:24:56 -0400268}
269
praneeth nalmas55616d62023-02-06 09:19:18 +0530270// DeleteDevice deletes a device
khenaidoo106c61a2021-08-11 18:05:46 -0400271func (oo *OpenOLT) DeleteDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000272 logger.Infow(ctx, "delete-device", log.Fields{"device-id": device.Id})
Devmalya Paul495b94a2019-08-27 19:42:00 -0400273 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400274 if err := handler.DeleteDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
Gustavo Silva41af9122022-10-11 11:05:13 -0300275 return nil, err
Devmalya Paul495b94a2019-08-27 19:42:00 -0400276 }
Akash Soni5c76e272024-01-15 04:09:24 +0530277 // Initialize a ticker with a 2-second interval to periodically check the states
278 ticker := time.NewTicker(2 * time.Second)
279 defer ticker.Stop()
280
281 // Set a maximum timeout duration of 30 seconds for the loop
282 timeout := time.After(30 * time.Second)
283
284 for {
285 select {
286 case <-ticker.C:
287 // Check if all processes have stopped
288 if !handler.isHeartbeatCheckActive && !handler.isCollectorActive && !handler.isReadIndicationRoutineActive {
289 logger.Debugf(ctx, "delete-device-handler")
290 oo.deleteDeviceHandlerToMap(handler)
291 return &empty.Empty{}, nil
292 }
293 case <-timeout:
294 // Timeout exceeded
295 logger.Warnw(ctx, "delete-device-handler timeout exceeded", log.Fields{"device-id": device.Id})
296 oo.deleteDeviceHandlerToMap(handler) // Clean up anyway
297 return &empty.Empty{}, nil
298 }
299 }
Devmalya Paul495b94a2019-08-27 19:42:00 -0400300 }
khenaidoo106c61a2021-08-11 18:05:46 -0400301 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400302}
303
praneeth nalmas55616d62023-02-06 09:19:18 +0530304// UpdateFlowsIncrementally updates (add/remove) the flows on a given device
khenaidoodc2116e2021-10-19 17:33:19 -0400305func (oo *OpenOLT) UpdateFlowsIncrementally(ctx context.Context, incrFlows *ca.IncrementalFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400306 logger.Infow(ctx, "update_flows_incrementally", log.Fields{"device-id": incrFlows.Device.Id, "flows": incrFlows.Flows, "flowMetadata": incrFlows.FlowMetadata})
307 if handler := oo.getDeviceHandler(incrFlows.Device.Id); handler != nil {
308 if err := handler.UpdateFlowsIncrementally(log.WithSpanFromContext(context.Background(), ctx), incrFlows.Device, incrFlows.Flows, incrFlows.Groups, incrFlows.FlowMetadata); err != nil {
309 return nil, err
310 }
311 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400312 }
khenaidoo106c61a2021-08-11 18:05:46 -0400313 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": incrFlows.Device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400314}
315
praneeth nalmas55616d62023-02-06 09:19:18 +0530316// UpdatePmConfig returns PmConfigs nil or error
khenaidoodc2116e2021-10-19 17:33:19 -0400317func (oo *OpenOLT) UpdatePmConfig(ctx context.Context, configs *ca.PmConfigsInfo) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400318 logger.Debugw(ctx, "update_pm_config", log.Fields{"device-id": configs.DeviceId, "pm-configs": configs.PmConfigs})
319 if handler := oo.getDeviceHandler(configs.DeviceId); handler != nil {
320 handler.UpdatePmConfig(log.WithSpanFromContext(context.Background(), ctx), configs.PmConfigs)
321 return &empty.Empty{}, nil
Rohan Agrawalda5e0b22020-05-20 11:10:26 +0000322 }
khenaidoo106c61a2021-08-11 18:05:46 -0400323 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": configs.DeviceId}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400324}
325
praneeth nalmas55616d62023-02-06 09:19:18 +0530326// SendPacketOut sends packet out to the device
khenaidoodc2116e2021-10-19 17:33:19 -0400327func (oo *OpenOLT) SendPacketOut(ctx context.Context, packet *ca.PacketOut) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400328 logger.Debugw(ctx, "send_packet_out", log.Fields{"device-id": packet.DeviceId, "egress_port_no": packet.EgressPortNo, "pkt": packet.Packet})
329 if handler := oo.getDeviceHandler(packet.DeviceId); handler != nil {
330 if err := handler.PacketOut(log.WithSpanFromContext(context.Background(), ctx), packet.EgressPortNo, packet.Packet); err != nil {
331 return nil, err
332 }
333 return &empty.Empty{}, nil
manikkaraj k9eb6cac2019-05-09 12:32:03 -0400334 }
khenaidoo106c61a2021-08-11 18:05:46 -0400335 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": packet.DeviceId}, nil)
336
Girish Gowdru0c588b22019-04-23 23:24:56 -0400337}
338
khenaidoo106c61a2021-08-11 18:05:46 -0400339// EnablePort to Enable PON/NNI interface
340func (oo *OpenOLT) EnablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
341 logger.Infow(ctx, "enable_port", log.Fields{"device-id": port.DeviceId, "port": port})
342 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, true); err != nil {
343 return nil, err
344 }
345 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400346}
347
khenaidoo106c61a2021-08-11 18:05:46 -0400348// DisablePort to Disable pon/nni interface
349func (oo *OpenOLT) DisablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
350 logger.Infow(ctx, "disable_port", log.Fields{"device-id": port.DeviceId, "port": port})
351 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, false); err != nil {
352 return nil, err
353 }
354 return &empty.Empty{}, nil
kesavand39e0aa32020-01-28 20:58:50 -0500355}
356
357// enableDisablePort to Disable pon or Enable PON interface
Neha Sharma96b7bf22020-06-15 10:37:32 +0000358func (oo *OpenOLT) enableDisablePort(ctx context.Context, deviceID string, port *voltha.Port, enablePort bool) error {
divyadesai3af43e12020-08-18 07:10:54 +0000359 logger.Infow(ctx, "enableDisablePort", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500360 if port == nil {
Thomas Lee S94109f12020-03-03 16:39:29 +0530361 return olterrors.NewErrInvalidValue(log.Fields{
David K. Bainbridge794735f2020-02-11 21:01:37 -0800362 "reason": "port cannot be nil",
363 "device-id": deviceID,
Girish Kumarf26e4882020-03-05 06:49:10 +0000364 "port": nil}, nil)
kesavand39e0aa32020-01-28 20:58:50 -0500365 }
366 if handler := oo.getDeviceHandler(deviceID); handler != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000367 logger.Debugw(ctx, "Enable_Disable_Port", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500368 if enablePort {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000369 if err := handler.EnablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000370 return olterrors.NewErrAdapter("error-occurred-during-enable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500371 }
372 } else {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000373 if err := handler.DisablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000374 return olterrors.NewErrAdapter("error-occurred-during-disable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500375 }
376 }
377 }
378 return nil
379}
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500380
praneeth nalmas55616d62023-02-06 09:19:18 +0530381// ChildDeviceLost deletes the ONU and its references from PONResources
khenaidoo106c61a2021-08-11 18:05:46 -0400382func (oo *OpenOLT) ChildDeviceLost(ctx context.Context, childDevice *voltha.Device) (*empty.Empty, error) {
Girish Gowdraa0870562021-03-11 14:30:14 -0800383 logger.Infow(ctx, "Child-device-lost", log.Fields{"parent-device-id": childDevice.ParentId, "child-device-id": childDevice.Id})
384 if handler := oo.getDeviceHandler(childDevice.ParentId); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400385 if err := handler.ChildDeviceLost(log.WithSpanFromContext(context.Background(), ctx), childDevice.ParentPortNo, childDevice.ProxyAddress.OnuId, childDevice.SerialNumber); err != nil {
386 return nil, err
387 }
388 return &empty.Empty{}, nil
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500389 }
khenaidoo106c61a2021-08-11 18:05:46 -0400390 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"parent-device-id": childDevice.ParentId}, nil).Log()
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500391}
Scott Baker24f83e22020-03-30 16:14:28 -0700392
khenaidoo106c61a2021-08-11 18:05:46 -0400393// GetExtValue retrieves a value on a particular ONU
khenaidoodc2116e2021-10-19 17:33:19 -0400394func (oo *OpenOLT) GetExtValue(ctx context.Context, extInfo *ca.GetExtValueMessage) (*extension.ReturnValues, error) {
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800395 var err error
khenaidoodc2116e2021-10-19 17:33:19 -0400396 resp := new(extension.ReturnValues)
khenaidoo106c61a2021-08-11 18:05:46 -0400397 logger.Infow(ctx, "get_ext_value", log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id})
398 if handler := oo.getDeviceHandler(extInfo.ParentDevice.Id); handler != nil {
399 if resp, err = handler.getExtValue(ctx, extInfo.ChildDevice, extInfo.ValueType); err != nil {
400 logger.Errorw(ctx, "error-occurred-during-get-ext-value",
401 log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id, "error": err})
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800402 return nil, err
403 }
404 }
405 return resp, nil
406}
kesavand62126212021-01-12 04:56:06 -0500407
praneeth nalmas55616d62023-02-06 09:19:18 +0530408// GetSingleValue handles get uni status on ONU and ondemand metric on OLT
khenaidoo106c61a2021-08-11 18:05:46 -0400409func (oo *OpenOLT) GetSingleValue(ctx context.Context, request *extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
410 logger.Infow(ctx, "single_get_value_request", log.Fields{"request": request})
kesavand62126212021-01-12 04:56:06 -0500411
412 errResp := func(status extension.GetValueResponse_Status,
413 reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
414 return &extension.SingleGetValueResponse{
415 Response: &extension.GetValueResponse{
416 Status: status,
417 ErrReason: reason,
418 },
419 }
420 }
421 if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
422 switch reqType := request.GetRequest().GetRequest().(type) {
423 case *extension.GetValueRequest_OltPortInfo:
424 return handler.getOltPortCounters(ctx, reqType.OltPortInfo), nil
Himani Chawla2c8ae0f2021-05-18 23:27:00 +0530425 case *extension.GetValueRequest_OnuPonInfo:
426 return handler.getOnuPonCounters(ctx, reqType.OnuPonInfo), nil
Gamze Abaka85e9a142021-05-26 13:41:39 +0000427 case *extension.GetValueRequest_RxPower:
428 return handler.getRxPower(ctx, reqType.RxPower), nil
praneeth nalmas55616d62023-02-06 09:19:18 +0530429 case *extension.GetValueRequest_OltRxPower:
430 return handler.getPONRxPower(ctx, reqType.OltRxPower), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530431 case *extension.GetValueRequest_OffloadedAppsStats:
432 return handler.getOltOffloadStats(ctx, reqType.OffloadedAppsStats), nil
kesavand62126212021-01-12 04:56:06 -0500433 default:
434 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
435 }
436 }
437
438 logger.Infow(ctx, "Single_get_value_request failed ", log.Fields{"request": request})
439 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE_ID), nil
440}
khenaidoo106c61a2021-08-11 18:05:46 -0400441
Akash Soni3bcf5e02024-12-03 08:01:48 +0530442// SetSingleValue is implemented
443func (oo *OpenOLT) SetSingleValue(ctx context.Context, request *extension.SingleSetValueRequest) (*extension.SingleSetValueResponse, error) {
444 logger.Infow(ctx, "single_set_value_request", log.Fields{"request": request})
445
446 errResp := func(status extension.SetValueResponse_Status,
447 reason extension.SetValueResponse_ErrorReason) *extension.SingleSetValueResponse {
448 return &extension.SingleSetValueResponse{
449 Response: &extension.SetValueResponse{
450 Status: status,
451 ErrReason: reason,
452 },
453 }
454 }
455 if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
456 switch reqType := request.GetRequest().GetRequest().(type) {
457 case *extension.SetValueRequest_AppOffloadConfig:
Akash Soni3c75ad72024-12-23 12:09:48 +0530458 return handler.setOltOffload(ctx, reqType.AppOffloadConfig), nil
459 case *extension.SetValueRequest_AppOffloadOnuConfig:
460 return handler.setOnuOffload(ctx, reqType.AppOffloadOnuConfig), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530461 default:
462 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_UNSUPPORTED), nil
463 }
464 }
465
466 logger.Infow(ctx, "Single_set_value_request failed ", log.Fields{"request": request})
467 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_INVALID_DEVICE_ID), nil
468}
469
khenaidoo106c61a2021-08-11 18:05:46 -0400470/*
471 * OLT Inter-adapter service
472 */
473
kesavandb9f54fd2021-11-25 20:08:04 +0530474// ProxyOmciRequests proxies an onu sw download OMCI request from the child adapter
475func (oo *OpenOLT) ProxyOmciRequests(ctx context.Context, request *ia.OmciMessages) (*empty.Empty, error) {
476 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
477 if err := handler.ProxyOmciRequests(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530478 return nil, err
kesavandb9f54fd2021-11-25 20:08:04 +0530479 }
480 return &empty.Empty{}, nil
481 }
482 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
483}
484
khenaidoo106c61a2021-08-11 18:05:46 -0400485// ProxyOmciRequest proxies an OMCI request from the child adapter
khenaidoodc2116e2021-10-19 17:33:19 -0400486func (oo *OpenOLT) ProxyOmciRequest(ctx context.Context, request *ia.OmciMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400487 logger.Debugw(ctx, "proxy-omci-request", log.Fields{"request": request})
488
489 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
490 if err := handler.ProxyOmciMessage(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530491 return nil, err
khenaidoo106c61a2021-08-11 18:05:46 -0400492 }
493 return &empty.Empty{}, nil
494 }
495 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
496}
497
498// GetTechProfileInstance returns an instance of a tech profile
khenaidoodc2116e2021-10-19 17:33:19 -0400499func (oo *OpenOLT) GetTechProfileInstance(ctx context.Context, request *ia.TechProfileInstanceRequestMessage) (*ia.TechProfileDownloadMessage, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400500 logger.Debugw(ctx, "getting-tech-profile-request", log.Fields{"request": request})
501
502 targetDeviceID := request.ParentDeviceId
503 if targetDeviceID == "" {
504 return nil, olterrors.NewErrNotFound("parent-id-empty", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
505 }
506 if handler := oo.getDeviceHandler(targetDeviceID); handler != nil {
507 return handler.GetTechProfileDownloadMessage(ctx, request)
508 }
509 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
510
511}
512
khenaidooefff76e2021-12-15 16:51:30 -0500513// GetHealthStatus is used by a OltAdapterService client to detect a connection
514// lost with the gRPC server hosting the OltAdapterService service
515func (oo *OpenOLT) GetHealthStatus(stream adapter_service.AdapterService_GetHealthStatusServer) error {
516 ctx := context.Background()
517 logger.Debugw(ctx, "receive-stream-connection", log.Fields{"stream": stream})
518
519 if stream == nil {
520 return fmt.Errorf("conn-is-nil %v", stream)
521 }
522 initialRequestTime := time.Now()
523 var remoteClient *common.Connection
524 var tempClient *common.Connection
525 var err error
526loop:
527 for {
528 tempClient, err = stream.Recv()
529 if err != nil {
530 logger.Warnw(ctx, "received-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
531 break loop
532 }
533 // Send a response back
534 err = stream.Send(&health.HealthStatus{State: health.HealthStatus_HEALTHY})
535 if err != nil {
536 logger.Warnw(ctx, "sending-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
537 break loop
538 }
539
540 remoteClient = tempClient
541 logger.Debugw(ctx, "received-keep-alive", log.Fields{"remote-client": remoteClient})
542
543 select {
544 case <-stream.Context().Done():
545 logger.Infow(ctx, "stream-keep-alive-context-done", log.Fields{"remote-client": remoteClient, "error": stream.Context().Err()})
546 break loop
547 case <-oo.exitChannel:
548 logger.Warnw(ctx, "received-stop", log.Fields{"remote-client": remoteClient, "initial-conn-time": initialRequestTime})
549 break loop
550 default:
551 }
552 }
553 logger.Errorw(ctx, "connection-down", log.Fields{"remote-client": remoteClient, "error": err, "initial-conn-time": initialRequestTime})
554 return err
555}
556
khenaidoo106c61a2021-08-11 18:05:46 -0400557/*
558 *
559 * Unimplemented APIs
560 *
561 */
562
praneeth nalmas55616d62023-02-06 09:19:18 +0530563// SimulateAlarm is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400564func (oo *OpenOLT) SimulateAlarm(context.Context, *ca.SimulateAlarmMessage) (*voltha.OperationResp, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400565 return nil, olterrors.ErrNotImplemented
566}
567
praneeth nalmas55616d62023-02-06 09:19:18 +0530568// SetExtValue is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400569func (oo *OpenOLT) SetExtValue(context.Context, *ca.SetExtValueMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400570 return nil, olterrors.ErrNotImplemented
571}
572
praneeth nalmas55616d62023-02-06 09:19:18 +0530573// StartOmciTest not implemented
khenaidoodc2116e2021-10-19 17:33:19 -0400574func (oo *OpenOLT) StartOmciTest(ctx context.Context, test *ca.OMCITest) (*omci.TestResponse, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400575 return nil, olterrors.ErrNotImplemented
576}
577
praneeth nalmas55616d62023-02-06 09:19:18 +0530578// SuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400579func (oo *OpenOLT) SuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
580 return nil, olterrors.ErrNotImplemented
581}
582
praneeth nalmas55616d62023-02-06 09:19:18 +0530583// UnSuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400584func (oo *OpenOLT) UnSuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
585 return nil, olterrors.ErrNotImplemented
586}
587
praneeth nalmas55616d62023-02-06 09:19:18 +0530588// DownloadImage is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400589func (oo *OpenOLT) DownloadImage(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400590 return nil, olterrors.ErrNotImplemented
591}
592
praneeth nalmas55616d62023-02-06 09:19:18 +0530593// GetImageDownloadStatus is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400594func (oo *OpenOLT) GetImageDownloadStatus(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400595 return nil, olterrors.ErrNotImplemented
596}
597
praneeth nalmas55616d62023-02-06 09:19:18 +0530598// CancelImageDownload is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400599func (oo *OpenOLT) CancelImageDownload(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400600 return nil, olterrors.ErrNotImplemented
601}
602
praneeth nalmas55616d62023-02-06 09:19:18 +0530603// ActivateImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400604func (oo *OpenOLT) ActivateImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400605 return nil, olterrors.ErrNotImplemented
606}
607
praneeth nalmas55616d62023-02-06 09:19:18 +0530608// RevertImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400609func (oo *OpenOLT) RevertImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400610 return nil, olterrors.ErrNotImplemented
611}
612
praneeth nalmas55616d62023-02-06 09:19:18 +0530613// DownloadOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400614func (oo *OpenOLT) DownloadOnuImage(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
615 return nil, olterrors.ErrNotImplemented
616}
617
praneeth nalmas55616d62023-02-06 09:19:18 +0530618// GetOnuImageStatus unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400619func (oo *OpenOLT) GetOnuImageStatus(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
620 return nil, olterrors.ErrNotImplemented
621}
622
praneeth nalmas55616d62023-02-06 09:19:18 +0530623// AbortOnuImageUpgrade unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400624func (oo *OpenOLT) AbortOnuImageUpgrade(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
625 return nil, olterrors.ErrNotImplemented
626}
627
praneeth nalmas55616d62023-02-06 09:19:18 +0530628// GetOnuImages unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400629func (oo *OpenOLT) GetOnuImages(ctx context.Context, deviceID *common.ID) (*voltha.OnuImages, error) {
630 return nil, olterrors.ErrNotImplemented
631}
632
praneeth nalmas55616d62023-02-06 09:19:18 +0530633// ActivateOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400634func (oo *OpenOLT) ActivateOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
635 return nil, olterrors.ErrNotImplemented
636}
637
praneeth nalmas55616d62023-02-06 09:19:18 +0530638// CommitOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400639func (oo *OpenOLT) CommitOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
640 return nil, olterrors.ErrNotImplemented
641}
642
643// UpdateFlowsBulk is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400644func (oo *OpenOLT) UpdateFlowsBulk(ctx context.Context, flows *ca.BulkFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400645 return nil, olterrors.ErrNotImplemented
646}
647
praneeth nalmas55616d62023-02-06 09:19:18 +0530648// SelfTestDevice unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400649func (oo *OpenOLT) SelfTestDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
650 return nil, olterrors.ErrNotImplemented
651}