blob: fd07c7efc17398424bd952c68b341f7b0e5b1f06 [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 (
npujar1d86a522019-11-14 17:11:16 +053020 "context"
khenaidoob9203542018-09-17 22:56:37 -040021 "errors"
npujar1d86a522019-11-14 17:11:16 +053022
khenaidoob9203542018-09-17 22:56:37 -040023 "github.com/golang/protobuf/ptypes"
24 "github.com/golang/protobuf/ptypes/empty"
sbarbari17d7e222019-11-05 10:02:29 -050025 "github.com/opencord/voltha-go/db/model"
khenaidoo1ce37ad2019-03-24 22:07:24 -040026 "github.com/opencord/voltha-go/rw_core/utils"
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 ic "github.com/opencord/voltha-protos/v3/go/inter_container"
30 "github.com/opencord/voltha-protos/v3/go/voltha"
khenaidoob9203542018-09-17 22:56:37 -040031 "google.golang.org/grpc/codes"
32 "google.golang.org/grpc/status"
33)
34
npujar1d86a522019-11-14 17:11:16 +053035// AdapterRequestHandlerProxy represent adapter request handler proxy attributes
khenaidoob9203542018-09-17 22:56:37 -040036type AdapterRequestHandlerProxy struct {
khenaidoode93b462019-02-13 22:17:21 -050037 TestMode bool
npujar1d86a522019-11-14 17:11:16 +053038 coreInstanceID string
khenaidoode93b462019-02-13 22:17:21 -050039 deviceMgr *DeviceManager
40 lDeviceMgr *LogicalDeviceManager
41 adapterMgr *AdapterManager
42 localDataProxy *model.Proxy
43 clusterDataProxy *model.Proxy
44 defaultRequestTimeout int64
khenaidoo297cd252019-02-07 22:10:23 -050045 longRunningRequestTimeout int64
khenaidoode93b462019-02-13 22:17:21 -050046 coreInCompetingMode bool
Richard Jankowski199fd862019-03-18 14:49:51 -040047 core *Core
khenaidoob9203542018-09-17 22:56:37 -040048}
49
npujar1d86a522019-11-14 17:11:16 +053050// NewAdapterRequestHandlerProxy assigns values for adapter request handler proxy attributes and returns the new instance
51func NewAdapterRequestHandlerProxy(core *Core, coreInstanceID string, dMgr *DeviceManager, ldMgr *LogicalDeviceManager,
khenaidoo297cd252019-02-07 22:10:23 -050052 aMgr *AdapterManager, cdProxy *model.Proxy, ldProxy *model.Proxy, incompetingMode bool, longRunningRequestTimeout int64,
53 defaultRequestTimeout int64) *AdapterRequestHandlerProxy {
khenaidoob9203542018-09-17 22:56:37 -040054 var proxy AdapterRequestHandlerProxy
Richard Jankowski199fd862019-03-18 14:49:51 -040055 proxy.core = core
npujar1d86a522019-11-14 17:11:16 +053056 proxy.coreInstanceID = coreInstanceID
khenaidoob9203542018-09-17 22:56:37 -040057 proxy.deviceMgr = dMgr
58 proxy.lDeviceMgr = ldMgr
59 proxy.clusterDataProxy = cdProxy
60 proxy.localDataProxy = ldProxy
khenaidoo21d51152019-02-01 13:48:37 -050061 proxy.adapterMgr = aMgr
khenaidoo297cd252019-02-07 22:10:23 -050062 proxy.coreInCompetingMode = incompetingMode
63 proxy.defaultRequestTimeout = defaultRequestTimeout
64 proxy.longRunningRequestTimeout = longRunningRequestTimeout
khenaidoob9203542018-09-17 22:56:37 -040065 return &proxy
66}
67
Richard Jankowski199fd862019-03-18 14:49:51 -040068// This is a helper function that attempts to acquire the request by using the device ownership model
npujar467fe752020-01-16 20:17:45 +053069func (rhp *AdapterRequestHandlerProxy) takeRequestOwnership(ctx context.Context, transactionID string, devID string, maxTimeout ...int64) (*KVTransaction, error) {
Richard Jankowski199fd862019-03-18 14:49:51 -040070 timeout := rhp.defaultRequestTimeout
71 if len(maxTimeout) > 0 {
72 timeout = maxTimeout[0]
73 }
npujar1d86a522019-11-14 17:11:16 +053074 txn := NewKVTransaction(transactionID)
Richard Jankowski199fd862019-03-18 14:49:51 -040075 if txn == nil {
76 return nil, errors.New("fail-to-create-transaction")
77 }
78
khenaidoo09771ef2019-10-11 14:25:02 -040079 var acquired bool
80 var err error
npujar1d86a522019-11-14 17:11:16 +053081 if devID != "" {
khenaidoo09771ef2019-10-11 14:25:02 -040082 var ownedByMe bool
npujar467fe752020-01-16 20:17:45 +053083 if ownedByMe, err = rhp.core.deviceOwnership.OwnedByMe(ctx, &utils.DeviceID{ID: devID}); err != nil {
npujar1d86a522019-11-14 17:11:16 +053084 log.Warnw("getting-ownership-failed", log.Fields{"deviceId": devID, "error": err})
khenaidoo09771ef2019-10-11 14:25:02 -040085 return nil, kafka.ErrorTransactionInvalidId
Richard Jankowski199fd862019-03-18 14:49:51 -040086 }
npujar467fe752020-01-16 20:17:45 +053087 acquired, err = txn.Acquired(ctx, timeout, ownedByMe)
Richard Jankowski199fd862019-03-18 14:49:51 -040088 } else {
npujar467fe752020-01-16 20:17:45 +053089 acquired, err = txn.Acquired(ctx, timeout)
khenaidoo09771ef2019-10-11 14:25:02 -040090 }
91 if err == nil && acquired {
npujar1d86a522019-11-14 17:11:16 +053092 log.Debugw("transaction-acquired", log.Fields{"transactionId": txn.txnID})
khenaidoo09771ef2019-10-11 14:25:02 -040093 return txn, nil
Richard Jankowski199fd862019-03-18 14:49:51 -040094 }
npujar1d86a522019-11-14 17:11:16 +053095 log.Debugw("transaction-not-acquired", log.Fields{"transactionId": txn.txnID, "error": err})
96 return nil, kafka.ErrorTransactionNotAcquired
Richard Jankowski199fd862019-03-18 14:49:51 -040097}
98
khenaidoo297cd252019-02-07 22:10:23 -050099// competeForTransaction is a helper function to determine whether every request needs to compete with another
100// Core to execute the request
101func (rhp *AdapterRequestHandlerProxy) competeForTransaction() bool {
102 return rhp.coreInCompetingMode
103}
104
npujar1d86a522019-11-14 17:11:16 +0530105// Register registers the adapter
khenaidoo79232702018-12-04 11:00:41 -0500106func (rhp *AdapterRequestHandlerProxy) Register(args []*ic.Argument) (*voltha.CoreInstance, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500107 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400108 log.Warn("invalid-number-of-args", log.Fields{"args": args})
109 err := errors.New("invalid-number-of-args")
110 return nil, err
111 }
112 adapter := &voltha.Adapter{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500113 deviceTypes := &voltha.DeviceTypes{}
npujar1d86a522019-11-14 17:11:16 +0530114 transactionID := &ic.StrType{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500115 for _, arg := range args {
116 switch arg.Key {
117 case "adapter":
118 if err := ptypes.UnmarshalAny(arg.Value, adapter); err != nil {
119 log.Warnw("cannot-unmarshal-adapter", log.Fields{"error": err})
120 return nil, err
121 }
122 case "deviceTypes":
123 if err := ptypes.UnmarshalAny(arg.Value, deviceTypes); err != nil {
124 log.Warnw("cannot-unmarshal-device-types", log.Fields{"error": err})
125 return nil, err
126 }
khenaidoo297cd252019-02-07 22:10:23 -0500127 case kafka.TransactionKey:
npujar1d86a522019-11-14 17:11:16 +0530128 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500129 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
130 return nil, err
131 }
khenaidoo91ecfd62018-11-04 17:13:42 -0500132 }
khenaidoob9203542018-09-17 22:56:37 -0400133 }
npujar1d86a522019-11-14 17:11:16 +0530134 log.Debugw("Register", log.Fields{"Adapter": *adapter, "DeviceTypes": deviceTypes, "transactionID": transactionID.Val, "coreID": rhp.coreInstanceID})
khenaidoo297cd252019-02-07 22:10:23 -0500135
136 // Try to grab the transaction as this core may be competing with another Core
137 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530138 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, "")
npujar1d86a522019-11-14 17:11:16 +0530139 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400140 if err.Error() == kafka.ErrorTransactionNotAcquired.Error() {
npujar1d86a522019-11-14 17:11:16 +0530141 log.Debugw("Another core handled the request", log.Fields{"transactionId": transactionID})
khenaidoo09771ef2019-10-11 14:25:02 -0400142 // Update our adapters in memory
npujar467fe752020-01-16 20:17:45 +0530143 go rhp.adapterMgr.updateAdaptersAndDevicetypesInMemory(context.TODO(), adapter)
khenaidoo09771ef2019-10-11 14:25:02 -0400144 }
145 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500146 }
npujar467fe752020-01-16 20:17:45 +0530147 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500148 }
khenaidoob9203542018-09-17 22:56:37 -0400149
150 if rhp.TestMode { // Execute only for test cases
151 return &voltha.CoreInstance{InstanceId: "CoreInstance"}, nil
152 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530153 return rhp.adapterMgr.registerAdapter(adapter, deviceTypes)
khenaidoob9203542018-09-17 22:56:37 -0400154}
155
npujar1d86a522019-11-14 17:11:16 +0530156// GetDevice returns device info
khenaidoo79232702018-12-04 11:00:41 -0500157func (rhp *AdapterRequestHandlerProxy) GetDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500158 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400159 log.Warn("invalid-number-of-args", log.Fields{"args": args})
160 err := errors.New("invalid-number-of-args")
161 return nil, err
162 }
khenaidoo297cd252019-02-07 22:10:23 -0500163
khenaidoob9203542018-09-17 22:56:37 -0400164 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500165 transactionID := &ic.StrType{}
166 for _, arg := range args {
167 switch arg.Key {
168 case "device_id":
169 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
170 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
171 return nil, err
172 }
173 case kafka.TransactionKey:
174 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
175 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
176 return nil, err
177 }
178 }
khenaidoob9203542018-09-17 22:56:37 -0400179 }
npujar1d86a522019-11-14 17:11:16 +0530180 log.Debugw("GetDevice", log.Fields{"deviceID": pID.Id, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500181
182 // Try to grab the transaction as this core may be competing with another Core
183 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530184 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530185 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400186 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
187 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500188 }
npujar467fe752020-01-16 20:17:45 +0530189 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500190 }
khenaidoob9203542018-09-17 22:56:37 -0400191
192 if rhp.TestMode { // Execute only for test cases
193 return &voltha.Device{Id: pID.Id}, nil
194 }
195
196 // Get the device via the device manager
npujar467fe752020-01-16 20:17:45 +0530197 device, err := rhp.deviceMgr.GetDevice(context.TODO(), pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530198 if err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400199 return nil, status.Errorf(codes.NotFound, "%s", err.Error())
khenaidoob9203542018-09-17 22:56:37 -0400200 }
npujar1d86a522019-11-14 17:11:16 +0530201 log.Debugw("GetDevice-response", log.Fields{"deviceID": pID.Id})
202 return device, nil
khenaidoob9203542018-09-17 22:56:37 -0400203}
204
npujar1d86a522019-11-14 17:11:16 +0530205// DeviceUpdate updates device using adapter data
khenaidoo79232702018-12-04 11:00:41 -0500206func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500207 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400208 log.Warn("invalid-number-of-args", log.Fields{"args": args})
209 err := errors.New("invalid-number-of-args")
210 return nil, err
211 }
khenaidoo297cd252019-02-07 22:10:23 -0500212
khenaidoob9203542018-09-17 22:56:37 -0400213 device := &voltha.Device{}
khenaidoo297cd252019-02-07 22:10:23 -0500214 transactionID := &ic.StrType{}
215 for _, arg := range args {
216 switch arg.Key {
217 case "device":
218 if err := ptypes.UnmarshalAny(arg.Value, device); err != nil {
219 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
220 return nil, err
221 }
222 case kafka.TransactionKey:
223 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
224 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
225 return nil, err
226 }
227 }
khenaidoob9203542018-09-17 22:56:37 -0400228 }
npujar1d86a522019-11-14 17:11:16 +0530229 log.Debugw("DeviceUpdate", log.Fields{"deviceID": device.Id, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500230
231 // Try to grab the transaction as this core may be competing with another Core
232 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530233 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, device.Id)
npujar1d86a522019-11-14 17:11:16 +0530234 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400235 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
236 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500237 }
npujar467fe752020-01-16 20:17:45 +0530238 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500239 }
khenaidoob9203542018-09-17 22:56:37 -0400240
npujar1d86a522019-11-14 17:11:16 +0530241 log.Debugw("DeviceUpdate got txn", log.Fields{"deviceID": device.Id, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400242 if rhp.TestMode { // Execute only for test cases
243 return new(empty.Empty), nil
244 }
npujar1d86a522019-11-14 17:11:16 +0530245 go func() {
npujar467fe752020-01-16 20:17:45 +0530246 err := rhp.deviceMgr.updateDeviceUsingAdapterData(context.TODO(), device)
npujar1d86a522019-11-14 17:11:16 +0530247 if err != nil {
248 log.Errorw("unable-to-update-device-using-adapter-data", log.Fields{"error": err})
249 }
250 }()
khenaidoob9203542018-09-17 22:56:37 -0400251 return new(empty.Empty), nil
252}
253
npujar1d86a522019-11-14 17:11:16 +0530254// GetChildDevice returns details of child device
khenaidoo79232702018-12-04 11:00:41 -0500255func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500256 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400257 log.Warn("invalid-number-of-args", log.Fields{"args": args})
258 err := errors.New("invalid-number-of-args")
259 return nil, err
260 }
khenaidoo297cd252019-02-07 22:10:23 -0500261
khenaidoo2c6f1672018-09-20 23:14:41 -0400262 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500263 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500264 serialNumber := &ic.StrType{}
npujar1d86a522019-11-14 17:11:16 +0530265 onuID := &ic.IntType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500266 parentPortNo := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500267 for _, arg := range args {
268 switch arg.Key {
269 case "device_id":
270 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
271 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
272 return nil, err
273 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500274 case "serial_number":
275 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
276 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
277 return nil, err
278 }
279 case "onu_id":
npujar1d86a522019-11-14 17:11:16 +0530280 if err := ptypes.UnmarshalAny(arg.Value, onuID); err != nil {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500281 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
282 return nil, err
283 }
284 case "parent_port_no":
285 if err := ptypes.UnmarshalAny(arg.Value, parentPortNo); err != nil {
286 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
287 return nil, err
288 }
khenaidoo297cd252019-02-07 22:10:23 -0500289 case kafka.TransactionKey:
290 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
291 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
292 return nil, err
293 }
294 }
khenaidoob9203542018-09-17 22:56:37 -0400295 }
npujar1d86a522019-11-14 17:11:16 +0530296 log.Debugw("GetChildDevice", log.Fields{"parentDeviceID": pID.Id, "args": args, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500297
298 // Try to grab the transaction as this core may be competing with another Core
299 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530300 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530301 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400302 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
303 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500304 }
npujar467fe752020-01-16 20:17:45 +0530305 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500306 }
khenaidoob9203542018-09-17 22:56:37 -0400307
308 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400309 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400310 }
npujar467fe752020-01-16 20:17:45 +0530311 return rhp.deviceMgr.GetChildDevice(context.TODO(), pID.Id, serialNumber.Val, onuID.Val, parentPortNo.Val)
khenaidoob9203542018-09-17 22:56:37 -0400312}
313
npujar1d86a522019-11-14 17:11:16 +0530314// GetChildDeviceWithProxyAddress returns details of child device with proxy address
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500315func (rhp *AdapterRequestHandlerProxy) GetChildDeviceWithProxyAddress(args []*ic.Argument) (*voltha.Device, error) {
316 if len(args) < 2 {
317 log.Warn("invalid-number-of-args", log.Fields{"args": args})
318 err := errors.New("invalid-number-of-args")
319 return nil, err
320 }
321
322 proxyAddress := &voltha.Device_ProxyAddress{}
323 transactionID := &ic.StrType{}
324 for _, arg := range args {
325 switch arg.Key {
326 case "proxy_address":
327 if err := ptypes.UnmarshalAny(arg.Value, proxyAddress); err != nil {
328 log.Warnw("cannot-unmarshal-proxy-address", log.Fields{"error": err})
329 return nil, err
330 }
331 case kafka.TransactionKey:
332 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
333 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
334 return nil, err
335 }
336 }
337 }
338 log.Debugw("GetChildDeviceWithProxyAddress", log.Fields{"proxyAddress": proxyAddress, "transactionID": transactionID.Val})
339
340 // Try to grab the transaction as this core may be competing with another Core
341 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530342 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, proxyAddress.DeviceId)
npujar1d86a522019-11-14 17:11:16 +0530343 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400344 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
345 return nil, err
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500346 }
npujar467fe752020-01-16 20:17:45 +0530347 defer txn.Close(context.TODO())
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500348 }
349
350 if rhp.TestMode { // Execute only for test cases
351 return &voltha.Device{Id: proxyAddress.DeviceId}, nil
352 }
npujar467fe752020-01-16 20:17:45 +0530353 return rhp.deviceMgr.GetChildDeviceWithProxyAddress(context.TODO(), proxyAddress)
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500354}
355
npujar1d86a522019-11-14 17:11:16 +0530356// GetPorts returns the ports information of the device based on the port type.
khenaidoo79232702018-12-04 11:00:41 -0500357func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500358 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400359 log.Warn("invalid-number-of-args", log.Fields{"args": args})
360 err := errors.New("invalid-number-of-args")
361 return nil, err
362 }
npujar1d86a522019-11-14 17:11:16 +0530363 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500364 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500365 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400366 for _, arg := range args {
367 switch arg.Key {
368 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530369 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400370 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
371 return nil, err
372 }
373 case "port_type":
374 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
375 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
376 return nil, err
377 }
khenaidoo297cd252019-02-07 22:10:23 -0500378 case kafka.TransactionKey:
379 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
380 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
381 return nil, err
382 }
khenaidoo92e62c52018-10-03 14:02:54 -0400383 }
khenaidoob9203542018-09-17 22:56:37 -0400384 }
npujar1d86a522019-11-14 17:11:16 +0530385 log.Debugw("GetPorts", log.Fields{"deviceID": deviceID.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400386 if rhp.TestMode { // Execute only for test cases
387 aPort := &voltha.Port{Label: "test_port"}
388 allPorts := &voltha.Ports{}
389 allPorts.Items = append(allPorts.Items, aPort)
390 return allPorts, nil
391 }
khenaidoo09771ef2019-10-11 14:25:02 -0400392 // Try to grab the transaction as this core may be competing with another Core
393 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530394 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530395 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400396 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
397 return nil, err
khenaidoo09771ef2019-10-11 14:25:02 -0400398 }
npujar467fe752020-01-16 20:17:45 +0530399 defer txn.Close(context.TODO())
khenaidoo09771ef2019-10-11 14:25:02 -0400400 }
401
npujar1d86a522019-11-14 17:11:16 +0530402 return rhp.deviceMgr.getPorts(context.TODO(), deviceID.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400403}
404
npujar1d86a522019-11-14 17:11:16 +0530405// GetChildDevices gets all the child device IDs from the device passed as parameter
khenaidoo297cd252019-02-07 22:10:23 -0500406func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500407 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400408 log.Warn("invalid-number-of-args", log.Fields{"args": args})
409 err := errors.New("invalid-number-of-args")
410 return nil, err
411 }
khenaidoo297cd252019-02-07 22:10:23 -0500412
khenaidoo2c6f1672018-09-20 23:14:41 -0400413 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500414 transactionID := &ic.StrType{}
415 for _, arg := range args {
416 switch arg.Key {
417 case "device_id":
418 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
419 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
420 return nil, err
421 }
422 case kafka.TransactionKey:
423 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
424 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
425 return nil, err
426 }
427 }
khenaidoob9203542018-09-17 22:56:37 -0400428 }
npujar1d86a522019-11-14 17:11:16 +0530429 log.Debugw("GetChildDevices", log.Fields{"deviceID": pID.Id, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500430
431 // Try to grab the transaction as this core may be competing with another Core
432 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530433 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530434 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400435 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
436 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500437 }
npujar467fe752020-01-16 20:17:45 +0530438 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500439 }
khenaidoob9203542018-09-17 22:56:37 -0400440
441 if rhp.TestMode { // Execute only for test cases
khenaidoode93b462019-02-13 22:17:21 -0500442 return &voltha.Devices{Items: nil}, nil
khenaidoob9203542018-09-17 22:56:37 -0400443 }
khenaidoo297cd252019-02-07 22:10:23 -0500444
npujar467fe752020-01-16 20:17:45 +0530445 return rhp.deviceMgr.getAllChildDevices(context.TODO(), pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400446}
447
448// ChildDeviceDetected is invoked when a child device is detected. The following
449// parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500450// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700451func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500452 if len(args) < 5 {
khenaidoob9203542018-09-17 22:56:37 -0400453 log.Warn("invalid-number-of-args", log.Fields{"args": args})
454 err := errors.New("invalid-number-of-args")
455 return nil, err
456 }
457
458 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500459 portNo := &ic.IntType{}
460 dt := &ic.StrType{}
npujar1d86a522019-11-14 17:11:16 +0530461 chnlID := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500462 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500463 serialNumber := &ic.StrType{}
npujar1d86a522019-11-14 17:11:16 +0530464 vendorID := &ic.StrType{}
465 onuID := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400466 for _, arg := range args {
467 switch arg.Key {
468 case "parent_device_id":
469 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
470 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
471 return nil, err
472 }
473 case "parent_port_no":
474 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
475 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
476 return nil, err
477 }
478 case "child_device_type":
479 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
480 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
481 return nil, err
482 }
483 case "channel_id":
npujar1d86a522019-11-14 17:11:16 +0530484 if err := ptypes.UnmarshalAny(arg.Value, chnlID); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400485 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
486 return nil, err
487 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500488 case "vendor_id":
npujar1d86a522019-11-14 17:11:16 +0530489 if err := ptypes.UnmarshalAny(arg.Value, vendorID); err != nil {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500490 log.Warnw("cannot-unmarshal-vendor-id", log.Fields{"error": err})
491 return nil, err
492 }
493 case "serial_number":
494 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
495 log.Warnw("cannot-unmarshal-serial-number", log.Fields{"error": err})
496 return nil, err
497 }
498 case "onu_id":
npujar1d86a522019-11-14 17:11:16 +0530499 if err := ptypes.UnmarshalAny(arg.Value, onuID); err != nil {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500500 log.Warnw("cannot-unmarshal-onu-id", log.Fields{"error": err})
501 return nil, err
502 }
khenaidoo297cd252019-02-07 22:10:23 -0500503 case kafka.TransactionKey:
504 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
505 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
506 return nil, err
507 }
khenaidoob9203542018-09-17 22:56:37 -0400508 }
509 }
npujar1d86a522019-11-14 17:11:16 +0530510 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceID": pID.Id, "parentPortNo": portNo.Val,
511 "deviceType": dt.Val, "channelID": chnlID.Val, "serialNumber": serialNumber.Val,
512 "vendorID": vendorID.Val, "onuID": onuID.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500513
514 // Try to grab the transaction as this core may be competing with another Core
515 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530516 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530517 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400518 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
519 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500520 }
npujar467fe752020-01-16 20:17:45 +0530521 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500522 }
khenaidoob9203542018-09-17 22:56:37 -0400523
524 if rhp.TestMode { // Execute only for test cases
525 return nil, nil
526 }
npujar467fe752020-01-16 20:17:45 +0530527 device, err := rhp.deviceMgr.childDeviceDetected(context.TODO(), pID.Id, portNo.Val, dt.Val, chnlID.Val, vendorID.Val, serialNumber.Val, onuID.Val)
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700528 if err != nil {
npujar1d86a522019-11-14 17:11:16 +0530529 log.Errorw("child-detection-failed", log.Fields{"parentID": pID.Id, "onuID": onuID.Val, "error": err})
khenaidoo59ef7be2019-06-21 12:40:28 -0400530 return nil, err
531 }
khenaidoob9203542018-09-17 22:56:37 -0400532
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700533 return device, nil
khenaidoob9203542018-09-17 22:56:37 -0400534}
535
npujar1d86a522019-11-14 17:11:16 +0530536// DeviceStateUpdate updates device status
khenaidoo79232702018-12-04 11:00:41 -0500537func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500538 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400539 log.Warn("invalid-number-of-args", log.Fields{"args": args})
540 err := errors.New("invalid-number-of-args")
541 return nil, err
542 }
npujar1d86a522019-11-14 17:11:16 +0530543 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500544 operStatus := &ic.IntType{}
545 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500546 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400547 for _, arg := range args {
548 switch arg.Key {
549 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530550 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400551 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
552 return nil, err
553 }
554 case "oper_status":
555 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
556 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
557 return nil, err
558 }
khenaidoob9203542018-09-17 22:56:37 -0400559 case "connect_status":
560 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
561 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
562 return nil, err
563 }
khenaidoo297cd252019-02-07 22:10:23 -0500564 case kafka.TransactionKey:
565 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
566 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
567 return nil, err
568 }
khenaidoob9203542018-09-17 22:56:37 -0400569 }
570 }
npujar1d86a522019-11-14 17:11:16 +0530571 log.Debugw("DeviceStateUpdate", log.Fields{"deviceID": deviceID.Id, "oper-status": operStatus,
khenaidoo297cd252019-02-07 22:10:23 -0500572 "conn-status": connStatus, "transactionID": transactionID.Val})
573
574 // Try to grab the transaction as this core may be competing with another Core
575 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530576 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530577 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400578 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
579 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500580 }
npujar467fe752020-01-16 20:17:45 +0530581 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500582 }
583
khenaidoob9203542018-09-17 22:56:37 -0400584 if rhp.TestMode { // Execute only for test cases
585 return nil, nil
586 }
khenaidoo92e62c52018-10-03 14:02:54 -0400587 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
npujar1d86a522019-11-14 17:11:16 +0530588 go func() {
npujar467fe752020-01-16 20:17:45 +0530589 err := rhp.deviceMgr.updateDeviceStatus(context.TODO(), deviceID.Id, voltha.OperStatus_Types(operStatus.Val),
serkant.uluderya2ae470f2020-01-21 11:13:09 -0800590 voltha.ConnectStatus_Types(connStatus.Val))
npujar1d86a522019-11-14 17:11:16 +0530591 if err != nil {
592 log.Errorw("unable-to-update-device-status", log.Fields{"error": err})
593 }
594 }()
khenaidoo1ce37ad2019-03-24 22:07:24 -0400595
khenaidoo92e62c52018-10-03 14:02:54 -0400596 return new(empty.Empty), nil
597}
598
npujar1d86a522019-11-14 17:11:16 +0530599// ChildrenStateUpdate updates child device status
khenaidoo79232702018-12-04 11:00:41 -0500600func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500601 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400602 log.Warn("invalid-number-of-args", log.Fields{"args": args})
603 err := errors.New("invalid-number-of-args")
604 return nil, err
605 }
npujar1d86a522019-11-14 17:11:16 +0530606 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500607 operStatus := &ic.IntType{}
608 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500609 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400610 for _, arg := range args {
611 switch arg.Key {
612 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530613 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo4d4802d2018-10-04 21:59:49 -0400614 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
615 return nil, err
616 }
617 case "oper_status":
618 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
619 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
620 return nil, err
621 }
622 case "connect_status":
623 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
624 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
625 return nil, err
626 }
khenaidoo297cd252019-02-07 22:10:23 -0500627 case kafka.TransactionKey:
628 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
629 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
630 return nil, err
631 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400632 }
633 }
npujar1d86a522019-11-14 17:11:16 +0530634 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceID": deviceID.Id, "oper-status": operStatus,
khenaidoo297cd252019-02-07 22:10:23 -0500635 "conn-status": connStatus, "transactionID": transactionID.Val})
636
637 // Try to grab the transaction as this core may be competing with another Core
638 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530639 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530640 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400641 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
642 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500643 }
npujar467fe752020-01-16 20:17:45 +0530644 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500645 }
646
khenaidoo4d4802d2018-10-04 21:59:49 -0400647 if rhp.TestMode { // Execute only for test cases
648 return nil, nil
649 }
650
651 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
npujar1d86a522019-11-14 17:11:16 +0530652 go func() {
npujar467fe752020-01-16 20:17:45 +0530653 err := rhp.deviceMgr.updateChildrenStatus(context.TODO(), deviceID.Id, voltha.OperStatus_Types(operStatus.Val),
serkant.uluderya2ae470f2020-01-21 11:13:09 -0800654 voltha.ConnectStatus_Types(connStatus.Val))
npujar1d86a522019-11-14 17:11:16 +0530655 if err != nil {
656 log.Errorw("unable-to-update-children-status", log.Fields{"error": err})
657 }
658 }()
khenaidoo1ce37ad2019-03-24 22:07:24 -0400659
npujar1d86a522019-11-14 17:11:16 +0530660 //if err := rhp.deviceMgr.updateChildrenStatus(deviceID.ID, voltha.OperStatus_OperStatus(operStatus.Val),
khenaidoo1ce37ad2019-03-24 22:07:24 -0400661 // voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
662 // return nil, err
663 //}
khenaidoo4d4802d2018-10-04 21:59:49 -0400664 return new(empty.Empty), nil
665}
666
npujar1d86a522019-11-14 17:11:16 +0530667// PortsStateUpdate updates the ports state related to the device
khenaidoo3ab34882019-05-02 21:33:30 -0400668func (rhp *AdapterRequestHandlerProxy) PortsStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
669 if len(args) < 2 {
670 log.Warn("invalid-number-of-args", log.Fields{"args": args})
671 err := errors.New("invalid-number-of-args")
672 return nil, err
673 }
npujar1d86a522019-11-14 17:11:16 +0530674 deviceID := &voltha.ID{}
khenaidoo3ab34882019-05-02 21:33:30 -0400675 operStatus := &ic.IntType{}
676 transactionID := &ic.StrType{}
677 for _, arg := range args {
678 switch arg.Key {
679 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530680 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo3ab34882019-05-02 21:33:30 -0400681 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
682 return nil, err
683 }
684 case "oper_status":
685 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
686 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
687 return nil, err
688 }
689 case kafka.TransactionKey:
690 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
691 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
692 return nil, err
693 }
694 }
695 }
npujar1d86a522019-11-14 17:11:16 +0530696 log.Debugw("PortsStateUpdate", log.Fields{"deviceID": deviceID.Id, "operStatus": operStatus, "transactionID": transactionID.Val})
khenaidoo3ab34882019-05-02 21:33:30 -0400697
698 // Try to grab the transaction as this core may be competing with another Core
699 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530700 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530701 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400702 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
703 return nil, err
khenaidoo3ab34882019-05-02 21:33:30 -0400704 }
npujar467fe752020-01-16 20:17:45 +0530705 defer txn.Close(context.TODO())
khenaidoo3ab34882019-05-02 21:33:30 -0400706 }
707
708 if rhp.TestMode { // Execute only for test cases
709 return nil, nil
710 }
711
npujar1d86a522019-11-14 17:11:16 +0530712 go func() {
npujar467fe752020-01-16 20:17:45 +0530713 err := rhp.deviceMgr.updatePortsState(context.TODO(), deviceID.Id, voltha.OperStatus_Types(operStatus.Val))
npujar1d86a522019-11-14 17:11:16 +0530714 if err != nil {
715 log.Errorw("unable-to-update-ports-state", log.Fields{"error": err})
716 }
717 }()
khenaidoo3ab34882019-05-02 21:33:30 -0400718
719 return new(empty.Empty), nil
720}
721
npujar1d86a522019-11-14 17:11:16 +0530722// PortStateUpdate updates the port state of the device
khenaidoo79232702018-12-04 11:00:41 -0500723func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500724 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400725 log.Warn("invalid-number-of-args", log.Fields{"args": args})
726 err := errors.New("invalid-number-of-args")
727 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400728 }
npujar1d86a522019-11-14 17:11:16 +0530729 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500730 portType := &ic.IntType{}
731 portNo := &ic.IntType{}
732 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500733 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400734 for _, arg := range args {
735 switch arg.Key {
736 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530737 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400738 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
739 return nil, err
740 }
741 case "oper_status":
742 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
743 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
744 return nil, err
745 }
746 case "port_type":
747 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
748 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
749 return nil, err
750 }
751 case "port_no":
752 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
753 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
754 return nil, err
755 }
khenaidoo297cd252019-02-07 22:10:23 -0500756 case kafka.TransactionKey:
757 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
758 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
759 return nil, err
760 }
khenaidoo92e62c52018-10-03 14:02:54 -0400761 }
762 }
npujar1d86a522019-11-14 17:11:16 +0530763 log.Debugw("PortStateUpdate", log.Fields{"deviceID": deviceID.Id, "operStatus": operStatus,
khenaidoo297cd252019-02-07 22:10:23 -0500764 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
765
766 // Try to grab the transaction as this core may be competing with another Core
767 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530768 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530769 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400770 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
771 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500772 }
npujar467fe752020-01-16 20:17:45 +0530773 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500774 }
775
khenaidoo92e62c52018-10-03 14:02:54 -0400776 if rhp.TestMode { // Execute only for test cases
777 return nil, nil
778 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400779
npujar1d86a522019-11-14 17:11:16 +0530780 go func() {
David K. Bainbridgeeb8c4f82020-03-04 12:34:30 -0800781 if err := rhp.deviceMgr.updatePortState(context.TODO(), deviceID.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
782 voltha.OperStatus_Types(operStatus.Val)); err != nil {
783 // If the error doesn't change behavior and is
784 // essentially ignored, it is not an error, it is a
785 // warning.
786 // TODO: VOL-2707
787 log.Warnw("unable-to-update-port-state", log.Fields{"error": err})
npujar1d86a522019-11-14 17:11:16 +0530788 }
789 }()
khenaidoo1ce37ad2019-03-24 22:07:24 -0400790
npujar1d86a522019-11-14 17:11:16 +0530791 //if err := rhp.deviceMgr.updatePortState(deviceID.ID, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
khenaidoo1ce37ad2019-03-24 22:07:24 -0400792 // voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
793 // return nil, err
794 //}
khenaidoob9203542018-09-17 22:56:37 -0400795 return new(empty.Empty), nil
796}
797
npujar1d86a522019-11-14 17:11:16 +0530798// DeleteAllPorts deletes all ports of device
khenaidoo0a822f92019-05-08 15:15:57 -0400799func (rhp *AdapterRequestHandlerProxy) DeleteAllPorts(args []*ic.Argument) (*empty.Empty, error) {
800 if len(args) < 3 {
801 log.Warn("invalid-number-of-args", log.Fields{"args": args})
802 err := errors.New("invalid-number-of-args")
803 return nil, err
804 }
npujar1d86a522019-11-14 17:11:16 +0530805 deviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400806 transactionID := &ic.StrType{}
807 for _, arg := range args {
808 switch arg.Key {
809 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530810 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400811 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
812 return nil, err
813 }
814 case kafka.TransactionKey:
815 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
816 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
817 return nil, err
818 }
819 }
820 }
npujar1d86a522019-11-14 17:11:16 +0530821 log.Debugw("DeleteAllPorts", log.Fields{"deviceID": deviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400822
823 // Try to grab the transaction as this core may be competing with another Core
824 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530825 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530826 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400827 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
828 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400829 }
npujar467fe752020-01-16 20:17:45 +0530830 defer txn.Close(context.TODO())
khenaidoo0a822f92019-05-08 15:15:57 -0400831 }
832
833 if rhp.TestMode { // Execute only for test cases
834 return nil, nil
835 }
836
npujar1d86a522019-11-14 17:11:16 +0530837 go func() {
npujar467fe752020-01-16 20:17:45 +0530838 err := rhp.deviceMgr.deleteAllPorts(context.TODO(), deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530839 if err != nil {
840 log.Errorw("unable-to-delete-ports", log.Fields{"error": err})
841 }
842 }()
khenaidoo0a822f92019-05-08 15:15:57 -0400843
844 return new(empty.Empty), nil
845}
846
npujar1d86a522019-11-14 17:11:16 +0530847// ChildDevicesLost indicates that a parent device is in a state (Disabled) where it cannot manage the child devices.
848// This will trigger the Core to disable all the child devices.
khenaidoo0a822f92019-05-08 15:15:57 -0400849func (rhp *AdapterRequestHandlerProxy) ChildDevicesLost(args []*ic.Argument) (*empty.Empty, error) {
850 if len(args) < 2 {
851 log.Warn("invalid-number-of-args", log.Fields{"args": args})
852 err := errors.New("invalid-number-of-args")
853 return nil, err
854 }
npujar1d86a522019-11-14 17:11:16 +0530855 parentDeviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400856 transactionID := &ic.StrType{}
857 for _, arg := range args {
858 switch arg.Key {
859 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +0530860 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400861 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
862 return nil, err
863 }
864 case kafka.TransactionKey:
865 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
866 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
867 return nil, err
868 }
869 }
870 }
npujar1d86a522019-11-14 17:11:16 +0530871 log.Debugw("ChildDevicesLost", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400872
873 // Try to grab the transaction as this core may be competing with another Core
874 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530875 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530876 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400877 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
878 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400879 }
npujar467fe752020-01-16 20:17:45 +0530880 defer txn.Close(context.TODO())
khenaidoo0a822f92019-05-08 15:15:57 -0400881 }
882
883 if rhp.TestMode { // Execute only for test cases
884 return nil, nil
885 }
886
npujar1d86a522019-11-14 17:11:16 +0530887 go func() {
npujar467fe752020-01-16 20:17:45 +0530888 err := rhp.deviceMgr.childDevicesLost(context.TODO(), parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530889 if err != nil {
890 log.Errorw("unable-to-disable-child-devices", log.Fields{"error": err})
891 }
892 }()
khenaidoo0a822f92019-05-08 15:15:57 -0400893
894 return new(empty.Empty), nil
895}
896
npujar1d86a522019-11-14 17:11:16 +0530897// ChildDevicesDetected invoked by an adapter when child devices are found, typically after after a disable/enable sequence.
898// This will trigger the Core to Enable all the child devices of that parent.
khenaidoo0a822f92019-05-08 15:15:57 -0400899func (rhp *AdapterRequestHandlerProxy) ChildDevicesDetected(args []*ic.Argument) (*empty.Empty, error) {
900 if len(args) < 2 {
901 log.Warn("invalid-number-of-args", log.Fields{"args": args})
902 err := errors.New("invalid-number-of-args")
903 return nil, err
904 }
npujar1d86a522019-11-14 17:11:16 +0530905 parentDeviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400906 transactionID := &ic.StrType{}
907 for _, arg := range args {
908 switch arg.Key {
909 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +0530910 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400911 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
912 return nil, err
913 }
914 case kafka.TransactionKey:
915 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
916 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
917 return nil, err
918 }
919 }
920 }
npujar1d86a522019-11-14 17:11:16 +0530921 log.Debugw("ChildDevicesDetected", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400922
923 // Try to grab the transaction as this core may be competing with another Core
924 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530925 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530926 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400927 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
928 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400929 }
npujar467fe752020-01-16 20:17:45 +0530930 defer txn.Close(context.TODO())
khenaidoo0a822f92019-05-08 15:15:57 -0400931 }
932
933 if rhp.TestMode { // Execute only for test cases
934 return nil, nil
935 }
936
npujar467fe752020-01-16 20:17:45 +0530937 if err := rhp.deviceMgr.childDevicesDetected(context.TODO(), parentDeviceID.Id); err != nil {
npujar1d86a522019-11-14 17:11:16 +0530938 log.Errorw("child-devices-dection-failed", log.Fields{"parentID": parentDeviceID.Id, "error": err})
khenaidoo59ef7be2019-06-21 12:40:28 -0400939 return nil, err
940 }
khenaidoo0a822f92019-05-08 15:15:57 -0400941
942 return new(empty.Empty), nil
943}
944
npujar1d86a522019-11-14 17:11:16 +0530945// PortCreated adds port to device
khenaidoo79232702018-12-04 11:00:41 -0500946func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500947 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400948 log.Warn("invalid-number-of-args", log.Fields{"args": args})
949 err := errors.New("invalid-number-of-args")
950 return nil, err
951 }
npujar1d86a522019-11-14 17:11:16 +0530952 deviceID := &voltha.ID{}
khenaidoob9203542018-09-17 22:56:37 -0400953 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500954 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400955 for _, arg := range args {
956 switch arg.Key {
957 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530958 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400959 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
960 return nil, err
961 }
962 case "port":
963 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
964 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
965 return nil, err
966 }
khenaidoo297cd252019-02-07 22:10:23 -0500967 case kafka.TransactionKey:
968 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
969 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
970 return nil, err
971 }
khenaidoob9203542018-09-17 22:56:37 -0400972 }
973 }
npujar1d86a522019-11-14 17:11:16 +0530974 log.Debugw("PortCreated", log.Fields{"deviceID": deviceID.Id, "port": port, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500975
976 // Try to grab the transaction as this core may be competing with another Core
977 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530978 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530979 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400980 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
981 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500982 }
npujar467fe752020-01-16 20:17:45 +0530983 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500984 }
khenaidoob9203542018-09-17 22:56:37 -0400985
986 if rhp.TestMode { // Execute only for test cases
987 return nil, nil
988 }
npujar1d86a522019-11-14 17:11:16 +0530989 go func() {
npujar467fe752020-01-16 20:17:45 +0530990 err := rhp.deviceMgr.addPort(context.TODO(), deviceID.Id, port)
npujar1d86a522019-11-14 17:11:16 +0530991 if err != nil {
992 log.Errorw("unable-to-add-port", log.Fields{"error": err})
993 }
994 }()
khenaidoo92e62c52018-10-03 14:02:54 -0400995
khenaidoob9203542018-09-17 22:56:37 -0400996 return new(empty.Empty), nil
997}
998
npujar1d86a522019-11-14 17:11:16 +0530999// DevicePMConfigUpdate initializes the pm configs as defined by the adapter.
khenaidoo79232702018-12-04 11:00:41 -05001000func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob3127472019-07-24 21:04:55 -04001001 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -04001002 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1003 err := errors.New("invalid-number-of-args")
1004 return nil, err
1005 }
1006 pmConfigs := &voltha.PmConfigs{}
khenaidoo297cd252019-02-07 22:10:23 -05001007 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -04001008 for _, arg := range args {
1009 switch arg.Key {
1010 case "device_pm_config":
1011 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
1012 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
1013 return nil, err
1014 }
khenaidoo297cd252019-02-07 22:10:23 -05001015 case kafka.TransactionKey:
1016 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1017 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1018 return nil, err
1019 }
khenaidoob9203542018-09-17 22:56:37 -04001020 }
1021 }
npujar1d86a522019-11-14 17:11:16 +05301022 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceID": pmConfigs.Id, "configs": pmConfigs,
khenaidoob3127472019-07-24 21:04:55 -04001023 "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -05001024
1025 // Try to grab the transaction as this core may be competing with another Core
1026 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301027 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pmConfigs.Id)
npujar1d86a522019-11-14 17:11:16 +05301028 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001029 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1030 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -05001031 }
npujar467fe752020-01-16 20:17:45 +05301032 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -05001033 }
khenaidoob9203542018-09-17 22:56:37 -04001034
1035 if rhp.TestMode { // Execute only for test cases
1036 return nil, nil
1037 }
1038
npujar1d86a522019-11-14 17:11:16 +05301039 go func() {
npujar467fe752020-01-16 20:17:45 +05301040 err := rhp.deviceMgr.initPmConfigs(context.TODO(), pmConfigs.Id, pmConfigs)
npujar1d86a522019-11-14 17:11:16 +05301041 if err != nil {
1042 log.Errorw("unable-to-initialize-pm-configs", log.Fields{"error": err})
1043 }
1044 }()
khenaidoo92e62c52018-10-03 14:02:54 -04001045
khenaidoob9203542018-09-17 22:56:37 -04001046 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -04001047}
khenaidoofdbad6e2018-11-06 22:26:38 -05001048
npujar1d86a522019-11-14 17:11:16 +05301049// PacketIn sends the incoming packet of device
khenaidoo79232702018-12-04 11:00:41 -05001050func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -05001051 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -05001052 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1053 err := errors.New("invalid-number-of-args")
1054 return nil, err
1055 }
npujar1d86a522019-11-14 17:11:16 +05301056 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -05001057 portNo := &ic.IntType{}
1058 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -05001059 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -05001060 for _, arg := range args {
1061 switch arg.Key {
1062 case "device_id":
npujar1d86a522019-11-14 17:11:16 +05301063 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoofdbad6e2018-11-06 22:26:38 -05001064 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1065 return nil, err
1066 }
1067 case "port":
1068 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
1069 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
1070 return nil, err
1071 }
1072 case "packet":
1073 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
1074 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
1075 return nil, err
1076 }
khenaidoo297cd252019-02-07 22:10:23 -05001077 case kafka.TransactionKey:
1078 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1079 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1080 return nil, err
1081 }
khenaidoofdbad6e2018-11-06 22:26:38 -05001082 }
1083 }
npujar1d86a522019-11-14 17:11:16 +05301084 log.Debugw("PacketIn", log.Fields{"deviceID": deviceID.Id, "port": portNo.Val, "packet": packet,
khenaidoo297cd252019-02-07 22:10:23 -05001085 "transactionID": transactionID.Val})
1086
khenaidoo3d3b8c22019-05-22 18:10:39 -04001087 // Try to grab the transaction as this core may be competing with another Core
1088 // TODO: If this adds too much latencies then needs to remove transaction and let OFAgent filter out
1089 // duplicates.
1090 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301091 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301092 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001093 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1094 return nil, err
khenaidoo3d3b8c22019-05-22 18:10:39 -04001095 }
npujar467fe752020-01-16 20:17:45 +05301096 defer txn.Close(context.TODO())
khenaidoo3d3b8c22019-05-22 18:10:39 -04001097 }
khenaidoofdbad6e2018-11-06 22:26:38 -05001098 if rhp.TestMode { // Execute only for test cases
1099 return nil, nil
1100 }
npujar1d86a522019-11-14 17:11:16 +05301101 go func() {
npujar467fe752020-01-16 20:17:45 +05301102 err := rhp.deviceMgr.PacketIn(context.TODO(), deviceID.Id, uint32(portNo.Val), transactionID.Val, packet.Payload)
npujar1d86a522019-11-14 17:11:16 +05301103 if err != nil {
1104 log.Errorw("unable-to-receive-packet-from-adapter", log.Fields{"error": err})
1105 }
1106 }()
khenaidoo3d3b8c22019-05-22 18:10:39 -04001107
khenaidoofdbad6e2018-11-06 22:26:38 -05001108 return new(empty.Empty), nil
1109}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001110
npujar1d86a522019-11-14 17:11:16 +05301111// UpdateImageDownload updates image download
khenaidoof5a5bfa2019-01-23 22:20:29 -05001112func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
1113 if len(args) < 2 {
1114 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1115 err := errors.New("invalid-number-of-args")
1116 return nil, err
1117 }
npujar1d86a522019-11-14 17:11:16 +05301118 deviceID := &voltha.ID{}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001119 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -05001120 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001121 for _, arg := range args {
1122 switch arg.Key {
1123 case "device_id":
npujar1d86a522019-11-14 17:11:16 +05301124 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoof5a5bfa2019-01-23 22:20:29 -05001125 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1126 return nil, err
1127 }
1128 case "image_download":
1129 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
1130 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
1131 return nil, err
1132 }
khenaidoo297cd252019-02-07 22:10:23 -05001133 case kafka.TransactionKey:
1134 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1135 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1136 return nil, err
1137 }
khenaidoof5a5bfa2019-01-23 22:20:29 -05001138 }
1139 }
npujar1d86a522019-11-14 17:11:16 +05301140 log.Debugw("UpdateImageDownload", log.Fields{"deviceID": deviceID.Id, "image-download": img,
khenaidoo297cd252019-02-07 22:10:23 -05001141 "transactionID": transactionID.Val})
1142
1143 // Try to grab the transaction as this core may be competing with another Core
1144 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301145 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301146 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001147 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1148 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -05001149 }
npujar467fe752020-01-16 20:17:45 +05301150 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -05001151 }
1152
khenaidoof5a5bfa2019-01-23 22:20:29 -05001153 if rhp.TestMode { // Execute only for test cases
1154 return nil, nil
1155 }
npujar1d86a522019-11-14 17:11:16 +05301156 go func() {
npujar467fe752020-01-16 20:17:45 +05301157 err := rhp.deviceMgr.updateImageDownload(context.TODO(), deviceID.Id, img)
npujar1d86a522019-11-14 17:11:16 +05301158 if err != nil {
1159 log.Errorw("unable-to-update-image-download", log.Fields{"error": err})
1160 }
1161 }()
1162 //if err := rhp.deviceMgr.updateImageDownload(deviceID.ID, img); err != nil {
khenaidoo1ce37ad2019-03-24 22:07:24 -04001163 // return nil, err
1164 //}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001165 return new(empty.Empty), nil
1166}
khenaidooba6b6c42019-08-02 09:11:56 -04001167
npujar1d86a522019-11-14 17:11:16 +05301168// ReconcileChildDevices reconciles child devices
khenaidooba6b6c42019-08-02 09:11:56 -04001169func (rhp *AdapterRequestHandlerProxy) ReconcileChildDevices(args []*ic.Argument) (*empty.Empty, error) {
1170 if len(args) < 2 {
1171 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1172 err := errors.New("invalid-number-of-args")
1173 return nil, err
1174 }
npujar1d86a522019-11-14 17:11:16 +05301175 parentDeviceID := &voltha.ID{}
khenaidooba6b6c42019-08-02 09:11:56 -04001176 transactionID := &ic.StrType{}
1177 for _, arg := range args {
1178 switch arg.Key {
1179 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +05301180 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
khenaidooba6b6c42019-08-02 09:11:56 -04001181 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1182 return nil, err
1183 }
1184 case kafka.TransactionKey:
1185 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1186 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1187 return nil, err
1188 }
1189 }
1190 }
npujar1d86a522019-11-14 17:11:16 +05301191 log.Debugw("ReconcileChildDevices", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidooba6b6c42019-08-02 09:11:56 -04001192
1193 // Try to grab the transaction as this core may be competing with another Core
1194 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301195 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301196 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001197 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1198 return nil, err
khenaidooba6b6c42019-08-02 09:11:56 -04001199 }
npujar467fe752020-01-16 20:17:45 +05301200 defer txn.Close(context.TODO())
khenaidooba6b6c42019-08-02 09:11:56 -04001201 }
1202
1203 if rhp.TestMode { // Execute only for test cases
1204 return nil, nil
1205 }
1206
1207 // Run it in its own routine
npujar1d86a522019-11-14 17:11:16 +05301208 go func() {
npujar467fe752020-01-16 20:17:45 +05301209 err := rhp.deviceMgr.reconcileChildDevices(context.TODO(), parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301210 if err != nil {
1211 log.Errorw("unable-to-reconcile-child-devices", log.Fields{"error": err})
1212 }
1213 }()
khenaidooba6b6c42019-08-02 09:11:56 -04001214
1215 return new(empty.Empty), nil
1216}
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001217
npujar1d86a522019-11-14 17:11:16 +05301218// DeviceReasonUpdate updates device reason
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001219func (rhp *AdapterRequestHandlerProxy) DeviceReasonUpdate(args []*ic.Argument) (*empty.Empty, error) {
1220 if len(args) < 2 {
1221 log.Warn("DeviceReasonUpdate: invalid-number-of-args", log.Fields{"args": args})
1222 err := errors.New("DeviceReasonUpdate: invalid-number-of-args")
1223 return nil, err
1224 }
npujar1d86a522019-11-14 17:11:16 +05301225 deviceID := &voltha.ID{}
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001226 reason := &ic.StrType{}
1227 transactionID := &ic.StrType{}
1228 for _, arg := range args {
1229 switch arg.Key {
1230 case "device_id":
npujar1d86a522019-11-14 17:11:16 +05301231 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001232 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1233 return nil, err
1234 }
1235 case "device_reason":
1236 if err := ptypes.UnmarshalAny(arg.Value, reason); err != nil {
1237 log.Warnw("cannot-unmarshal-reason", log.Fields{"error": err})
1238 return nil, err
1239 }
1240 case kafka.TransactionKey:
1241 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1242 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1243 return nil, err
1244 }
1245 }
1246 }
npujar1d86a522019-11-14 17:11:16 +05301247 log.Debugw("DeviceReasonUpdate", log.Fields{"deviceId": deviceID.Id, "reason": reason.Val,
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001248 "transactionID": transactionID.Val})
1249
1250 // Try to grab the transaction as this core may be competing with another Core
1251 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301252 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301253 if err != nil {
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001254 log.Debugw("DeviceReasonUpdate: Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1255 return nil, err
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001256 }
npujar467fe752020-01-16 20:17:45 +05301257 defer txn.Close(context.TODO())
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001258 }
1259
1260 if rhp.TestMode { // Execute only for test cases
1261 return nil, nil
1262 }
1263
npujar467fe752020-01-16 20:17:45 +05301264 // Run it in its own routine (w/ background context)
npujar1d86a522019-11-14 17:11:16 +05301265 go func() {
npujar467fe752020-01-16 20:17:45 +05301266 err := rhp.deviceMgr.updateDeviceReason(context.TODO(), deviceID.Id, reason.Val)
npujar1d86a522019-11-14 17:11:16 +05301267 if err != nil {
1268 log.Errorw("unable-to-update-device-reason", log.Fields{"error": err})
1269 }
1270 }()
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001271
1272 return new(empty.Empty), nil
1273}