blob: 2b28fa54071e3781c9245fd0fd501dfba48a19ea [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 */
16package core
17
18import (
19 "errors"
20 "github.com/golang/protobuf/ptypes"
21 "github.com/golang/protobuf/ptypes/empty"
22 "github.com/opencord/voltha-go/common/log"
23 "github.com/opencord/voltha-go/db/model"
khenaidoo297cd252019-02-07 22:10:23 -050024 "github.com/opencord/voltha-go/kafka"
khenaidoo1ce37ad2019-03-24 22:07:24 -040025 "github.com/opencord/voltha-go/rw_core/utils"
William Kurkiandaa6bb22019-03-07 12:26:28 -050026 ic "github.com/opencord/voltha-protos/go/inter_container"
27 "github.com/opencord/voltha-protos/go/voltha"
khenaidoob9203542018-09-17 22:56:37 -040028 "google.golang.org/grpc/codes"
29 "google.golang.org/grpc/status"
30)
31
32type AdapterRequestHandlerProxy struct {
khenaidoode93b462019-02-13 22:17:21 -050033 TestMode bool
34 coreInstanceId string
35 deviceMgr *DeviceManager
36 lDeviceMgr *LogicalDeviceManager
37 adapterMgr *AdapterManager
38 localDataProxy *model.Proxy
39 clusterDataProxy *model.Proxy
40 defaultRequestTimeout int64
khenaidoo297cd252019-02-07 22:10:23 -050041 longRunningRequestTimeout int64
khenaidoode93b462019-02-13 22:17:21 -050042 coreInCompetingMode bool
Richard Jankowski199fd862019-03-18 14:49:51 -040043 core *Core
khenaidoob9203542018-09-17 22:56:37 -040044}
45
Richard Jankowski199fd862019-03-18 14:49:51 -040046func NewAdapterRequestHandlerProxy(core *Core, coreInstanceId string, dMgr *DeviceManager, ldMgr *LogicalDeviceManager,
khenaidoo297cd252019-02-07 22:10:23 -050047 aMgr *AdapterManager, cdProxy *model.Proxy, ldProxy *model.Proxy, incompetingMode bool, longRunningRequestTimeout int64,
48 defaultRequestTimeout int64) *AdapterRequestHandlerProxy {
khenaidoob9203542018-09-17 22:56:37 -040049 var proxy AdapterRequestHandlerProxy
Richard Jankowski199fd862019-03-18 14:49:51 -040050 proxy.core = core
khenaidoo91ecfd62018-11-04 17:13:42 -050051 proxy.coreInstanceId = coreInstanceId
khenaidoob9203542018-09-17 22:56:37 -040052 proxy.deviceMgr = dMgr
53 proxy.lDeviceMgr = ldMgr
54 proxy.clusterDataProxy = cdProxy
55 proxy.localDataProxy = ldProxy
khenaidoo21d51152019-02-01 13:48:37 -050056 proxy.adapterMgr = aMgr
khenaidoo297cd252019-02-07 22:10:23 -050057 proxy.coreInCompetingMode = incompetingMode
58 proxy.defaultRequestTimeout = defaultRequestTimeout
59 proxy.longRunningRequestTimeout = longRunningRequestTimeout
khenaidoob9203542018-09-17 22:56:37 -040060 return &proxy
61}
62
Richard Jankowski199fd862019-03-18 14:49:51 -040063func (rhp *AdapterRequestHandlerProxy) acquireRequest(transactionId string, maxTimeout ...int64) (*KVTransaction, error) {
khenaidoo297cd252019-02-07 22:10:23 -050064 timeout := rhp.defaultRequestTimeout
65 if len(maxTimeout) > 0 {
66 timeout = maxTimeout[0]
67 }
khenaidoo297cd252019-02-07 22:10:23 -050068 txn := NewKVTransaction(transactionId)
69 if txn == nil {
khenaidoode93b462019-02-13 22:17:21 -050070 return nil, errors.New("fail-to-create-transaction")
khenaidoo297cd252019-02-07 22:10:23 -050071 } else if txn.Acquired(timeout) {
khenaidoo1ce37ad2019-03-24 22:07:24 -040072 log.Debugw("acquired-request", log.Fields{"xtrnsId": transactionId})
khenaidoo297cd252019-02-07 22:10:23 -050073 return txn, nil
74 } else {
75 return nil, errors.New("failed-to-seize-request")
76 }
77}
78
Richard Jankowski199fd862019-03-18 14:49:51 -040079// This is a helper function that attempts to acquire the request by using the device ownership model
80func (rhp *AdapterRequestHandlerProxy) takeRequestOwnership(transactionId string, devId string, maxTimeout ...int64) (*KVTransaction, error) {
81 timeout := rhp.defaultRequestTimeout
82 if len(maxTimeout) > 0 {
83 timeout = maxTimeout[0]
84 }
Richard Jankowski199fd862019-03-18 14:49:51 -040085 txn := NewKVTransaction(transactionId)
86 if txn == nil {
87 return nil, errors.New("fail-to-create-transaction")
88 }
89
khenaidoo2c6a0992019-04-29 13:46:56 -040090 if rhp.core.deviceOwnership.OwnedByMe(&utils.DeviceID{Id: devId}) {
khenaidoo1ce37ad2019-03-24 22:07:24 -040091 log.Debugw("owned-by-me", log.Fields{"Id": devId})
Richard Jankowski199fd862019-03-18 14:49:51 -040092 if txn.Acquired(timeout) {
khenaidoo1ce37ad2019-03-24 22:07:24 -040093 log.Debugw("processing-request", log.Fields{"Id": devId})
Richard Jankowski199fd862019-03-18 14:49:51 -040094 return txn, nil
95 } else {
96 return nil, errors.New("failed-to-seize-request")
97 }
98 } else {
khenaidoo1ce37ad2019-03-24 22:07:24 -040099 log.Debugw("not-owned-by-me", log.Fields{"Id": devId})
Richard Jankowski199fd862019-03-18 14:49:51 -0400100 if txn.Monitor(timeout) {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400101 log.Debugw("timeout-processing-request", log.Fields{"Id": devId})
Richard Jankowski199fd862019-03-18 14:49:51 -0400102 return txn, nil
103 } else {
104 return nil, errors.New("device-not-owned")
105 }
106 }
107}
108
khenaidoo297cd252019-02-07 22:10:23 -0500109// competeForTransaction is a helper function to determine whether every request needs to compete with another
110// Core to execute the request
111func (rhp *AdapterRequestHandlerProxy) competeForTransaction() bool {
112 return rhp.coreInCompetingMode
113}
114
khenaidoo79232702018-12-04 11:00:41 -0500115func (rhp *AdapterRequestHandlerProxy) Register(args []*ic.Argument) (*voltha.CoreInstance, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500116 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400117 log.Warn("invalid-number-of-args", log.Fields{"args": args})
118 err := errors.New("invalid-number-of-args")
119 return nil, err
120 }
121 adapter := &voltha.Adapter{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500122 deviceTypes := &voltha.DeviceTypes{}
khenaidoo297cd252019-02-07 22:10:23 -0500123 transactionID := &ic.StrType{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500124 for _, arg := range args {
125 switch arg.Key {
126 case "adapter":
127 if err := ptypes.UnmarshalAny(arg.Value, adapter); err != nil {
128 log.Warnw("cannot-unmarshal-adapter", log.Fields{"error": err})
129 return nil, err
130 }
131 case "deviceTypes":
132 if err := ptypes.UnmarshalAny(arg.Value, deviceTypes); err != nil {
133 log.Warnw("cannot-unmarshal-device-types", log.Fields{"error": err})
134 return nil, err
135 }
khenaidoo297cd252019-02-07 22:10:23 -0500136 case kafka.TransactionKey:
137 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
138 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
139 return nil, err
140 }
khenaidoo91ecfd62018-11-04 17:13:42 -0500141 }
khenaidoob9203542018-09-17 22:56:37 -0400142 }
khenaidoo297cd252019-02-07 22:10:23 -0500143 log.Debugw("Register", log.Fields{"Adapter": *adapter, "DeviceTypes": deviceTypes, "transactionID": transactionID.Val, "coreId": rhp.coreInstanceId})
144
145 // Try to grab the transaction as this core may be competing with another Core
146 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400147 if txn, err := rhp.acquireRequest(transactionID.Val); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500148 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
149 // Update our adapters in memory
khenaidooba6b6c42019-08-02 09:11:56 -0400150 go rhp.adapterMgr.updateAdaptersAndDevicetypesInMemory(adapter)
khenaidoo297cd252019-02-07 22:10:23 -0500151 // returning nil, nil instructs the callee to ignore this request
152 return nil, nil
153 } else {
154 defer txn.Close()
155 }
156 }
khenaidoob9203542018-09-17 22:56:37 -0400157
158 if rhp.TestMode { // Execute only for test cases
159 return &voltha.CoreInstance{InstanceId: "CoreInstance"}, nil
160 }
khenaidoo21d51152019-02-01 13:48:37 -0500161 return rhp.adapterMgr.registerAdapter(adapter, deviceTypes), nil
khenaidoob9203542018-09-17 22:56:37 -0400162}
163
khenaidoo79232702018-12-04 11:00:41 -0500164func (rhp *AdapterRequestHandlerProxy) GetDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500165 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400166 log.Warn("invalid-number-of-args", log.Fields{"args": args})
167 err := errors.New("invalid-number-of-args")
168 return nil, err
169 }
khenaidoo297cd252019-02-07 22:10:23 -0500170
khenaidoob9203542018-09-17 22:56:37 -0400171 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500172 transactionID := &ic.StrType{}
173 for _, arg := range args {
174 switch arg.Key {
175 case "device_id":
176 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
177 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
178 return nil, err
179 }
180 case kafka.TransactionKey:
181 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
182 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
183 return nil, err
184 }
185 }
khenaidoob9203542018-09-17 22:56:37 -0400186 }
khenaidoo297cd252019-02-07 22:10:23 -0500187 log.Debugw("GetDevice", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
188
189 // Try to grab the transaction as this core may be competing with another Core
190 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400191 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500192 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
193 // returning nil, nil instructs the callee to ignore this request
194 return nil, nil
195 } else {
196 defer txn.Close()
197 }
198 }
khenaidoob9203542018-09-17 22:56:37 -0400199
200 if rhp.TestMode { // Execute only for test cases
201 return &voltha.Device{Id: pID.Id}, nil
202 }
203
204 // Get the device via the device manager
khenaidoo19d7b632018-10-30 10:49:50 -0400205 if device, err := rhp.deviceMgr.GetDevice(pID.Id); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400206 return nil, status.Errorf(codes.NotFound, "%s", err.Error())
207 } else {
khenaidoo79232702018-12-04 11:00:41 -0500208 log.Debugw("GetDevice-response", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400209 return device, nil
210 }
211}
212
khenaidoo79232702018-12-04 11:00:41 -0500213func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500214 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400215 log.Warn("invalid-number-of-args", log.Fields{"args": args})
216 err := errors.New("invalid-number-of-args")
217 return nil, err
218 }
khenaidoo297cd252019-02-07 22:10:23 -0500219
khenaidoob9203542018-09-17 22:56:37 -0400220 device := &voltha.Device{}
khenaidoo297cd252019-02-07 22:10:23 -0500221 transactionID := &ic.StrType{}
222 for _, arg := range args {
223 switch arg.Key {
224 case "device":
225 if err := ptypes.UnmarshalAny(arg.Value, device); err != nil {
226 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
227 return nil, err
228 }
229 case kafka.TransactionKey:
230 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
231 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
232 return nil, err
233 }
234 }
khenaidoob9203542018-09-17 22:56:37 -0400235 }
khenaidoo297cd252019-02-07 22:10:23 -0500236 log.Debugw("DeviceUpdate", log.Fields{"deviceId": device.Id, "transactionID": transactionID.Val})
237
238 // Try to grab the transaction as this core may be competing with another Core
239 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400240 if txn, err := rhp.takeRequestOwnership(transactionID.Val, device.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500241 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
242 // returning nil, nil instructs the callee to ignore this request
243 return nil, nil
244 } else {
245 defer txn.Close()
246 }
247 }
khenaidoob9203542018-09-17 22:56:37 -0400248
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700249 log.Debugw("DeviceUpdate got txn", log.Fields{"deviceId": device.Id, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400250 if rhp.TestMode { // Execute only for test cases
251 return new(empty.Empty), nil
252 }
Mahir Gunyel8e2707d2019-07-25 00:36:21 -0700253 go rhp.deviceMgr.updateDeviceUsingAdapterData(device)
khenaidoob9203542018-09-17 22:56:37 -0400254 return new(empty.Empty), nil
255}
256
khenaidoo79232702018-12-04 11:00:41 -0500257func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500258 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400259 log.Warn("invalid-number-of-args", log.Fields{"args": args})
260 err := errors.New("invalid-number-of-args")
261 return nil, err
262 }
khenaidoo297cd252019-02-07 22:10:23 -0500263
khenaidoo2c6f1672018-09-20 23:14:41 -0400264 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500265 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500266 serialNumber := &ic.StrType{}
267 onuId := &ic.IntType{}
268 parentPortNo := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500269 for _, arg := range args {
270 switch arg.Key {
271 case "device_id":
272 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
273 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
274 return nil, err
275 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500276 case "serial_number":
277 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
278 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
279 return nil, err
280 }
281 case "onu_id":
282 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
283 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
284 return nil, err
285 }
286 case "parent_port_no":
287 if err := ptypes.UnmarshalAny(arg.Value, parentPortNo); err != nil {
288 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
289 return nil, err
290 }
khenaidoo297cd252019-02-07 22:10:23 -0500291 case kafka.TransactionKey:
292 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
293 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
294 return nil, err
295 }
296 }
khenaidoob9203542018-09-17 22:56:37 -0400297 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500298 log.Debugw("GetChildDevice", log.Fields{"parentDeviceId": pID.Id, "args": args, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500299
300 // Try to grab the transaction as this core may be competing with another Core
301 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400302 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500303 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
304 // returning nil, nil instructs the callee to ignore this request
305 return nil, nil
306 } else {
307 defer txn.Close()
308 }
309 }
khenaidoob9203542018-09-17 22:56:37 -0400310
311 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400312 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400313 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500314 return rhp.deviceMgr.GetChildDevice(pID.Id, serialNumber.Val, onuId.Val, parentPortNo.Val)
khenaidoob9203542018-09-17 22:56:37 -0400315}
316
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500317func (rhp *AdapterRequestHandlerProxy) GetChildDeviceWithProxyAddress(args []*ic.Argument) (*voltha.Device, error) {
318 if len(args) < 2 {
319 log.Warn("invalid-number-of-args", log.Fields{"args": args})
320 err := errors.New("invalid-number-of-args")
321 return nil, err
322 }
323
324 proxyAddress := &voltha.Device_ProxyAddress{}
325 transactionID := &ic.StrType{}
326 for _, arg := range args {
327 switch arg.Key {
328 case "proxy_address":
329 if err := ptypes.UnmarshalAny(arg.Value, proxyAddress); err != nil {
330 log.Warnw("cannot-unmarshal-proxy-address", log.Fields{"error": err})
331 return nil, err
332 }
333 case kafka.TransactionKey:
334 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
335 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
336 return nil, err
337 }
338 }
339 }
340 log.Debugw("GetChildDeviceWithProxyAddress", log.Fields{"proxyAddress": proxyAddress, "transactionID": transactionID.Val})
341
342 // Try to grab the transaction as this core may be competing with another Core
343 if rhp.competeForTransaction() {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400344 if txn, err := rhp.takeRequestOwnership(transactionID.Val, proxyAddress.DeviceId); err != nil {
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500345 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500346 return nil, nil
347 } else {
348 defer txn.Close()
349 }
350 }
351
352 if rhp.TestMode { // Execute only for test cases
353 return &voltha.Device{Id: proxyAddress.DeviceId}, nil
354 }
355 return rhp.deviceMgr.GetChildDeviceWithProxyAddress(proxyAddress)
356}
357
khenaidoo79232702018-12-04 11:00:41 -0500358func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500359 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400360 log.Warn("invalid-number-of-args", log.Fields{"args": args})
361 err := errors.New("invalid-number-of-args")
362 return nil, err
363 }
khenaidoo92e62c52018-10-03 14:02:54 -0400364 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500365 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500366 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400367 for _, arg := range args {
368 switch arg.Key {
369 case "device_id":
370 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
371 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
372 return nil, err
373 }
374 case "port_type":
375 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
376 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
377 return nil, err
378 }
khenaidoo297cd252019-02-07 22:10:23 -0500379 case kafka.TransactionKey:
380 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
381 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
382 return nil, err
383 }
khenaidoo92e62c52018-10-03 14:02:54 -0400384 }
khenaidoob9203542018-09-17 22:56:37 -0400385 }
khenaidoo297cd252019-02-07 22:10:23 -0500386 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400387 if rhp.TestMode { // Execute only for test cases
388 aPort := &voltha.Port{Label: "test_port"}
389 allPorts := &voltha.Ports{}
390 allPorts.Items = append(allPorts.Items, aPort)
391 return allPorts, nil
392 }
khenaidoo92e62c52018-10-03 14:02:54 -0400393 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400394}
395
khenaidoo297cd252019-02-07 22:10:23 -0500396func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500397 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400398 log.Warn("invalid-number-of-args", log.Fields{"args": args})
399 err := errors.New("invalid-number-of-args")
400 return nil, err
401 }
khenaidoo297cd252019-02-07 22:10:23 -0500402
khenaidoo2c6f1672018-09-20 23:14:41 -0400403 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500404 transactionID := &ic.StrType{}
405 for _, arg := range args {
406 switch arg.Key {
407 case "device_id":
408 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
409 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
410 return nil, err
411 }
412 case kafka.TransactionKey:
413 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
414 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
415 return nil, err
416 }
417 }
khenaidoob9203542018-09-17 22:56:37 -0400418 }
khenaidoo297cd252019-02-07 22:10:23 -0500419 log.Debugw("GetChildDevices", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
420
421 // Try to grab the transaction as this core may be competing with another Core
422 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400423 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500424 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
425 // returning nil, nil instructs the callee to ignore this request
426 return nil, nil
427 } else {
428 defer txn.Close()
429 }
430 }
khenaidoob9203542018-09-17 22:56:37 -0400431
432 if rhp.TestMode { // Execute only for test cases
khenaidoode93b462019-02-13 22:17:21 -0500433 return &voltha.Devices{Items: nil}, nil
khenaidoob9203542018-09-17 22:56:37 -0400434 }
khenaidoo297cd252019-02-07 22:10:23 -0500435
436 return rhp.deviceMgr.getAllChildDevices(pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400437}
438
439// ChildDeviceDetected is invoked when a child device is detected. The following
440// parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500441// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700442func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500443 if len(args) < 5 {
khenaidoob9203542018-09-17 22:56:37 -0400444 log.Warn("invalid-number-of-args", log.Fields{"args": args})
445 err := errors.New("invalid-number-of-args")
446 return nil, err
447 }
448
449 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500450 portNo := &ic.IntType{}
451 dt := &ic.StrType{}
452 chnlId := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500453 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500454 serialNumber := &ic.StrType{}
455 vendorId := &ic.StrType{}
456 onuId := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400457 for _, arg := range args {
458 switch arg.Key {
459 case "parent_device_id":
460 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
461 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
462 return nil, err
463 }
464 case "parent_port_no":
465 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
466 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
467 return nil, err
468 }
469 case "child_device_type":
470 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
471 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
472 return nil, err
473 }
474 case "channel_id":
475 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
476 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
477 return nil, err
478 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500479 case "vendor_id":
480 if err := ptypes.UnmarshalAny(arg.Value, vendorId); err != nil {
481 log.Warnw("cannot-unmarshal-vendor-id", log.Fields{"error": err})
482 return nil, err
483 }
484 case "serial_number":
485 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
486 log.Warnw("cannot-unmarshal-serial-number", log.Fields{"error": err})
487 return nil, err
488 }
489 case "onu_id":
490 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
491 log.Warnw("cannot-unmarshal-onu-id", log.Fields{"error": err})
492 return nil, err
493 }
khenaidoo297cd252019-02-07 22:10:23 -0500494 case kafka.TransactionKey:
495 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
496 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
497 return nil, err
498 }
khenaidoob9203542018-09-17 22:56:37 -0400499 }
500 }
khenaidoob9203542018-09-17 22:56:37 -0400501 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
Matt Jeanneret4e241952019-02-28 11:16:04 -0500502 "deviceType": dt.Val, "channelId": chnlId.Val, "serialNumber": serialNumber.Val,
503 "vendorId": vendorId.Val, "onuId": onuId.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500504
505 // Try to grab the transaction as this core may be competing with another Core
506 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400507 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500508 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
509 // returning nil, nil instructs the callee to ignore this request
510 return nil, nil
511 } else {
512 defer txn.Close()
513 }
514 }
khenaidoob9203542018-09-17 22:56:37 -0400515
516 if rhp.TestMode { // Execute only for test cases
517 return nil, nil
518 }
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700519 device, err := rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val, vendorId.Val, serialNumber.Val, onuId.Val)
520 if err != nil {
khenaidoo59ef7be2019-06-21 12:40:28 -0400521 log.Errorw("child-detection-failed", log.Fields{"parentId": pID.Id, "onuId": onuId.Val, "error": err})
522 return nil, err
523 }
khenaidoob9203542018-09-17 22:56:37 -0400524
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700525 return device, nil
khenaidoob9203542018-09-17 22:56:37 -0400526}
527
khenaidoo79232702018-12-04 11:00:41 -0500528func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500529 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400530 log.Warn("invalid-number-of-args", log.Fields{"args": args})
531 err := errors.New("invalid-number-of-args")
532 return nil, err
533 }
534 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500535 operStatus := &ic.IntType{}
536 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500537 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400538 for _, arg := range args {
539 switch arg.Key {
540 case "device_id":
541 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
542 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
543 return nil, err
544 }
545 case "oper_status":
546 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
547 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
548 return nil, err
549 }
khenaidoob9203542018-09-17 22:56:37 -0400550 case "connect_status":
551 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
552 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
553 return nil, err
554 }
khenaidoo297cd252019-02-07 22:10:23 -0500555 case kafka.TransactionKey:
556 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
557 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
558 return nil, err
559 }
khenaidoob9203542018-09-17 22:56:37 -0400560 }
561 }
khenaidoo297cd252019-02-07 22:10:23 -0500562 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
563 "conn-status": connStatus, "transactionID": transactionID.Val})
564
565 // Try to grab the transaction as this core may be competing with another Core
566 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400567 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500568 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
569 // returning nil, nil instructs the callee to ignore this request
570 return nil, nil
571 } else {
572 defer txn.Close()
573 }
574 }
575
khenaidoob9203542018-09-17 22:56:37 -0400576 if rhp.TestMode { // Execute only for test cases
577 return nil, nil
578 }
khenaidoo92e62c52018-10-03 14:02:54 -0400579 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
khenaidoo1ce37ad2019-03-24 22:07:24 -0400580 go rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
581 voltha.ConnectStatus_ConnectStatus(connStatus.Val))
582
583 //if err := rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
584 // voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
585 // return nil, err
586 //}
khenaidoo92e62c52018-10-03 14:02:54 -0400587 return new(empty.Empty), nil
588}
589
khenaidoo79232702018-12-04 11:00:41 -0500590func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500591 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400592 log.Warn("invalid-number-of-args", log.Fields{"args": args})
593 err := errors.New("invalid-number-of-args")
594 return nil, err
595 }
596 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500597 operStatus := &ic.IntType{}
598 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500599 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400600 for _, arg := range args {
601 switch arg.Key {
602 case "device_id":
603 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
604 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
605 return nil, err
606 }
607 case "oper_status":
608 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
609 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
610 return nil, err
611 }
612 case "connect_status":
613 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
614 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
615 return nil, err
616 }
khenaidoo297cd252019-02-07 22:10:23 -0500617 case kafka.TransactionKey:
618 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
619 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
620 return nil, err
621 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400622 }
623 }
khenaidoo297cd252019-02-07 22:10:23 -0500624 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
625 "conn-status": connStatus, "transactionID": transactionID.Val})
626
627 // Try to grab the transaction as this core may be competing with another Core
628 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400629 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500630 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
631 // returning nil, nil instructs the callee to ignore this request
632 return nil, nil
633 } else {
634 defer txn.Close()
635 }
636 }
637
khenaidoo4d4802d2018-10-04 21:59:49 -0400638 if rhp.TestMode { // Execute only for test cases
639 return nil, nil
640 }
641
642 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
khenaidoo1ce37ad2019-03-24 22:07:24 -0400643 go rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
644 voltha.ConnectStatus_ConnectStatus(connStatus.Val))
645
646 //if err := rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
647 // voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
648 // return nil, err
649 //}
khenaidoo4d4802d2018-10-04 21:59:49 -0400650 return new(empty.Empty), nil
651}
652
khenaidoo3ab34882019-05-02 21:33:30 -0400653func (rhp *AdapterRequestHandlerProxy) PortsStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
654 if len(args) < 2 {
655 log.Warn("invalid-number-of-args", log.Fields{"args": args})
656 err := errors.New("invalid-number-of-args")
657 return nil, err
658 }
659 deviceId := &voltha.ID{}
660 operStatus := &ic.IntType{}
661 transactionID := &ic.StrType{}
662 for _, arg := range args {
663 switch arg.Key {
664 case "device_id":
665 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
666 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
667 return nil, err
668 }
669 case "oper_status":
670 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
671 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
672 return nil, err
673 }
674 case kafka.TransactionKey:
675 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
676 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
677 return nil, err
678 }
679 }
680 }
681 log.Debugw("PortsStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus, "transactionID": transactionID.Val})
682
683 // Try to grab the transaction as this core may be competing with another Core
684 if rhp.competeForTransaction() {
685 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
686 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
687 // returning nil, nil instructs the callee to ignore this request
688 return nil, nil
689 } else {
690 defer txn.Close()
691 }
692 }
693
694 if rhp.TestMode { // Execute only for test cases
695 return nil, nil
696 }
697
698 go rhp.deviceMgr.updatePortsState(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val))
699
700 return new(empty.Empty), nil
701}
702
khenaidoo79232702018-12-04 11:00:41 -0500703func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500704 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400705 log.Warn("invalid-number-of-args", log.Fields{"args": args})
706 err := errors.New("invalid-number-of-args")
707 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400708 }
khenaidoo92e62c52018-10-03 14:02:54 -0400709 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500710 portType := &ic.IntType{}
711 portNo := &ic.IntType{}
712 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500713 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400714 for _, arg := range args {
715 switch arg.Key {
716 case "device_id":
717 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
718 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
719 return nil, err
720 }
721 case "oper_status":
722 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
723 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
724 return nil, err
725 }
726 case "port_type":
727 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
728 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
729 return nil, err
730 }
731 case "port_no":
732 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
733 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
734 return nil, err
735 }
khenaidoo297cd252019-02-07 22:10:23 -0500736 case kafka.TransactionKey:
737 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
738 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
739 return nil, err
740 }
khenaidoo92e62c52018-10-03 14:02:54 -0400741 }
742 }
khenaidoo297cd252019-02-07 22:10:23 -0500743 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
744 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
745
746 // Try to grab the transaction as this core may be competing with another Core
747 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400748 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500749 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
750 // returning nil, nil instructs the callee to ignore this request
751 return nil, nil
752 } else {
753 defer txn.Close()
754 }
755 }
756
khenaidoo92e62c52018-10-03 14:02:54 -0400757 if rhp.TestMode { // Execute only for test cases
758 return nil, nil
759 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400760
761 go rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
762 voltha.OperStatus_OperStatus(operStatus.Val))
763
764 //if err := rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
765 // voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
766 // return nil, err
767 //}
khenaidoob9203542018-09-17 22:56:37 -0400768 return new(empty.Empty), nil
769}
770
khenaidoo0a822f92019-05-08 15:15:57 -0400771func (rhp *AdapterRequestHandlerProxy) DeleteAllPorts(args []*ic.Argument) (*empty.Empty, error) {
772 if len(args) < 3 {
773 log.Warn("invalid-number-of-args", log.Fields{"args": args})
774 err := errors.New("invalid-number-of-args")
775 return nil, err
776 }
777 deviceId := &voltha.ID{}
778 transactionID := &ic.StrType{}
779 for _, arg := range args {
780 switch arg.Key {
781 case "device_id":
782 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
783 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
784 return nil, err
785 }
786 case kafka.TransactionKey:
787 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
788 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
789 return nil, err
790 }
791 }
792 }
793 log.Debugw("DeleteAllPorts", log.Fields{"deviceId": deviceId.Id, "transactionID": transactionID.Val})
794
795 // Try to grab the transaction as this core may be competing with another Core
796 if rhp.competeForTransaction() {
797 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
798 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
799 // returning nil, nil instructs the callee to ignore this request
800 return nil, nil
801 } else {
802 defer txn.Close()
803 }
804 }
805
806 if rhp.TestMode { // Execute only for test cases
807 return nil, nil
808 }
809
810 go rhp.deviceMgr.deleteAllPorts(deviceId.Id)
811
812 return new(empty.Empty), nil
813}
814
815func (rhp *AdapterRequestHandlerProxy) ChildDevicesLost(args []*ic.Argument) (*empty.Empty, error) {
816 if len(args) < 2 {
817 log.Warn("invalid-number-of-args", log.Fields{"args": args})
818 err := errors.New("invalid-number-of-args")
819 return nil, err
820 }
821 parentDeviceId := &voltha.ID{}
822 transactionID := &ic.StrType{}
823 for _, arg := range args {
824 switch arg.Key {
825 case "parent_device_id":
826 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceId); err != nil {
827 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
828 return nil, err
829 }
830 case kafka.TransactionKey:
831 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
832 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
833 return nil, err
834 }
835 }
836 }
837 log.Debugw("ChildDevicesLost", log.Fields{"deviceId": parentDeviceId.Id, "transactionID": transactionID.Val})
838
839 // Try to grab the transaction as this core may be competing with another Core
840 if rhp.competeForTransaction() {
841 if txn, err := rhp.takeRequestOwnership(transactionID.Val, parentDeviceId.Id); err != nil {
842 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
843 // returning nil, nil instructs the callee to ignore this request
844 return nil, nil
845 } else {
846 defer txn.Close()
847 }
848 }
849
850 if rhp.TestMode { // Execute only for test cases
851 return nil, nil
852 }
853
854 go rhp.deviceMgr.childDevicesLost(parentDeviceId.Id)
855
856 return new(empty.Empty), nil
857}
858
859func (rhp *AdapterRequestHandlerProxy) ChildDevicesDetected(args []*ic.Argument) (*empty.Empty, error) {
860 if len(args) < 2 {
861 log.Warn("invalid-number-of-args", log.Fields{"args": args})
862 err := errors.New("invalid-number-of-args")
863 return nil, err
864 }
865 parentDeviceId := &voltha.ID{}
866 transactionID := &ic.StrType{}
867 for _, arg := range args {
868 switch arg.Key {
869 case "parent_device_id":
870 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceId); err != nil {
871 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
872 return nil, err
873 }
874 case kafka.TransactionKey:
875 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
876 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
877 return nil, err
878 }
879 }
880 }
881 log.Debugw("ChildDevicesDetected", log.Fields{"deviceId": parentDeviceId.Id, "transactionID": transactionID.Val})
882
883 // Try to grab the transaction as this core may be competing with another Core
884 if rhp.competeForTransaction() {
885 if txn, err := rhp.takeRequestOwnership(transactionID.Val, parentDeviceId.Id); err != nil {
886 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
887 // returning nil, nil instructs the callee to ignore this request
888 return nil, nil
889 } else {
890 defer txn.Close()
891 }
892 }
893
894 if rhp.TestMode { // Execute only for test cases
895 return nil, nil
896 }
897
khenaidoo59ef7be2019-06-21 12:40:28 -0400898 if err := rhp.deviceMgr.childDevicesDetected(parentDeviceId.Id); err != nil {
899 log.Errorw("child-devices-dection-failed", log.Fields{"parentId": parentDeviceId.Id, "error": err})
900 return nil, err
901 }
khenaidoo0a822f92019-05-08 15:15:57 -0400902
903 return new(empty.Empty), nil
904}
905
khenaidoo79232702018-12-04 11:00:41 -0500906func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500907 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400908 log.Warn("invalid-number-of-args", log.Fields{"args": args})
909 err := errors.New("invalid-number-of-args")
910 return nil, err
911 }
912 deviceId := &voltha.ID{}
913 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500914 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400915 for _, arg := range args {
916 switch arg.Key {
917 case "device_id":
918 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
919 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
920 return nil, err
921 }
922 case "port":
923 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
924 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
925 return nil, err
926 }
khenaidoo297cd252019-02-07 22:10:23 -0500927 case kafka.TransactionKey:
928 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
929 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
930 return nil, err
931 }
khenaidoob9203542018-09-17 22:56:37 -0400932 }
933 }
khenaidoo297cd252019-02-07 22:10:23 -0500934 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
935
936 // Try to grab the transaction as this core may be competing with another Core
937 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400938 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500939 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
940 // returning nil, nil instructs the callee to ignore this request
941 return nil, nil
942 } else {
943 defer txn.Close()
944 }
945 }
khenaidoob9203542018-09-17 22:56:37 -0400946
947 if rhp.TestMode { // Execute only for test cases
948 return nil, nil
949 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400950 go rhp.deviceMgr.addPort(deviceId.Id, port)
khenaidoo92e62c52018-10-03 14:02:54 -0400951
khenaidoob9203542018-09-17 22:56:37 -0400952 return new(empty.Empty), nil
953}
954
khenaidoo79232702018-12-04 11:00:41 -0500955func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob3127472019-07-24 21:04:55 -0400956 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400957 log.Warn("invalid-number-of-args", log.Fields{"args": args})
958 err := errors.New("invalid-number-of-args")
959 return nil, err
960 }
961 pmConfigs := &voltha.PmConfigs{}
khenaidoo297cd252019-02-07 22:10:23 -0500962 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400963 for _, arg := range args {
964 switch arg.Key {
965 case "device_pm_config":
966 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
967 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
968 return nil, err
969 }
khenaidoo297cd252019-02-07 22:10:23 -0500970 case kafka.TransactionKey:
971 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
972 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
973 return nil, err
974 }
khenaidoob9203542018-09-17 22:56:37 -0400975 }
976 }
khenaidoob9203542018-09-17 22:56:37 -0400977 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoob3127472019-07-24 21:04:55 -0400978 "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500979
980 // Try to grab the transaction as this core may be competing with another Core
981 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400982 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pmConfigs.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500983 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
984 // returning nil, nil instructs the callee to ignore this request
985 return nil, nil
986 } else {
987 defer txn.Close()
988 }
989 }
khenaidoob9203542018-09-17 22:56:37 -0400990
991 if rhp.TestMode { // Execute only for test cases
992 return nil, nil
993 }
994
khenaidoob3127472019-07-24 21:04:55 -0400995 go rhp.deviceMgr.initPmConfigs(pmConfigs.Id, pmConfigs)
khenaidoo92e62c52018-10-03 14:02:54 -0400996
khenaidoob9203542018-09-17 22:56:37 -0400997 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400998}
khenaidoofdbad6e2018-11-06 22:26:38 -0500999
khenaidoo79232702018-12-04 11:00:41 -05001000func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -05001001 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -05001002 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1003 err := errors.New("invalid-number-of-args")
1004 return nil, err
1005 }
1006 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -05001007 portNo := &ic.IntType{}
1008 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -05001009 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -05001010 for _, arg := range args {
1011 switch arg.Key {
1012 case "device_id":
1013 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
1014 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1015 return nil, err
1016 }
1017 case "port":
1018 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
1019 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
1020 return nil, err
1021 }
1022 case "packet":
1023 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
1024 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
1025 return nil, err
1026 }
khenaidoo297cd252019-02-07 22:10:23 -05001027 case kafka.TransactionKey:
1028 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1029 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1030 return nil, err
1031 }
khenaidoofdbad6e2018-11-06 22:26:38 -05001032 }
1033 }
khenaidoo297cd252019-02-07 22:10:23 -05001034 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
1035 "transactionID": transactionID.Val})
1036
khenaidoo3d3b8c22019-05-22 18:10:39 -04001037 // Try to grab the transaction as this core may be competing with another Core
1038 // TODO: If this adds too much latencies then needs to remove transaction and let OFAgent filter out
1039 // duplicates.
1040 if rhp.competeForTransaction() {
1041 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
1042 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
1043 return nil, nil
1044 } else {
1045 defer txn.Close()
1046 }
1047 }
khenaidoofdbad6e2018-11-06 22:26:38 -05001048 if rhp.TestMode { // Execute only for test cases
1049 return nil, nil
1050 }
khenaidoo1ce37ad2019-03-24 22:07:24 -04001051 go rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload)
khenaidoo3d3b8c22019-05-22 18:10:39 -04001052
khenaidoofdbad6e2018-11-06 22:26:38 -05001053 return new(empty.Empty), nil
1054}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001055
khenaidoof5a5bfa2019-01-23 22:20:29 -05001056func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
1057 if len(args) < 2 {
1058 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1059 err := errors.New("invalid-number-of-args")
1060 return nil, err
1061 }
1062 deviceId := &voltha.ID{}
1063 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -05001064 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001065 for _, arg := range args {
1066 switch arg.Key {
1067 case "device_id":
1068 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
1069 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1070 return nil, err
1071 }
1072 case "image_download":
1073 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
1074 log.Warnw("cannot-unmarshal-imgaeDownload", 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 }
khenaidoof5a5bfa2019-01-23 22:20:29 -05001082 }
1083 }
khenaidoo297cd252019-02-07 22:10:23 -05001084 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
1085 "transactionID": transactionID.Val})
1086
1087 // Try to grab the transaction as this core may be competing with another Core
1088 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -04001089 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -05001090 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
1091 // returning nil, nil instructs the callee to ignore this request
1092 return nil, nil
1093 } else {
1094 defer txn.Close()
1095 }
1096 }
1097
khenaidoof5a5bfa2019-01-23 22:20:29 -05001098 if rhp.TestMode { // Execute only for test cases
1099 return nil, nil
1100 }
khenaidoo1ce37ad2019-03-24 22:07:24 -04001101 go rhp.deviceMgr.updateImageDownload(deviceId.Id, img)
1102 //if err := rhp.deviceMgr.updateImageDownload(deviceId.Id, img); err != nil {
1103 // return nil, err
1104 //}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001105 return new(empty.Empty), nil
1106}
khenaidooba6b6c42019-08-02 09:11:56 -04001107
1108func (rhp *AdapterRequestHandlerProxy) ReconcileChildDevices(args []*ic.Argument) (*empty.Empty, error) {
1109 if len(args) < 2 {
1110 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1111 err := errors.New("invalid-number-of-args")
1112 return nil, err
1113 }
1114 parentDeviceId := &voltha.ID{}
1115 transactionID := &ic.StrType{}
1116 for _, arg := range args {
1117 switch arg.Key {
1118 case "parent_device_id":
1119 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceId); err != nil {
1120 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1121 return nil, err
1122 }
1123 case kafka.TransactionKey:
1124 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1125 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1126 return nil, err
1127 }
1128 }
1129 }
1130 log.Debugw("ReconcileChildDevices", log.Fields{"deviceId": parentDeviceId.Id, "transactionID": transactionID.Val})
1131
1132 // Try to grab the transaction as this core may be competing with another Core
1133 if rhp.competeForTransaction() {
1134 if txn, err := rhp.takeRequestOwnership(transactionID.Val, parentDeviceId.Id); err != nil {
1135 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
1136 // returning nil, nil instructs the callee to ignore this request
1137 return nil, nil
1138 } else {
1139 defer txn.Close()
1140 }
1141 }
1142
1143 if rhp.TestMode { // Execute only for test cases
1144 return nil, nil
1145 }
1146
1147 // Run it in its own routine
1148 go rhp.deviceMgr.reconcileChildDevices(parentDeviceId.Id)
1149
1150 return new(empty.Empty), nil
1151}