blob: f2554d6b686796dc2c302b4443252dfcea97e0ed [file] [log] [blame]
khenaidoob9203542018-09-17 22:56:37 -04001/*
2 * Copyright 2018-present Open Networking Foundation
3
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 */
npujar1d86a522019-11-14 17:11:16 +053016
khenaidoob9203542018-09-17 22:56:37 -040017package core
18
19import (
20 "context"
21 "errors"
David Bainbridged1afd662020-03-26 18:27:41 -070022 "strings"
23 "sync"
24 "time"
25
sbarbari17d7e222019-11-05 10:02:29 -050026 "github.com/opencord/voltha-go/db/model"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080027 "github.com/opencord/voltha-lib-go/v3/pkg/kafka"
28 "github.com/opencord/voltha-lib-go/v3/pkg/log"
29 "github.com/opencord/voltha-lib-go/v3/pkg/probe"
30 "github.com/opencord/voltha-protos/v3/go/openflow_13"
31 "github.com/opencord/voltha-protos/v3/go/voltha"
khenaidoob9203542018-09-17 22:56:37 -040032 "google.golang.org/grpc/codes"
33 "google.golang.org/grpc/status"
khenaidoob9203542018-09-17 22:56:37 -040034)
35
npujar1d86a522019-11-14 17:11:16 +053036// LogicalDeviceManager represent logical device manager attributes
khenaidoob9203542018-09-17 22:56:37 -040037type LogicalDeviceManager struct {
khenaidoo4c9e5592019-09-09 16:20:41 -040038 logicalDeviceAgents sync.Map
39 core *Core
40 deviceMgr *DeviceManager
41 grpcNbiHdlr *APIHandler
npujar467fe752020-01-16 20:17:45 +053042 kafkaICProxy kafka.InterContainerProxy
khenaidoo4c9e5592019-09-09 16:20:41 -040043 clusterDataProxy *model.Proxy
44 exitChannel chan int
khenaidoo442e7c72020-03-10 16:13:48 -040045 defaultTimeout time.Duration
khenaidoo4c9e5592019-09-09 16:20:41 -040046 logicalDevicesLoadingLock sync.RWMutex
47 logicalDeviceLoadingInProgress map[string][]chan int
khenaidoob9203542018-09-17 22:56:37 -040048}
49
khenaidoo442e7c72020-03-10 16:13:48 -040050func newLogicalDeviceManager(core *Core, deviceMgr *DeviceManager, kafkaICProxy kafka.InterContainerProxy, cdProxy *model.Proxy, timeout time.Duration) *LogicalDeviceManager {
khenaidoob9203542018-09-17 22:56:37 -040051 var logicalDeviceMgr LogicalDeviceManager
Richard Jankowski199fd862019-03-18 14:49:51 -040052 logicalDeviceMgr.core = core
khenaidoob9203542018-09-17 22:56:37 -040053 logicalDeviceMgr.exitChannel = make(chan int, 1)
khenaidoob9203542018-09-17 22:56:37 -040054 logicalDeviceMgr.deviceMgr = deviceMgr
khenaidoo43c82122018-11-22 18:38:28 -050055 logicalDeviceMgr.kafkaICProxy = kafkaICProxy
khenaidoo9a468962018-09-19 15:33:13 -040056 logicalDeviceMgr.clusterDataProxy = cdProxy
khenaidoo2c6a0992019-04-29 13:46:56 -040057 logicalDeviceMgr.defaultTimeout = timeout
khenaidoo4c9e5592019-09-09 16:20:41 -040058 logicalDeviceMgr.logicalDevicesLoadingLock = sync.RWMutex{}
59 logicalDeviceMgr.logicalDeviceLoadingInProgress = make(map[string][]chan int)
khenaidoob9203542018-09-17 22:56:37 -040060 return &logicalDeviceMgr
61}
62
Richard Jankowskidbab94a2018-12-06 16:20:25 -050063func (ldMgr *LogicalDeviceManager) setGrpcNbiHandler(grpcNbiHandler *APIHandler) {
64 ldMgr.grpcNbiHdlr = grpcNbiHandler
65}
66
khenaidoo4d4802d2018-10-04 21:59:49 -040067func (ldMgr *LogicalDeviceManager) start(ctx context.Context) {
Girish Kumarf56a4682020-03-20 20:07:46 +000068 logger.Info("starting-logical-device-manager")
David K. Bainbridgeb4a9ab02019-09-20 15:12:16 -070069 probe.UpdateStatusFromContext(ctx, "logical-device-manager", probe.ServiceStatusRunning)
Girish Kumarf56a4682020-03-20 20:07:46 +000070 logger.Info("logical-device-manager-started")
khenaidoob9203542018-09-17 22:56:37 -040071}
72
khenaidoo4d4802d2018-10-04 21:59:49 -040073func (ldMgr *LogicalDeviceManager) stop(ctx context.Context) {
Girish Kumarf56a4682020-03-20 20:07:46 +000074 logger.Info("stopping-logical-device-manager")
khenaidoob9203542018-09-17 22:56:37 -040075 ldMgr.exitChannel <- 1
David K. Bainbridgeb4a9ab02019-09-20 15:12:16 -070076 probe.UpdateStatusFromContext(ctx, "logical-device-manager", probe.ServiceStatusStopped)
Girish Kumarf56a4682020-03-20 20:07:46 +000077 logger.Info("logical-device-manager-stopped")
khenaidoob9203542018-09-17 22:56:37 -040078}
79
khenaidoo19d7b632018-10-30 10:49:50 -040080func sendAPIResponse(ctx context.Context, ch chan interface{}, result interface{}) {
81 if ctx.Err() == nil {
82 // Returned response only of the ctx has not been cancelled/timeout/etc
83 // Channel is automatically closed when a context is Done
84 ch <- result
Girish Kumarf56a4682020-03-20 20:07:46 +000085 logger.Debugw("sendResponse", log.Fields{"result": result})
khenaidoo19d7b632018-10-30 10:49:50 -040086 } else {
87 // Should the transaction be reverted back?
Girish Kumarf56a4682020-03-20 20:07:46 +000088 logger.Debugw("sendResponse-context-error", log.Fields{"context-error": ctx.Err()})
khenaidoo19d7b632018-10-30 10:49:50 -040089 }
90}
91
khenaidoob9203542018-09-17 22:56:37 -040092func (ldMgr *LogicalDeviceManager) addLogicalDeviceAgentToMap(agent *LogicalDeviceAgent) {
npujar1d86a522019-11-14 17:11:16 +053093 if _, exist := ldMgr.logicalDeviceAgents.Load(agent.logicalDeviceID); !exist {
94 ldMgr.logicalDeviceAgents.Store(agent.logicalDeviceID, agent)
khenaidoob9203542018-09-17 22:56:37 -040095 }
96}
97
khenaidoo8c3303d2019-02-13 14:59:39 -050098// getLogicalDeviceAgent returns the logical device agent. If the device is not in memory then the device will
99// be loaded from dB and a logical device agent created to managed it.
npujar467fe752020-01-16 20:17:45 +0530100func (ldMgr *LogicalDeviceManager) getLogicalDeviceAgent(ctx context.Context, logicalDeviceID string) *LogicalDeviceAgent {
Andrea Campanella09400bd2020-04-02 11:58:04 +0200101 logger.Debugw("get-logical-device-agent", log.Fields{"logical-device-id": logicalDeviceID})
npujar1d86a522019-11-14 17:11:16 +0530102 agent, ok := ldMgr.logicalDeviceAgents.Load(logicalDeviceID)
103 if ok {
khenaidoo93d5a3d2020-01-15 12:37:05 -0500104 lda := agent.(*LogicalDeviceAgent)
105 if lda.logicalDevice == nil {
106 // This can happen when an agent for the logical device has been created but the logical device
107 // itself is not ready for action as it is waiting for switch and port capabilities from the
108 // relevant adapter. In such a case prevent any request aimed at that logical device.
Girish Kumarf56a4682020-03-20 20:07:46 +0000109 logger.Debugf("Logical device %s is not ready to serve requests", logicalDeviceID)
khenaidoo93d5a3d2020-01-15 12:37:05 -0500110 return nil
111 }
112 return lda
npujar1d86a522019-11-14 17:11:16 +0530113 }
114 // Try to load into memory - loading will also create the logical device agent
npujar467fe752020-01-16 20:17:45 +0530115 if err := ldMgr.load(ctx, logicalDeviceID); err == nil {
npujar1d86a522019-11-14 17:11:16 +0530116 if agent, ok = ldMgr.logicalDeviceAgents.Load(logicalDeviceID); ok {
117 return agent.(*LogicalDeviceAgent)
khenaidoo8c3303d2019-02-13 14:59:39 -0500118 }
khenaidoob9203542018-09-17 22:56:37 -0400119 }
120 return nil
121}
122
npujar1d86a522019-11-14 17:11:16 +0530123func (ldMgr *LogicalDeviceManager) deleteLogicalDeviceAgent(logicalDeviceID string) {
124 ldMgr.logicalDeviceAgents.Delete(logicalDeviceID)
khenaidoo92e62c52018-10-03 14:02:54 -0400125}
126
khenaidoo8c3303d2019-02-13 14:59:39 -0500127// GetLogicalDevice provides a cloned most up to date logical device. If device is not in memory
128// it will be fetched from the dB
npujar467fe752020-01-16 20:17:45 +0530129func (ldMgr *LogicalDeviceManager) getLogicalDevice(ctx context.Context, id string) (*voltha.LogicalDevice, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000130 logger.Debugw("getlogicalDevice", log.Fields{"logicaldeviceid": id})
npujar467fe752020-01-16 20:17:45 +0530131 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400132 return agent.GetLogicalDevice(ctx)
khenaidoob9203542018-09-17 22:56:37 -0400133 }
134 return nil, status.Errorf(codes.NotFound, "%s", id)
135}
136
khenaidooba6b6c42019-08-02 09:11:56 -0400137//listLogicalDevices returns the list of all logical devices
npujar467fe752020-01-16 20:17:45 +0530138func (ldMgr *LogicalDeviceManager) listLogicalDevices(ctx context.Context) (*voltha.LogicalDevices, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000139 logger.Debug("ListAllLogicalDevices")
khenaidoob9203542018-09-17 22:56:37 -0400140 result := &voltha.LogicalDevices{}
npujar467fe752020-01-16 20:17:45 +0530141 logicalDevices, err := ldMgr.clusterDataProxy.List(ctx, "/logical_devices", 0, true, "")
Thomas Lee Se5a44012019-11-07 20:32:24 +0530142 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000143 logger.Errorw("failed-to-list-logical-devices-from-cluster-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530144 return nil, err
145 }
146 if logicalDevices != nil {
Stephane Barbarie1ab43272018-12-08 21:42:13 -0500147 for _, logicalDevice := range logicalDevices.([]interface{}) {
Stephane Barbarie1ab43272018-12-08 21:42:13 -0500148 result.Items = append(result.Items, logicalDevice.(*voltha.LogicalDevice))
khenaidoob9203542018-09-17 22:56:37 -0400149 }
150 }
151 return result, nil
152}
153
khenaidoo4d4802d2018-10-04 21:59:49 -0400154func (ldMgr *LogicalDeviceManager) createLogicalDevice(ctx context.Context, device *voltha.Device) (*string, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000155 logger.Debugw("creating-logical-device", log.Fields{"deviceId": device.Id})
khenaidoob9203542018-09-17 22:56:37 -0400156 // Sanity check
157 if !device.Root {
khenaidoo2c6a0992019-04-29 13:46:56 -0400158 return nil, errors.New("device-not-root")
khenaidoob9203542018-09-17 22:56:37 -0400159 }
160
161 // Create a logical device agent - the logical device Id is based on the mac address of the device
162 // For now use the serial number - it may contain any combination of alphabetic characters and numbers,
163 // with length varying from eight characters to a maximum of 14 characters. Mac Address is part of oneof
164 // in the Device model. May need to be moved out.
David Bainbridged1afd662020-03-26 18:27:41 -0700165 id := CreateLogicalDeviceID()
166 sn := strings.Replace(device.MacAddress, ":", "", -1)
khenaidoo92e62c52018-10-03 14:02:54 -0400167 if id == "" {
David Bainbridged1afd662020-03-26 18:27:41 -0700168 logger.Errorw("mac-address-not-set", log.Fields{"deviceId": device.Id, "serial-number": sn})
khenaidoo92e62c52018-10-03 14:02:54 -0400169 return nil, errors.New("mac-address-not-set")
170 }
David Bainbridged1afd662020-03-26 18:27:41 -0700171
Girish Kumarf56a4682020-03-20 20:07:46 +0000172 logger.Debugw("logical-device-id", log.Fields{"logicaldeviceId": id})
khenaidoob9203542018-09-17 22:56:37 -0400173
David Bainbridged1afd662020-03-26 18:27:41 -0700174 agent := newLogicalDeviceAgent(id, sn, device.Id, ldMgr, ldMgr.deviceMgr, ldMgr.clusterDataProxy, ldMgr.defaultTimeout)
khenaidoob9203542018-09-17 22:56:37 -0400175 ldMgr.addLogicalDeviceAgentToMap(agent)
khenaidooad06fd72019-10-28 12:26:05 -0400176
177 // Update the root device with the logical device Id reference
npujar467fe752020-01-16 20:17:45 +0530178 if err := ldMgr.deviceMgr.setParentID(ctx, device, id); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000179 logger.Errorw("failed-setting-parent-id", log.Fields{"logicalDeviceId": id, "deviceId": device.Id})
khenaidooad06fd72019-10-28 12:26:05 -0400180 return nil, err
181 }
182
npujar1d86a522019-11-14 17:11:16 +0530183 go func() {
khenaidoo442e7c72020-03-10 16:13:48 -0400184 //agent := newLogicalDeviceAgent(id, device.Id, ldMgr, ldMgr.deviceMgr, ldMgr.clusterDataProxy, ldMgr.defaultTimeout)
185 err := agent.start(context.Background(), false)
npujar1d86a522019-11-14 17:11:16 +0530186 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000187 logger.Errorw("unable-to-create-the-logical-device", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400188 ldMgr.deleteLogicalDeviceAgent(id)
npujar1d86a522019-11-14 17:11:16 +0530189 }
190 }()
khenaidoob9203542018-09-17 22:56:37 -0400191
Girish Kumarf56a4682020-03-20 20:07:46 +0000192 logger.Debug("creating-logical-device-ends")
khenaidoob9203542018-09-17 22:56:37 -0400193 return &id, nil
194}
195
khenaidoo6d62c002019-05-15 21:57:03 -0400196// stopManagingLogicalDeviceWithDeviceId stops the management of the logical device. This implies removal of any
197// reference of this logical device in cache. The device Id is passed as param because the logical device may already
198// have been removed from the model. This function returns the logical device Id if found
npujar467fe752020-01-16 20:17:45 +0530199func (ldMgr *LogicalDeviceManager) stopManagingLogicalDeviceWithDeviceID(ctx context.Context, id string) string {
Girish Kumarf56a4682020-03-20 20:07:46 +0000200 logger.Infow("stop-managing-logical-device", log.Fields{"deviceId": id})
khenaidoo6d62c002019-05-15 21:57:03 -0400201 // Go over the list of logical device agents to find the one which has rootDeviceId as id
npujar1d86a522019-11-14 17:11:16 +0530202 var ldID = ""
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400203 ldMgr.logicalDeviceAgents.Range(func(key, value interface{}) bool {
204 ldAgent := value.(*LogicalDeviceAgent)
npujar1d86a522019-11-14 17:11:16 +0530205 if ldAgent.rootDeviceID == id {
Girish Kumarf56a4682020-03-20 20:07:46 +0000206 logger.Infow("stopping-logical-device-agent", log.Fields{"lDeviceId": key})
npujar467fe752020-01-16 20:17:45 +0530207 if err := ldAgent.stop(ctx); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000208 logger.Errorw("failed-to-stop-LDAgent", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530209 return false
210 }
npujar1d86a522019-11-14 17:11:16 +0530211 ldID = key.(string)
212 ldMgr.logicalDeviceAgents.Delete(ldID)
khenaidoo6d62c002019-05-15 21:57:03 -0400213 }
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400214 return true
215 })
npujar1d86a522019-11-14 17:11:16 +0530216 return ldID
khenaidoo6d62c002019-05-15 21:57:03 -0400217}
218
219//getLogicalDeviceFromModel retrieves the logical device data from the model.
npujar467fe752020-01-16 20:17:45 +0530220func (ldMgr *LogicalDeviceManager) getLogicalDeviceFromModel(ctx context.Context, lDeviceID string) (*voltha.LogicalDevice, error) {
221 logicalDevice, err := ldMgr.clusterDataProxy.Get(ctx, "/logical_devices/"+lDeviceID, 0, false, "")
Thomas Lee Se5a44012019-11-07 20:32:24 +0530222 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000223 logger.Errorw("failed-to-get-logical-devices-from-cluster-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530224 return nil, err
225 }
226 if logicalDevice != nil {
khenaidoo6d62c002019-05-15 21:57:03 -0400227 if lDevice, ok := logicalDevice.(*voltha.LogicalDevice); ok {
228 return lDevice, nil
229 }
230 }
npujar1d86a522019-11-14 17:11:16 +0530231 return nil, status.Error(codes.NotFound, lDeviceID)
khenaidoo6d62c002019-05-15 21:57:03 -0400232}
233
khenaidoo297cd252019-02-07 22:10:23 -0500234// load loads a logical device manager in memory
npujar467fe752020-01-16 20:17:45 +0530235func (ldMgr *LogicalDeviceManager) load(ctx context.Context, lDeviceID string) error {
npujar1d86a522019-11-14 17:11:16 +0530236 if lDeviceID == "" {
khenaidoo4c9e5592019-09-09 16:20:41 -0400237 return nil
khenaidoo297cd252019-02-07 22:10:23 -0500238 }
khenaidoo4c9e5592019-09-09 16:20:41 -0400239 // Add a lock to prevent two concurrent calls from loading the same device twice
240 ldMgr.logicalDevicesLoadingLock.Lock()
npujar1d86a522019-11-14 17:11:16 +0530241 if _, exist := ldMgr.logicalDeviceLoadingInProgress[lDeviceID]; !exist {
242 if ldAgent, _ := ldMgr.logicalDeviceAgents.Load(lDeviceID); ldAgent == nil {
243 ldMgr.logicalDeviceLoadingInProgress[lDeviceID] = []chan int{make(chan int, 1)}
khenaidoo4c9e5592019-09-09 16:20:41 -0400244 ldMgr.logicalDevicesLoadingLock.Unlock()
npujar467fe752020-01-16 20:17:45 +0530245 if _, err := ldMgr.getLogicalDeviceFromModel(ctx, lDeviceID); err == nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000246 logger.Debugw("loading-logical-device", log.Fields{"lDeviceId": lDeviceID})
David Bainbridged1afd662020-03-26 18:27:41 -0700247 agent := newLogicalDeviceAgent(lDeviceID, "", "", ldMgr, ldMgr.deviceMgr, ldMgr.clusterDataProxy, ldMgr.defaultTimeout)
npujar467fe752020-01-16 20:17:45 +0530248 if err := agent.start(ctx, true); err != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400249 return err
khenaidoo4c9e5592019-09-09 16:20:41 -0400250 }
khenaidoo442e7c72020-03-10 16:13:48 -0400251 ldMgr.logicalDeviceAgents.Store(agent.logicalDeviceID, agent)
khenaidoo4c9e5592019-09-09 16:20:41 -0400252 } else {
Girish Kumarf56a4682020-03-20 20:07:46 +0000253 logger.Debugw("logicalDevice not in model", log.Fields{"lDeviceId": lDeviceID})
khenaidoo4c9e5592019-09-09 16:20:41 -0400254 }
255 // announce completion of task to any number of waiting channels
256 ldMgr.logicalDevicesLoadingLock.Lock()
npujar1d86a522019-11-14 17:11:16 +0530257 if v, ok := ldMgr.logicalDeviceLoadingInProgress[lDeviceID]; ok {
khenaidoo4c9e5592019-09-09 16:20:41 -0400258 for _, ch := range v {
259 close(ch)
260 }
npujar1d86a522019-11-14 17:11:16 +0530261 delete(ldMgr.logicalDeviceLoadingInProgress, lDeviceID)
khenaidoo4c9e5592019-09-09 16:20:41 -0400262 }
263 ldMgr.logicalDevicesLoadingLock.Unlock()
264 } else {
265 ldMgr.logicalDevicesLoadingLock.Unlock()
266 }
267 } else {
268 ch := make(chan int, 1)
npujar1d86a522019-11-14 17:11:16 +0530269 ldMgr.logicalDeviceLoadingInProgress[lDeviceID] = append(ldMgr.logicalDeviceLoadingInProgress[lDeviceID], ch)
khenaidoo4c9e5592019-09-09 16:20:41 -0400270 ldMgr.logicalDevicesLoadingLock.Unlock()
271 // Wait for the channel to be closed, implying the process loading this device is done.
272 <-ch
273 }
npujar1d86a522019-11-14 17:11:16 +0530274 if _, exist := ldMgr.logicalDeviceAgents.Load(lDeviceID); exist {
khenaidoo4c9e5592019-09-09 16:20:41 -0400275 return nil
276 }
npujar1d86a522019-11-14 17:11:16 +0530277 return status.Errorf(codes.Aborted, "Error loading logical device %s", lDeviceID)
khenaidoo297cd252019-02-07 22:10:23 -0500278}
279
khenaidoo4d4802d2018-10-04 21:59:49 -0400280func (ldMgr *LogicalDeviceManager) deleteLogicalDevice(ctx context.Context, device *voltha.Device) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000281 logger.Debugw("deleting-logical-device", log.Fields{"deviceId": device.Id})
khenaidoo92e62c52018-10-03 14:02:54 -0400282 // Sanity check
283 if !device.Root {
khenaidoo2c6a0992019-04-29 13:46:56 -0400284 return errors.New("device-not-root")
khenaidoo92e62c52018-10-03 14:02:54 -0400285 }
npujar1d86a522019-11-14 17:11:16 +0530286 logDeviceID := device.ParentId
npujar467fe752020-01-16 20:17:45 +0530287 if agent := ldMgr.getLogicalDeviceAgent(ctx, logDeviceID); agent != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400288 // Stop the logical device agent
Thomas Lee Se5a44012019-11-07 20:32:24 +0530289 if err := agent.stop(ctx); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000290 logger.Errorw("failed-to-stop-agent", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530291 return err
292 }
khenaidoo92e62c52018-10-03 14:02:54 -0400293 //Remove the logical device agent from the Map
npujar1d86a522019-11-14 17:11:16 +0530294 ldMgr.deleteLogicalDeviceAgent(logDeviceID)
khenaidoo92e62c52018-10-03 14:02:54 -0400295 }
296
Girish Kumarf56a4682020-03-20 20:07:46 +0000297 logger.Debug("deleting-logical-device-ends")
khenaidoo92e62c52018-10-03 14:02:54 -0400298 return nil
299}
300
npujar467fe752020-01-16 20:17:45 +0530301func (ldMgr *LogicalDeviceManager) getLogicalDeviceID(ctx context.Context, device *voltha.Device) (*string, error) {
khenaidoo92e62c52018-10-03 14:02:54 -0400302 // Device can either be a parent or a child device
303 if device.Root {
304 // Parent device. The ID of a parent device is the logical device ID
305 return &device.ParentId, nil
306 }
307 // Device is child device
308 // retrieve parent device using child device ID
npujar467fe752020-01-16 20:17:45 +0530309 if parentDevice := ldMgr.deviceMgr.getParentDevice(ctx, device); parentDevice != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400310 return &parentDevice.ParentId, nil
311 }
312 return nil, status.Errorf(codes.NotFound, "%s", device.Id)
313}
314
npujar467fe752020-01-16 20:17:45 +0530315func (ldMgr *LogicalDeviceManager) getLogicalDeviceIDFromDeviceID(ctx context.Context, deviceID string) (*string, error) {
khenaidoo3ab34882019-05-02 21:33:30 -0400316 // Get the device
317 var device *voltha.Device
318 var err error
npujar467fe752020-01-16 20:17:45 +0530319 if device, err = ldMgr.deviceMgr.GetDevice(ctx, deviceID); err != nil {
khenaidoo3ab34882019-05-02 21:33:30 -0400320 return nil, err
321 }
npujar467fe752020-01-16 20:17:45 +0530322 return ldMgr.getLogicalDeviceID(ctx, device)
khenaidoo3ab34882019-05-02 21:33:30 -0400323}
324
npujar467fe752020-01-16 20:17:45 +0530325func (ldMgr *LogicalDeviceManager) getLogicalPortID(ctx context.Context, device *voltha.Device) (*voltha.LogicalPortId, error) {
khenaidoo19d7b632018-10-30 10:49:50 -0400326 // Get the logical device where this device is attached
npujar1d86a522019-11-14 17:11:16 +0530327 var lDeviceID *string
khenaidoo19d7b632018-10-30 10:49:50 -0400328 var err error
npujar467fe752020-01-16 20:17:45 +0530329 if lDeviceID, err = ldMgr.getLogicalDeviceID(ctx, device); err != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400330 return nil, err
331 }
332 var lDevice *voltha.LogicalDevice
npujar467fe752020-01-16 20:17:45 +0530333 if lDevice, err = ldMgr.getLogicalDevice(ctx, *lDeviceID); err != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400334 return nil, err
335 }
336 // Go over list of ports
337 for _, port := range lDevice.Ports {
338 if port.DeviceId == device.Id {
npujar1d86a522019-11-14 17:11:16 +0530339 return &voltha.LogicalPortId{Id: *lDeviceID, PortId: port.Id}, nil
khenaidoo19d7b632018-10-30 10:49:50 -0400340 }
341 }
342 return nil, status.Errorf(codes.NotFound, "%s", device.Id)
343}
344
npujar1d86a522019-11-14 17:11:16 +0530345// ListLogicalDeviceFlows returns the flows of logical device
khenaidoodd237172019-05-27 16:37:17 -0400346func (ldMgr *LogicalDeviceManager) ListLogicalDeviceFlows(ctx context.Context, id string) (*openflow_13.Flows, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000347 logger.Debugw("ListLogicalDeviceFlows", log.Fields{"logicaldeviceid": id})
npujar467fe752020-01-16 20:17:45 +0530348 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400349 return agent.ListLogicalDeviceFlows(ctx)
khenaidoodd237172019-05-27 16:37:17 -0400350 }
351 return nil, status.Errorf(codes.NotFound, "%s", id)
352}
353
npujar1d86a522019-11-14 17:11:16 +0530354// ListLogicalDeviceFlowGroups returns logical device flow groups
khenaidoodd237172019-05-27 16:37:17 -0400355func (ldMgr *LogicalDeviceManager) ListLogicalDeviceFlowGroups(ctx context.Context, id string) (*openflow_13.FlowGroups, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000356 logger.Debugw("ListLogicalDeviceFlowGroups", log.Fields{"logicaldeviceid": id})
npujar467fe752020-01-16 20:17:45 +0530357 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400358 return agent.ListLogicalDeviceFlowGroups(ctx)
khenaidoodd237172019-05-27 16:37:17 -0400359 }
360 return nil, status.Errorf(codes.NotFound, "%s", id)
361}
362
npujar1d86a522019-11-14 17:11:16 +0530363// ListLogicalDevicePorts returns logical device ports
khenaidoo19d7b632018-10-30 10:49:50 -0400364func (ldMgr *LogicalDeviceManager) ListLogicalDevicePorts(ctx context.Context, id string) (*voltha.LogicalPorts, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000365 logger.Debugw("ListLogicalDevicePorts", log.Fields{"logicaldeviceid": id})
npujar467fe752020-01-16 20:17:45 +0530366 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400367 return agent.ListLogicalDevicePorts(ctx)
khenaidoo19d7b632018-10-30 10:49:50 -0400368 }
369 return nil, status.Errorf(codes.NotFound, "%s", id)
khenaidoo19d7b632018-10-30 10:49:50 -0400370}
371
npujar467fe752020-01-16 20:17:45 +0530372func (ldMgr *LogicalDeviceManager) getLogicalPort(ctx context.Context, lPortID *voltha.LogicalPortId) (*voltha.LogicalPort, error) {
khenaidoo19d7b632018-10-30 10:49:50 -0400373 // Get the logical device where this device is attached
374 var err error
375 var lDevice *voltha.LogicalDevice
npujar467fe752020-01-16 20:17:45 +0530376 if lDevice, err = ldMgr.getLogicalDevice(ctx, lPortID.Id); err != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400377 return nil, err
378 }
379 // Go over list of ports
380 for _, port := range lDevice.Ports {
npujar1d86a522019-11-14 17:11:16 +0530381 if port.Id == lPortID.PortId {
khenaidoo19d7b632018-10-30 10:49:50 -0400382 return port, nil
383 }
384 }
npujar1d86a522019-11-14 17:11:16 +0530385 return nil, status.Errorf(codes.NotFound, "%s-%s", lPortID.Id, lPortID.PortId)
khenaidoo19d7b632018-10-30 10:49:50 -0400386}
387
khenaidoo2c6a0992019-04-29 13:46:56 -0400388// updateLogicalPort sets up a logical port on the logical device based on the device port
389// information, if needed
npujar467fe752020-01-16 20:17:45 +0530390func (ldMgr *LogicalDeviceManager) updateLogicalPort(ctx context.Context, device *voltha.Device, port *voltha.Port) error {
391 ldID, err := ldMgr.getLogicalDeviceID(ctx, device)
npujar1d86a522019-11-14 17:11:16 +0530392 if err != nil || *ldID == "" {
khenaidoo2c6a0992019-04-29 13:46:56 -0400393 // This is not an error as the logical device may not have been created at this time. In such a case,
394 // the ports will be created when the logical device is ready.
395 return nil
khenaidoo2c6a0992019-04-29 13:46:56 -0400396 }
npujar467fe752020-01-16 20:17:45 +0530397 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
398 if err := agent.updateLogicalPort(ctx, device, port); err != nil {
npujar1d86a522019-11-14 17:11:16 +0530399 return err
khenaidoofc1314d2019-03-14 09:34:21 -0400400 }
401 }
402 return nil
403}
404
khenaidoo0a822f92019-05-08 15:15:57 -0400405// deleteLogicalPort removes the logical port associated with a device
npujar1d86a522019-11-14 17:11:16 +0530406func (ldMgr *LogicalDeviceManager) deleteLogicalPort(ctx context.Context, lPortID *voltha.LogicalPortId) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000407 logger.Debugw("deleting-logical-port", log.Fields{"LDeviceId": lPortID.Id})
khenaidoo19d7b632018-10-30 10:49:50 -0400408 // Get logical port
409 var logicalPort *voltha.LogicalPort
410 var err error
npujar467fe752020-01-16 20:17:45 +0530411 if logicalPort, err = ldMgr.getLogicalPort(ctx, lPortID); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000412 logger.Debugw("no-logical-device-port-present", log.Fields{"logicalPortId": lPortID.PortId})
khenaidoo19d7b632018-10-30 10:49:50 -0400413 return err
414 }
khenaidoo92e62c52018-10-03 14:02:54 -0400415 // Sanity check
khenaidoo19d7b632018-10-30 10:49:50 -0400416 if logicalPort.RootPort {
khenaidoo2c6a0992019-04-29 13:46:56 -0400417 return errors.New("device-root")
khenaidoo92e62c52018-10-03 14:02:54 -0400418 }
npujar467fe752020-01-16 20:17:45 +0530419 if agent := ldMgr.getLogicalDeviceAgent(ctx, lPortID.Id); agent != nil {
420 if err := agent.deleteLogicalPort(ctx, logicalPort); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000421 logger.Warnw("deleting-logicalport-failed", log.Fields{"LDeviceId": lPortID.Id, "error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400422 }
khenaidoo92e62c52018-10-03 14:02:54 -0400423 }
424
Girish Kumarf56a4682020-03-20 20:07:46 +0000425 logger.Debug("deleting-logical-port-ends")
khenaidoo92e62c52018-10-03 14:02:54 -0400426 return nil
427}
428
khenaidoo0a822f92019-05-08 15:15:57 -0400429// deleteLogicalPort removes the logical port associated with a child device
npujar467fe752020-01-16 20:17:45 +0530430func (ldMgr *LogicalDeviceManager) deleteLogicalPorts(ctx context.Context, deviceID string) error {
Andrea Campanella09400bd2020-04-02 11:58:04 +0200431 logger.Debugw("deleting-logical-ports", log.Fields{"device-id": deviceID})
khenaidoo0a822f92019-05-08 15:15:57 -0400432 // Get logical port
npujar467fe752020-01-16 20:17:45 +0530433 ldID, err := ldMgr.getLogicalDeviceIDFromDeviceID(ctx, deviceID)
npujar1d86a522019-11-14 17:11:16 +0530434 if err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400435 return err
npujar1d86a522019-11-14 17:11:16 +0530436 }
npujar467fe752020-01-16 20:17:45 +0530437 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
438 if err = agent.deleteLogicalPorts(ctx, deviceID); err != nil {
Andrea Campanella09400bd2020-04-02 11:58:04 +0200439 logger.Warnw("delete-logical-ports-failed", log.Fields{"logical-device-id": *ldID})
npujar1d86a522019-11-14 17:11:16 +0530440 return err
khenaidoo0a822f92019-05-08 15:15:57 -0400441 }
442 }
Andrea Campanella09400bd2020-04-02 11:58:04 +0200443 logger.Debug("deleting-logical-ports-ends")
khenaidoo0a822f92019-05-08 15:15:57 -0400444 return nil
445}
446
khenaidoofc1314d2019-03-14 09:34:21 -0400447func (ldMgr *LogicalDeviceManager) setupUNILogicalPorts(ctx context.Context, childDevice *voltha.Device) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000448 logger.Debugw("setupUNILogicalPorts", log.Fields{"childDeviceId": childDevice.Id, "parentDeviceId": childDevice.ParentId, "current-data": childDevice})
khenaidoob9203542018-09-17 22:56:37 -0400449 // Sanity check
450 if childDevice.Root {
451 return errors.New("Device-root")
452 }
453
454 // Get the logical device id parent device
npujar1d86a522019-11-14 17:11:16 +0530455 parentID := childDevice.ParentId
npujar467fe752020-01-16 20:17:45 +0530456 logDeviceID := ldMgr.deviceMgr.GetParentDeviceID(ctx, parentID)
khenaidoob9203542018-09-17 22:56:37 -0400457
Girish Kumarf56a4682020-03-20 20:07:46 +0000458 logger.Debugw("setupUNILogicalPorts", log.Fields{"logDeviceId": logDeviceID, "parentId": parentID})
khenaidoob9203542018-09-17 22:56:37 -0400459
npujar1d86a522019-11-14 17:11:16 +0530460 if parentID == "" || logDeviceID == "" {
khenaidoo2c6a0992019-04-29 13:46:56 -0400461 return errors.New("device-in-invalid-state")
khenaidoo5e677ae2019-02-28 17:26:29 -0500462 }
463
npujar467fe752020-01-16 20:17:45 +0530464 if agent := ldMgr.getLogicalDeviceAgent(ctx, logDeviceID); agent != nil {
khenaidoofc1314d2019-03-14 09:34:21 -0400465 if err := agent.setupUNILogicalPorts(ctx, childDevice); err != nil {
khenaidoobcf205b2019-01-25 22:21:14 -0500466 return err
467 }
khenaidoob9203542018-09-17 22:56:37 -0400468 }
khenaidoo21d51152019-02-01 13:48:37 -0500469 return nil
khenaidoob9203542018-09-17 22:56:37 -0400470}
khenaidoo19d7b632018-10-30 10:49:50 -0400471
npujar467fe752020-01-16 20:17:45 +0530472func (ldMgr *LogicalDeviceManager) deleteAllLogicalPorts(ctx context.Context, device *voltha.Device) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000473 logger.Debugw("deleteAllLogicalPorts", log.Fields{"deviceId": device.Id})
khenaidoo0a822f92019-05-08 15:15:57 -0400474
npujar1d86a522019-11-14 17:11:16 +0530475 var ldID *string
khenaidoo0a822f92019-05-08 15:15:57 -0400476 var err error
477 //Get the logical device Id for this device
npujar467fe752020-01-16 20:17:45 +0530478 if ldID, err = ldMgr.getLogicalDeviceID(ctx, device); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000479 logger.Warnw("no-logical-device-found", log.Fields{"deviceId": device.Id, "error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400480 return err
481 }
npujar467fe752020-01-16 20:17:45 +0530482 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
Girish Gowdra408cd962020-03-11 14:31:31 -0700483 if err := agent.deleteAllLogicalPorts(ctx); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400484 return err
485 }
486 }
487 return nil
488}
Hardik Windlassc704def2020-02-26 18:23:19 +0000489
490func (ldMgr *LogicalDeviceManager) deleteAllUNILogicalPorts(ctx context.Context, parentDevice *voltha.Device) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000491 logger.Debugw("delete-all-uni-logical-ports", log.Fields{"parent-device-id": parentDevice.Id})
Hardik Windlassc704def2020-02-26 18:23:19 +0000492
493 var ldID *string
494 var err error
495 //Get the logical device Id for this device
496 if ldID, err = ldMgr.getLogicalDeviceID(ctx, parentDevice); err != nil {
497 return err
498 }
499 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
500 if err := agent.deleteAllUNILogicalPorts(ctx, parentDevice); err != nil {
501 return err
502 }
503 }
504 return nil
505}
506
npujar467fe752020-01-16 20:17:45 +0530507func (ldMgr *LogicalDeviceManager) updatePortState(ctx context.Context, deviceID string, portNo uint32, state voltha.OperStatus_Types) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000508 logger.Debugw("updatePortState", log.Fields{"deviceId": deviceID, "state": state, "portNo": portNo})
khenaidoo171b98e2019-10-31 11:48:15 -0400509
npujar1d86a522019-11-14 17:11:16 +0530510 var ldID *string
khenaidoo171b98e2019-10-31 11:48:15 -0400511 var err error
512 //Get the logical device Id for this device
npujar467fe752020-01-16 20:17:45 +0530513 if ldID, err = ldMgr.getLogicalDeviceIDFromDeviceID(ctx, deviceID); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000514 logger.Warnw("no-logical-device-found", log.Fields{"deviceId": deviceID, "error": err})
khenaidoo171b98e2019-10-31 11:48:15 -0400515 return err
516 }
npujar467fe752020-01-16 20:17:45 +0530517 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
518 if err := agent.updatePortState(ctx, deviceID, portNo, state); err != nil {
khenaidoo171b98e2019-10-31 11:48:15 -0400519 return err
520 }
521 }
522 return nil
523}
khenaidoo0a822f92019-05-08 15:15:57 -0400524
kesavandbc2d1622020-01-21 00:42:01 -0500525func (ldMgr *LogicalDeviceManager) updatePortsState(ctx context.Context, device *voltha.Device, state voltha.OperStatus_Types) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000526 logger.Debugw("updatePortsState", log.Fields{"deviceId": device.Id, "state": state, "current-data": device})
khenaidoo3ab34882019-05-02 21:33:30 -0400527
npujar1d86a522019-11-14 17:11:16 +0530528 var ldID *string
khenaidoo3ab34882019-05-02 21:33:30 -0400529 var err error
530 //Get the logical device Id for this device
npujar467fe752020-01-16 20:17:45 +0530531 if ldID, err = ldMgr.getLogicalDeviceID(ctx, device); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000532 logger.Warnw("no-logical-device-found", log.Fields{"deviceId": device.Id, "error": err})
khenaidoo3ab34882019-05-02 21:33:30 -0400533 return err
534 }
npujar467fe752020-01-16 20:17:45 +0530535 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
536 if err := agent.updatePortsState(ctx, device, state); err != nil {
khenaidoo3ab34882019-05-02 21:33:30 -0400537 return err
538 }
539 }
540 return nil
541}
542
khenaidoo19d7b632018-10-30 10:49:50 -0400543func (ldMgr *LogicalDeviceManager) updateFlowTable(ctx context.Context, id string, flow *openflow_13.OfpFlowMod, ch chan interface{}) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000544 logger.Debugw("updateFlowTable", log.Fields{"logicalDeviceId": id})
khenaidoo19d7b632018-10-30 10:49:50 -0400545 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530546 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400547 res = agent.updateFlowTable(ctx, flow)
Girish Kumarf56a4682020-03-20 20:07:46 +0000548 logger.Debugw("updateFlowTable-result", log.Fields{"result": res})
khenaidoo19d7b632018-10-30 10:49:50 -0400549 } else {
550 res = status.Errorf(codes.NotFound, "%s", id)
551 }
552 sendAPIResponse(ctx, ch, res)
553}
554
Manikkaraj kb1a10922019-07-29 12:10:34 -0400555func (ldMgr *LogicalDeviceManager) updateMeterTable(ctx context.Context, id string, meter *openflow_13.OfpMeterMod, ch chan interface{}) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000556 logger.Debugw("updateMeterTable", log.Fields{"logicalDeviceId": id})
Manikkaraj kb1a10922019-07-29 12:10:34 -0400557 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530558 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
Manikkaraj kb1a10922019-07-29 12:10:34 -0400559 res = agent.updateMeterTable(ctx, meter)
Girish Kumarf56a4682020-03-20 20:07:46 +0000560 logger.Debugw("updateMeterTable-result", log.Fields{"result": res})
Manikkaraj kb1a10922019-07-29 12:10:34 -0400561 } else {
562 res = status.Errorf(codes.NotFound, "%s", id)
563 }
564 sendAPIResponse(ctx, ch, res)
565}
566
npujar1d86a522019-11-14 17:11:16 +0530567// ListLogicalDeviceMeters returns logical device meters
Manikkaraj kb1a10922019-07-29 12:10:34 -0400568func (ldMgr *LogicalDeviceManager) ListLogicalDeviceMeters(ctx context.Context, id string) (*openflow_13.Meters, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000569 logger.Debugw("ListLogicalDeviceMeters", log.Fields{"logicalDeviceId": id})
npujar467fe752020-01-16 20:17:45 +0530570 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400571 return agent.ListLogicalDeviceMeters(ctx)
Manikkaraj kb1a10922019-07-29 12:10:34 -0400572 }
573 return nil, status.Errorf(codes.NotFound, "%s", id)
574}
khenaidoo19d7b632018-10-30 10:49:50 -0400575func (ldMgr *LogicalDeviceManager) updateGroupTable(ctx context.Context, id string, groupMod *openflow_13.OfpGroupMod, ch chan interface{}) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000576 logger.Debugw("updateGroupTable", log.Fields{"logicalDeviceId": id})
khenaidoo19d7b632018-10-30 10:49:50 -0400577 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530578 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400579 res = agent.updateGroupTable(ctx, groupMod)
Girish Kumarf56a4682020-03-20 20:07:46 +0000580 logger.Debugw("updateGroupTable-result", log.Fields{"result": res})
khenaidoo19d7b632018-10-30 10:49:50 -0400581 } else {
582 res = status.Errorf(codes.NotFound, "%s", id)
583 }
584 sendAPIResponse(ctx, ch, res)
585}
586
587func (ldMgr *LogicalDeviceManager) enableLogicalPort(ctx context.Context, id *voltha.LogicalPortId, ch chan interface{}) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000588 logger.Debugw("enableLogicalPort", log.Fields{"logicalDeviceId": id})
khenaidoo19d7b632018-10-30 10:49:50 -0400589 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530590 if agent := ldMgr.getLogicalDeviceAgent(ctx, id.Id); agent != nil {
591 res = agent.enableLogicalPort(ctx, id.PortId)
Girish Kumarf56a4682020-03-20 20:07:46 +0000592 logger.Debugw("enableLogicalPort-result", log.Fields{"result": res})
khenaidoo19d7b632018-10-30 10:49:50 -0400593 } else {
594 res = status.Errorf(codes.NotFound, "%s", id.Id)
595 }
596 sendAPIResponse(ctx, ch, res)
597}
598
599func (ldMgr *LogicalDeviceManager) disableLogicalPort(ctx context.Context, id *voltha.LogicalPortId, ch chan interface{}) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000600 logger.Debugw("disableLogicalPort", log.Fields{"logicalDeviceId": id})
khenaidoo19d7b632018-10-30 10:49:50 -0400601 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530602 if agent := ldMgr.getLogicalDeviceAgent(ctx, id.Id); agent != nil {
603 res = agent.disableLogicalPort(ctx, id.PortId)
Girish Kumarf56a4682020-03-20 20:07:46 +0000604 logger.Debugw("disableLogicalPort-result", log.Fields{"result": res})
khenaidoo19d7b632018-10-30 10:49:50 -0400605 } else {
606 res = status.Errorf(codes.NotFound, "%s", id.Id)
607 }
608 sendAPIResponse(ctx, ch, res)
609}
khenaidoofdbad6e2018-11-06 22:26:38 -0500610
npujar467fe752020-01-16 20:17:45 +0530611func (ldMgr *LogicalDeviceManager) packetIn(ctx context.Context, logicalDeviceID string, port uint32, transactionID string, packet []byte) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000612 logger.Debugw("packetIn", log.Fields{"logicalDeviceId": logicalDeviceID, "port": port})
npujar467fe752020-01-16 20:17:45 +0530613 if agent := ldMgr.getLogicalDeviceAgent(ctx, logicalDeviceID); agent != nil {
npujar1d86a522019-11-14 17:11:16 +0530614 agent.packetIn(port, transactionID, packet)
khenaidoofdbad6e2018-11-06 22:26:38 -0500615 } else {
Girish Kumarf56a4682020-03-20 20:07:46 +0000616 logger.Error("logical-device-not-exist", log.Fields{"logicalDeviceId": logicalDeviceID})
khenaidoofdbad6e2018-11-06 22:26:38 -0500617 }
618 return nil
619}