blob: 01c289ce1092c9b42499ce6511b2cec66f532519 [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
khenaidoo79232702018-12-04 11:00:41 -0500312func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500313 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400314 log.Warn("invalid-number-of-args", log.Fields{"args": args})
315 err := errors.New("invalid-number-of-args")
316 return nil, err
317 }
khenaidoo92e62c52018-10-03 14:02:54 -0400318 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500319 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500320 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400321 for _, arg := range args {
322 switch arg.Key {
323 case "device_id":
324 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
325 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
326 return nil, err
327 }
328 case "port_type":
329 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
330 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
331 return nil, err
332 }
khenaidoo297cd252019-02-07 22:10:23 -0500333 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 }
khenaidoo92e62c52018-10-03 14:02:54 -0400338 }
khenaidoob9203542018-09-17 22:56:37 -0400339 }
khenaidoo297cd252019-02-07 22:10:23 -0500340 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400341 if rhp.TestMode { // Execute only for test cases
342 aPort := &voltha.Port{Label: "test_port"}
343 allPorts := &voltha.Ports{}
344 allPorts.Items = append(allPorts.Items, aPort)
345 return allPorts, nil
346 }
khenaidoo92e62c52018-10-03 14:02:54 -0400347 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400348}
349
khenaidoo297cd252019-02-07 22:10:23 -0500350func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500351 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400352 log.Warn("invalid-number-of-args", log.Fields{"args": args})
353 err := errors.New("invalid-number-of-args")
354 return nil, err
355 }
khenaidoo297cd252019-02-07 22:10:23 -0500356
khenaidoo2c6f1672018-09-20 23:14:41 -0400357 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500358 transactionID := &ic.StrType{}
359 for _, arg := range args {
360 switch arg.Key {
361 case "device_id":
362 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
363 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
364 return nil, err
365 }
366 case kafka.TransactionKey:
367 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
368 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
369 return nil, err
370 }
371 }
khenaidoob9203542018-09-17 22:56:37 -0400372 }
khenaidoo297cd252019-02-07 22:10:23 -0500373 log.Debugw("GetChildDevices", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
374
375 // Try to grab the transaction as this core may be competing with another Core
376 if rhp.competeForTransaction() {
377 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
378 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
379 // returning nil, nil instructs the callee to ignore this request
380 return nil, nil
381 } else {
382 defer txn.Close()
383 }
384 }
khenaidoob9203542018-09-17 22:56:37 -0400385
386 if rhp.TestMode { // Execute only for test cases
khenaidoode93b462019-02-13 22:17:21 -0500387 return &voltha.Devices{Items: nil}, nil
khenaidoob9203542018-09-17 22:56:37 -0400388 }
khenaidoo297cd252019-02-07 22:10:23 -0500389
390 return rhp.deviceMgr.getAllChildDevices(pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400391}
392
393// ChildDeviceDetected is invoked when a child device is detected. The following
394// parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500395// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
khenaidoo79232702018-12-04 11:00:41 -0500396func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500397 if len(args) < 5 {
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 }
402
403 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500404 portNo := &ic.IntType{}
405 dt := &ic.StrType{}
406 chnlId := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500407 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500408 serialNumber := &ic.StrType{}
409 vendorId := &ic.StrType{}
410 onuId := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400411 for _, arg := range args {
412 switch arg.Key {
413 case "parent_device_id":
414 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
415 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
416 return nil, err
417 }
418 case "parent_port_no":
419 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
420 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
421 return nil, err
422 }
423 case "child_device_type":
424 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
425 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
426 return nil, err
427 }
428 case "channel_id":
429 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
430 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
431 return nil, err
432 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500433 case "vendor_id":
434 if err := ptypes.UnmarshalAny(arg.Value, vendorId); err != nil {
435 log.Warnw("cannot-unmarshal-vendor-id", log.Fields{"error": err})
436 return nil, err
437 }
438 case "serial_number":
439 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
440 log.Warnw("cannot-unmarshal-serial-number", log.Fields{"error": err})
441 return nil, err
442 }
443 case "onu_id":
444 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
445 log.Warnw("cannot-unmarshal-onu-id", log.Fields{"error": err})
446 return nil, err
447 }
khenaidoo297cd252019-02-07 22:10:23 -0500448 case kafka.TransactionKey:
449 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
450 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
451 return nil, err
452 }
khenaidoob9203542018-09-17 22:56:37 -0400453 }
454 }
khenaidoob9203542018-09-17 22:56:37 -0400455 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
Matt Jeanneret4e241952019-02-28 11:16:04 -0500456 "deviceType": dt.Val, "channelId": chnlId.Val, "serialNumber": serialNumber.Val,
457 "vendorId": vendorId.Val, "onuId": onuId.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500458
459 // Try to grab the transaction as this core may be competing with another Core
460 if rhp.competeForTransaction() {
461 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
462 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
463 // returning nil, nil instructs the callee to ignore this request
464 return nil, nil
465 } else {
466 defer txn.Close()
467 }
468 }
khenaidoob9203542018-09-17 22:56:37 -0400469
470 if rhp.TestMode { // Execute only for test cases
471 return nil, nil
472 }
khenaidoob9203542018-09-17 22:56:37 -0400473 // Run child detection in it's own go routine as it can be a lengthy process
Matt Jeanneret4e241952019-02-28 11:16:04 -0500474 go rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val, vendorId.Val, serialNumber.Val, onuId.Val)
khenaidoob9203542018-09-17 22:56:37 -0400475
476 return new(empty.Empty), nil
477}
478
khenaidoo79232702018-12-04 11:00:41 -0500479func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500480 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400481 log.Warn("invalid-number-of-args", log.Fields{"args": args})
482 err := errors.New("invalid-number-of-args")
483 return nil, err
484 }
485 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500486 operStatus := &ic.IntType{}
487 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500488 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400489 for _, arg := range args {
490 switch arg.Key {
491 case "device_id":
492 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
493 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
494 return nil, err
495 }
496 case "oper_status":
497 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
498 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
499 return nil, err
500 }
khenaidoob9203542018-09-17 22:56:37 -0400501 case "connect_status":
502 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
503 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
504 return nil, err
505 }
khenaidoo297cd252019-02-07 22:10:23 -0500506 case kafka.TransactionKey:
507 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
508 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
509 return nil, err
510 }
khenaidoob9203542018-09-17 22:56:37 -0400511 }
512 }
khenaidoo297cd252019-02-07 22:10:23 -0500513 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
514 "conn-status": connStatus, "transactionID": transactionID.Val})
515
516 // Try to grab the transaction as this core may be competing with another Core
517 if rhp.competeForTransaction() {
518 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
519 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
520 // returning nil, nil instructs the callee to ignore this request
521 return nil, nil
522 } else {
523 defer txn.Close()
524 }
525 }
526
khenaidoob9203542018-09-17 22:56:37 -0400527 if rhp.TestMode { // Execute only for test cases
528 return nil, nil
529 }
khenaidoo92e62c52018-10-03 14:02:54 -0400530 // 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 -0500531 if err := rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
532 voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
533 return nil, err
534 }
khenaidoo92e62c52018-10-03 14:02:54 -0400535 return new(empty.Empty), nil
536}
537
khenaidoo79232702018-12-04 11:00:41 -0500538func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500539 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400540 log.Warn("invalid-number-of-args", log.Fields{"args": args})
541 err := errors.New("invalid-number-of-args")
542 return nil, err
543 }
544 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500545 operStatus := &ic.IntType{}
546 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500547 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400548 for _, arg := range args {
549 switch arg.Key {
550 case "device_id":
551 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
552 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
553 return nil, err
554 }
555 case "oper_status":
556 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
557 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
558 return nil, err
559 }
560 case "connect_status":
561 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
562 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
563 return nil, err
564 }
khenaidoo297cd252019-02-07 22:10:23 -0500565 case kafka.TransactionKey:
566 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
567 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
568 return nil, err
569 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400570 }
571 }
khenaidoo297cd252019-02-07 22:10:23 -0500572 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
573 "conn-status": connStatus, "transactionID": transactionID.Val})
574
575 // Try to grab the transaction as this core may be competing with another Core
576 if rhp.competeForTransaction() {
577 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
578 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
579 // returning nil, nil instructs the callee to ignore this request
580 return nil, nil
581 } else {
582 defer txn.Close()
583 }
584 }
585
khenaidoo4d4802d2018-10-04 21:59:49 -0400586 if rhp.TestMode { // Execute only for test cases
587 return nil, nil
588 }
589
590 // 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 -0500591 if err := rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
592 voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
593 return nil, err
594 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400595 return new(empty.Empty), nil
596}
597
khenaidoo79232702018-12-04 11:00:41 -0500598func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500599 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400600 log.Warn("invalid-number-of-args", log.Fields{"args": args})
601 err := errors.New("invalid-number-of-args")
602 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400603 }
khenaidoo92e62c52018-10-03 14:02:54 -0400604 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500605 portType := &ic.IntType{}
606 portNo := &ic.IntType{}
607 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500608 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400609 for _, arg := range args {
610 switch arg.Key {
611 case "device_id":
612 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
613 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
614 return nil, err
615 }
616 case "oper_status":
617 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
618 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
619 return nil, err
620 }
621 case "port_type":
622 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
623 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
624 return nil, err
625 }
626 case "port_no":
627 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
628 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
629 return nil, err
630 }
khenaidoo297cd252019-02-07 22:10:23 -0500631 case kafka.TransactionKey:
632 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
633 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
634 return nil, err
635 }
khenaidoo92e62c52018-10-03 14:02:54 -0400636 }
637 }
khenaidoo297cd252019-02-07 22:10:23 -0500638 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
639 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
640
641 // Try to grab the transaction as this core may be competing with another Core
642 if rhp.competeForTransaction() {
643 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
644 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
645 // returning nil, nil instructs the callee to ignore this request
646 return nil, nil
647 } else {
648 defer txn.Close()
649 }
650 }
651
khenaidoo92e62c52018-10-03 14:02:54 -0400652 if rhp.TestMode { // Execute only for test cases
653 return nil, nil
654 }
khenaidoode93b462019-02-13 22:17:21 -0500655 if err := rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
656 voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
657 return nil, err
658 }
khenaidoob9203542018-09-17 22:56:37 -0400659 return new(empty.Empty), nil
660}
661
khenaidoo79232702018-12-04 11:00:41 -0500662func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500663 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400664 log.Warn("invalid-number-of-args", log.Fields{"args": args})
665 err := errors.New("invalid-number-of-args")
666 return nil, err
667 }
668 deviceId := &voltha.ID{}
669 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500670 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400671 for _, arg := range args {
672 switch arg.Key {
673 case "device_id":
674 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
675 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
676 return nil, err
677 }
678 case "port":
679 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
680 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
681 return nil, err
682 }
khenaidoo297cd252019-02-07 22:10:23 -0500683 case kafka.TransactionKey:
684 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
685 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
686 return nil, err
687 }
khenaidoob9203542018-09-17 22:56:37 -0400688 }
689 }
khenaidoo297cd252019-02-07 22:10:23 -0500690 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
691
692 // Try to grab the transaction as this core may be competing with another Core
693 if rhp.competeForTransaction() {
694 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
695 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
696 // returning nil, nil instructs the callee to ignore this request
697 return nil, nil
698 } else {
699 defer txn.Close()
700 }
701 }
khenaidoob9203542018-09-17 22:56:37 -0400702
703 if rhp.TestMode { // Execute only for test cases
704 return nil, nil
705 }
khenaidoode93b462019-02-13 22:17:21 -0500706 if err := rhp.deviceMgr.addPort(deviceId.Id, port); err != nil {
707 return nil, err
708 }
khenaidoo92e62c52018-10-03 14:02:54 -0400709
khenaidoob9203542018-09-17 22:56:37 -0400710 return new(empty.Empty), nil
711}
712
khenaidoo79232702018-12-04 11:00:41 -0500713func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500714 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400715 log.Warn("invalid-number-of-args", log.Fields{"args": args})
716 err := errors.New("invalid-number-of-args")
717 return nil, err
718 }
719 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500720 init := &ic.BoolType{}
khenaidoo297cd252019-02-07 22:10:23 -0500721 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400722 for _, arg := range args {
723 switch arg.Key {
724 case "device_pm_config":
725 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
726 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
727 return nil, err
728 }
729 case "init":
730 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
731 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
732 return nil, err
733 }
khenaidoo297cd252019-02-07 22:10:23 -0500734 case kafka.TransactionKey:
735 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
736 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
737 return nil, err
738 }
khenaidoob9203542018-09-17 22:56:37 -0400739 }
740 }
khenaidoob9203542018-09-17 22:56:37 -0400741 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoode93b462019-02-13 22:17:21 -0500742 "init": init, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500743
744 // Try to grab the transaction as this core may be competing with another Core
745 if rhp.competeForTransaction() {
746 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
747 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
748 // returning nil, nil instructs the callee to ignore this request
749 return nil, nil
750 } else {
751 defer txn.Close()
752 }
753 }
khenaidoob9203542018-09-17 22:56:37 -0400754
755 if rhp.TestMode { // Execute only for test cases
756 return nil, nil
757 }
758
khenaidoode93b462019-02-13 22:17:21 -0500759 if err := rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs); err != nil {
760 return nil, err
761 }
khenaidoo92e62c52018-10-03 14:02:54 -0400762
khenaidoob9203542018-09-17 22:56:37 -0400763 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400764}
khenaidoofdbad6e2018-11-06 22:26:38 -0500765
khenaidoo79232702018-12-04 11:00:41 -0500766func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500767 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -0500768 log.Warn("invalid-number-of-args", log.Fields{"args": args})
769 err := errors.New("invalid-number-of-args")
770 return nil, err
771 }
772 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500773 portNo := &ic.IntType{}
774 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500775 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500776 for _, arg := range args {
777 switch arg.Key {
778 case "device_id":
779 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
780 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
781 return nil, err
782 }
783 case "port":
784 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
785 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
786 return nil, err
787 }
788 case "packet":
789 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
790 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
791 return nil, err
792 }
khenaidoo297cd252019-02-07 22:10:23 -0500793 case kafka.TransactionKey:
794 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
795 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
796 return nil, err
797 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500798 }
799 }
khenaidoo297cd252019-02-07 22:10:23 -0500800 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
801 "transactionID": transactionID.Val})
802
803 // For performance reason, we do not compete for packet-in. We process it and send the packet in. later in the
804 // processing flow the duplicate packet will be discarded
805
khenaidoofdbad6e2018-11-06 22:26:38 -0500806 if rhp.TestMode { // Execute only for test cases
807 return nil, nil
808 }
khenaidoode93b462019-02-13 22:17:21 -0500809 if err := rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload); err != nil {
810 return nil, err
811 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500812 return new(empty.Empty), nil
813}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500814
khenaidoof5a5bfa2019-01-23 22:20:29 -0500815func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(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 deviceId := &voltha.ID{}
822 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -0500823 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500824 for _, arg := range args {
825 switch arg.Key {
826 case "device_id":
827 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
828 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
829 return nil, err
830 }
831 case "image_download":
832 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
833 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
834 return nil, err
835 }
khenaidoo297cd252019-02-07 22:10:23 -0500836 case kafka.TransactionKey:
837 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
838 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
839 return nil, err
840 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500841 }
842 }
khenaidoo297cd252019-02-07 22:10:23 -0500843 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
844 "transactionID": transactionID.Val})
845
846 // Try to grab the transaction as this core may be competing with another Core
847 if rhp.competeForTransaction() {
848 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
849 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
850 // returning nil, nil instructs the callee to ignore this request
851 return nil, nil
852 } else {
853 defer txn.Close()
854 }
855 }
856
khenaidoof5a5bfa2019-01-23 22:20:29 -0500857 if rhp.TestMode { // Execute only for test cases
858 return nil, nil
859 }
khenaidoode93b462019-02-13 22:17:21 -0500860 if err := rhp.deviceMgr.updateImageDownload(deviceId.Id, img); err != nil {
861 return nil, err
862 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500863 return new(empty.Empty), nil
864}