blob: c6d5563831f6143da552bbfef9f669c27dd130f5 [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 }
277 oo.deleteDeviceHandlerToMap(handler)
khenaidoo106c61a2021-08-11 18:05:46 -0400278 return &empty.Empty{}, nil
Devmalya Paul495b94a2019-08-27 19:42:00 -0400279 }
khenaidoo106c61a2021-08-11 18:05:46 -0400280 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400281}
282
praneeth nalmas55616d62023-02-06 09:19:18 +0530283// UpdateFlowsIncrementally updates (add/remove) the flows on a given device
khenaidoodc2116e2021-10-19 17:33:19 -0400284func (oo *OpenOLT) UpdateFlowsIncrementally(ctx context.Context, incrFlows *ca.IncrementalFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400285 logger.Infow(ctx, "update_flows_incrementally", log.Fields{"device-id": incrFlows.Device.Id, "flows": incrFlows.Flows, "flowMetadata": incrFlows.FlowMetadata})
286 if handler := oo.getDeviceHandler(incrFlows.Device.Id); handler != nil {
287 if err := handler.UpdateFlowsIncrementally(log.WithSpanFromContext(context.Background(), ctx), incrFlows.Device, incrFlows.Flows, incrFlows.Groups, incrFlows.FlowMetadata); err != nil {
288 return nil, err
289 }
290 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400291 }
khenaidoo106c61a2021-08-11 18:05:46 -0400292 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": incrFlows.Device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400293}
294
praneeth nalmas55616d62023-02-06 09:19:18 +0530295// UpdatePmConfig returns PmConfigs nil or error
khenaidoodc2116e2021-10-19 17:33:19 -0400296func (oo *OpenOLT) UpdatePmConfig(ctx context.Context, configs *ca.PmConfigsInfo) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400297 logger.Debugw(ctx, "update_pm_config", log.Fields{"device-id": configs.DeviceId, "pm-configs": configs.PmConfigs})
298 if handler := oo.getDeviceHandler(configs.DeviceId); handler != nil {
299 handler.UpdatePmConfig(log.WithSpanFromContext(context.Background(), ctx), configs.PmConfigs)
300 return &empty.Empty{}, nil
Rohan Agrawalda5e0b22020-05-20 11:10:26 +0000301 }
khenaidoo106c61a2021-08-11 18:05:46 -0400302 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": configs.DeviceId}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400303}
304
praneeth nalmas55616d62023-02-06 09:19:18 +0530305// SendPacketOut sends packet out to the device
khenaidoodc2116e2021-10-19 17:33:19 -0400306func (oo *OpenOLT) SendPacketOut(ctx context.Context, packet *ca.PacketOut) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400307 logger.Debugw(ctx, "send_packet_out", log.Fields{"device-id": packet.DeviceId, "egress_port_no": packet.EgressPortNo, "pkt": packet.Packet})
308 if handler := oo.getDeviceHandler(packet.DeviceId); handler != nil {
309 if err := handler.PacketOut(log.WithSpanFromContext(context.Background(), ctx), packet.EgressPortNo, packet.Packet); err != nil {
310 return nil, err
311 }
312 return &empty.Empty{}, nil
manikkaraj k9eb6cac2019-05-09 12:32:03 -0400313 }
khenaidoo106c61a2021-08-11 18:05:46 -0400314 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": packet.DeviceId}, nil)
315
Girish Gowdru0c588b22019-04-23 23:24:56 -0400316}
317
khenaidoo106c61a2021-08-11 18:05:46 -0400318// EnablePort to Enable PON/NNI interface
319func (oo *OpenOLT) EnablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
320 logger.Infow(ctx, "enable_port", log.Fields{"device-id": port.DeviceId, "port": port})
321 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, true); err != nil {
322 return nil, err
323 }
324 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400325}
326
khenaidoo106c61a2021-08-11 18:05:46 -0400327// DisablePort to Disable pon/nni interface
328func (oo *OpenOLT) DisablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
329 logger.Infow(ctx, "disable_port", log.Fields{"device-id": port.DeviceId, "port": port})
330 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, false); err != nil {
331 return nil, err
332 }
333 return &empty.Empty{}, nil
kesavand39e0aa32020-01-28 20:58:50 -0500334}
335
336// enableDisablePort to Disable pon or Enable PON interface
Neha Sharma96b7bf22020-06-15 10:37:32 +0000337func (oo *OpenOLT) enableDisablePort(ctx context.Context, deviceID string, port *voltha.Port, enablePort bool) error {
divyadesai3af43e12020-08-18 07:10:54 +0000338 logger.Infow(ctx, "enableDisablePort", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500339 if port == nil {
Thomas Lee S94109f12020-03-03 16:39:29 +0530340 return olterrors.NewErrInvalidValue(log.Fields{
David K. Bainbridge794735f2020-02-11 21:01:37 -0800341 "reason": "port cannot be nil",
342 "device-id": deviceID,
Girish Kumarf26e4882020-03-05 06:49:10 +0000343 "port": nil}, nil)
kesavand39e0aa32020-01-28 20:58:50 -0500344 }
345 if handler := oo.getDeviceHandler(deviceID); handler != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000346 logger.Debugw(ctx, "Enable_Disable_Port", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500347 if enablePort {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000348 if err := handler.EnablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000349 return olterrors.NewErrAdapter("error-occurred-during-enable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500350 }
351 } else {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000352 if err := handler.DisablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000353 return olterrors.NewErrAdapter("error-occurred-during-disable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500354 }
355 }
356 }
357 return nil
358}
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500359
praneeth nalmas55616d62023-02-06 09:19:18 +0530360// ChildDeviceLost deletes the ONU and its references from PONResources
khenaidoo106c61a2021-08-11 18:05:46 -0400361func (oo *OpenOLT) ChildDeviceLost(ctx context.Context, childDevice *voltha.Device) (*empty.Empty, error) {
Girish Gowdraa0870562021-03-11 14:30:14 -0800362 logger.Infow(ctx, "Child-device-lost", log.Fields{"parent-device-id": childDevice.ParentId, "child-device-id": childDevice.Id})
363 if handler := oo.getDeviceHandler(childDevice.ParentId); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400364 if err := handler.ChildDeviceLost(log.WithSpanFromContext(context.Background(), ctx), childDevice.ParentPortNo, childDevice.ProxyAddress.OnuId, childDevice.SerialNumber); err != nil {
365 return nil, err
366 }
367 return &empty.Empty{}, nil
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500368 }
khenaidoo106c61a2021-08-11 18:05:46 -0400369 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"parent-device-id": childDevice.ParentId}, nil).Log()
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500370}
Scott Baker24f83e22020-03-30 16:14:28 -0700371
khenaidoo106c61a2021-08-11 18:05:46 -0400372// GetExtValue retrieves a value on a particular ONU
khenaidoodc2116e2021-10-19 17:33:19 -0400373func (oo *OpenOLT) GetExtValue(ctx context.Context, extInfo *ca.GetExtValueMessage) (*extension.ReturnValues, error) {
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800374 var err error
khenaidoodc2116e2021-10-19 17:33:19 -0400375 resp := new(extension.ReturnValues)
khenaidoo106c61a2021-08-11 18:05:46 -0400376 logger.Infow(ctx, "get_ext_value", log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id})
377 if handler := oo.getDeviceHandler(extInfo.ParentDevice.Id); handler != nil {
378 if resp, err = handler.getExtValue(ctx, extInfo.ChildDevice, extInfo.ValueType); err != nil {
379 logger.Errorw(ctx, "error-occurred-during-get-ext-value",
380 log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id, "error": err})
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800381 return nil, err
382 }
383 }
384 return resp, nil
385}
kesavand62126212021-01-12 04:56:06 -0500386
praneeth nalmas55616d62023-02-06 09:19:18 +0530387// GetSingleValue handles get uni status on ONU and ondemand metric on OLT
khenaidoo106c61a2021-08-11 18:05:46 -0400388func (oo *OpenOLT) GetSingleValue(ctx context.Context, request *extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
389 logger.Infow(ctx, "single_get_value_request", log.Fields{"request": request})
kesavand62126212021-01-12 04:56:06 -0500390
391 errResp := func(status extension.GetValueResponse_Status,
392 reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
393 return &extension.SingleGetValueResponse{
394 Response: &extension.GetValueResponse{
395 Status: status,
396 ErrReason: reason,
397 },
398 }
399 }
400 if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
401 switch reqType := request.GetRequest().GetRequest().(type) {
402 case *extension.GetValueRequest_OltPortInfo:
403 return handler.getOltPortCounters(ctx, reqType.OltPortInfo), nil
Himani Chawla2c8ae0f2021-05-18 23:27:00 +0530404 case *extension.GetValueRequest_OnuPonInfo:
405 return handler.getOnuPonCounters(ctx, reqType.OnuPonInfo), nil
Gamze Abaka85e9a142021-05-26 13:41:39 +0000406 case *extension.GetValueRequest_RxPower:
407 return handler.getRxPower(ctx, reqType.RxPower), nil
praneeth nalmas55616d62023-02-06 09:19:18 +0530408 case *extension.GetValueRequest_OltRxPower:
409 return handler.getPONRxPower(ctx, reqType.OltRxPower), nil
Akash Soni3bcf5e02024-12-03 08:01:48 +0530410 case *extension.GetValueRequest_OffloadedAppsStats:
411 return handler.getOltOffloadStats(ctx, reqType.OffloadedAppsStats), nil
kesavand62126212021-01-12 04:56:06 -0500412 default:
413 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
414 }
415 }
416
417 logger.Infow(ctx, "Single_get_value_request failed ", log.Fields{"request": request})
418 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE_ID), nil
419}
khenaidoo106c61a2021-08-11 18:05:46 -0400420
Akash Soni3bcf5e02024-12-03 08:01:48 +0530421// SetSingleValue is implemented
422func (oo *OpenOLT) SetSingleValue(ctx context.Context, request *extension.SingleSetValueRequest) (*extension.SingleSetValueResponse, error) {
423 logger.Infow(ctx, "single_set_value_request", log.Fields{"request": request})
424
425 errResp := func(status extension.SetValueResponse_Status,
426 reason extension.SetValueResponse_ErrorReason) *extension.SingleSetValueResponse {
427 return &extension.SingleSetValueResponse{
428 Response: &extension.SetValueResponse{
429 Status: status,
430 ErrReason: reason,
431 },
432 }
433 }
434 if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
435 switch reqType := request.GetRequest().GetRequest().(type) {
436 case *extension.SetValueRequest_AppOffloadConfig:
437 return handler.setOltOffloadStats(ctx, reqType.AppOffloadConfig), nil
438 default:
439 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_UNSUPPORTED), nil
440 }
441 }
442
443 logger.Infow(ctx, "Single_set_value_request failed ", log.Fields{"request": request})
444 return errResp(extension.SetValueResponse_ERROR, extension.SetValueResponse_INVALID_DEVICE_ID), nil
445}
446
khenaidoo106c61a2021-08-11 18:05:46 -0400447/*
448 * OLT Inter-adapter service
449 */
450
kesavandb9f54fd2021-11-25 20:08:04 +0530451// ProxyOmciRequests proxies an onu sw download OMCI request from the child adapter
452func (oo *OpenOLT) ProxyOmciRequests(ctx context.Context, request *ia.OmciMessages) (*empty.Empty, error) {
453 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
454 if err := handler.ProxyOmciRequests(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530455 return nil, err
kesavandb9f54fd2021-11-25 20:08:04 +0530456 }
457 return &empty.Empty{}, nil
458 }
459 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
460}
461
khenaidoo106c61a2021-08-11 18:05:46 -0400462// ProxyOmciRequest proxies an OMCI request from the child adapter
khenaidoodc2116e2021-10-19 17:33:19 -0400463func (oo *OpenOLT) ProxyOmciRequest(ctx context.Context, request *ia.OmciMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400464 logger.Debugw(ctx, "proxy-omci-request", log.Fields{"request": request})
465
466 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
467 if err := handler.ProxyOmciMessage(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530468 return nil, err
khenaidoo106c61a2021-08-11 18:05:46 -0400469 }
470 return &empty.Empty{}, nil
471 }
472 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
473}
474
475// GetTechProfileInstance returns an instance of a tech profile
khenaidoodc2116e2021-10-19 17:33:19 -0400476func (oo *OpenOLT) GetTechProfileInstance(ctx context.Context, request *ia.TechProfileInstanceRequestMessage) (*ia.TechProfileDownloadMessage, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400477 logger.Debugw(ctx, "getting-tech-profile-request", log.Fields{"request": request})
478
479 targetDeviceID := request.ParentDeviceId
480 if targetDeviceID == "" {
481 return nil, olterrors.NewErrNotFound("parent-id-empty", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
482 }
483 if handler := oo.getDeviceHandler(targetDeviceID); handler != nil {
484 return handler.GetTechProfileDownloadMessage(ctx, request)
485 }
486 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
487
488}
489
khenaidooefff76e2021-12-15 16:51:30 -0500490// GetHealthStatus is used by a OltAdapterService client to detect a connection
491// lost with the gRPC server hosting the OltAdapterService service
492func (oo *OpenOLT) GetHealthStatus(stream adapter_service.AdapterService_GetHealthStatusServer) error {
493 ctx := context.Background()
494 logger.Debugw(ctx, "receive-stream-connection", log.Fields{"stream": stream})
495
496 if stream == nil {
497 return fmt.Errorf("conn-is-nil %v", stream)
498 }
499 initialRequestTime := time.Now()
500 var remoteClient *common.Connection
501 var tempClient *common.Connection
502 var err error
503loop:
504 for {
505 tempClient, err = stream.Recv()
506 if err != nil {
507 logger.Warnw(ctx, "received-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
508 break loop
509 }
510 // Send a response back
511 err = stream.Send(&health.HealthStatus{State: health.HealthStatus_HEALTHY})
512 if err != nil {
513 logger.Warnw(ctx, "sending-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
514 break loop
515 }
516
517 remoteClient = tempClient
518 logger.Debugw(ctx, "received-keep-alive", log.Fields{"remote-client": remoteClient})
519
520 select {
521 case <-stream.Context().Done():
522 logger.Infow(ctx, "stream-keep-alive-context-done", log.Fields{"remote-client": remoteClient, "error": stream.Context().Err()})
523 break loop
524 case <-oo.exitChannel:
525 logger.Warnw(ctx, "received-stop", log.Fields{"remote-client": remoteClient, "initial-conn-time": initialRequestTime})
526 break loop
527 default:
528 }
529 }
530 logger.Errorw(ctx, "connection-down", log.Fields{"remote-client": remoteClient, "error": err, "initial-conn-time": initialRequestTime})
531 return err
532}
533
khenaidoo106c61a2021-08-11 18:05:46 -0400534/*
535 *
536 * Unimplemented APIs
537 *
538 */
539
praneeth nalmas55616d62023-02-06 09:19:18 +0530540// SimulateAlarm is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400541func (oo *OpenOLT) SimulateAlarm(context.Context, *ca.SimulateAlarmMessage) (*voltha.OperationResp, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400542 return nil, olterrors.ErrNotImplemented
543}
544
praneeth nalmas55616d62023-02-06 09:19:18 +0530545// SetExtValue is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400546func (oo *OpenOLT) SetExtValue(context.Context, *ca.SetExtValueMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400547 return nil, olterrors.ErrNotImplemented
548}
549
praneeth nalmas55616d62023-02-06 09:19:18 +0530550// StartOmciTest not implemented
khenaidoodc2116e2021-10-19 17:33:19 -0400551func (oo *OpenOLT) StartOmciTest(ctx context.Context, test *ca.OMCITest) (*omci.TestResponse, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400552 return nil, olterrors.ErrNotImplemented
553}
554
praneeth nalmas55616d62023-02-06 09:19:18 +0530555// SuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400556func (oo *OpenOLT) SuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
557 return nil, olterrors.ErrNotImplemented
558}
559
praneeth nalmas55616d62023-02-06 09:19:18 +0530560// UnSuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400561func (oo *OpenOLT) UnSuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
562 return nil, olterrors.ErrNotImplemented
563}
564
praneeth nalmas55616d62023-02-06 09:19:18 +0530565// DownloadImage is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400566func (oo *OpenOLT) DownloadImage(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400567 return nil, olterrors.ErrNotImplemented
568}
569
praneeth nalmas55616d62023-02-06 09:19:18 +0530570// GetImageDownloadStatus is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400571func (oo *OpenOLT) GetImageDownloadStatus(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400572 return nil, olterrors.ErrNotImplemented
573}
574
praneeth nalmas55616d62023-02-06 09:19:18 +0530575// CancelImageDownload is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400576func (oo *OpenOLT) CancelImageDownload(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400577 return nil, olterrors.ErrNotImplemented
578}
579
praneeth nalmas55616d62023-02-06 09:19:18 +0530580// ActivateImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400581func (oo *OpenOLT) ActivateImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400582 return nil, olterrors.ErrNotImplemented
583}
584
praneeth nalmas55616d62023-02-06 09:19:18 +0530585// RevertImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400586func (oo *OpenOLT) RevertImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400587 return nil, olterrors.ErrNotImplemented
588}
589
praneeth nalmas55616d62023-02-06 09:19:18 +0530590// DownloadOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400591func (oo *OpenOLT) DownloadOnuImage(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
592 return nil, olterrors.ErrNotImplemented
593}
594
praneeth nalmas55616d62023-02-06 09:19:18 +0530595// GetOnuImageStatus unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400596func (oo *OpenOLT) GetOnuImageStatus(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
597 return nil, olterrors.ErrNotImplemented
598}
599
praneeth nalmas55616d62023-02-06 09:19:18 +0530600// AbortOnuImageUpgrade unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400601func (oo *OpenOLT) AbortOnuImageUpgrade(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
602 return nil, olterrors.ErrNotImplemented
603}
604
praneeth nalmas55616d62023-02-06 09:19:18 +0530605// GetOnuImages unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400606func (oo *OpenOLT) GetOnuImages(ctx context.Context, deviceID *common.ID) (*voltha.OnuImages, error) {
607 return nil, olterrors.ErrNotImplemented
608}
609
praneeth nalmas55616d62023-02-06 09:19:18 +0530610// ActivateOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400611func (oo *OpenOLT) ActivateOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
612 return nil, olterrors.ErrNotImplemented
613}
614
praneeth nalmas55616d62023-02-06 09:19:18 +0530615// CommitOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400616func (oo *OpenOLT) CommitOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
617 return nil, olterrors.ErrNotImplemented
618}
619
620// UpdateFlowsBulk is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400621func (oo *OpenOLT) UpdateFlowsBulk(ctx context.Context, flows *ca.BulkFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400622 return nil, olterrors.ErrNotImplemented
623}
624
praneeth nalmas55616d62023-02-06 09:19:18 +0530625// SelfTestDevice unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400626func (oo *OpenOLT) SelfTestDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
627 return nil, olterrors.ErrNotImplemented
628}