blob: b9f68dc25e809ada4c740ac7e3e4ee849e6b515a [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
khenaidoo106c61a2021-08-11 18:05:46 -0400178 cgClient, err := oo.coreClient.GetCoreServiceClient()
Manindere49938d2021-03-19 00:23:24 +0530179 if err != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400180 return nil, err
Manindere49938d2021-03-19 00:23:24 +0530181 }
khenaidoo106c61a2021-08-11 18:05:46 -0400182 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), oo.rpcTimeout)
183 defer cancel()
khenaidoodc2116e2021-10-19 17:33:19 -0400184 if _, err := cgClient.DeviceStateUpdate(subCtx, &ca.DeviceStateFilter{
khenaidoo106c61a2021-08-11 18:05:46 -0400185 DeviceId: device.Id,
186 OperStatus: voltha.OperStatus_RECONCILING,
Akash Sonif49299a2024-04-25 12:06:37 +0530187 ConnStatus: voltha.ConnectStatus_UNREACHABLE,
khenaidoo106c61a2021-08-11 18:05:46 -0400188 }); err != nil {
189 return nil, olterrors.NewErrAdapter("device-update-failed", log.Fields{"device-id": device.Id}, err)
190 }
191
Akash Sonif49299a2024-04-25 12:06:37 +0530192 // 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 -0700193 // locally cached copy of the device struct.
194 device.OperStatus = voltha.OperStatus_RECONCILING
Akash Sonif49299a2024-04-25 12:06:37 +0530195 device.ConnectStatus = voltha.ConnectStatus_UNREACHABLE
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700196 handler := NewDeviceHandler(oo.coreClient, oo.eventProxy, device, oo, oo.configManager, oo.config)
197 handler.adapterPreviouslyConnected = true
198 oo.addDeviceHandlerToMap(handler)
199 handler.transitionMap = NewTransitionMap(handler)
200
khenaidoo106c61a2021-08-11 18:05:46 -0400201 handler.transitionMap.Handle(log.WithSpanFromContext(context.Background(), ctx), DeviceInit)
nikesh.krishnan4d644532023-12-16 00:21:07 +0530202 } else {
203 logger.Warnf(ctx, "device-already-reconciled-or-active", log.Fields{"device-id": device.Id})
204 return &empty.Empty{}, status.Errorf(codes.AlreadyExists, "handler exists: %s", device.Id)
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530205 }
khenaidoo106c61a2021-08-11 18:05:46 -0400206 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400207}
208
praneeth nalmas55616d62023-02-06 09:19:18 +0530209// DisableDevice disables the given device
khenaidoo106c61a2021-08-11 18:05:46 -0400210func (oo *OpenOLT) DisableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000211 logger.Infow(ctx, "disable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400212 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400213 if err := handler.DisableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
214 return nil, err
215 }
216 return &empty.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400217 }
khenaidoo106c61a2021-08-11 18:05:46 -0400218 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400219}
220
praneeth nalmas55616d62023-02-06 09:19:18 +0530221// ReEnableDevice enables the olt device after disable
khenaidoo106c61a2021-08-11 18:05:46 -0400222func (oo *OpenOLT) ReEnableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000223 logger.Infow(ctx, "reenable-device", log.Fields{"device-id": device.Id})
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400224 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400225 if err := handler.ReenableDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
226 return nil, err
227 }
228 return &empty.Empty{}, nil
Girish Gowdru5ba46c92019-04-25 05:00:05 -0400229 }
khenaidoo106c61a2021-08-11 18:05:46 -0400230 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400231}
232
praneeth nalmas55616d62023-02-06 09:19:18 +0530233// RebootDevice reboots the given device
khenaidoo106c61a2021-08-11 18:05:46 -0400234func (oo *OpenOLT) RebootDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000235 logger.Infow(ctx, "reboot-device", log.Fields{"device-id": device.Id})
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400236 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400237 if err := handler.RebootDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
238 return nil, err
239 }
240 return &empty.Empty{}, nil
Girish Gowdru0fe5f7e2019-05-28 05:12:27 -0400241 }
khenaidoo106c61a2021-08-11 18:05:46 -0400242 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
243
Girish Gowdru0c588b22019-04-23 23:24:56 -0400244}
245
praneeth nalmas55616d62023-02-06 09:19:18 +0530246// DeleteDevice deletes a device
khenaidoo106c61a2021-08-11 18:05:46 -0400247func (oo *OpenOLT) DeleteDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
divyadesai3af43e12020-08-18 07:10:54 +0000248 logger.Infow(ctx, "delete-device", log.Fields{"device-id": device.Id})
Devmalya Paul495b94a2019-08-27 19:42:00 -0400249 if handler := oo.getDeviceHandler(device.Id); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400250 if err := handler.DeleteDevice(log.WithSpanFromContext(context.Background(), ctx), device); err != nil {
Gustavo Silva41af9122022-10-11 11:05:13 -0300251 return nil, err
Devmalya Paul495b94a2019-08-27 19:42:00 -0400252 }
253 oo.deleteDeviceHandlerToMap(handler)
khenaidoo106c61a2021-08-11 18:05:46 -0400254 return &empty.Empty{}, nil
Devmalya Paul495b94a2019-08-27 19:42:00 -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// UpdateFlowsIncrementally updates (add/remove) the flows on a given device
khenaidoodc2116e2021-10-19 17:33:19 -0400260func (oo *OpenOLT) UpdateFlowsIncrementally(ctx context.Context, incrFlows *ca.IncrementalFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400261 logger.Infow(ctx, "update_flows_incrementally", log.Fields{"device-id": incrFlows.Device.Id, "flows": incrFlows.Flows, "flowMetadata": incrFlows.FlowMetadata})
262 if handler := oo.getDeviceHandler(incrFlows.Device.Id); handler != nil {
263 if err := handler.UpdateFlowsIncrementally(log.WithSpanFromContext(context.Background(), ctx), incrFlows.Device, incrFlows.Flows, incrFlows.Groups, incrFlows.FlowMetadata); err != nil {
264 return nil, err
265 }
266 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400267 }
khenaidoo106c61a2021-08-11 18:05:46 -0400268 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": incrFlows.Device.Id}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400269}
270
praneeth nalmas55616d62023-02-06 09:19:18 +0530271// UpdatePmConfig returns PmConfigs nil or error
khenaidoodc2116e2021-10-19 17:33:19 -0400272func (oo *OpenOLT) UpdatePmConfig(ctx context.Context, configs *ca.PmConfigsInfo) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400273 logger.Debugw(ctx, "update_pm_config", log.Fields{"device-id": configs.DeviceId, "pm-configs": configs.PmConfigs})
274 if handler := oo.getDeviceHandler(configs.DeviceId); handler != nil {
275 handler.UpdatePmConfig(log.WithSpanFromContext(context.Background(), ctx), configs.PmConfigs)
276 return &empty.Empty{}, nil
Rohan Agrawalda5e0b22020-05-20 11:10:26 +0000277 }
khenaidoo106c61a2021-08-11 18:05:46 -0400278 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": configs.DeviceId}, nil)
Girish Gowdru0c588b22019-04-23 23:24:56 -0400279}
280
praneeth nalmas55616d62023-02-06 09:19:18 +0530281// SendPacketOut sends packet out to the device
khenaidoodc2116e2021-10-19 17:33:19 -0400282func (oo *OpenOLT) SendPacketOut(ctx context.Context, packet *ca.PacketOut) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400283 logger.Debugw(ctx, "send_packet_out", log.Fields{"device-id": packet.DeviceId, "egress_port_no": packet.EgressPortNo, "pkt": packet.Packet})
284 if handler := oo.getDeviceHandler(packet.DeviceId); handler != nil {
285 if err := handler.PacketOut(log.WithSpanFromContext(context.Background(), ctx), packet.EgressPortNo, packet.Packet); err != nil {
286 return nil, err
287 }
288 return &empty.Empty{}, nil
manikkaraj k9eb6cac2019-05-09 12:32:03 -0400289 }
khenaidoo106c61a2021-08-11 18:05:46 -0400290 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": packet.DeviceId}, nil)
291
Girish Gowdru0c588b22019-04-23 23:24:56 -0400292}
293
khenaidoo106c61a2021-08-11 18:05:46 -0400294// EnablePort to Enable PON/NNI interface
295func (oo *OpenOLT) EnablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
296 logger.Infow(ctx, "enable_port", log.Fields{"device-id": port.DeviceId, "port": port})
297 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, true); err != nil {
298 return nil, err
299 }
300 return &empty.Empty{}, nil
Girish Gowdru0c588b22019-04-23 23:24:56 -0400301}
302
khenaidoo106c61a2021-08-11 18:05:46 -0400303// DisablePort to Disable pon/nni interface
304func (oo *OpenOLT) DisablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
305 logger.Infow(ctx, "disable_port", log.Fields{"device-id": port.DeviceId, "port": port})
306 if err := oo.enableDisablePort(log.WithSpanFromContext(context.Background(), ctx), port.DeviceId, port, false); err != nil {
307 return nil, err
308 }
309 return &empty.Empty{}, nil
kesavand39e0aa32020-01-28 20:58:50 -0500310}
311
312// enableDisablePort to Disable pon or Enable PON interface
Neha Sharma96b7bf22020-06-15 10:37:32 +0000313func (oo *OpenOLT) enableDisablePort(ctx context.Context, deviceID string, port *voltha.Port, enablePort bool) error {
divyadesai3af43e12020-08-18 07:10:54 +0000314 logger.Infow(ctx, "enableDisablePort", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500315 if port == nil {
Thomas Lee S94109f12020-03-03 16:39:29 +0530316 return olterrors.NewErrInvalidValue(log.Fields{
David K. Bainbridge794735f2020-02-11 21:01:37 -0800317 "reason": "port cannot be nil",
318 "device-id": deviceID,
Girish Kumarf26e4882020-03-05 06:49:10 +0000319 "port": nil}, nil)
kesavand39e0aa32020-01-28 20:58:50 -0500320 }
321 if handler := oo.getDeviceHandler(deviceID); handler != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000322 logger.Debugw(ctx, "Enable_Disable_Port", log.Fields{"device-id": deviceID, "port": port})
kesavand39e0aa32020-01-28 20:58:50 -0500323 if enablePort {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000324 if err := handler.EnablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000325 return olterrors.NewErrAdapter("error-occurred-during-enable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500326 }
327 } else {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000328 if err := handler.DisablePort(ctx, port); err != nil {
divyadesai3af43e12020-08-18 07:10:54 +0000329 return olterrors.NewErrAdapter("error-occurred-during-disable-port", log.Fields{"device-id": deviceID, "port": port}, err)
kesavand39e0aa32020-01-28 20:58:50 -0500330 }
331 }
332 }
333 return nil
334}
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500335
praneeth nalmas55616d62023-02-06 09:19:18 +0530336// ChildDeviceLost deletes the ONU and its references from PONResources
khenaidoo106c61a2021-08-11 18:05:46 -0400337func (oo *OpenOLT) ChildDeviceLost(ctx context.Context, childDevice *voltha.Device) (*empty.Empty, error) {
Girish Gowdraa0870562021-03-11 14:30:14 -0800338 logger.Infow(ctx, "Child-device-lost", log.Fields{"parent-device-id": childDevice.ParentId, "child-device-id": childDevice.Id})
339 if handler := oo.getDeviceHandler(childDevice.ParentId); handler != nil {
khenaidoo106c61a2021-08-11 18:05:46 -0400340 if err := handler.ChildDeviceLost(log.WithSpanFromContext(context.Background(), ctx), childDevice.ParentPortNo, childDevice.ProxyAddress.OnuId, childDevice.SerialNumber); err != nil {
341 return nil, err
342 }
343 return &empty.Empty{}, nil
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500344 }
khenaidoo106c61a2021-08-11 18:05:46 -0400345 return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"parent-device-id": childDevice.ParentId}, nil).Log()
Chaitrashree G S1a55b882020-02-04 17:35:35 -0500346}
Scott Baker24f83e22020-03-30 16:14:28 -0700347
khenaidoo106c61a2021-08-11 18:05:46 -0400348// GetExtValue retrieves a value on a particular ONU
khenaidoodc2116e2021-10-19 17:33:19 -0400349func (oo *OpenOLT) GetExtValue(ctx context.Context, extInfo *ca.GetExtValueMessage) (*extension.ReturnValues, error) {
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800350 var err error
khenaidoodc2116e2021-10-19 17:33:19 -0400351 resp := new(extension.ReturnValues)
khenaidoo106c61a2021-08-11 18:05:46 -0400352 logger.Infow(ctx, "get_ext_value", log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id})
353 if handler := oo.getDeviceHandler(extInfo.ParentDevice.Id); handler != nil {
354 if resp, err = handler.getExtValue(ctx, extInfo.ChildDevice, extInfo.ValueType); err != nil {
355 logger.Errorw(ctx, "error-occurred-during-get-ext-value",
356 log.Fields{"parent-device-id": extInfo.ParentDevice.Id, "onu-id": extInfo.ChildDevice.Id, "error": err})
Dinesh Belwalkardb587af2020-02-27 15:37:16 -0800357 return nil, err
358 }
359 }
360 return resp, nil
361}
kesavand62126212021-01-12 04:56:06 -0500362
praneeth nalmas55616d62023-02-06 09:19:18 +0530363// GetSingleValue handles get uni status on ONU and ondemand metric on OLT
khenaidoo106c61a2021-08-11 18:05:46 -0400364func (oo *OpenOLT) GetSingleValue(ctx context.Context, request *extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
365 logger.Infow(ctx, "single_get_value_request", log.Fields{"request": request})
kesavand62126212021-01-12 04:56:06 -0500366
367 errResp := func(status extension.GetValueResponse_Status,
368 reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
369 return &extension.SingleGetValueResponse{
370 Response: &extension.GetValueResponse{
371 Status: status,
372 ErrReason: reason,
373 },
374 }
375 }
376 if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
377 switch reqType := request.GetRequest().GetRequest().(type) {
378 case *extension.GetValueRequest_OltPortInfo:
379 return handler.getOltPortCounters(ctx, reqType.OltPortInfo), nil
Himani Chawla2c8ae0f2021-05-18 23:27:00 +0530380 case *extension.GetValueRequest_OnuPonInfo:
381 return handler.getOnuPonCounters(ctx, reqType.OnuPonInfo), nil
Gamze Abaka85e9a142021-05-26 13:41:39 +0000382 case *extension.GetValueRequest_RxPower:
383 return handler.getRxPower(ctx, reqType.RxPower), nil
praneeth nalmas55616d62023-02-06 09:19:18 +0530384 case *extension.GetValueRequest_OltRxPower:
385 return handler.getPONRxPower(ctx, reqType.OltRxPower), nil
kesavand62126212021-01-12 04:56:06 -0500386 default:
387 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
388 }
389 }
390
391 logger.Infow(ctx, "Single_get_value_request failed ", log.Fields{"request": request})
392 return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE_ID), nil
393}
khenaidoo106c61a2021-08-11 18:05:46 -0400394
395/*
396 * OLT Inter-adapter service
397 */
398
kesavandb9f54fd2021-11-25 20:08:04 +0530399// ProxyOmciRequests proxies an onu sw download OMCI request from the child adapter
400func (oo *OpenOLT) ProxyOmciRequests(ctx context.Context, request *ia.OmciMessages) (*empty.Empty, error) {
401 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
402 if err := handler.ProxyOmciRequests(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530403 return nil, err
kesavandb9f54fd2021-11-25 20:08:04 +0530404 }
405 return &empty.Empty{}, nil
406 }
407 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
408}
409
khenaidoo106c61a2021-08-11 18:05:46 -0400410// ProxyOmciRequest proxies an OMCI request from the child adapter
khenaidoodc2116e2021-10-19 17:33:19 -0400411func (oo *OpenOLT) ProxyOmciRequest(ctx context.Context, request *ia.OmciMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400412 logger.Debugw(ctx, "proxy-omci-request", log.Fields{"request": request})
413
414 if handler := oo.getDeviceHandler(request.ParentDeviceId); handler != nil {
415 if err := handler.ProxyOmciMessage(ctx, request); err != nil {
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530416 return nil, err
khenaidoo106c61a2021-08-11 18:05:46 -0400417 }
418 return &empty.Empty{}, nil
419 }
420 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.ChildDeviceId}, nil).Log()
421}
422
423// GetTechProfileInstance returns an instance of a tech profile
khenaidoodc2116e2021-10-19 17:33:19 -0400424func (oo *OpenOLT) GetTechProfileInstance(ctx context.Context, request *ia.TechProfileInstanceRequestMessage) (*ia.TechProfileDownloadMessage, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400425 logger.Debugw(ctx, "getting-tech-profile-request", log.Fields{"request": request})
426
427 targetDeviceID := request.ParentDeviceId
428 if targetDeviceID == "" {
429 return nil, olterrors.NewErrNotFound("parent-id-empty", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
430 }
431 if handler := oo.getDeviceHandler(targetDeviceID); handler != nil {
432 return handler.GetTechProfileDownloadMessage(ctx, request)
433 }
434 return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
435
436}
437
khenaidooefff76e2021-12-15 16:51:30 -0500438// GetHealthStatus is used by a OltAdapterService client to detect a connection
439// lost with the gRPC server hosting the OltAdapterService service
440func (oo *OpenOLT) GetHealthStatus(stream adapter_service.AdapterService_GetHealthStatusServer) error {
441 ctx := context.Background()
442 logger.Debugw(ctx, "receive-stream-connection", log.Fields{"stream": stream})
443
444 if stream == nil {
445 return fmt.Errorf("conn-is-nil %v", stream)
446 }
447 initialRequestTime := time.Now()
448 var remoteClient *common.Connection
449 var tempClient *common.Connection
450 var err error
451loop:
452 for {
453 tempClient, err = stream.Recv()
454 if err != nil {
455 logger.Warnw(ctx, "received-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
456 break loop
457 }
458 // Send a response back
459 err = stream.Send(&health.HealthStatus{State: health.HealthStatus_HEALTHY})
460 if err != nil {
461 logger.Warnw(ctx, "sending-stream-error", log.Fields{"remote-client": remoteClient, "error": err})
462 break loop
463 }
464
465 remoteClient = tempClient
466 logger.Debugw(ctx, "received-keep-alive", log.Fields{"remote-client": remoteClient})
467
468 select {
469 case <-stream.Context().Done():
470 logger.Infow(ctx, "stream-keep-alive-context-done", log.Fields{"remote-client": remoteClient, "error": stream.Context().Err()})
471 break loop
472 case <-oo.exitChannel:
473 logger.Warnw(ctx, "received-stop", log.Fields{"remote-client": remoteClient, "initial-conn-time": initialRequestTime})
474 break loop
475 default:
476 }
477 }
478 logger.Errorw(ctx, "connection-down", log.Fields{"remote-client": remoteClient, "error": err, "initial-conn-time": initialRequestTime})
479 return err
480}
481
khenaidoo106c61a2021-08-11 18:05:46 -0400482/*
483 *
484 * Unimplemented APIs
485 *
486 */
487
praneeth nalmas55616d62023-02-06 09:19:18 +0530488// SimulateAlarm is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400489func (oo *OpenOLT) SimulateAlarm(context.Context, *ca.SimulateAlarmMessage) (*voltha.OperationResp, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400490 return nil, olterrors.ErrNotImplemented
491}
492
praneeth nalmas55616d62023-02-06 09:19:18 +0530493// SetExtValue is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400494func (oo *OpenOLT) SetExtValue(context.Context, *ca.SetExtValueMessage) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400495 return nil, olterrors.ErrNotImplemented
496}
497
praneeth nalmas55616d62023-02-06 09:19:18 +0530498// SetSingleValue is unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400499func (oo *OpenOLT) SetSingleValue(context.Context, *extension.SingleSetValueRequest) (*extension.SingleSetValueResponse, error) {
500 return nil, olterrors.ErrNotImplemented
501}
502
praneeth nalmas55616d62023-02-06 09:19:18 +0530503// StartOmciTest not implemented
khenaidoodc2116e2021-10-19 17:33:19 -0400504func (oo *OpenOLT) StartOmciTest(ctx context.Context, test *ca.OMCITest) (*omci.TestResponse, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400505 return nil, olterrors.ErrNotImplemented
506}
507
praneeth nalmas55616d62023-02-06 09:19:18 +0530508// SuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400509func (oo *OpenOLT) SuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
510 return nil, olterrors.ErrNotImplemented
511}
512
praneeth nalmas55616d62023-02-06 09:19:18 +0530513// UnSuppressEvent unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400514func (oo *OpenOLT) UnSuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*empty.Empty, error) {
515 return nil, olterrors.ErrNotImplemented
516}
517
praneeth nalmas55616d62023-02-06 09:19:18 +0530518// DownloadImage is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400519func (oo *OpenOLT) DownloadImage(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400520 return nil, olterrors.ErrNotImplemented
521}
522
praneeth nalmas55616d62023-02-06 09:19:18 +0530523// GetImageDownloadStatus is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400524func (oo *OpenOLT) GetImageDownloadStatus(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400525 return nil, olterrors.ErrNotImplemented
526}
527
praneeth nalmas55616d62023-02-06 09:19:18 +0530528// CancelImageDownload is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400529func (oo *OpenOLT) CancelImageDownload(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400530 return nil, olterrors.ErrNotImplemented
531}
532
praneeth nalmas55616d62023-02-06 09:19:18 +0530533// ActivateImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400534func (oo *OpenOLT) ActivateImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400535 return nil, olterrors.ErrNotImplemented
536}
537
praneeth nalmas55616d62023-02-06 09:19:18 +0530538// RevertImageUpdate is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400539func (oo *OpenOLT) RevertImageUpdate(ctx context.Context, imageInfo *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400540 return nil, olterrors.ErrNotImplemented
541}
542
praneeth nalmas55616d62023-02-06 09:19:18 +0530543// DownloadOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400544func (oo *OpenOLT) DownloadOnuImage(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
545 return nil, olterrors.ErrNotImplemented
546}
547
praneeth nalmas55616d62023-02-06 09:19:18 +0530548// GetOnuImageStatus unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400549func (oo *OpenOLT) GetOnuImageStatus(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
550 return nil, olterrors.ErrNotImplemented
551}
552
praneeth nalmas55616d62023-02-06 09:19:18 +0530553// AbortOnuImageUpgrade unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400554func (oo *OpenOLT) AbortOnuImageUpgrade(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
555 return nil, olterrors.ErrNotImplemented
556}
557
praneeth nalmas55616d62023-02-06 09:19:18 +0530558// GetOnuImages unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400559func (oo *OpenOLT) GetOnuImages(ctx context.Context, deviceID *common.ID) (*voltha.OnuImages, error) {
560 return nil, olterrors.ErrNotImplemented
561}
562
praneeth nalmas55616d62023-02-06 09:19:18 +0530563// ActivateOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400564func (oo *OpenOLT) ActivateOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
565 return nil, olterrors.ErrNotImplemented
566}
567
praneeth nalmas55616d62023-02-06 09:19:18 +0530568// CommitOnuImage unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400569func (oo *OpenOLT) CommitOnuImage(ctx context.Context, in *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
570 return nil, olterrors.ErrNotImplemented
571}
572
573// UpdateFlowsBulk is unimplemented
khenaidoodc2116e2021-10-19 17:33:19 -0400574func (oo *OpenOLT) UpdateFlowsBulk(ctx context.Context, flows *ca.BulkFlows) (*empty.Empty, error) {
khenaidoo106c61a2021-08-11 18:05:46 -0400575 return nil, olterrors.ErrNotImplemented
576}
577
praneeth nalmas55616d62023-02-06 09:19:18 +0530578// SelfTestDevice unimplemented
khenaidoo106c61a2021-08-11 18:05:46 -0400579func (oo *OpenOLT) SelfTestDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
580 return nil, olterrors.ErrNotImplemented
581}