blob: dbdcc315860daf9c89fa6e2b51ae33c22e5d1df4 [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() {
npujar467fe752020-01-16 20:17:45 +0530781 err := rhp.deviceMgr.updatePortState(context.TODO(), deviceID.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
serkant.uluderya2ae470f2020-01-21 11:13:09 -0800782 voltha.OperStatus_Types(operStatus.Val))
npujar1d86a522019-11-14 17:11:16 +0530783 if err != nil {
784 log.Errorw("unable-to-update-port-state", log.Fields{"error": err})
785 }
786 }()
khenaidoo1ce37ad2019-03-24 22:07:24 -0400787
npujar1d86a522019-11-14 17:11:16 +0530788 //if err := rhp.deviceMgr.updatePortState(deviceID.ID, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
khenaidoo1ce37ad2019-03-24 22:07:24 -0400789 // voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
790 // return nil, err
791 //}
khenaidoob9203542018-09-17 22:56:37 -0400792 return new(empty.Empty), nil
793}
794
npujar1d86a522019-11-14 17:11:16 +0530795// DeleteAllPorts deletes all ports of device
khenaidoo0a822f92019-05-08 15:15:57 -0400796func (rhp *AdapterRequestHandlerProxy) DeleteAllPorts(args []*ic.Argument) (*empty.Empty, error) {
797 if len(args) < 3 {
798 log.Warn("invalid-number-of-args", log.Fields{"args": args})
799 err := errors.New("invalid-number-of-args")
800 return nil, err
801 }
npujar1d86a522019-11-14 17:11:16 +0530802 deviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400803 transactionID := &ic.StrType{}
804 for _, arg := range args {
805 switch arg.Key {
806 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530807 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400808 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
809 return nil, err
810 }
811 case kafka.TransactionKey:
812 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
813 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
814 return nil, err
815 }
816 }
817 }
npujar1d86a522019-11-14 17:11:16 +0530818 log.Debugw("DeleteAllPorts", log.Fields{"deviceID": deviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400819
820 // Try to grab the transaction as this core may be competing with another Core
821 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530822 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530823 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400824 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
825 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400826 }
npujar467fe752020-01-16 20:17:45 +0530827 defer txn.Close(context.TODO())
khenaidoo0a822f92019-05-08 15:15:57 -0400828 }
829
830 if rhp.TestMode { // Execute only for test cases
831 return nil, nil
832 }
833
npujar1d86a522019-11-14 17:11:16 +0530834 go func() {
npujar467fe752020-01-16 20:17:45 +0530835 err := rhp.deviceMgr.deleteAllPorts(context.TODO(), deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530836 if err != nil {
837 log.Errorw("unable-to-delete-ports", log.Fields{"error": err})
838 }
839 }()
khenaidoo0a822f92019-05-08 15:15:57 -0400840
841 return new(empty.Empty), nil
842}
843
npujar1d86a522019-11-14 17:11:16 +0530844// ChildDevicesLost indicates that a parent device is in a state (Disabled) where it cannot manage the child devices.
845// This will trigger the Core to disable all the child devices.
khenaidoo0a822f92019-05-08 15:15:57 -0400846func (rhp *AdapterRequestHandlerProxy) ChildDevicesLost(args []*ic.Argument) (*empty.Empty, error) {
847 if len(args) < 2 {
848 log.Warn("invalid-number-of-args", log.Fields{"args": args})
849 err := errors.New("invalid-number-of-args")
850 return nil, err
851 }
npujar1d86a522019-11-14 17:11:16 +0530852 parentDeviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400853 transactionID := &ic.StrType{}
854 for _, arg := range args {
855 switch arg.Key {
856 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +0530857 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400858 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
859 return nil, err
860 }
861 case kafka.TransactionKey:
862 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
863 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
864 return nil, err
865 }
866 }
867 }
npujar1d86a522019-11-14 17:11:16 +0530868 log.Debugw("ChildDevicesLost", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400869
870 // Try to grab the transaction as this core may be competing with another Core
871 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530872 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530873 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400874 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
875 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400876 }
npujar467fe752020-01-16 20:17:45 +0530877 defer txn.Close(context.TODO())
khenaidoo0a822f92019-05-08 15:15:57 -0400878 }
879
880 if rhp.TestMode { // Execute only for test cases
881 return nil, nil
882 }
883
npujar1d86a522019-11-14 17:11:16 +0530884 go func() {
npujar467fe752020-01-16 20:17:45 +0530885 err := rhp.deviceMgr.childDevicesLost(context.TODO(), parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530886 if err != nil {
887 log.Errorw("unable-to-disable-child-devices", log.Fields{"error": err})
888 }
889 }()
khenaidoo0a822f92019-05-08 15:15:57 -0400890
891 return new(empty.Empty), nil
892}
893
npujar1d86a522019-11-14 17:11:16 +0530894// ChildDevicesDetected invoked by an adapter when child devices are found, typically after after a disable/enable sequence.
895// This will trigger the Core to Enable all the child devices of that parent.
khenaidoo0a822f92019-05-08 15:15:57 -0400896func (rhp *AdapterRequestHandlerProxy) ChildDevicesDetected(args []*ic.Argument) (*empty.Empty, error) {
897 if len(args) < 2 {
898 log.Warn("invalid-number-of-args", log.Fields{"args": args})
899 err := errors.New("invalid-number-of-args")
900 return nil, err
901 }
npujar1d86a522019-11-14 17:11:16 +0530902 parentDeviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400903 transactionID := &ic.StrType{}
904 for _, arg := range args {
905 switch arg.Key {
906 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +0530907 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400908 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
909 return nil, err
910 }
911 case kafka.TransactionKey:
912 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
913 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
914 return nil, err
915 }
916 }
917 }
npujar1d86a522019-11-14 17:11:16 +0530918 log.Debugw("ChildDevicesDetected", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400919
920 // Try to grab the transaction as this core may be competing with another Core
921 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530922 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530923 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400924 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
925 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400926 }
npujar467fe752020-01-16 20:17:45 +0530927 defer txn.Close(context.TODO())
khenaidoo0a822f92019-05-08 15:15:57 -0400928 }
929
930 if rhp.TestMode { // Execute only for test cases
931 return nil, nil
932 }
933
npujar467fe752020-01-16 20:17:45 +0530934 if err := rhp.deviceMgr.childDevicesDetected(context.TODO(), parentDeviceID.Id); err != nil {
npujar1d86a522019-11-14 17:11:16 +0530935 log.Errorw("child-devices-dection-failed", log.Fields{"parentID": parentDeviceID.Id, "error": err})
khenaidoo59ef7be2019-06-21 12:40:28 -0400936 return nil, err
937 }
khenaidoo0a822f92019-05-08 15:15:57 -0400938
939 return new(empty.Empty), nil
940}
941
npujar1d86a522019-11-14 17:11:16 +0530942// PortCreated adds port to device
khenaidoo79232702018-12-04 11:00:41 -0500943func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500944 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400945 log.Warn("invalid-number-of-args", log.Fields{"args": args})
946 err := errors.New("invalid-number-of-args")
947 return nil, err
948 }
npujar1d86a522019-11-14 17:11:16 +0530949 deviceID := &voltha.ID{}
khenaidoob9203542018-09-17 22:56:37 -0400950 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500951 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400952 for _, arg := range args {
953 switch arg.Key {
954 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530955 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400956 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
957 return nil, err
958 }
959 case "port":
960 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
961 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
962 return nil, err
963 }
khenaidoo297cd252019-02-07 22:10:23 -0500964 case kafka.TransactionKey:
965 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
966 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
967 return nil, err
968 }
khenaidoob9203542018-09-17 22:56:37 -0400969 }
970 }
npujar1d86a522019-11-14 17:11:16 +0530971 log.Debugw("PortCreated", log.Fields{"deviceID": deviceID.Id, "port": port, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500972
973 // Try to grab the transaction as this core may be competing with another Core
974 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530975 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530976 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400977 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
978 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500979 }
npujar467fe752020-01-16 20:17:45 +0530980 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500981 }
khenaidoob9203542018-09-17 22:56:37 -0400982
983 if rhp.TestMode { // Execute only for test cases
984 return nil, nil
985 }
npujar1d86a522019-11-14 17:11:16 +0530986 go func() {
npujar467fe752020-01-16 20:17:45 +0530987 err := rhp.deviceMgr.addPort(context.TODO(), deviceID.Id, port)
npujar1d86a522019-11-14 17:11:16 +0530988 if err != nil {
989 log.Errorw("unable-to-add-port", log.Fields{"error": err})
990 }
991 }()
khenaidoo92e62c52018-10-03 14:02:54 -0400992
khenaidoob9203542018-09-17 22:56:37 -0400993 return new(empty.Empty), nil
994}
995
npujar1d86a522019-11-14 17:11:16 +0530996// DevicePMConfigUpdate initializes the pm configs as defined by the adapter.
khenaidoo79232702018-12-04 11:00:41 -0500997func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob3127472019-07-24 21:04:55 -0400998 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400999 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1000 err := errors.New("invalid-number-of-args")
1001 return nil, err
1002 }
1003 pmConfigs := &voltha.PmConfigs{}
khenaidoo297cd252019-02-07 22:10:23 -05001004 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -04001005 for _, arg := range args {
1006 switch arg.Key {
1007 case "device_pm_config":
1008 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
1009 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
1010 return nil, err
1011 }
khenaidoo297cd252019-02-07 22:10:23 -05001012 case kafka.TransactionKey:
1013 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1014 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1015 return nil, err
1016 }
khenaidoob9203542018-09-17 22:56:37 -04001017 }
1018 }
npujar1d86a522019-11-14 17:11:16 +05301019 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceID": pmConfigs.Id, "configs": pmConfigs,
khenaidoob3127472019-07-24 21:04:55 -04001020 "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -05001021
1022 // Try to grab the transaction as this core may be competing with another Core
1023 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301024 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pmConfigs.Id)
npujar1d86a522019-11-14 17:11:16 +05301025 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001026 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1027 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -05001028 }
npujar467fe752020-01-16 20:17:45 +05301029 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -05001030 }
khenaidoob9203542018-09-17 22:56:37 -04001031
1032 if rhp.TestMode { // Execute only for test cases
1033 return nil, nil
1034 }
1035
npujar1d86a522019-11-14 17:11:16 +05301036 go func() {
npujar467fe752020-01-16 20:17:45 +05301037 err := rhp.deviceMgr.initPmConfigs(context.TODO(), pmConfigs.Id, pmConfigs)
npujar1d86a522019-11-14 17:11:16 +05301038 if err != nil {
1039 log.Errorw("unable-to-initialize-pm-configs", log.Fields{"error": err})
1040 }
1041 }()
khenaidoo92e62c52018-10-03 14:02:54 -04001042
khenaidoob9203542018-09-17 22:56:37 -04001043 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -04001044}
khenaidoofdbad6e2018-11-06 22:26:38 -05001045
npujar1d86a522019-11-14 17:11:16 +05301046// PacketIn sends the incoming packet of device
khenaidoo79232702018-12-04 11:00:41 -05001047func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -05001048 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -05001049 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1050 err := errors.New("invalid-number-of-args")
1051 return nil, err
1052 }
npujar1d86a522019-11-14 17:11:16 +05301053 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -05001054 portNo := &ic.IntType{}
1055 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -05001056 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -05001057 for _, arg := range args {
1058 switch arg.Key {
1059 case "device_id":
npujar1d86a522019-11-14 17:11:16 +05301060 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoofdbad6e2018-11-06 22:26:38 -05001061 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1062 return nil, err
1063 }
1064 case "port":
1065 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
1066 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
1067 return nil, err
1068 }
1069 case "packet":
1070 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
1071 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
1072 return nil, err
1073 }
khenaidoo297cd252019-02-07 22:10:23 -05001074 case kafka.TransactionKey:
1075 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1076 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1077 return nil, err
1078 }
khenaidoofdbad6e2018-11-06 22:26:38 -05001079 }
1080 }
npujar1d86a522019-11-14 17:11:16 +05301081 log.Debugw("PacketIn", log.Fields{"deviceID": deviceID.Id, "port": portNo.Val, "packet": packet,
khenaidoo297cd252019-02-07 22:10:23 -05001082 "transactionID": transactionID.Val})
1083
khenaidoo3d3b8c22019-05-22 18:10:39 -04001084 // Try to grab the transaction as this core may be competing with another Core
1085 // TODO: If this adds too much latencies then needs to remove transaction and let OFAgent filter out
1086 // duplicates.
1087 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301088 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301089 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001090 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1091 return nil, err
khenaidoo3d3b8c22019-05-22 18:10:39 -04001092 }
npujar467fe752020-01-16 20:17:45 +05301093 defer txn.Close(context.TODO())
khenaidoo3d3b8c22019-05-22 18:10:39 -04001094 }
khenaidoofdbad6e2018-11-06 22:26:38 -05001095 if rhp.TestMode { // Execute only for test cases
1096 return nil, nil
1097 }
npujar1d86a522019-11-14 17:11:16 +05301098 go func() {
npujar467fe752020-01-16 20:17:45 +05301099 err := rhp.deviceMgr.PacketIn(context.TODO(), deviceID.Id, uint32(portNo.Val), transactionID.Val, packet.Payload)
npujar1d86a522019-11-14 17:11:16 +05301100 if err != nil {
1101 log.Errorw("unable-to-receive-packet-from-adapter", log.Fields{"error": err})
1102 }
1103 }()
khenaidoo3d3b8c22019-05-22 18:10:39 -04001104
khenaidoofdbad6e2018-11-06 22:26:38 -05001105 return new(empty.Empty), nil
1106}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001107
npujar1d86a522019-11-14 17:11:16 +05301108// UpdateImageDownload updates image download
khenaidoof5a5bfa2019-01-23 22:20:29 -05001109func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
1110 if len(args) < 2 {
1111 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1112 err := errors.New("invalid-number-of-args")
1113 return nil, err
1114 }
npujar1d86a522019-11-14 17:11:16 +05301115 deviceID := &voltha.ID{}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001116 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -05001117 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001118 for _, arg := range args {
1119 switch arg.Key {
1120 case "device_id":
npujar1d86a522019-11-14 17:11:16 +05301121 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoof5a5bfa2019-01-23 22:20:29 -05001122 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1123 return nil, err
1124 }
1125 case "image_download":
1126 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
1127 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
1128 return nil, err
1129 }
khenaidoo297cd252019-02-07 22:10:23 -05001130 case kafka.TransactionKey:
1131 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1132 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1133 return nil, err
1134 }
khenaidoof5a5bfa2019-01-23 22:20:29 -05001135 }
1136 }
npujar1d86a522019-11-14 17:11:16 +05301137 log.Debugw("UpdateImageDownload", log.Fields{"deviceID": deviceID.Id, "image-download": img,
khenaidoo297cd252019-02-07 22:10:23 -05001138 "transactionID": transactionID.Val})
1139
1140 // Try to grab the transaction as this core may be competing with another Core
1141 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301142 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301143 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001144 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1145 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -05001146 }
npujar467fe752020-01-16 20:17:45 +05301147 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -05001148 }
1149
khenaidoof5a5bfa2019-01-23 22:20:29 -05001150 if rhp.TestMode { // Execute only for test cases
1151 return nil, nil
1152 }
npujar1d86a522019-11-14 17:11:16 +05301153 go func() {
npujar467fe752020-01-16 20:17:45 +05301154 err := rhp.deviceMgr.updateImageDownload(context.TODO(), deviceID.Id, img)
npujar1d86a522019-11-14 17:11:16 +05301155 if err != nil {
1156 log.Errorw("unable-to-update-image-download", log.Fields{"error": err})
1157 }
1158 }()
1159 //if err := rhp.deviceMgr.updateImageDownload(deviceID.ID, img); err != nil {
khenaidoo1ce37ad2019-03-24 22:07:24 -04001160 // return nil, err
1161 //}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001162 return new(empty.Empty), nil
1163}
khenaidooba6b6c42019-08-02 09:11:56 -04001164
npujar1d86a522019-11-14 17:11:16 +05301165// ReconcileChildDevices reconciles child devices
khenaidooba6b6c42019-08-02 09:11:56 -04001166func (rhp *AdapterRequestHandlerProxy) ReconcileChildDevices(args []*ic.Argument) (*empty.Empty, error) {
1167 if len(args) < 2 {
1168 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1169 err := errors.New("invalid-number-of-args")
1170 return nil, err
1171 }
npujar1d86a522019-11-14 17:11:16 +05301172 parentDeviceID := &voltha.ID{}
khenaidooba6b6c42019-08-02 09:11:56 -04001173 transactionID := &ic.StrType{}
1174 for _, arg := range args {
1175 switch arg.Key {
1176 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +05301177 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
khenaidooba6b6c42019-08-02 09:11:56 -04001178 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1179 return nil, err
1180 }
1181 case kafka.TransactionKey:
1182 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1183 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1184 return nil, err
1185 }
1186 }
1187 }
npujar1d86a522019-11-14 17:11:16 +05301188 log.Debugw("ReconcileChildDevices", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidooba6b6c42019-08-02 09:11:56 -04001189
1190 // Try to grab the transaction as this core may be competing with another Core
1191 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301192 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301193 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001194 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1195 return nil, err
khenaidooba6b6c42019-08-02 09:11:56 -04001196 }
npujar467fe752020-01-16 20:17:45 +05301197 defer txn.Close(context.TODO())
khenaidooba6b6c42019-08-02 09:11:56 -04001198 }
1199
1200 if rhp.TestMode { // Execute only for test cases
1201 return nil, nil
1202 }
1203
1204 // Run it in its own routine
npujar1d86a522019-11-14 17:11:16 +05301205 go func() {
npujar467fe752020-01-16 20:17:45 +05301206 err := rhp.deviceMgr.reconcileChildDevices(context.TODO(), parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301207 if err != nil {
1208 log.Errorw("unable-to-reconcile-child-devices", log.Fields{"error": err})
1209 }
1210 }()
khenaidooba6b6c42019-08-02 09:11:56 -04001211
1212 return new(empty.Empty), nil
1213}
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001214
npujar1d86a522019-11-14 17:11:16 +05301215// DeviceReasonUpdate updates device reason
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001216func (rhp *AdapterRequestHandlerProxy) DeviceReasonUpdate(args []*ic.Argument) (*empty.Empty, error) {
1217 if len(args) < 2 {
1218 log.Warn("DeviceReasonUpdate: invalid-number-of-args", log.Fields{"args": args})
1219 err := errors.New("DeviceReasonUpdate: invalid-number-of-args")
1220 return nil, err
1221 }
npujar1d86a522019-11-14 17:11:16 +05301222 deviceID := &voltha.ID{}
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001223 reason := &ic.StrType{}
1224 transactionID := &ic.StrType{}
1225 for _, arg := range args {
1226 switch arg.Key {
1227 case "device_id":
npujar1d86a522019-11-14 17:11:16 +05301228 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001229 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1230 return nil, err
1231 }
1232 case "device_reason":
1233 if err := ptypes.UnmarshalAny(arg.Value, reason); err != nil {
1234 log.Warnw("cannot-unmarshal-reason", log.Fields{"error": err})
1235 return nil, err
1236 }
1237 case kafka.TransactionKey:
1238 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1239 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1240 return nil, err
1241 }
1242 }
1243 }
npujar1d86a522019-11-14 17:11:16 +05301244 log.Debugw("DeviceReasonUpdate", log.Fields{"deviceId": deviceID.Id, "reason": reason.Val,
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001245 "transactionID": transactionID.Val})
1246
1247 // Try to grab the transaction as this core may be competing with another Core
1248 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301249 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301250 if err != nil {
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001251 log.Debugw("DeviceReasonUpdate: Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1252 return nil, err
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001253 }
npujar467fe752020-01-16 20:17:45 +05301254 defer txn.Close(context.TODO())
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001255 }
1256
1257 if rhp.TestMode { // Execute only for test cases
1258 return nil, nil
1259 }
1260
npujar467fe752020-01-16 20:17:45 +05301261 // Run it in its own routine (w/ background context)
npujar1d86a522019-11-14 17:11:16 +05301262 go func() {
npujar467fe752020-01-16 20:17:45 +05301263 err := rhp.deviceMgr.updateDeviceReason(context.TODO(), deviceID.Id, reason.Val)
npujar1d86a522019-11-14 17:11:16 +05301264 if err != nil {
1265 log.Errorw("unable-to-update-device-reason", log.Fields{"error": err})
1266 }
1267 }()
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001268
1269 return new(empty.Empty), nil
1270}