blob: 3d9487fe8b5bb5adb927b6783c91f7382691e42b [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"
khenaidoo19d7b632018-10-30 10:49:50 -040020 "github.com/gogo/protobuf/proto"
khenaidoob9203542018-09-17 22:56:37 -040021 "github.com/golang/protobuf/ptypes"
22 "github.com/golang/protobuf/ptypes/empty"
23 "github.com/opencord/voltha-go/common/log"
24 "github.com/opencord/voltha-go/db/model"
khenaidoo297cd252019-02-07 22:10:23 -050025 "github.com/opencord/voltha-go/kafka"
khenaidoo79232702018-12-04 11:00:41 -050026 ic "github.com/opencord/voltha-go/protos/inter_container"
khenaidoob9203542018-09-17 22:56:37 -040027 "github.com/opencord/voltha-go/protos/voltha"
28 "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 }
68 log.Debugw("transaction-timeout", log.Fields{"timeout": timeout})
69 txn := NewKVTransaction(transactionId)
70 if txn == nil {
khenaidoode93b462019-02-13 22:17:21 -050071 return nil, errors.New("fail-to-create-transaction")
khenaidoo297cd252019-02-07 22:10:23 -050072 } else if txn.Acquired(timeout) {
73 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 }
85 log.Debugw("transaction-timeout", log.Fields{"timeout": timeout})
86 txn := NewKVTransaction(transactionId)
87 if txn == nil {
88 return nil, errors.New("fail-to-create-transaction")
89 }
90
91 if rhp.core.deviceOwnership.OwnedByMe(devId) {
92 if txn.Acquired(timeout) {
93 return txn, nil
94 } else {
95 return nil, errors.New("failed-to-seize-request")
96 }
97 } else {
98 if txn.Monitor(timeout) {
99 return txn, nil
100 } else {
101 return nil, errors.New("device-not-owned")
102 }
103 }
104}
105
khenaidoo297cd252019-02-07 22:10:23 -0500106// competeForTransaction is a helper function to determine whether every request needs to compete with another
107// Core to execute the request
108func (rhp *AdapterRequestHandlerProxy) competeForTransaction() bool {
109 return rhp.coreInCompetingMode
110}
111
khenaidoo79232702018-12-04 11:00:41 -0500112func (rhp *AdapterRequestHandlerProxy) Register(args []*ic.Argument) (*voltha.CoreInstance, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500113 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400114 log.Warn("invalid-number-of-args", log.Fields{"args": args})
115 err := errors.New("invalid-number-of-args")
116 return nil, err
117 }
118 adapter := &voltha.Adapter{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500119 deviceTypes := &voltha.DeviceTypes{}
khenaidoo297cd252019-02-07 22:10:23 -0500120 transactionID := &ic.StrType{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500121 for _, arg := range args {
122 switch arg.Key {
123 case "adapter":
124 if err := ptypes.UnmarshalAny(arg.Value, adapter); err != nil {
125 log.Warnw("cannot-unmarshal-adapter", log.Fields{"error": err})
126 return nil, err
127 }
128 case "deviceTypes":
129 if err := ptypes.UnmarshalAny(arg.Value, deviceTypes); err != nil {
130 log.Warnw("cannot-unmarshal-device-types", log.Fields{"error": err})
131 return nil, err
132 }
khenaidoo297cd252019-02-07 22:10:23 -0500133 case kafka.TransactionKey:
134 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
135 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
136 return nil, err
137 }
khenaidoo91ecfd62018-11-04 17:13:42 -0500138 }
khenaidoob9203542018-09-17 22:56:37 -0400139 }
khenaidoo297cd252019-02-07 22:10:23 -0500140 log.Debugw("Register", log.Fields{"Adapter": *adapter, "DeviceTypes": deviceTypes, "transactionID": transactionID.Val, "coreId": rhp.coreInstanceId})
141
142 // Try to grab the transaction as this core may be competing with another Core
143 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400144 if txn, err := rhp.acquireRequest(transactionID.Val); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500145 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
146 // Update our adapters in memory
147 go rhp.adapterMgr.updateAdaptersAndDevicetypesInMemory()
148 // returning nil, nil instructs the callee to ignore this request
149 return nil, nil
150 } else {
151 defer txn.Close()
152 }
153 }
khenaidoob9203542018-09-17 22:56:37 -0400154
155 if rhp.TestMode { // Execute only for test cases
156 return &voltha.CoreInstance{InstanceId: "CoreInstance"}, nil
157 }
khenaidoo21d51152019-02-01 13:48:37 -0500158 return rhp.adapterMgr.registerAdapter(adapter, deviceTypes), nil
khenaidoob9203542018-09-17 22:56:37 -0400159}
160
khenaidoo79232702018-12-04 11:00:41 -0500161func (rhp *AdapterRequestHandlerProxy) GetDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500162 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400163 log.Warn("invalid-number-of-args", log.Fields{"args": args})
164 err := errors.New("invalid-number-of-args")
165 return nil, err
166 }
khenaidoo297cd252019-02-07 22:10:23 -0500167
khenaidoob9203542018-09-17 22:56:37 -0400168 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500169 transactionID := &ic.StrType{}
170 for _, arg := range args {
171 switch arg.Key {
172 case "device_id":
173 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
174 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
175 return nil, err
176 }
177 case kafka.TransactionKey:
178 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
179 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
180 return nil, err
181 }
182 }
khenaidoob9203542018-09-17 22:56:37 -0400183 }
khenaidoo297cd252019-02-07 22:10:23 -0500184 log.Debugw("GetDevice", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
185
186 // Try to grab the transaction as this core may be competing with another Core
187 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400188 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500189 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
190 // returning nil, nil instructs the callee to ignore this request
191 return nil, nil
192 } else {
193 defer txn.Close()
194 }
195 }
khenaidoob9203542018-09-17 22:56:37 -0400196
197 if rhp.TestMode { // Execute only for test cases
198 return &voltha.Device{Id: pID.Id}, nil
199 }
200
201 // Get the device via the device manager
khenaidoo19d7b632018-10-30 10:49:50 -0400202 if device, err := rhp.deviceMgr.GetDevice(pID.Id); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400203 return nil, status.Errorf(codes.NotFound, "%s", err.Error())
204 } else {
khenaidoo79232702018-12-04 11:00:41 -0500205 log.Debugw("GetDevice-response", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400206 return device, nil
207 }
208}
209
khenaidoo92e62c52018-10-03 14:02:54 -0400210// updatePartialDeviceData updates a subset of a device that an Adapter can update.
211// TODO: May need a specific proto to handle only a subset of a device that can be changed by an adapter
212func (rhp *AdapterRequestHandlerProxy) mergeDeviceInfoFromAdapter(device *voltha.Device) (*voltha.Device, error) {
213 // First retrieve the most up to date device info
214 var currentDevice *voltha.Device
215 var err error
khenaidoo19d7b632018-10-30 10:49:50 -0400216 if currentDevice, err = rhp.deviceMgr.GetDevice(device.Id); err != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400217 return nil, err
218 }
khenaidoo19d7b632018-10-30 10:49:50 -0400219 cloned := proto.Clone(currentDevice).(*voltha.Device)
khenaidoo92e62c52018-10-03 14:02:54 -0400220 cloned.Root = device.Root
221 cloned.Vendor = device.Vendor
222 cloned.Model = device.Model
223 cloned.SerialNumber = device.SerialNumber
224 cloned.MacAddress = device.MacAddress
khenaidoo19d7b632018-10-30 10:49:50 -0400225 cloned.Vlan = device.Vlan
226 return cloned, nil
khenaidoo92e62c52018-10-03 14:02:54 -0400227}
228
khenaidoo79232702018-12-04 11:00:41 -0500229func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500230 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400231 log.Warn("invalid-number-of-args", log.Fields{"args": args})
232 err := errors.New("invalid-number-of-args")
233 return nil, err
234 }
khenaidoo297cd252019-02-07 22:10:23 -0500235
khenaidoob9203542018-09-17 22:56:37 -0400236 device := &voltha.Device{}
khenaidoo297cd252019-02-07 22:10:23 -0500237 transactionID := &ic.StrType{}
238 for _, arg := range args {
239 switch arg.Key {
240 case "device":
241 if err := ptypes.UnmarshalAny(arg.Value, device); err != nil {
242 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
243 return nil, err
244 }
245 case kafka.TransactionKey:
246 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
247 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
248 return nil, err
249 }
250 }
khenaidoob9203542018-09-17 22:56:37 -0400251 }
khenaidoo297cd252019-02-07 22:10:23 -0500252 log.Debugw("DeviceUpdate", log.Fields{"deviceId": device.Id, "transactionID": transactionID.Val})
253
254 // Try to grab the transaction as this core may be competing with another Core
255 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400256 if txn, err := rhp.takeRequestOwnership(transactionID.Val, device.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500257 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
258 // returning nil, nil instructs the callee to ignore this request
259 return nil, nil
260 } else {
261 defer txn.Close()
262 }
263 }
khenaidoob9203542018-09-17 22:56:37 -0400264
265 if rhp.TestMode { // Execute only for test cases
266 return new(empty.Empty), nil
267 }
khenaidoo92e62c52018-10-03 14:02:54 -0400268
269 //Merge the adapter device info (only the ones an adapter can change) with the latest device data
270 if updatedDevice, err := rhp.mergeDeviceInfoFromAdapter(device); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400271 return nil, status.Errorf(codes.Internal, "%s", err.Error())
khenaidoo92e62c52018-10-03 14:02:54 -0400272 } else {
khenaidoode93b462019-02-13 22:17:21 -0500273 if err := rhp.deviceMgr.updateDevice(updatedDevice); err != nil {
274 return nil, err
275 }
khenaidoob9203542018-09-17 22:56:37 -0400276 }
khenaidoo92e62c52018-10-03 14:02:54 -0400277
khenaidoob9203542018-09-17 22:56:37 -0400278 return new(empty.Empty), nil
279}
280
khenaidoo79232702018-12-04 11:00:41 -0500281func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500282 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400283 log.Warn("invalid-number-of-args", log.Fields{"args": args})
284 err := errors.New("invalid-number-of-args")
285 return nil, err
286 }
khenaidoo297cd252019-02-07 22:10:23 -0500287
khenaidoo2c6f1672018-09-20 23:14:41 -0400288 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500289 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500290 serialNumber := &ic.StrType{}
291 onuId := &ic.IntType{}
292 parentPortNo := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500293 for _, arg := range args {
294 switch arg.Key {
295 case "device_id":
296 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
297 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
298 return nil, err
299 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500300 case "serial_number":
301 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
302 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
303 return nil, err
304 }
305 case "onu_id":
306 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
307 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
308 return nil, err
309 }
310 case "parent_port_no":
311 if err := ptypes.UnmarshalAny(arg.Value, parentPortNo); err != nil {
312 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
313 return nil, err
314 }
khenaidoo297cd252019-02-07 22:10:23 -0500315 case kafka.TransactionKey:
316 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
317 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
318 return nil, err
319 }
320 }
khenaidoob9203542018-09-17 22:56:37 -0400321 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500322 log.Debugw("GetChildDevice", log.Fields{"parentDeviceId": pID.Id, "args": args, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500323
324 // Try to grab the transaction as this core may be competing with another Core
325 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400326 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500327 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
328 // returning nil, nil instructs the callee to ignore this request
329 return nil, nil
330 } else {
331 defer txn.Close()
332 }
333 }
khenaidoob9203542018-09-17 22:56:37 -0400334
335 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400336 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400337 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500338 return rhp.deviceMgr.GetChildDevice(pID.Id, serialNumber.Val, onuId.Val, parentPortNo.Val)
khenaidoob9203542018-09-17 22:56:37 -0400339}
340
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500341func (rhp *AdapterRequestHandlerProxy) GetChildDeviceWithProxyAddress(args []*ic.Argument) (*voltha.Device, error) {
342 if len(args) < 2 {
343 log.Warn("invalid-number-of-args", log.Fields{"args": args})
344 err := errors.New("invalid-number-of-args")
345 return nil, err
346 }
347
348 proxyAddress := &voltha.Device_ProxyAddress{}
349 transactionID := &ic.StrType{}
350 for _, arg := range args {
351 switch arg.Key {
352 case "proxy_address":
353 if err := ptypes.UnmarshalAny(arg.Value, proxyAddress); err != nil {
354 log.Warnw("cannot-unmarshal-proxy-address", log.Fields{"error": err})
355 return nil, err
356 }
357 case kafka.TransactionKey:
358 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
359 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
360 return nil, err
361 }
362 }
363 }
364 log.Debugw("GetChildDeviceWithProxyAddress", log.Fields{"proxyAddress": proxyAddress, "transactionID": transactionID.Val})
365
366 // Try to grab the transaction as this core may be competing with another Core
367 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400368 if txn, err := rhp.acquireRequest(transactionID.Val); err != nil {
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500369 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
370 // returning nil, nil instructs the callee to ignore this request
371 return nil, nil
372 } else {
373 defer txn.Close()
374 }
375 }
376
377 if rhp.TestMode { // Execute only for test cases
378 return &voltha.Device{Id: proxyAddress.DeviceId}, nil
379 }
380 return rhp.deviceMgr.GetChildDeviceWithProxyAddress(proxyAddress)
381}
382
khenaidoo79232702018-12-04 11:00:41 -0500383func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500384 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400385 log.Warn("invalid-number-of-args", log.Fields{"args": args})
386 err := errors.New("invalid-number-of-args")
387 return nil, err
388 }
khenaidoo92e62c52018-10-03 14:02:54 -0400389 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500390 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500391 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400392 for _, arg := range args {
393 switch arg.Key {
394 case "device_id":
395 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
396 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
397 return nil, err
398 }
399 case "port_type":
400 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
401 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
402 return nil, err
403 }
khenaidoo297cd252019-02-07 22:10:23 -0500404 case kafka.TransactionKey:
405 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
406 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
407 return nil, err
408 }
khenaidoo92e62c52018-10-03 14:02:54 -0400409 }
khenaidoob9203542018-09-17 22:56:37 -0400410 }
khenaidoo297cd252019-02-07 22:10:23 -0500411 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400412 if rhp.TestMode { // Execute only for test cases
413 aPort := &voltha.Port{Label: "test_port"}
414 allPorts := &voltha.Ports{}
415 allPorts.Items = append(allPorts.Items, aPort)
416 return allPorts, nil
417 }
khenaidoo92e62c52018-10-03 14:02:54 -0400418 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400419}
420
khenaidoo297cd252019-02-07 22:10:23 -0500421func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500422 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400423 log.Warn("invalid-number-of-args", log.Fields{"args": args})
424 err := errors.New("invalid-number-of-args")
425 return nil, err
426 }
khenaidoo297cd252019-02-07 22:10:23 -0500427
khenaidoo2c6f1672018-09-20 23:14:41 -0400428 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500429 transactionID := &ic.StrType{}
430 for _, arg := range args {
431 switch arg.Key {
432 case "device_id":
433 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
434 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
435 return nil, err
436 }
437 case kafka.TransactionKey:
438 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
439 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
440 return nil, err
441 }
442 }
khenaidoob9203542018-09-17 22:56:37 -0400443 }
khenaidoo297cd252019-02-07 22:10:23 -0500444 log.Debugw("GetChildDevices", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
445
446 // Try to grab the transaction as this core may be competing with another Core
447 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400448 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500449 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
450 // returning nil, nil instructs the callee to ignore this request
451 return nil, nil
452 } else {
453 defer txn.Close()
454 }
455 }
khenaidoob9203542018-09-17 22:56:37 -0400456
457 if rhp.TestMode { // Execute only for test cases
khenaidoode93b462019-02-13 22:17:21 -0500458 return &voltha.Devices{Items: nil}, nil
khenaidoob9203542018-09-17 22:56:37 -0400459 }
khenaidoo297cd252019-02-07 22:10:23 -0500460
461 return rhp.deviceMgr.getAllChildDevices(pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400462}
463
464// ChildDeviceDetected is invoked when a child device is detected. The following
465// parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500466// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
khenaidoo79232702018-12-04 11:00:41 -0500467func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500468 if len(args) < 5 {
khenaidoob9203542018-09-17 22:56:37 -0400469 log.Warn("invalid-number-of-args", log.Fields{"args": args})
470 err := errors.New("invalid-number-of-args")
471 return nil, err
472 }
473
474 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500475 portNo := &ic.IntType{}
476 dt := &ic.StrType{}
477 chnlId := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500478 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500479 serialNumber := &ic.StrType{}
480 vendorId := &ic.StrType{}
481 onuId := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400482 for _, arg := range args {
483 switch arg.Key {
484 case "parent_device_id":
485 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
486 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
487 return nil, err
488 }
489 case "parent_port_no":
490 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
491 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
492 return nil, err
493 }
494 case "child_device_type":
495 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
496 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
497 return nil, err
498 }
499 case "channel_id":
500 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
501 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
502 return nil, err
503 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500504 case "vendor_id":
505 if err := ptypes.UnmarshalAny(arg.Value, vendorId); err != nil {
506 log.Warnw("cannot-unmarshal-vendor-id", log.Fields{"error": err})
507 return nil, err
508 }
509 case "serial_number":
510 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
511 log.Warnw("cannot-unmarshal-serial-number", log.Fields{"error": err})
512 return nil, err
513 }
514 case "onu_id":
515 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
516 log.Warnw("cannot-unmarshal-onu-id", log.Fields{"error": err})
517 return nil, err
518 }
khenaidoo297cd252019-02-07 22:10:23 -0500519 case kafka.TransactionKey:
520 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
521 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
522 return nil, err
523 }
khenaidoob9203542018-09-17 22:56:37 -0400524 }
525 }
khenaidoob9203542018-09-17 22:56:37 -0400526 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
Matt Jeanneret4e241952019-02-28 11:16:04 -0500527 "deviceType": dt.Val, "channelId": chnlId.Val, "serialNumber": serialNumber.Val,
528 "vendorId": vendorId.Val, "onuId": onuId.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500529
530 // Try to grab the transaction as this core may be competing with another Core
531 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400532 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500533 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
534 // returning nil, nil instructs the callee to ignore this request
535 return nil, nil
536 } else {
537 defer txn.Close()
538 }
539 }
khenaidoob9203542018-09-17 22:56:37 -0400540
541 if rhp.TestMode { // Execute only for test cases
542 return nil, nil
543 }
khenaidoob9203542018-09-17 22:56:37 -0400544 // Run child detection in it's own go routine as it can be a lengthy process
Matt Jeanneret4e241952019-02-28 11:16:04 -0500545 go rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val, vendorId.Val, serialNumber.Val, onuId.Val)
khenaidoob9203542018-09-17 22:56:37 -0400546
547 return new(empty.Empty), nil
548}
549
khenaidoo79232702018-12-04 11:00:41 -0500550func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500551 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400552 log.Warn("invalid-number-of-args", log.Fields{"args": args})
553 err := errors.New("invalid-number-of-args")
554 return nil, err
555 }
556 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500557 operStatus := &ic.IntType{}
558 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500559 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400560 for _, arg := range args {
561 switch arg.Key {
562 case "device_id":
563 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
564 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
565 return nil, err
566 }
567 case "oper_status":
568 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
569 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
570 return nil, err
571 }
khenaidoob9203542018-09-17 22:56:37 -0400572 case "connect_status":
573 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
574 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
575 return nil, err
576 }
khenaidoo297cd252019-02-07 22:10:23 -0500577 case kafka.TransactionKey:
578 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
579 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
580 return nil, err
581 }
khenaidoob9203542018-09-17 22:56:37 -0400582 }
583 }
khenaidoo297cd252019-02-07 22:10:23 -0500584 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
585 "conn-status": connStatus, "transactionID": transactionID.Val})
586
587 // Try to grab the transaction as this core may be competing with another Core
588 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400589 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500590 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
591 // returning nil, nil instructs the callee to ignore this request
592 return nil, nil
593 } else {
594 defer txn.Close()
595 }
596 }
597
khenaidoob9203542018-09-17 22:56:37 -0400598 if rhp.TestMode { // Execute only for test cases
599 return nil, nil
600 }
khenaidoo92e62c52018-10-03 14:02:54 -0400601 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
khenaidoode93b462019-02-13 22:17:21 -0500602 if err := rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
603 voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
604 return nil, err
605 }
khenaidoo92e62c52018-10-03 14:02:54 -0400606 return new(empty.Empty), nil
607}
608
khenaidoo79232702018-12-04 11:00:41 -0500609func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500610 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400611 log.Warn("invalid-number-of-args", log.Fields{"args": args})
612 err := errors.New("invalid-number-of-args")
613 return nil, err
614 }
615 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500616 operStatus := &ic.IntType{}
617 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500618 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400619 for _, arg := range args {
620 switch arg.Key {
621 case "device_id":
622 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
623 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
624 return nil, err
625 }
626 case "oper_status":
627 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
628 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
629 return nil, err
630 }
631 case "connect_status":
632 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
633 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
634 return nil, err
635 }
khenaidoo297cd252019-02-07 22:10:23 -0500636 case kafka.TransactionKey:
637 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
638 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
639 return nil, err
640 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400641 }
642 }
khenaidoo297cd252019-02-07 22:10:23 -0500643 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
644 "conn-status": connStatus, "transactionID": transactionID.Val})
645
646 // Try to grab the transaction as this core may be competing with another Core
647 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400648 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500649 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
650 // returning nil, nil instructs the callee to ignore this request
651 return nil, nil
652 } else {
653 defer txn.Close()
654 }
655 }
656
khenaidoo4d4802d2018-10-04 21:59:49 -0400657 if rhp.TestMode { // Execute only for test cases
658 return nil, nil
659 }
660
661 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
khenaidoode93b462019-02-13 22:17:21 -0500662 if err := rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
663 voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
664 return nil, err
665 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400666 return new(empty.Empty), nil
667}
668
khenaidoo79232702018-12-04 11:00:41 -0500669func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500670 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400671 log.Warn("invalid-number-of-args", log.Fields{"args": args})
672 err := errors.New("invalid-number-of-args")
673 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400674 }
khenaidoo92e62c52018-10-03 14:02:54 -0400675 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500676 portType := &ic.IntType{}
677 portNo := &ic.IntType{}
678 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500679 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400680 for _, arg := range args {
681 switch arg.Key {
682 case "device_id":
683 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
684 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
685 return nil, err
686 }
687 case "oper_status":
688 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
689 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
690 return nil, err
691 }
692 case "port_type":
693 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
694 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
695 return nil, err
696 }
697 case "port_no":
698 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
699 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
700 return nil, err
701 }
khenaidoo297cd252019-02-07 22:10:23 -0500702 case kafka.TransactionKey:
703 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
704 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
705 return nil, err
706 }
khenaidoo92e62c52018-10-03 14:02:54 -0400707 }
708 }
khenaidoo297cd252019-02-07 22:10:23 -0500709 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
710 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
711
712 // Try to grab the transaction as this core may be competing with another Core
713 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400714 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500715 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
716 // returning nil, nil instructs the callee to ignore this request
717 return nil, nil
718 } else {
719 defer txn.Close()
720 }
721 }
722
khenaidoo92e62c52018-10-03 14:02:54 -0400723 if rhp.TestMode { // Execute only for test cases
724 return nil, nil
725 }
khenaidoode93b462019-02-13 22:17:21 -0500726 if err := rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
727 voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
728 return nil, err
729 }
khenaidoob9203542018-09-17 22:56:37 -0400730 return new(empty.Empty), nil
731}
732
khenaidoo79232702018-12-04 11:00:41 -0500733func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500734 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400735 log.Warn("invalid-number-of-args", log.Fields{"args": args})
736 err := errors.New("invalid-number-of-args")
737 return nil, err
738 }
739 deviceId := &voltha.ID{}
740 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500741 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400742 for _, arg := range args {
743 switch arg.Key {
744 case "device_id":
745 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
746 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
747 return nil, err
748 }
749 case "port":
750 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
751 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
752 return nil, err
753 }
khenaidoo297cd252019-02-07 22:10:23 -0500754 case kafka.TransactionKey:
755 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
756 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
757 return nil, err
758 }
khenaidoob9203542018-09-17 22:56:37 -0400759 }
760 }
khenaidoo297cd252019-02-07 22:10:23 -0500761 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
762
763 // Try to grab the transaction as this core may be competing with another Core
764 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400765 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500766 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
767 // returning nil, nil instructs the callee to ignore this request
768 return nil, nil
769 } else {
770 defer txn.Close()
771 }
772 }
khenaidoob9203542018-09-17 22:56:37 -0400773
774 if rhp.TestMode { // Execute only for test cases
775 return nil, nil
776 }
khenaidoode93b462019-02-13 22:17:21 -0500777 if err := rhp.deviceMgr.addPort(deviceId.Id, port); err != nil {
778 return nil, err
779 }
khenaidoo92e62c52018-10-03 14:02:54 -0400780
khenaidoob9203542018-09-17 22:56:37 -0400781 return new(empty.Empty), nil
782}
783
khenaidoo79232702018-12-04 11:00:41 -0500784func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500785 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400786 log.Warn("invalid-number-of-args", log.Fields{"args": args})
787 err := errors.New("invalid-number-of-args")
788 return nil, err
789 }
790 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500791 init := &ic.BoolType{}
khenaidoo297cd252019-02-07 22:10:23 -0500792 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400793 for _, arg := range args {
794 switch arg.Key {
795 case "device_pm_config":
796 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
797 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
798 return nil, err
799 }
800 case "init":
801 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
802 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
803 return nil, err
804 }
khenaidoo297cd252019-02-07 22:10:23 -0500805 case kafka.TransactionKey:
806 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
807 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
808 return nil, err
809 }
khenaidoob9203542018-09-17 22:56:37 -0400810 }
811 }
khenaidoob9203542018-09-17 22:56:37 -0400812 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoode93b462019-02-13 22:17:21 -0500813 "init": init, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500814
815 // Try to grab the transaction as this core may be competing with another Core
816 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400817 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pmConfigs.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500818 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
819 // returning nil, nil instructs the callee to ignore this request
820 return nil, nil
821 } else {
822 defer txn.Close()
823 }
824 }
khenaidoob9203542018-09-17 22:56:37 -0400825
826 if rhp.TestMode { // Execute only for test cases
827 return nil, nil
828 }
829
khenaidoode93b462019-02-13 22:17:21 -0500830 if err := rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs); err != nil {
831 return nil, err
832 }
khenaidoo92e62c52018-10-03 14:02:54 -0400833
khenaidoob9203542018-09-17 22:56:37 -0400834 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400835}
khenaidoofdbad6e2018-11-06 22:26:38 -0500836
khenaidoo79232702018-12-04 11:00:41 -0500837func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500838 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -0500839 log.Warn("invalid-number-of-args", log.Fields{"args": args})
840 err := errors.New("invalid-number-of-args")
841 return nil, err
842 }
843 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500844 portNo := &ic.IntType{}
845 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500846 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500847 for _, arg := range args {
848 switch arg.Key {
849 case "device_id":
850 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
851 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
852 return nil, err
853 }
854 case "port":
855 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
856 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
857 return nil, err
858 }
859 case "packet":
860 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
861 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
862 return nil, err
863 }
khenaidoo297cd252019-02-07 22:10:23 -0500864 case kafka.TransactionKey:
865 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
866 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
867 return nil, err
868 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500869 }
870 }
khenaidoo297cd252019-02-07 22:10:23 -0500871 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
872 "transactionID": transactionID.Val})
873
874 // For performance reason, we do not compete for packet-in. We process it and send the packet in. later in the
875 // processing flow the duplicate packet will be discarded
876
khenaidoofdbad6e2018-11-06 22:26:38 -0500877 if rhp.TestMode { // Execute only for test cases
878 return nil, nil
879 }
khenaidoode93b462019-02-13 22:17:21 -0500880 if err := rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload); err != nil {
881 return nil, err
882 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500883 return new(empty.Empty), nil
884}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500885
khenaidoof5a5bfa2019-01-23 22:20:29 -0500886func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
887 if len(args) < 2 {
888 log.Warn("invalid-number-of-args", log.Fields{"args": args})
889 err := errors.New("invalid-number-of-args")
890 return nil, err
891 }
892 deviceId := &voltha.ID{}
893 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -0500894 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500895 for _, arg := range args {
896 switch arg.Key {
897 case "device_id":
898 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
899 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
900 return nil, err
901 }
902 case "image_download":
903 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
904 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
905 return nil, err
906 }
khenaidoo297cd252019-02-07 22:10:23 -0500907 case kafka.TransactionKey:
908 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
909 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
910 return nil, err
911 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500912 }
913 }
khenaidoo297cd252019-02-07 22:10:23 -0500914 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
915 "transactionID": transactionID.Val})
916
917 // Try to grab the transaction as this core may be competing with another Core
918 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400919 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500920 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
921 // returning nil, nil instructs the callee to ignore this request
922 return nil, nil
923 } else {
924 defer txn.Close()
925 }
926 }
927
khenaidoof5a5bfa2019-01-23 22:20:29 -0500928 if rhp.TestMode { // Execute only for test cases
929 return nil, nil
930 }
khenaidoode93b462019-02-13 22:17:21 -0500931 if err := rhp.deviceMgr.updateImageDownload(deviceId.Id, img); err != nil {
932 return nil, err
933 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500934 return new(empty.Empty), nil
935}