blob: 0df51406272593459b5caa66e2b2c8f350b8f78e [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
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})
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530411 var handler *DeviceHandler
412 var onuDevice *voltha.Device
kesavand62126212021-01-12 04:56:06 -0500413
414 errResp := func(status extension.GetValueResponse_Status,
415 reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
416 return &extension.SingleGetValueResponse{
417 Response: &extension.GetValueResponse{
418 Status: status,
419 ErrReason: reason,
420 },
421 }
422 }
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530423
424 switch request.GetRequest().GetRequest().(type) {
425 case *extension.GetValueRequest_OnuStatsFromOlt:
426 handler, onuDevice = oo.GetDeviceHandlerFromChild(ctx, request.TargetId)
427 default:
428 handler = oo.getDeviceHandler(request.TargetId)
429 }
430
431 if handler != nil {
kesavand62126212021-01-12 04:56:06 -0500432 switch reqType := request.GetRequest().GetRequest().(type) {
433 case *extension.GetValueRequest_OltPortInfo:
434 return handler.getOltPortCounters(ctx, reqType.OltPortInfo), nil
Himani Chawla2c8ae0f2021-05-18 23:27:00 +0530435 case *extension.GetValueRequest_OnuPonInfo:
436 return handler.getOnuPonCounters(ctx, reqType.OnuPonInfo), nil
Gamze Abaka85e9a142021-05-26 13:41:39 +0000437 case *extension.GetValueRequest_RxPower:
438 return handler.getRxPower(ctx, reqType.RxPower), nil
praneeth nalmas55616d62023-02-06 09:19:18 +0530439 case *extension.GetValueRequest_OltRxPower:
440 return handler.getPONRxPower(ctx, reqType.OltRxPower), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530441 case *extension.GetValueRequest_OffloadedAppsStats:
442 return handler.getOltOffloadStats(ctx, reqType.OffloadedAppsStats), nil
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530443 case *extension.GetValueRequest_OnuStatsFromOlt:
444 return handler.getOnuStatsFromOlt(ctx, reqType.OnuStatsFromOlt, onuDevice), nil
Akash Reddy Kankanalad9ec4822025-06-10 22:59:53 +0530445 case *extension.GetValueRequest_OltPonStats:
446 return handler.getPonPortStats(ctx, reqType.OltPonStats), nil
447 case *extension.GetValueRequest_OltNniStats:
448 return handler.getNniPortStats(ctx, reqType.OltNniStats), nil
kesavand62126212021-01-12 04:56:06 -0500449 default:
450 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
451 }
452 }
453
454 logger.Infow(ctx, "Single_get_value_request failed ", log.Fields{"request": request})
455 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE_ID), nil
456}
khenaidoo106c61a2021-08-11 18:05:46 -0400457
Akash Soni3bcf5e02024-12-03 08:01:48 +0530458// SetSingleValue is implemented
459func (oo *OpenOLT) SetSingleValue(ctx context.Context, request *extension.SingleSetValueRequest) (*extension.SingleSetValueResponse, error) {
460 logger.Infow(ctx, "single_set_value_request", log.Fields{"request": request})
461
462 errResp := func(status extension.SetValueResponse_Status,
463 reason extension.SetValueResponse_ErrorReason) *extension.SingleSetValueResponse {
464 return &extension.SingleSetValueResponse{
465 Response: &extension.SetValueResponse{
466 Status: status,
467 ErrReason: reason,
468 },
469 }
470 }
471 if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
472 switch reqType := request.GetRequest().GetRequest().(type) {
473 case *extension.SetValueRequest_AppOffloadConfig:
Akash Soni3c75ad72024-12-23 12:09:48 +0530474 return handler.setOltOffload(ctx, reqType.AppOffloadConfig), nil
475 case *extension.SetValueRequest_AppOffloadOnuConfig:
476 return handler.setOnuOffload(ctx, reqType.AppOffloadOnuConfig), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530477 default:
478 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_UNSUPPORTED), nil
479 }
480 }
481
482 logger.Infow(ctx, "Single_set_value_request failed ", log.Fields{"request": request})
483 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_INVALID_DEVICE_ID), nil
484}
485
Akash Reddy Kankanalac6b6ca12025-06-12 14:26:57 +0530486func (oo *OpenOLT) GetDeviceHandlerFromChild(ctx context.Context, deviceId string) (*DeviceHandler, *voltha.Device) {
487 oo.lockDeviceHandlersMap.Lock()
488 defer oo.lockDeviceHandlersMap.Unlock()
489
490 for parentId, handler := range oo.deviceHandlers {
491 devices, _ := handler.getChildDevicesFromCore(ctx, parentId)
492 if devices != nil {
493 for _, onuDevice := range devices.Items {
494 if onuDevice.Id == deviceId {
495 return handler, onuDevice
496 }
497 }
498 }
499 }
500 return nil, nil
501}
502
khenaidoo106c61a2021-08-11 18:05:46 -0400503/*
504 * OLT Inter-adapter service
505 */
506
kesavandb9f54fd2021-11-25 20:08:04 +0530507// ProxyOmciRequests proxies an onu sw download OMCI request from the child adapter
508func (oo *OpenOLT) ProxyOmciRequests(ctx context.Context, request *ia.OmciMessages) (*empty.Empty, error) {
509 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
510 if err := handler.ProxyOmciRequests(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530511 return nil, err
kesavandb9f54fd2021-11-25 20:08:04 +0530512 }
513 return &empty.Empty{}, nil
514 }
515 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
516}
517
khenaidoo106c61a2021-08-11 18:05:46 -0400518// ProxyOmciRequest proxies an OMCI request from the child adapter
khenaidoodc2116e2021-10-19 17:33:19 -0400519func (oo *OpenOLT) ProxyOmciRequest(ctx context.Context, request *ia.OmciMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400520 logger.Debugw(ctx, "proxy-omci-request", log.Fields{"request": request})
521
522 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
523 if err := handler.ProxyOmciMessage(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530524 return nil, err
khenaidoo106c61a2021-08-11 18:05:46 -0400525 }
526 return &empty.Empty{}, nil
527 }
528 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
529}
530
531// GetTechProfileInstance returns an instance of a tech profile
khenaidoodc2116e2021-10-19 17:33:19 -0400532func (oo *OpenOLT) GetTechProfileInstance(ctx context.Context, request *ia.TechProfileInstanceRequestMessage) (*ia.TechProfileDownloadMessage, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400533 logger.Debugw(ctx, "getting-tech-profile-request", log.Fields{"request": request})
534
535 targetDeviceID := request.ParentDeviceId
536 if targetDeviceID == "" {
537 return nil, olterrors.NewErrNotFound("parent-id-empty", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
538 }
539 if handler := oo.getDeviceHandler(targetDeviceID); handler != nil {
540 return handler.GetTechProfileDownloadMessage(ctx, request)
541 }
542 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 -0400543}
544
khenaidooefff76e2021-12-15 16:51:30 -0500545// GetHealthStatus is used by a OltAdapterService client to detect a connection
546// lost with the gRPC server hosting the OltAdapterService service
547func (oo *OpenOLT) GetHealthStatus(stream adapter_service.AdapterService_GetHealthStatusServer) error {
548 ctx := context.Background()
549 logger.Debugw(ctx, "receive-stream-connection", log.Fields{"stream": stream})
550
551 if stream == nil {
552 return fmt.Errorf("conn-is-nil %v", stream)
553 }
554 initialRequestTime := time.Now()
555 var remoteClient *common.Connection
556 var tempClient *common.Connection
557 var err error
558loop:
559 for {
560 tempClient, err = stream.Recv()
561 if err != nil {
562 logger.Warnw(ctx, "received-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
563 break loop
564 }
565 // Send a response back
566 err = stream.Send(&health.HealthStatus{State: health.HealthStatus_HEALTHY})
567 if err != nil {
568 logger.Warnw(ctx, "sending-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
569 break loop
570 }
571
572 remoteClient = tempClient
573 logger.Debugw(ctx, "received-keep-alive", log.Fields{"remote-client": remoteClient})
574
575 select {
576 case <-stream.Context().Done():
577 logger.Infow(ctx, "stream-keep-alive-context-done", log.Fields{"remote-client": remoteClient, "error": stream.Context().Err()})
578 break loop
579 case <-oo.exitChannel:
580 logger.Warnw(ctx, "received-stop", log.Fields{"remote-client": remoteClient, "initial-conn-time": initialRequestTime})
581 break loop
582 default:
583 }
584 }
585 logger.Errorw(ctx, "connection-down", log.Fields{"remote-client": remoteClient, "error": err, "initial-conn-time": initialRequestTime})
586 return err
587}
588
khenaidoo106c61a2021-08-11 18:05:46 -0400589/*
590 *
591 * Unimplemented APIs
592 *
593 */
594
praneeth nalmas55616d62023-02-06 09:19:18 +0530595// SimulateAlarm is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400596func (oo *OpenOLT) SimulateAlarm(context.Context, *ca.SimulateAlarmMessage) (*voltha.OperationResp, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400597 return nil, olterrors.ErrNotImplemented
598}
599
praneeth nalmas55616d62023-02-06 09:19:18 +0530600// SetExtValue is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400601func (oo *OpenOLT) SetExtValue(context.Context, *ca.SetExtValueMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400602 return nil, olterrors.ErrNotImplemented
603}
604
praneeth nalmas55616d62023-02-06 09:19:18 +0530605// StartOmciTest not implemented
khenaidoodc2116e2021-10-19 17:33:19 -0400606func (oo *OpenOLT) StartOmciTest(ctx context.Context, test *ca.OMCITest) (*omci.TestResponse, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400607 return nil, olterrors.ErrNotImplemented
608}
609
praneeth nalmas55616d62023-02-06 09:19:18 +0530610// SuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400611func (oo *OpenOLT) SuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
612 return nil, olterrors.ErrNotImplemented
613}
614
praneeth nalmas55616d62023-02-06 09:19:18 +0530615// UnSuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400616func (oo *OpenOLT) UnSuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
617 return nil, olterrors.ErrNotImplemented
618}
619
praneeth nalmas55616d62023-02-06 09:19:18 +0530620// DownloadImage is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400621func (oo *OpenOLT) DownloadImage(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400622 return nil, olterrors.ErrNotImplemented
623}
624
praneeth nalmas55616d62023-02-06 09:19:18 +0530625// GetImageDownloadStatus is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400626func (oo *OpenOLT) GetImageDownloadStatus(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400627 return nil, olterrors.ErrNotImplemented
628}
629
praneeth nalmas55616d62023-02-06 09:19:18 +0530630// CancelImageDownload is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400631func (oo *OpenOLT) CancelImageDownload(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400632 return nil, olterrors.ErrNotImplemented
633}
634
praneeth nalmas55616d62023-02-06 09:19:18 +0530635// ActivateImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400636func (oo *OpenOLT) ActivateImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400637 return nil, olterrors.ErrNotImplemented
638}
639
praneeth nalmas55616d62023-02-06 09:19:18 +0530640// RevertImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400641func (oo *OpenOLT) RevertImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400642 return nil, olterrors.ErrNotImplemented
643}
644
praneeth nalmas55616d62023-02-06 09:19:18 +0530645// DownloadOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400646func (oo *OpenOLT) DownloadOnuImage(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
647 return nil, olterrors.ErrNotImplemented
648}
649
praneeth nalmas55616d62023-02-06 09:19:18 +0530650// GetOnuImageStatus unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400651func (oo *OpenOLT) GetOnuImageStatus(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
652 return nil, olterrors.ErrNotImplemented
653}
654
praneeth nalmas55616d62023-02-06 09:19:18 +0530655// AbortOnuImageUpgrade unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400656func (oo *OpenOLT) AbortOnuImageUpgrade(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
657 return nil, olterrors.ErrNotImplemented
658}
659
praneeth nalmas55616d62023-02-06 09:19:18 +0530660// GetOnuImages unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400661func (oo *OpenOLT) GetOnuImages(ctx context.Context, deviceID *common.ID) (*voltha.OnuImages, error) {
662 return nil, olterrors.ErrNotImplemented
663}
664
praneeth nalmas55616d62023-02-06 09:19:18 +0530665// ActivateOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400666func (oo *OpenOLT) ActivateOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
667 return nil, olterrors.ErrNotImplemented
668}
669
praneeth nalmas55616d62023-02-06 09:19:18 +0530670// CommitOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400671func (oo *OpenOLT) CommitOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
672 return nil, olterrors.ErrNotImplemented
673}
674
675// UpdateFlowsBulk is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400676func (oo *OpenOLT) UpdateFlowsBulk(ctx context.Context, flows *ca.BulkFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400677 return nil, olterrors.ErrNotImplemented
678}
679
praneeth nalmas55616d62023-02-06 09:19:18 +0530680// SelfTestDevice unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400681func (oo *OpenOLT) SelfTestDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
682 return nil, olterrors.ErrNotImplemented
683}