blob: f5295c40687ec2fe95c7eb1a0cbd6b66671cffa1 [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
khenaidoob9203542018-09-17 22:56:37 -040043}
44
khenaidoo297cd252019-02-07 22:10:23 -050045func NewAdapterRequestHandlerProxy(coreInstanceId string, dMgr *DeviceManager, ldMgr *LogicalDeviceManager,
46 aMgr *AdapterManager, cdProxy *model.Proxy, ldProxy *model.Proxy, incompetingMode bool, longRunningRequestTimeout int64,
47 defaultRequestTimeout int64) *AdapterRequestHandlerProxy {
khenaidoob9203542018-09-17 22:56:37 -040048 var proxy AdapterRequestHandlerProxy
khenaidoo91ecfd62018-11-04 17:13:42 -050049 proxy.coreInstanceId = coreInstanceId
khenaidoob9203542018-09-17 22:56:37 -040050 proxy.deviceMgr = dMgr
51 proxy.lDeviceMgr = ldMgr
52 proxy.clusterDataProxy = cdProxy
53 proxy.localDataProxy = ldProxy
khenaidoo21d51152019-02-01 13:48:37 -050054 proxy.adapterMgr = aMgr
khenaidoo297cd252019-02-07 22:10:23 -050055 proxy.coreInCompetingMode = incompetingMode
56 proxy.defaultRequestTimeout = defaultRequestTimeout
57 proxy.longRunningRequestTimeout = longRunningRequestTimeout
khenaidoob9203542018-09-17 22:56:37 -040058 return &proxy
59}
60
khenaidoo297cd252019-02-07 22:10:23 -050061func (rhp *AdapterRequestHandlerProxy) acquireTransaction(transactionId string, maxTimeout ...int64) (*KVTransaction, error) {
62 timeout := rhp.defaultRequestTimeout
63 if len(maxTimeout) > 0 {
64 timeout = maxTimeout[0]
65 }
66 log.Debugw("transaction-timeout", log.Fields{"timeout": timeout})
67 txn := NewKVTransaction(transactionId)
68 if txn == nil {
khenaidoode93b462019-02-13 22:17:21 -050069 return nil, errors.New("fail-to-create-transaction")
khenaidoo297cd252019-02-07 22:10:23 -050070 } else if txn.Acquired(timeout) {
71 return txn, nil
72 } else {
73 return nil, errors.New("failed-to-seize-request")
74 }
75}
76
77// competeForTransaction is a helper function to determine whether every request needs to compete with another
78// Core to execute the request
79func (rhp *AdapterRequestHandlerProxy) competeForTransaction() bool {
80 return rhp.coreInCompetingMode
81}
82
khenaidoo79232702018-12-04 11:00:41 -050083func (rhp *AdapterRequestHandlerProxy) Register(args []*ic.Argument) (*voltha.CoreInstance, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -050084 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -040085 log.Warn("invalid-number-of-args", log.Fields{"args": args})
86 err := errors.New("invalid-number-of-args")
87 return nil, err
88 }
89 adapter := &voltha.Adapter{}
khenaidoo91ecfd62018-11-04 17:13:42 -050090 deviceTypes := &voltha.DeviceTypes{}
khenaidoo297cd252019-02-07 22:10:23 -050091 transactionID := &ic.StrType{}
khenaidoo91ecfd62018-11-04 17:13:42 -050092 for _, arg := range args {
93 switch arg.Key {
94 case "adapter":
95 if err := ptypes.UnmarshalAny(arg.Value, adapter); err != nil {
96 log.Warnw("cannot-unmarshal-adapter", log.Fields{"error": err})
97 return nil, err
98 }
99 case "deviceTypes":
100 if err := ptypes.UnmarshalAny(arg.Value, deviceTypes); err != nil {
101 log.Warnw("cannot-unmarshal-device-types", log.Fields{"error": err})
102 return nil, err
103 }
khenaidoo297cd252019-02-07 22:10:23 -0500104 case kafka.TransactionKey:
105 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
106 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
107 return nil, err
108 }
khenaidoo91ecfd62018-11-04 17:13:42 -0500109 }
khenaidoob9203542018-09-17 22:56:37 -0400110 }
khenaidoo297cd252019-02-07 22:10:23 -0500111 log.Debugw("Register", log.Fields{"Adapter": *adapter, "DeviceTypes": deviceTypes, "transactionID": transactionID.Val, "coreId": rhp.coreInstanceId})
112
113 // Try to grab the transaction as this core may be competing with another Core
114 if rhp.competeForTransaction() {
115 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
116 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
117 // Update our adapters in memory
118 go rhp.adapterMgr.updateAdaptersAndDevicetypesInMemory()
119 // returning nil, nil instructs the callee to ignore this request
120 return nil, nil
121 } else {
122 defer txn.Close()
123 }
124 }
khenaidoob9203542018-09-17 22:56:37 -0400125
126 if rhp.TestMode { // Execute only for test cases
127 return &voltha.CoreInstance{InstanceId: "CoreInstance"}, nil
128 }
khenaidoo21d51152019-02-01 13:48:37 -0500129 return rhp.adapterMgr.registerAdapter(adapter, deviceTypes), nil
khenaidoob9203542018-09-17 22:56:37 -0400130}
131
khenaidoo79232702018-12-04 11:00:41 -0500132func (rhp *AdapterRequestHandlerProxy) GetDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500133 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400134 log.Warn("invalid-number-of-args", log.Fields{"args": args})
135 err := errors.New("invalid-number-of-args")
136 return nil, err
137 }
khenaidoo297cd252019-02-07 22:10:23 -0500138
khenaidoob9203542018-09-17 22:56:37 -0400139 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500140 transactionID := &ic.StrType{}
141 for _, arg := range args {
142 switch arg.Key {
143 case "device_id":
144 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
145 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
146 return nil, err
147 }
148 case kafka.TransactionKey:
149 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
150 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
151 return nil, err
152 }
153 }
khenaidoob9203542018-09-17 22:56:37 -0400154 }
khenaidoo297cd252019-02-07 22:10:23 -0500155 log.Debugw("GetDevice", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
156
157 // Try to grab the transaction as this core may be competing with another Core
158 if rhp.competeForTransaction() {
159 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
160 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
161 // returning nil, nil instructs the callee to ignore this request
162 return nil, nil
163 } else {
164 defer txn.Close()
165 }
166 }
khenaidoob9203542018-09-17 22:56:37 -0400167
168 if rhp.TestMode { // Execute only for test cases
169 return &voltha.Device{Id: pID.Id}, nil
170 }
171
172 // Get the device via the device manager
khenaidoo19d7b632018-10-30 10:49:50 -0400173 if device, err := rhp.deviceMgr.GetDevice(pID.Id); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400174 return nil, status.Errorf(codes.NotFound, "%s", err.Error())
175 } else {
khenaidoo79232702018-12-04 11:00:41 -0500176 log.Debugw("GetDevice-response", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400177 return device, nil
178 }
179}
180
khenaidoo92e62c52018-10-03 14:02:54 -0400181// updatePartialDeviceData updates a subset of a device that an Adapter can update.
182// TODO: May need a specific proto to handle only a subset of a device that can be changed by an adapter
183func (rhp *AdapterRequestHandlerProxy) mergeDeviceInfoFromAdapter(device *voltha.Device) (*voltha.Device, error) {
184 // First retrieve the most up to date device info
185 var currentDevice *voltha.Device
186 var err error
khenaidoo19d7b632018-10-30 10:49:50 -0400187 if currentDevice, err = rhp.deviceMgr.GetDevice(device.Id); err != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400188 return nil, err
189 }
khenaidoo19d7b632018-10-30 10:49:50 -0400190 cloned := proto.Clone(currentDevice).(*voltha.Device)
khenaidoo92e62c52018-10-03 14:02:54 -0400191 cloned.Root = device.Root
192 cloned.Vendor = device.Vendor
193 cloned.Model = device.Model
194 cloned.SerialNumber = device.SerialNumber
195 cloned.MacAddress = device.MacAddress
khenaidoo19d7b632018-10-30 10:49:50 -0400196 cloned.Vlan = device.Vlan
197 return cloned, nil
khenaidoo92e62c52018-10-03 14:02:54 -0400198}
199
khenaidoo79232702018-12-04 11:00:41 -0500200func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500201 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400202 log.Warn("invalid-number-of-args", log.Fields{"args": args})
203 err := errors.New("invalid-number-of-args")
204 return nil, err
205 }
khenaidoo297cd252019-02-07 22:10:23 -0500206
khenaidoob9203542018-09-17 22:56:37 -0400207 device := &voltha.Device{}
khenaidoo297cd252019-02-07 22:10:23 -0500208 transactionID := &ic.StrType{}
209 for _, arg := range args {
210 switch arg.Key {
211 case "device":
212 if err := ptypes.UnmarshalAny(arg.Value, device); err != nil {
213 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
214 return nil, err
215 }
216 case kafka.TransactionKey:
217 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
218 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
219 return nil, err
220 }
221 }
khenaidoob9203542018-09-17 22:56:37 -0400222 }
khenaidoo297cd252019-02-07 22:10:23 -0500223 log.Debugw("DeviceUpdate", log.Fields{"deviceId": device.Id, "transactionID": transactionID.Val})
224
225 // Try to grab the transaction as this core may be competing with another Core
226 if rhp.competeForTransaction() {
227 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
228 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
229 // returning nil, nil instructs the callee to ignore this request
230 return nil, nil
231 } else {
232 defer txn.Close()
233 }
234 }
khenaidoob9203542018-09-17 22:56:37 -0400235
236 if rhp.TestMode { // Execute only for test cases
237 return new(empty.Empty), nil
238 }
khenaidoo92e62c52018-10-03 14:02:54 -0400239
240 //Merge the adapter device info (only the ones an adapter can change) with the latest device data
241 if updatedDevice, err := rhp.mergeDeviceInfoFromAdapter(device); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400242 return nil, status.Errorf(codes.Internal, "%s", err.Error())
khenaidoo92e62c52018-10-03 14:02:54 -0400243 } else {
khenaidoode93b462019-02-13 22:17:21 -0500244 if err := rhp.deviceMgr.updateDevice(updatedDevice); err != nil {
245 return nil, err
246 }
khenaidoob9203542018-09-17 22:56:37 -0400247 }
khenaidoo92e62c52018-10-03 14:02:54 -0400248
khenaidoob9203542018-09-17 22:56:37 -0400249 return new(empty.Empty), nil
250}
251
khenaidoo79232702018-12-04 11:00:41 -0500252func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500253 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400254 log.Warn("invalid-number-of-args", log.Fields{"args": args})
255 err := errors.New("invalid-number-of-args")
256 return nil, err
257 }
khenaidoo297cd252019-02-07 22:10:23 -0500258
khenaidoo2c6f1672018-09-20 23:14:41 -0400259 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500260 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500261 serialNumber := &ic.StrType{}
262 onuId := &ic.IntType{}
263 parentPortNo := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500264 for _, arg := range args {
265 switch arg.Key {
266 case "device_id":
267 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
268 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
269 return nil, err
270 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500271 case "serial_number":
272 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
273 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
274 return nil, err
275 }
276 case "onu_id":
277 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
278 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
279 return nil, err
280 }
281 case "parent_port_no":
282 if err := ptypes.UnmarshalAny(arg.Value, parentPortNo); err != nil {
283 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
284 return nil, err
285 }
khenaidoo297cd252019-02-07 22:10:23 -0500286 case kafka.TransactionKey:
287 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
288 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
289 return nil, err
290 }
291 }
khenaidoob9203542018-09-17 22:56:37 -0400292 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500293 log.Debugw("GetChildDevice", log.Fields{"parentDeviceId": pID.Id, "args": args, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500294
295 // Try to grab the transaction as this core may be competing with another Core
296 if rhp.competeForTransaction() {
297 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
298 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
299 // returning nil, nil instructs the callee to ignore this request
300 return nil, nil
301 } else {
302 defer txn.Close()
303 }
304 }
khenaidoob9203542018-09-17 22:56:37 -0400305
306 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400307 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400308 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500309 return rhp.deviceMgr.GetChildDevice(pID.Id, serialNumber.Val, onuId.Val, parentPortNo.Val)
khenaidoob9203542018-09-17 22:56:37 -0400310}
311
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500312func (rhp *AdapterRequestHandlerProxy) GetChildDeviceWithProxyAddress(args []*ic.Argument) (*voltha.Device, error) {
313 if len(args) < 2 {
314 log.Warn("invalid-number-of-args", log.Fields{"args": args})
315 err := errors.New("invalid-number-of-args")
316 return nil, err
317 }
318
319 proxyAddress := &voltha.Device_ProxyAddress{}
320 transactionID := &ic.StrType{}
321 for _, arg := range args {
322 switch arg.Key {
323 case "proxy_address":
324 if err := ptypes.UnmarshalAny(arg.Value, proxyAddress); err != nil {
325 log.Warnw("cannot-unmarshal-proxy-address", log.Fields{"error": err})
326 return nil, err
327 }
328 case kafka.TransactionKey:
329 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
330 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
331 return nil, err
332 }
333 }
334 }
335 log.Debugw("GetChildDeviceWithProxyAddress", log.Fields{"proxyAddress": proxyAddress, "transactionID": transactionID.Val})
336
337 // Try to grab the transaction as this core may be competing with another Core
338 if rhp.competeForTransaction() {
339 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
340 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
341 // returning nil, nil instructs the callee to ignore this request
342 return nil, nil
343 } else {
344 defer txn.Close()
345 }
346 }
347
348 if rhp.TestMode { // Execute only for test cases
349 return &voltha.Device{Id: proxyAddress.DeviceId}, nil
350 }
351 return rhp.deviceMgr.GetChildDeviceWithProxyAddress(proxyAddress)
352}
353
khenaidoo79232702018-12-04 11:00:41 -0500354func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500355 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400356 log.Warn("invalid-number-of-args", log.Fields{"args": args})
357 err := errors.New("invalid-number-of-args")
358 return nil, err
359 }
khenaidoo92e62c52018-10-03 14:02:54 -0400360 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500361 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500362 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400363 for _, arg := range args {
364 switch arg.Key {
365 case "device_id":
366 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
367 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
368 return nil, err
369 }
370 case "port_type":
371 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
372 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
373 return nil, err
374 }
khenaidoo297cd252019-02-07 22:10:23 -0500375 case kafka.TransactionKey:
376 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
377 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
378 return nil, err
379 }
khenaidoo92e62c52018-10-03 14:02:54 -0400380 }
khenaidoob9203542018-09-17 22:56:37 -0400381 }
khenaidoo297cd252019-02-07 22:10:23 -0500382 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400383 if rhp.TestMode { // Execute only for test cases
384 aPort := &voltha.Port{Label: "test_port"}
385 allPorts := &voltha.Ports{}
386 allPorts.Items = append(allPorts.Items, aPort)
387 return allPorts, nil
388 }
khenaidoo92e62c52018-10-03 14:02:54 -0400389 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400390}
391
khenaidoo297cd252019-02-07 22:10:23 -0500392func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500393 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400394 log.Warn("invalid-number-of-args", log.Fields{"args": args})
395 err := errors.New("invalid-number-of-args")
396 return nil, err
397 }
khenaidoo297cd252019-02-07 22:10:23 -0500398
khenaidoo2c6f1672018-09-20 23:14:41 -0400399 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500400 transactionID := &ic.StrType{}
401 for _, arg := range args {
402 switch arg.Key {
403 case "device_id":
404 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
405 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
406 return nil, err
407 }
408 case kafka.TransactionKey:
409 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
410 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
411 return nil, err
412 }
413 }
khenaidoob9203542018-09-17 22:56:37 -0400414 }
khenaidoo297cd252019-02-07 22:10:23 -0500415 log.Debugw("GetChildDevices", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
416
417 // Try to grab the transaction as this core may be competing with another Core
418 if rhp.competeForTransaction() {
419 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
420 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
421 // returning nil, nil instructs the callee to ignore this request
422 return nil, nil
423 } else {
424 defer txn.Close()
425 }
426 }
khenaidoob9203542018-09-17 22:56:37 -0400427
428 if rhp.TestMode { // Execute only for test cases
khenaidoode93b462019-02-13 22:17:21 -0500429 return &voltha.Devices{Items: nil}, nil
khenaidoob9203542018-09-17 22:56:37 -0400430 }
khenaidoo297cd252019-02-07 22:10:23 -0500431
432 return rhp.deviceMgr.getAllChildDevices(pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400433}
434
435// ChildDeviceDetected is invoked when a child device is detected. The following
436// parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500437// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
khenaidoo79232702018-12-04 11:00:41 -0500438func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500439 if len(args) < 5 {
khenaidoob9203542018-09-17 22:56:37 -0400440 log.Warn("invalid-number-of-args", log.Fields{"args": args})
441 err := errors.New("invalid-number-of-args")
442 return nil, err
443 }
444
445 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500446 portNo := &ic.IntType{}
447 dt := &ic.StrType{}
448 chnlId := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500449 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500450 serialNumber := &ic.StrType{}
451 vendorId := &ic.StrType{}
452 onuId := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400453 for _, arg := range args {
454 switch arg.Key {
455 case "parent_device_id":
456 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
457 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
458 return nil, err
459 }
460 case "parent_port_no":
461 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
462 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
463 return nil, err
464 }
465 case "child_device_type":
466 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
467 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
468 return nil, err
469 }
470 case "channel_id":
471 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
472 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
473 return nil, err
474 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500475 case "vendor_id":
476 if err := ptypes.UnmarshalAny(arg.Value, vendorId); err != nil {
477 log.Warnw("cannot-unmarshal-vendor-id", log.Fields{"error": err})
478 return nil, err
479 }
480 case "serial_number":
481 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
482 log.Warnw("cannot-unmarshal-serial-number", log.Fields{"error": err})
483 return nil, err
484 }
485 case "onu_id":
486 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
487 log.Warnw("cannot-unmarshal-onu-id", log.Fields{"error": err})
488 return nil, err
489 }
khenaidoo297cd252019-02-07 22:10:23 -0500490 case kafka.TransactionKey:
491 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
492 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
493 return nil, err
494 }
khenaidoob9203542018-09-17 22:56:37 -0400495 }
496 }
khenaidoob9203542018-09-17 22:56:37 -0400497 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
Matt Jeanneret4e241952019-02-28 11:16:04 -0500498 "deviceType": dt.Val, "channelId": chnlId.Val, "serialNumber": serialNumber.Val,
499 "vendorId": vendorId.Val, "onuId": onuId.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500500
501 // Try to grab the transaction as this core may be competing with another Core
502 if rhp.competeForTransaction() {
503 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
504 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
505 // returning nil, nil instructs the callee to ignore this request
506 return nil, nil
507 } else {
508 defer txn.Close()
509 }
510 }
khenaidoob9203542018-09-17 22:56:37 -0400511
512 if rhp.TestMode { // Execute only for test cases
513 return nil, nil
514 }
khenaidoob9203542018-09-17 22:56:37 -0400515 // Run child detection in it's own go routine as it can be a lengthy process
Matt Jeanneret4e241952019-02-28 11:16:04 -0500516 go rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val, vendorId.Val, serialNumber.Val, onuId.Val)
khenaidoob9203542018-09-17 22:56:37 -0400517
518 return new(empty.Empty), nil
519}
520
khenaidoo79232702018-12-04 11:00:41 -0500521func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500522 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400523 log.Warn("invalid-number-of-args", log.Fields{"args": args})
524 err := errors.New("invalid-number-of-args")
525 return nil, err
526 }
527 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500528 operStatus := &ic.IntType{}
529 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500530 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400531 for _, arg := range args {
532 switch arg.Key {
533 case "device_id":
534 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
535 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
536 return nil, err
537 }
538 case "oper_status":
539 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
540 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
541 return nil, err
542 }
khenaidoob9203542018-09-17 22:56:37 -0400543 case "connect_status":
544 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
545 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
546 return nil, err
547 }
khenaidoo297cd252019-02-07 22:10:23 -0500548 case kafka.TransactionKey:
549 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
550 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
551 return nil, err
552 }
khenaidoob9203542018-09-17 22:56:37 -0400553 }
554 }
khenaidoo297cd252019-02-07 22:10:23 -0500555 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
556 "conn-status": connStatus, "transactionID": transactionID.Val})
557
558 // Try to grab the transaction as this core may be competing with another Core
559 if rhp.competeForTransaction() {
560 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
561 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
562 // returning nil, nil instructs the callee to ignore this request
563 return nil, nil
564 } else {
565 defer txn.Close()
566 }
567 }
568
khenaidoob9203542018-09-17 22:56:37 -0400569 if rhp.TestMode { // Execute only for test cases
570 return nil, nil
571 }
khenaidoo92e62c52018-10-03 14:02:54 -0400572 // 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 -0500573 if err := rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
574 voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
575 return nil, err
576 }
khenaidoo92e62c52018-10-03 14:02:54 -0400577 return new(empty.Empty), nil
578}
579
khenaidoo79232702018-12-04 11:00:41 -0500580func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500581 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400582 log.Warn("invalid-number-of-args", log.Fields{"args": args})
583 err := errors.New("invalid-number-of-args")
584 return nil, err
585 }
586 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500587 operStatus := &ic.IntType{}
588 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500589 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400590 for _, arg := range args {
591 switch arg.Key {
592 case "device_id":
593 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
594 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
595 return nil, err
596 }
597 case "oper_status":
598 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
599 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
600 return nil, err
601 }
602 case "connect_status":
603 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
604 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
605 return nil, err
606 }
khenaidoo297cd252019-02-07 22:10:23 -0500607 case kafka.TransactionKey:
608 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
609 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
610 return nil, err
611 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400612 }
613 }
khenaidoo297cd252019-02-07 22:10:23 -0500614 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
615 "conn-status": connStatus, "transactionID": transactionID.Val})
616
617 // Try to grab the transaction as this core may be competing with another Core
618 if rhp.competeForTransaction() {
619 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
620 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
621 // returning nil, nil instructs the callee to ignore this request
622 return nil, nil
623 } else {
624 defer txn.Close()
625 }
626 }
627
khenaidoo4d4802d2018-10-04 21:59:49 -0400628 if rhp.TestMode { // Execute only for test cases
629 return nil, nil
630 }
631
632 // 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 -0500633 if err := rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
634 voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
635 return nil, err
636 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400637 return new(empty.Empty), nil
638}
639
khenaidoo79232702018-12-04 11:00:41 -0500640func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500641 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400642 log.Warn("invalid-number-of-args", log.Fields{"args": args})
643 err := errors.New("invalid-number-of-args")
644 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400645 }
khenaidoo92e62c52018-10-03 14:02:54 -0400646 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500647 portType := &ic.IntType{}
648 portNo := &ic.IntType{}
649 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500650 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400651 for _, arg := range args {
652 switch arg.Key {
653 case "device_id":
654 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
655 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
656 return nil, err
657 }
658 case "oper_status":
659 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
660 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
661 return nil, err
662 }
663 case "port_type":
664 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
665 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
666 return nil, err
667 }
668 case "port_no":
669 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
670 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
671 return nil, err
672 }
khenaidoo297cd252019-02-07 22:10:23 -0500673 case kafka.TransactionKey:
674 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
675 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
676 return nil, err
677 }
khenaidoo92e62c52018-10-03 14:02:54 -0400678 }
679 }
khenaidoo297cd252019-02-07 22:10:23 -0500680 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
681 "portType": portType, "portNo": portNo, "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.acquireTransaction(transactionID.Val); 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
khenaidoo92e62c52018-10-03 14:02:54 -0400694 if rhp.TestMode { // Execute only for test cases
695 return nil, nil
696 }
khenaidoode93b462019-02-13 22:17:21 -0500697 if err := rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
698 voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
699 return nil, err
700 }
khenaidoob9203542018-09-17 22:56:37 -0400701 return new(empty.Empty), nil
702}
703
khenaidoo79232702018-12-04 11:00:41 -0500704func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500705 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400706 log.Warn("invalid-number-of-args", log.Fields{"args": args})
707 err := errors.New("invalid-number-of-args")
708 return nil, err
709 }
710 deviceId := &voltha.ID{}
711 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500712 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400713 for _, arg := range args {
714 switch arg.Key {
715 case "device_id":
716 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
717 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
718 return nil, err
719 }
720 case "port":
721 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
722 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
723 return nil, err
724 }
khenaidoo297cd252019-02-07 22:10:23 -0500725 case kafka.TransactionKey:
726 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
727 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
728 return nil, err
729 }
khenaidoob9203542018-09-17 22:56:37 -0400730 }
731 }
khenaidoo297cd252019-02-07 22:10:23 -0500732 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
733
734 // Try to grab the transaction as this core may be competing with another Core
735 if rhp.competeForTransaction() {
736 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
737 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
738 // returning nil, nil instructs the callee to ignore this request
739 return nil, nil
740 } else {
741 defer txn.Close()
742 }
743 }
khenaidoob9203542018-09-17 22:56:37 -0400744
745 if rhp.TestMode { // Execute only for test cases
746 return nil, nil
747 }
khenaidoode93b462019-02-13 22:17:21 -0500748 if err := rhp.deviceMgr.addPort(deviceId.Id, port); err != nil {
749 return nil, err
750 }
khenaidoo92e62c52018-10-03 14:02:54 -0400751
khenaidoob9203542018-09-17 22:56:37 -0400752 return new(empty.Empty), nil
753}
754
khenaidoo79232702018-12-04 11:00:41 -0500755func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500756 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400757 log.Warn("invalid-number-of-args", log.Fields{"args": args})
758 err := errors.New("invalid-number-of-args")
759 return nil, err
760 }
761 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500762 init := &ic.BoolType{}
khenaidoo297cd252019-02-07 22:10:23 -0500763 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400764 for _, arg := range args {
765 switch arg.Key {
766 case "device_pm_config":
767 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
768 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
769 return nil, err
770 }
771 case "init":
772 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
773 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
774 return nil, err
775 }
khenaidoo297cd252019-02-07 22:10:23 -0500776 case kafka.TransactionKey:
777 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
778 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
779 return nil, err
780 }
khenaidoob9203542018-09-17 22:56:37 -0400781 }
782 }
khenaidoob9203542018-09-17 22:56:37 -0400783 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoode93b462019-02-13 22:17:21 -0500784 "init": init, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500785
786 // Try to grab the transaction as this core may be competing with another Core
787 if rhp.competeForTransaction() {
788 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
789 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
790 // returning nil, nil instructs the callee to ignore this request
791 return nil, nil
792 } else {
793 defer txn.Close()
794 }
795 }
khenaidoob9203542018-09-17 22:56:37 -0400796
797 if rhp.TestMode { // Execute only for test cases
798 return nil, nil
799 }
800
khenaidoode93b462019-02-13 22:17:21 -0500801 if err := rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs); err != nil {
802 return nil, err
803 }
khenaidoo92e62c52018-10-03 14:02:54 -0400804
khenaidoob9203542018-09-17 22:56:37 -0400805 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400806}
khenaidoofdbad6e2018-11-06 22:26:38 -0500807
khenaidoo79232702018-12-04 11:00:41 -0500808func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500809 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -0500810 log.Warn("invalid-number-of-args", log.Fields{"args": args})
811 err := errors.New("invalid-number-of-args")
812 return nil, err
813 }
814 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500815 portNo := &ic.IntType{}
816 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500817 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500818 for _, arg := range args {
819 switch arg.Key {
820 case "device_id":
821 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
822 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
823 return nil, err
824 }
825 case "port":
826 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
827 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
828 return nil, err
829 }
830 case "packet":
831 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
832 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
833 return nil, err
834 }
khenaidoo297cd252019-02-07 22:10:23 -0500835 case kafka.TransactionKey:
836 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
837 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
838 return nil, err
839 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500840 }
841 }
khenaidoo297cd252019-02-07 22:10:23 -0500842 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
843 "transactionID": transactionID.Val})
844
845 // For performance reason, we do not compete for packet-in. We process it and send the packet in. later in the
846 // processing flow the duplicate packet will be discarded
847
khenaidoofdbad6e2018-11-06 22:26:38 -0500848 if rhp.TestMode { // Execute only for test cases
849 return nil, nil
850 }
khenaidoode93b462019-02-13 22:17:21 -0500851 if err := rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload); err != nil {
852 return nil, err
853 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500854 return new(empty.Empty), nil
855}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500856
khenaidoof5a5bfa2019-01-23 22:20:29 -0500857func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
858 if len(args) < 2 {
859 log.Warn("invalid-number-of-args", log.Fields{"args": args})
860 err := errors.New("invalid-number-of-args")
861 return nil, err
862 }
863 deviceId := &voltha.ID{}
864 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -0500865 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500866 for _, arg := range args {
867 switch arg.Key {
868 case "device_id":
869 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
870 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
871 return nil, err
872 }
873 case "image_download":
874 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
875 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
876 return nil, err
877 }
khenaidoo297cd252019-02-07 22:10:23 -0500878 case kafka.TransactionKey:
879 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
880 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
881 return nil, err
882 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500883 }
884 }
khenaidoo297cd252019-02-07 22:10:23 -0500885 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
886 "transactionID": transactionID.Val})
887
888 // Try to grab the transaction as this core may be competing with another Core
889 if rhp.competeForTransaction() {
890 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
891 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
892 // returning nil, nil instructs the callee to ignore this request
893 return nil, nil
894 } else {
895 defer txn.Close()
896 }
897 }
898
khenaidoof5a5bfa2019-01-23 22:20:29 -0500899 if rhp.TestMode { // Execute only for test cases
900 return nil, nil
901 }
khenaidoode93b462019-02-13 22:17:21 -0500902 if err := rhp.deviceMgr.updateImageDownload(deviceId.Id, img); err != nil {
903 return nil, err
904 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500905 return new(empty.Empty), nil
906}