blob: d93346600e86eb6b26a44d6abd05e198b15a07d3 [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"
khenaidoo1ce37ad2019-03-24 22:07:24 -040026 "github.com/opencord/voltha-go/rw_core/utils"
William Kurkiandaa6bb22019-03-07 12:26:28 -050027 ic "github.com/opencord/voltha-protos/go/inter_container"
28 "github.com/opencord/voltha-protos/go/voltha"
khenaidoob9203542018-09-17 22:56:37 -040029 "google.golang.org/grpc/codes"
30 "google.golang.org/grpc/status"
31)
32
33type AdapterRequestHandlerProxy struct {
khenaidoode93b462019-02-13 22:17:21 -050034 TestMode bool
35 coreInstanceId string
36 deviceMgr *DeviceManager
37 lDeviceMgr *LogicalDeviceManager
38 adapterMgr *AdapterManager
39 localDataProxy *model.Proxy
40 clusterDataProxy *model.Proxy
41 defaultRequestTimeout int64
khenaidoo297cd252019-02-07 22:10:23 -050042 longRunningRequestTimeout int64
khenaidoode93b462019-02-13 22:17:21 -050043 coreInCompetingMode bool
Richard Jankowski199fd862019-03-18 14:49:51 -040044 core *Core
khenaidoob9203542018-09-17 22:56:37 -040045}
46
Richard Jankowski199fd862019-03-18 14:49:51 -040047func NewAdapterRequestHandlerProxy(core *Core, coreInstanceId string, dMgr *DeviceManager, ldMgr *LogicalDeviceManager,
khenaidoo297cd252019-02-07 22:10:23 -050048 aMgr *AdapterManager, cdProxy *model.Proxy, ldProxy *model.Proxy, incompetingMode bool, longRunningRequestTimeout int64,
49 defaultRequestTimeout int64) *AdapterRequestHandlerProxy {
khenaidoob9203542018-09-17 22:56:37 -040050 var proxy AdapterRequestHandlerProxy
Richard Jankowski199fd862019-03-18 14:49:51 -040051 proxy.core = core
khenaidoo91ecfd62018-11-04 17:13:42 -050052 proxy.coreInstanceId = coreInstanceId
khenaidoob9203542018-09-17 22:56:37 -040053 proxy.deviceMgr = dMgr
54 proxy.lDeviceMgr = ldMgr
55 proxy.clusterDataProxy = cdProxy
56 proxy.localDataProxy = ldProxy
khenaidoo21d51152019-02-01 13:48:37 -050057 proxy.adapterMgr = aMgr
khenaidoo297cd252019-02-07 22:10:23 -050058 proxy.coreInCompetingMode = incompetingMode
59 proxy.defaultRequestTimeout = defaultRequestTimeout
60 proxy.longRunningRequestTimeout = longRunningRequestTimeout
khenaidoob9203542018-09-17 22:56:37 -040061 return &proxy
62}
63
Richard Jankowski199fd862019-03-18 14:49:51 -040064func (rhp *AdapterRequestHandlerProxy) acquireRequest(transactionId string, maxTimeout ...int64) (*KVTransaction, error) {
khenaidoo297cd252019-02-07 22:10:23 -050065 timeout := rhp.defaultRequestTimeout
66 if len(maxTimeout) > 0 {
67 timeout = maxTimeout[0]
68 }
khenaidoo297cd252019-02-07 22:10:23 -050069 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) {
khenaidoo1ce37ad2019-03-24 22:07:24 -040073 log.Debugw("acquired-request", log.Fields{"xtrnsId": transactionId})
khenaidoo297cd252019-02-07 22:10:23 -050074 return txn, nil
75 } else {
76 return nil, errors.New("failed-to-seize-request")
77 }
78}
79
Richard Jankowski199fd862019-03-18 14:49:51 -040080// This is a helper function that attempts to acquire the request by using the device ownership model
81func (rhp *AdapterRequestHandlerProxy) takeRequestOwnership(transactionId string, devId string, maxTimeout ...int64) (*KVTransaction, error) {
82 timeout := rhp.defaultRequestTimeout
83 if len(maxTimeout) > 0 {
84 timeout = maxTimeout[0]
85 }
Richard Jankowski199fd862019-03-18 14:49:51 -040086 txn := NewKVTransaction(transactionId)
87 if txn == nil {
88 return nil, errors.New("fail-to-create-transaction")
89 }
90
khenaidoo1ce37ad2019-03-24 22:07:24 -040091 if rhp.core.deviceOwnership.OwnedByMe(&utils.DeviceID{Id:devId}) {
92 log.Debugw("owned-by-me", log.Fields{"Id": devId})
Richard Jankowski199fd862019-03-18 14:49:51 -040093 if txn.Acquired(timeout) {
khenaidoo1ce37ad2019-03-24 22:07:24 -040094 log.Debugw("processing-request", log.Fields{"Id": devId})
Richard Jankowski199fd862019-03-18 14:49:51 -040095 return txn, nil
96 } else {
97 return nil, errors.New("failed-to-seize-request")
98 }
99 } else {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400100 log.Debugw("not-owned-by-me", log.Fields{"Id": devId})
Richard Jankowski199fd862019-03-18 14:49:51 -0400101 if txn.Monitor(timeout) {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400102 log.Debugw("timeout-processing-request", log.Fields{"Id": devId})
Richard Jankowski199fd862019-03-18 14:49:51 -0400103 return txn, nil
104 } else {
105 return nil, errors.New("device-not-owned")
106 }
107 }
108}
109
khenaidoo297cd252019-02-07 22:10:23 -0500110// competeForTransaction is a helper function to determine whether every request needs to compete with another
111// Core to execute the request
112func (rhp *AdapterRequestHandlerProxy) competeForTransaction() bool {
113 return rhp.coreInCompetingMode
114}
115
khenaidoo79232702018-12-04 11:00:41 -0500116func (rhp *AdapterRequestHandlerProxy) Register(args []*ic.Argument) (*voltha.CoreInstance, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500117 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400118 log.Warn("invalid-number-of-args", log.Fields{"args": args})
119 err := errors.New("invalid-number-of-args")
120 return nil, err
121 }
122 adapter := &voltha.Adapter{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500123 deviceTypes := &voltha.DeviceTypes{}
khenaidoo297cd252019-02-07 22:10:23 -0500124 transactionID := &ic.StrType{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500125 for _, arg := range args {
126 switch arg.Key {
127 case "adapter":
128 if err := ptypes.UnmarshalAny(arg.Value, adapter); err != nil {
129 log.Warnw("cannot-unmarshal-adapter", log.Fields{"error": err})
130 return nil, err
131 }
132 case "deviceTypes":
133 if err := ptypes.UnmarshalAny(arg.Value, deviceTypes); err != nil {
134 log.Warnw("cannot-unmarshal-device-types", log.Fields{"error": err})
135 return nil, err
136 }
khenaidoo297cd252019-02-07 22:10:23 -0500137 case kafka.TransactionKey:
138 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
139 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
140 return nil, err
141 }
khenaidoo91ecfd62018-11-04 17:13:42 -0500142 }
khenaidoob9203542018-09-17 22:56:37 -0400143 }
khenaidoo297cd252019-02-07 22:10:23 -0500144 log.Debugw("Register", log.Fields{"Adapter": *adapter, "DeviceTypes": deviceTypes, "transactionID": transactionID.Val, "coreId": rhp.coreInstanceId})
145
146 // Try to grab the transaction as this core may be competing with another Core
147 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400148 if txn, err := rhp.acquireRequest(transactionID.Val); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500149 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
150 // Update our adapters in memory
151 go rhp.adapterMgr.updateAdaptersAndDevicetypesInMemory()
152 // returning nil, nil instructs the callee to ignore this request
153 return nil, nil
154 } else {
155 defer txn.Close()
156 }
157 }
khenaidoob9203542018-09-17 22:56:37 -0400158
159 if rhp.TestMode { // Execute only for test cases
160 return &voltha.CoreInstance{InstanceId: "CoreInstance"}, nil
161 }
khenaidoo21d51152019-02-01 13:48:37 -0500162 return rhp.adapterMgr.registerAdapter(adapter, deviceTypes), nil
khenaidoob9203542018-09-17 22:56:37 -0400163}
164
khenaidoo79232702018-12-04 11:00:41 -0500165func (rhp *AdapterRequestHandlerProxy) GetDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500166 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400167 log.Warn("invalid-number-of-args", log.Fields{"args": args})
168 err := errors.New("invalid-number-of-args")
169 return nil, err
170 }
khenaidoo297cd252019-02-07 22:10:23 -0500171
khenaidoob9203542018-09-17 22:56:37 -0400172 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500173 transactionID := &ic.StrType{}
174 for _, arg := range args {
175 switch arg.Key {
176 case "device_id":
177 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
178 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
179 return nil, err
180 }
181 case kafka.TransactionKey:
182 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
183 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
184 return nil, err
185 }
186 }
khenaidoob9203542018-09-17 22:56:37 -0400187 }
khenaidoo297cd252019-02-07 22:10:23 -0500188 log.Debugw("GetDevice", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
189
190 // Try to grab the transaction as this core may be competing with another Core
191 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400192 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500193 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
194 // returning nil, nil instructs the callee to ignore this request
195 return nil, nil
196 } else {
197 defer txn.Close()
198 }
199 }
khenaidoob9203542018-09-17 22:56:37 -0400200
201 if rhp.TestMode { // Execute only for test cases
202 return &voltha.Device{Id: pID.Id}, nil
203 }
204
205 // Get the device via the device manager
khenaidoo19d7b632018-10-30 10:49:50 -0400206 if device, err := rhp.deviceMgr.GetDevice(pID.Id); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400207 return nil, status.Errorf(codes.NotFound, "%s", err.Error())
208 } else {
khenaidoo79232702018-12-04 11:00:41 -0500209 log.Debugw("GetDevice-response", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400210 return device, nil
211 }
212}
213
khenaidoo92e62c52018-10-03 14:02:54 -0400214// updatePartialDeviceData updates a subset of a device that an Adapter can update.
215// TODO: May need a specific proto to handle only a subset of a device that can be changed by an adapter
216func (rhp *AdapterRequestHandlerProxy) mergeDeviceInfoFromAdapter(device *voltha.Device) (*voltha.Device, error) {
217 // First retrieve the most up to date device info
218 var currentDevice *voltha.Device
219 var err error
khenaidoo19d7b632018-10-30 10:49:50 -0400220 if currentDevice, err = rhp.deviceMgr.GetDevice(device.Id); err != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400221 return nil, err
222 }
khenaidoo19d7b632018-10-30 10:49:50 -0400223 cloned := proto.Clone(currentDevice).(*voltha.Device)
khenaidoo92e62c52018-10-03 14:02:54 -0400224 cloned.Root = device.Root
225 cloned.Vendor = device.Vendor
226 cloned.Model = device.Model
227 cloned.SerialNumber = device.SerialNumber
228 cloned.MacAddress = device.MacAddress
khenaidoo19d7b632018-10-30 10:49:50 -0400229 cloned.Vlan = device.Vlan
230 return cloned, nil
khenaidoo92e62c52018-10-03 14:02:54 -0400231}
232
khenaidoo79232702018-12-04 11:00:41 -0500233func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500234 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400235 log.Warn("invalid-number-of-args", log.Fields{"args": args})
236 err := errors.New("invalid-number-of-args")
237 return nil, err
238 }
khenaidoo297cd252019-02-07 22:10:23 -0500239
khenaidoob9203542018-09-17 22:56:37 -0400240 device := &voltha.Device{}
khenaidoo297cd252019-02-07 22:10:23 -0500241 transactionID := &ic.StrType{}
242 for _, arg := range args {
243 switch arg.Key {
244 case "device":
245 if err := ptypes.UnmarshalAny(arg.Value, device); err != nil {
246 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
247 return nil, err
248 }
249 case kafka.TransactionKey:
250 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
251 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
252 return nil, err
253 }
254 }
khenaidoob9203542018-09-17 22:56:37 -0400255 }
khenaidoo297cd252019-02-07 22:10:23 -0500256 log.Debugw("DeviceUpdate", log.Fields{"deviceId": device.Id, "transactionID": transactionID.Val})
257
258 // Try to grab the transaction as this core may be competing with another Core
259 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400260 if txn, err := rhp.takeRequestOwnership(transactionID.Val, device.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500261 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
262 // returning nil, nil instructs the callee to ignore this request
263 return nil, nil
264 } else {
265 defer txn.Close()
266 }
267 }
khenaidoob9203542018-09-17 22:56:37 -0400268
269 if rhp.TestMode { // Execute only for test cases
270 return new(empty.Empty), nil
271 }
khenaidoo92e62c52018-10-03 14:02:54 -0400272
273 //Merge the adapter device info (only the ones an adapter can change) with the latest device data
274 if updatedDevice, err := rhp.mergeDeviceInfoFromAdapter(device); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400275 return nil, status.Errorf(codes.Internal, "%s", err.Error())
khenaidoo92e62c52018-10-03 14:02:54 -0400276 } else {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400277 go rhp.deviceMgr.updateDevice(updatedDevice)
278 //if err := rhp.deviceMgr.updateDevice(updatedDevice); err != nil {
279 // return nil, err
280 //}
khenaidoob9203542018-09-17 22:56:37 -0400281 }
khenaidoo92e62c52018-10-03 14:02:54 -0400282
khenaidoob9203542018-09-17 22:56:37 -0400283 return new(empty.Empty), nil
284}
285
khenaidoo79232702018-12-04 11:00:41 -0500286func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500287 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400288 log.Warn("invalid-number-of-args", log.Fields{"args": args})
289 err := errors.New("invalid-number-of-args")
290 return nil, err
291 }
khenaidoo297cd252019-02-07 22:10:23 -0500292
khenaidoo2c6f1672018-09-20 23:14:41 -0400293 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500294 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500295 serialNumber := &ic.StrType{}
296 onuId := &ic.IntType{}
297 parentPortNo := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500298 for _, arg := range args {
299 switch arg.Key {
300 case "device_id":
301 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
302 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
303 return nil, err
304 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500305 case "serial_number":
306 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
307 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
308 return nil, err
309 }
310 case "onu_id":
311 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
312 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
313 return nil, err
314 }
315 case "parent_port_no":
316 if err := ptypes.UnmarshalAny(arg.Value, parentPortNo); err != nil {
317 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
318 return nil, err
319 }
khenaidoo297cd252019-02-07 22:10:23 -0500320 case kafka.TransactionKey:
321 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
322 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
323 return nil, err
324 }
325 }
khenaidoob9203542018-09-17 22:56:37 -0400326 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500327 log.Debugw("GetChildDevice", log.Fields{"parentDeviceId": pID.Id, "args": args, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500328
329 // Try to grab the transaction as this core may be competing with another Core
330 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400331 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500332 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
333 // returning nil, nil instructs the callee to ignore this request
334 return nil, nil
335 } else {
336 defer txn.Close()
337 }
338 }
khenaidoob9203542018-09-17 22:56:37 -0400339
340 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400341 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400342 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500343 return rhp.deviceMgr.GetChildDevice(pID.Id, serialNumber.Val, onuId.Val, parentPortNo.Val)
khenaidoob9203542018-09-17 22:56:37 -0400344}
345
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500346func (rhp *AdapterRequestHandlerProxy) GetChildDeviceWithProxyAddress(args []*ic.Argument) (*voltha.Device, error) {
347 if len(args) < 2 {
348 log.Warn("invalid-number-of-args", log.Fields{"args": args})
349 err := errors.New("invalid-number-of-args")
350 return nil, err
351 }
352
353 proxyAddress := &voltha.Device_ProxyAddress{}
354 transactionID := &ic.StrType{}
355 for _, arg := range args {
356 switch arg.Key {
357 case "proxy_address":
358 if err := ptypes.UnmarshalAny(arg.Value, proxyAddress); err != nil {
359 log.Warnw("cannot-unmarshal-proxy-address", log.Fields{"error": err})
360 return nil, err
361 }
362 case kafka.TransactionKey:
363 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
364 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
365 return nil, err
366 }
367 }
368 }
369 log.Debugw("GetChildDeviceWithProxyAddress", log.Fields{"proxyAddress": proxyAddress, "transactionID": transactionID.Val})
370
371 // Try to grab the transaction as this core may be competing with another Core
372 if rhp.competeForTransaction() {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400373 if txn, err := rhp.takeRequestOwnership(transactionID.Val, proxyAddress.DeviceId); err != nil {
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500374 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500375 return nil, nil
376 } else {
377 defer txn.Close()
378 }
379 }
380
381 if rhp.TestMode { // Execute only for test cases
382 return &voltha.Device{Id: proxyAddress.DeviceId}, nil
383 }
384 return rhp.deviceMgr.GetChildDeviceWithProxyAddress(proxyAddress)
385}
386
khenaidoo79232702018-12-04 11:00:41 -0500387func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500388 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400389 log.Warn("invalid-number-of-args", log.Fields{"args": args})
390 err := errors.New("invalid-number-of-args")
391 return nil, err
392 }
khenaidoo92e62c52018-10-03 14:02:54 -0400393 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500394 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500395 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400396 for _, arg := range args {
397 switch arg.Key {
398 case "device_id":
399 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
400 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
401 return nil, err
402 }
403 case "port_type":
404 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
405 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
406 return nil, err
407 }
khenaidoo297cd252019-02-07 22:10:23 -0500408 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 }
khenaidoo92e62c52018-10-03 14:02:54 -0400413 }
khenaidoob9203542018-09-17 22:56:37 -0400414 }
khenaidoo297cd252019-02-07 22:10:23 -0500415 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400416 if rhp.TestMode { // Execute only for test cases
417 aPort := &voltha.Port{Label: "test_port"}
418 allPorts := &voltha.Ports{}
419 allPorts.Items = append(allPorts.Items, aPort)
420 return allPorts, nil
421 }
khenaidoo92e62c52018-10-03 14:02:54 -0400422 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400423}
424
khenaidoo297cd252019-02-07 22:10:23 -0500425func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500426 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400427 log.Warn("invalid-number-of-args", log.Fields{"args": args})
428 err := errors.New("invalid-number-of-args")
429 return nil, err
430 }
khenaidoo297cd252019-02-07 22:10:23 -0500431
khenaidoo2c6f1672018-09-20 23:14:41 -0400432 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500433 transactionID := &ic.StrType{}
434 for _, arg := range args {
435 switch arg.Key {
436 case "device_id":
437 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
438 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
439 return nil, err
440 }
441 case kafka.TransactionKey:
442 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
443 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
444 return nil, err
445 }
446 }
khenaidoob9203542018-09-17 22:56:37 -0400447 }
khenaidoo297cd252019-02-07 22:10:23 -0500448 log.Debugw("GetChildDevices", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
449
450 // Try to grab the transaction as this core may be competing with another Core
451 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400452 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500453 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
454 // returning nil, nil instructs the callee to ignore this request
455 return nil, nil
456 } else {
457 defer txn.Close()
458 }
459 }
khenaidoob9203542018-09-17 22:56:37 -0400460
461 if rhp.TestMode { // Execute only for test cases
khenaidoode93b462019-02-13 22:17:21 -0500462 return &voltha.Devices{Items: nil}, nil
khenaidoob9203542018-09-17 22:56:37 -0400463 }
khenaidoo297cd252019-02-07 22:10:23 -0500464
465 return rhp.deviceMgr.getAllChildDevices(pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400466}
467
468// ChildDeviceDetected is invoked when a child device is detected. The following
469// parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500470// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
khenaidoo79232702018-12-04 11:00:41 -0500471func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500472 if len(args) < 5 {
khenaidoob9203542018-09-17 22:56:37 -0400473 log.Warn("invalid-number-of-args", log.Fields{"args": args})
474 err := errors.New("invalid-number-of-args")
475 return nil, err
476 }
477
478 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500479 portNo := &ic.IntType{}
480 dt := &ic.StrType{}
481 chnlId := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500482 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500483 serialNumber := &ic.StrType{}
484 vendorId := &ic.StrType{}
485 onuId := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400486 for _, arg := range args {
487 switch arg.Key {
488 case "parent_device_id":
489 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
490 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
491 return nil, err
492 }
493 case "parent_port_no":
494 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
495 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
496 return nil, err
497 }
498 case "child_device_type":
499 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
500 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
501 return nil, err
502 }
503 case "channel_id":
504 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
505 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
506 return nil, err
507 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500508 case "vendor_id":
509 if err := ptypes.UnmarshalAny(arg.Value, vendorId); err != nil {
510 log.Warnw("cannot-unmarshal-vendor-id", log.Fields{"error": err})
511 return nil, err
512 }
513 case "serial_number":
514 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
515 log.Warnw("cannot-unmarshal-serial-number", log.Fields{"error": err})
516 return nil, err
517 }
518 case "onu_id":
519 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
520 log.Warnw("cannot-unmarshal-onu-id", log.Fields{"error": err})
521 return nil, err
522 }
khenaidoo297cd252019-02-07 22:10:23 -0500523 case kafka.TransactionKey:
524 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
525 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
526 return nil, err
527 }
khenaidoob9203542018-09-17 22:56:37 -0400528 }
529 }
khenaidoob9203542018-09-17 22:56:37 -0400530 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
Matt Jeanneret4e241952019-02-28 11:16:04 -0500531 "deviceType": dt.Val, "channelId": chnlId.Val, "serialNumber": serialNumber.Val,
532 "vendorId": vendorId.Val, "onuId": onuId.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500533
534 // Try to grab the transaction as this core may be competing with another Core
535 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400536 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500537 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
538 // returning nil, nil instructs the callee to ignore this request
539 return nil, nil
540 } else {
541 defer txn.Close()
542 }
543 }
khenaidoob9203542018-09-17 22:56:37 -0400544
545 if rhp.TestMode { // Execute only for test cases
546 return nil, nil
547 }
khenaidoob9203542018-09-17 22:56:37 -0400548 // Run child detection in it's own go routine as it can be a lengthy process
Matt Jeanneret4e241952019-02-28 11:16:04 -0500549 go rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val, vendorId.Val, serialNumber.Val, onuId.Val)
khenaidoob9203542018-09-17 22:56:37 -0400550
551 return new(empty.Empty), nil
552}
553
khenaidoo79232702018-12-04 11:00:41 -0500554func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500555 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400556 log.Warn("invalid-number-of-args", log.Fields{"args": args})
557 err := errors.New("invalid-number-of-args")
558 return nil, err
559 }
560 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500561 operStatus := &ic.IntType{}
562 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500563 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400564 for _, arg := range args {
565 switch arg.Key {
566 case "device_id":
567 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
568 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
569 return nil, err
570 }
571 case "oper_status":
572 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
573 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
574 return nil, err
575 }
khenaidoob9203542018-09-17 22:56:37 -0400576 case "connect_status":
577 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
578 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
579 return nil, err
580 }
khenaidoo297cd252019-02-07 22:10:23 -0500581 case kafka.TransactionKey:
582 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
583 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
584 return nil, err
585 }
khenaidoob9203542018-09-17 22:56:37 -0400586 }
587 }
khenaidoo297cd252019-02-07 22:10:23 -0500588 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
589 "conn-status": connStatus, "transactionID": transactionID.Val})
590
591 // Try to grab the transaction as this core may be competing with another Core
592 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400593 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500594 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
595 // returning nil, nil instructs the callee to ignore this request
596 return nil, nil
597 } else {
598 defer txn.Close()
599 }
600 }
601
khenaidoob9203542018-09-17 22:56:37 -0400602 if rhp.TestMode { // Execute only for test cases
603 return nil, nil
604 }
khenaidoo92e62c52018-10-03 14:02:54 -0400605 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
khenaidoo1ce37ad2019-03-24 22:07:24 -0400606 go rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
607 voltha.ConnectStatus_ConnectStatus(connStatus.Val))
608
609 //if err := rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
610 // voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
611 // return nil, err
612 //}
khenaidoo92e62c52018-10-03 14:02:54 -0400613 return new(empty.Empty), nil
614}
615
khenaidoo79232702018-12-04 11:00:41 -0500616func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500617 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400618 log.Warn("invalid-number-of-args", log.Fields{"args": args})
619 err := errors.New("invalid-number-of-args")
620 return nil, err
621 }
622 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500623 operStatus := &ic.IntType{}
624 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500625 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400626 for _, arg := range args {
627 switch arg.Key {
628 case "device_id":
629 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
630 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
631 return nil, err
632 }
633 case "oper_status":
634 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
635 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
636 return nil, err
637 }
638 case "connect_status":
639 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
640 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
641 return nil, err
642 }
khenaidoo297cd252019-02-07 22:10:23 -0500643 case kafka.TransactionKey:
644 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
645 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
646 return nil, err
647 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400648 }
649 }
khenaidoo297cd252019-02-07 22:10:23 -0500650 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
651 "conn-status": connStatus, "transactionID": transactionID.Val})
652
653 // Try to grab the transaction as this core may be competing with another Core
654 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400655 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500656 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
657 // returning nil, nil instructs the callee to ignore this request
658 return nil, nil
659 } else {
660 defer txn.Close()
661 }
662 }
663
khenaidoo4d4802d2018-10-04 21:59:49 -0400664 if rhp.TestMode { // Execute only for test cases
665 return nil, nil
666 }
667
668 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
khenaidoo1ce37ad2019-03-24 22:07:24 -0400669 go rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
670 voltha.ConnectStatus_ConnectStatus(connStatus.Val))
671
672 //if err := rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
673 // voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
674 // return nil, err
675 //}
khenaidoo4d4802d2018-10-04 21:59:49 -0400676 return new(empty.Empty), nil
677}
678
khenaidoo79232702018-12-04 11:00:41 -0500679func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500680 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400681 log.Warn("invalid-number-of-args", log.Fields{"args": args})
682 err := errors.New("invalid-number-of-args")
683 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400684 }
khenaidoo92e62c52018-10-03 14:02:54 -0400685 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500686 portType := &ic.IntType{}
687 portNo := &ic.IntType{}
688 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500689 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400690 for _, arg := range args {
691 switch arg.Key {
692 case "device_id":
693 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
694 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
695 return nil, err
696 }
697 case "oper_status":
698 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
699 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
700 return nil, err
701 }
702 case "port_type":
703 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
704 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
705 return nil, err
706 }
707 case "port_no":
708 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
709 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
710 return nil, err
711 }
khenaidoo297cd252019-02-07 22:10:23 -0500712 case kafka.TransactionKey:
713 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
714 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
715 return nil, err
716 }
khenaidoo92e62c52018-10-03 14:02:54 -0400717 }
718 }
khenaidoo297cd252019-02-07 22:10:23 -0500719 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
720 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
721
722 // Try to grab the transaction as this core may be competing with another Core
723 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400724 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500725 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
726 // returning nil, nil instructs the callee to ignore this request
727 return nil, nil
728 } else {
729 defer txn.Close()
730 }
731 }
732
khenaidoo92e62c52018-10-03 14:02:54 -0400733 if rhp.TestMode { // Execute only for test cases
734 return nil, nil
735 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400736
737 go rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
738 voltha.OperStatus_OperStatus(operStatus.Val))
739
740 //if err := rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
741 // voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
742 // return nil, err
743 //}
khenaidoob9203542018-09-17 22:56:37 -0400744 return new(empty.Empty), nil
745}
746
khenaidoo79232702018-12-04 11:00:41 -0500747func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500748 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400749 log.Warn("invalid-number-of-args", log.Fields{"args": args})
750 err := errors.New("invalid-number-of-args")
751 return nil, err
752 }
753 deviceId := &voltha.ID{}
754 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500755 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400756 for _, arg := range args {
757 switch arg.Key {
758 case "device_id":
759 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
760 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
761 return nil, err
762 }
763 case "port":
764 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
765 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
766 return nil, err
767 }
khenaidoo297cd252019-02-07 22:10:23 -0500768 case kafka.TransactionKey:
769 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
770 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
771 return nil, err
772 }
khenaidoob9203542018-09-17 22:56:37 -0400773 }
774 }
khenaidoo297cd252019-02-07 22:10:23 -0500775 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
776
777 // Try to grab the transaction as this core may be competing with another Core
778 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400779 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500780 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
781 // returning nil, nil instructs the callee to ignore this request
782 return nil, nil
783 } else {
784 defer txn.Close()
785 }
786 }
khenaidoob9203542018-09-17 22:56:37 -0400787
788 if rhp.TestMode { // Execute only for test cases
789 return nil, nil
790 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400791 go rhp.deviceMgr.addPort(deviceId.Id, port)
792 //if err := rhp.deviceMgr.addPort(deviceId.Id, port); err != nil {
793 // return nil, err
794 //}
khenaidoo92e62c52018-10-03 14:02:54 -0400795
khenaidoob9203542018-09-17 22:56:37 -0400796 return new(empty.Empty), nil
797}
798
khenaidoo79232702018-12-04 11:00:41 -0500799func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500800 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400801 log.Warn("invalid-number-of-args", log.Fields{"args": args})
802 err := errors.New("invalid-number-of-args")
803 return nil, err
804 }
805 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500806 init := &ic.BoolType{}
khenaidoo297cd252019-02-07 22:10:23 -0500807 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400808 for _, arg := range args {
809 switch arg.Key {
810 case "device_pm_config":
811 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
812 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
813 return nil, err
814 }
815 case "init":
816 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
817 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
818 return nil, err
819 }
khenaidoo297cd252019-02-07 22:10:23 -0500820 case kafka.TransactionKey:
821 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
822 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
823 return nil, err
824 }
khenaidoob9203542018-09-17 22:56:37 -0400825 }
826 }
khenaidoob9203542018-09-17 22:56:37 -0400827 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoode93b462019-02-13 22:17:21 -0500828 "init": init, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500829
830 // Try to grab the transaction as this core may be competing with another Core
831 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400832 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pmConfigs.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500833 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
834 // returning nil, nil instructs the callee to ignore this request
835 return nil, nil
836 } else {
837 defer txn.Close()
838 }
839 }
khenaidoob9203542018-09-17 22:56:37 -0400840
841 if rhp.TestMode { // Execute only for test cases
842 return nil, nil
843 }
844
khenaidoo1ce37ad2019-03-24 22:07:24 -0400845 go rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs)
846 //if err := rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs); err != nil {
847 // return nil, err
848 //}
khenaidoo92e62c52018-10-03 14:02:54 -0400849
khenaidoob9203542018-09-17 22:56:37 -0400850 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400851}
khenaidoofdbad6e2018-11-06 22:26:38 -0500852
khenaidoo79232702018-12-04 11:00:41 -0500853func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500854 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -0500855 log.Warn("invalid-number-of-args", log.Fields{"args": args})
856 err := errors.New("invalid-number-of-args")
857 return nil, err
858 }
859 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500860 portNo := &ic.IntType{}
861 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500862 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500863 for _, arg := range args {
864 switch arg.Key {
865 case "device_id":
866 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
867 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
868 return nil, err
869 }
870 case "port":
871 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
872 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
873 return nil, err
874 }
875 case "packet":
876 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
877 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
878 return nil, err
879 }
khenaidoo297cd252019-02-07 22:10:23 -0500880 case kafka.TransactionKey:
881 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
882 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
883 return nil, err
884 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500885 }
886 }
khenaidoo297cd252019-02-07 22:10:23 -0500887 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
888 "transactionID": transactionID.Val})
889
890 // For performance reason, we do not compete for packet-in. We process it and send the packet in. later in the
891 // processing flow the duplicate packet will be discarded
892
khenaidoofdbad6e2018-11-06 22:26:38 -0500893 if rhp.TestMode { // Execute only for test cases
894 return nil, nil
895 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400896 go rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload)
897 //if err := rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload); err != nil {
898 // return nil, err
899 //}
khenaidoofdbad6e2018-11-06 22:26:38 -0500900 return new(empty.Empty), nil
901}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500902
khenaidoof5a5bfa2019-01-23 22:20:29 -0500903func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
904 if len(args) < 2 {
905 log.Warn("invalid-number-of-args", log.Fields{"args": args})
906 err := errors.New("invalid-number-of-args")
907 return nil, err
908 }
909 deviceId := &voltha.ID{}
910 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -0500911 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500912 for _, arg := range args {
913 switch arg.Key {
914 case "device_id":
915 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
916 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
917 return nil, err
918 }
919 case "image_download":
920 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
921 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
922 return nil, err
923 }
khenaidoo297cd252019-02-07 22:10:23 -0500924 case kafka.TransactionKey:
925 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
926 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
927 return nil, err
928 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500929 }
930 }
khenaidoo297cd252019-02-07 22:10:23 -0500931 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
932 "transactionID": transactionID.Val})
933
934 // Try to grab the transaction as this core may be competing with another Core
935 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400936 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500937 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
938 // returning nil, nil instructs the callee to ignore this request
939 return nil, nil
940 } else {
941 defer txn.Close()
942 }
943 }
944
khenaidoof5a5bfa2019-01-23 22:20:29 -0500945 if rhp.TestMode { // Execute only for test cases
946 return nil, nil
947 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400948 go rhp.deviceMgr.updateImageDownload(deviceId.Id, img)
949 //if err := rhp.deviceMgr.updateImageDownload(deviceId.Id, img); err != nil {
950 // return nil, err
951 //}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500952 return new(empty.Empty), nil
953}