blob: 1be0cff9cbc2234db160f30c1827b9b8304b44ae [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) {
khenaidoo297cd252019-02-07 22:10:23 -0500253 if len(args) < 2 {
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{}
261 for _, arg := range args {
262 switch arg.Key {
263 case "device_id":
264 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
265 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
266 return nil, err
267 }
268 case kafka.TransactionKey:
269 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
270 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
271 return nil, err
272 }
273 }
khenaidoob9203542018-09-17 22:56:37 -0400274 }
khenaidoo297cd252019-02-07 22:10:23 -0500275 log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
276
277 // Try to grab the transaction as this core may be competing with another Core
278 if rhp.competeForTransaction() {
279 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
280 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
281 // returning nil, nil instructs the callee to ignore this request
282 return nil, nil
283 } else {
284 defer txn.Close()
285 }
286 }
khenaidoob9203542018-09-17 22:56:37 -0400287
288 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400289 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400290 }
khenaidoo297cd252019-02-07 22:10:23 -0500291 return rhp.deviceMgr.GetDevice(pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400292}
293
khenaidoo79232702018-12-04 11:00:41 -0500294func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500295 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400296 log.Warn("invalid-number-of-args", log.Fields{"args": args})
297 err := errors.New("invalid-number-of-args")
298 return nil, err
299 }
khenaidoo92e62c52018-10-03 14:02:54 -0400300 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500301 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500302 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400303 for _, arg := range args {
304 switch arg.Key {
305 case "device_id":
306 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
307 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
308 return nil, err
309 }
310 case "port_type":
311 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
312 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
313 return nil, err
314 }
khenaidoo297cd252019-02-07 22:10:23 -0500315 case kafka.TransactionKey:
316 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
317 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
318 return nil, err
319 }
khenaidoo92e62c52018-10-03 14:02:54 -0400320 }
khenaidoob9203542018-09-17 22:56:37 -0400321 }
khenaidoo297cd252019-02-07 22:10:23 -0500322 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400323 if rhp.TestMode { // Execute only for test cases
324 aPort := &voltha.Port{Label: "test_port"}
325 allPorts := &voltha.Ports{}
326 allPorts.Items = append(allPorts.Items, aPort)
327 return allPorts, nil
328 }
khenaidoo92e62c52018-10-03 14:02:54 -0400329 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400330}
331
khenaidoo297cd252019-02-07 22:10:23 -0500332func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500333 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400334 log.Warn("invalid-number-of-args", log.Fields{"args": args})
335 err := errors.New("invalid-number-of-args")
336 return nil, err
337 }
khenaidoo297cd252019-02-07 22:10:23 -0500338
khenaidoo2c6f1672018-09-20 23:14:41 -0400339 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500340 transactionID := &ic.StrType{}
341 for _, arg := range args {
342 switch arg.Key {
343 case "device_id":
344 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
345 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
346 return nil, err
347 }
348 case kafka.TransactionKey:
349 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
350 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
351 return nil, err
352 }
353 }
khenaidoob9203542018-09-17 22:56:37 -0400354 }
khenaidoo297cd252019-02-07 22:10:23 -0500355 log.Debugw("GetChildDevices", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
356
357 // Try to grab the transaction as this core may be competing with another Core
358 if rhp.competeForTransaction() {
359 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
360 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
361 // returning nil, nil instructs the callee to ignore this request
362 return nil, nil
363 } else {
364 defer txn.Close()
365 }
366 }
khenaidoob9203542018-09-17 22:56:37 -0400367
368 if rhp.TestMode { // Execute only for test cases
khenaidoode93b462019-02-13 22:17:21 -0500369 return &voltha.Devices{Items: nil}, nil
khenaidoob9203542018-09-17 22:56:37 -0400370 }
khenaidoo297cd252019-02-07 22:10:23 -0500371
372 return rhp.deviceMgr.getAllChildDevices(pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400373}
374
375// ChildDeviceDetected is invoked when a child device is detected. The following
376// parameters are expected:
377// {parent_device_id, parent_port_no, child_device_type, proxy_address, admin_state, **kw)
khenaidoo79232702018-12-04 11:00:41 -0500378func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500379 if len(args) < 5 {
khenaidoob9203542018-09-17 22:56:37 -0400380 log.Warn("invalid-number-of-args", log.Fields{"args": args})
381 err := errors.New("invalid-number-of-args")
382 return nil, err
383 }
384
385 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500386 portNo := &ic.IntType{}
387 dt := &ic.StrType{}
388 chnlId := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500389 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400390 for _, arg := range args {
391 switch arg.Key {
392 case "parent_device_id":
393 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
394 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
395 return nil, err
396 }
397 case "parent_port_no":
398 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
399 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
400 return nil, err
401 }
402 case "child_device_type":
403 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
404 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
405 return nil, err
406 }
407 case "channel_id":
408 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
409 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
410 return nil, err
411 }
khenaidoo297cd252019-02-07 22:10:23 -0500412 case kafka.TransactionKey:
413 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
414 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
415 return nil, err
416 }
khenaidoob9203542018-09-17 22:56:37 -0400417 }
418 }
khenaidoob9203542018-09-17 22:56:37 -0400419 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
khenaidoo297cd252019-02-07 22:10:23 -0500420 "deviceType": dt.Val, "channelId": chnlId.Val, "transactionID": transactionID.Val})
421
422 // Try to grab the transaction as this core may be competing with another Core
423 if rhp.competeForTransaction() {
424 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
425 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
426 // returning nil, nil instructs the callee to ignore this request
427 return nil, nil
428 } else {
429 defer txn.Close()
430 }
431 }
khenaidoob9203542018-09-17 22:56:37 -0400432
433 if rhp.TestMode { // Execute only for test cases
434 return nil, nil
435 }
khenaidoob9203542018-09-17 22:56:37 -0400436 // Run child detection in it's own go routine as it can be a lengthy process
437 go rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val)
438
439 return new(empty.Empty), nil
440}
441
khenaidoo79232702018-12-04 11:00:41 -0500442func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500443 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400444 log.Warn("invalid-number-of-args", log.Fields{"args": args})
445 err := errors.New("invalid-number-of-args")
446 return nil, err
447 }
448 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500449 operStatus := &ic.IntType{}
450 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500451 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400452 for _, arg := range args {
453 switch arg.Key {
454 case "device_id":
455 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
456 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
457 return nil, err
458 }
459 case "oper_status":
460 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
461 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
462 return nil, err
463 }
khenaidoob9203542018-09-17 22:56:37 -0400464 case "connect_status":
465 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
466 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
467 return nil, err
468 }
khenaidoo297cd252019-02-07 22:10:23 -0500469 case kafka.TransactionKey:
470 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
471 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
472 return nil, err
473 }
khenaidoob9203542018-09-17 22:56:37 -0400474 }
475 }
khenaidoo297cd252019-02-07 22:10:23 -0500476 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
477 "conn-status": connStatus, "transactionID": transactionID.Val})
478
479 // Try to grab the transaction as this core may be competing with another Core
480 if rhp.competeForTransaction() {
481 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
482 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
483 // returning nil, nil instructs the callee to ignore this request
484 return nil, nil
485 } else {
486 defer txn.Close()
487 }
488 }
489
khenaidoob9203542018-09-17 22:56:37 -0400490 if rhp.TestMode { // Execute only for test cases
491 return nil, nil
492 }
khenaidoo92e62c52018-10-03 14:02:54 -0400493 // 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 -0500494 if err := rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
495 voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
496 return nil, err
497 }
khenaidoo92e62c52018-10-03 14:02:54 -0400498 return new(empty.Empty), nil
499}
500
khenaidoo79232702018-12-04 11:00:41 -0500501func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500502 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400503 log.Warn("invalid-number-of-args", log.Fields{"args": args})
504 err := errors.New("invalid-number-of-args")
505 return nil, err
506 }
507 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500508 operStatus := &ic.IntType{}
509 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500510 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400511 for _, arg := range args {
512 switch arg.Key {
513 case "device_id":
514 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
515 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
516 return nil, err
517 }
518 case "oper_status":
519 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
520 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
521 return nil, err
522 }
523 case "connect_status":
524 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
525 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
526 return nil, err
527 }
khenaidoo297cd252019-02-07 22:10:23 -0500528 case kafka.TransactionKey:
529 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
530 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
531 return nil, err
532 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400533 }
534 }
khenaidoo297cd252019-02-07 22:10:23 -0500535 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
536 "conn-status": connStatus, "transactionID": transactionID.Val})
537
538 // Try to grab the transaction as this core may be competing with another Core
539 if rhp.competeForTransaction() {
540 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
541 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
542 // returning nil, nil instructs the callee to ignore this request
543 return nil, nil
544 } else {
545 defer txn.Close()
546 }
547 }
548
khenaidoo4d4802d2018-10-04 21:59:49 -0400549 if rhp.TestMode { // Execute only for test cases
550 return nil, nil
551 }
552
553 // 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 -0500554 if err := rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
555 voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
556 return nil, err
557 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400558 return new(empty.Empty), nil
559}
560
khenaidoo79232702018-12-04 11:00:41 -0500561func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500562 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400563 log.Warn("invalid-number-of-args", log.Fields{"args": args})
564 err := errors.New("invalid-number-of-args")
565 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400566 }
khenaidoo92e62c52018-10-03 14:02:54 -0400567 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500568 portType := &ic.IntType{}
569 portNo := &ic.IntType{}
570 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500571 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400572 for _, arg := range args {
573 switch arg.Key {
574 case "device_id":
575 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
576 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
577 return nil, err
578 }
579 case "oper_status":
580 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
581 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
582 return nil, err
583 }
584 case "port_type":
585 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
586 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
587 return nil, err
588 }
589 case "port_no":
590 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
591 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
592 return nil, err
593 }
khenaidoo297cd252019-02-07 22:10:23 -0500594 case kafka.TransactionKey:
595 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
596 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
597 return nil, err
598 }
khenaidoo92e62c52018-10-03 14:02:54 -0400599 }
600 }
khenaidoo297cd252019-02-07 22:10:23 -0500601 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
602 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
603
604 // Try to grab the transaction as this core may be competing with another Core
605 if rhp.competeForTransaction() {
606 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
607 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
608 // returning nil, nil instructs the callee to ignore this request
609 return nil, nil
610 } else {
611 defer txn.Close()
612 }
613 }
614
khenaidoo92e62c52018-10-03 14:02:54 -0400615 if rhp.TestMode { // Execute only for test cases
616 return nil, nil
617 }
khenaidoode93b462019-02-13 22:17:21 -0500618 if err := rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
619 voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
620 return nil, err
621 }
khenaidoob9203542018-09-17 22:56:37 -0400622 return new(empty.Empty), nil
623}
624
khenaidoo79232702018-12-04 11:00:41 -0500625func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500626 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400627 log.Warn("invalid-number-of-args", log.Fields{"args": args})
628 err := errors.New("invalid-number-of-args")
629 return nil, err
630 }
631 deviceId := &voltha.ID{}
632 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500633 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400634 for _, arg := range args {
635 switch arg.Key {
636 case "device_id":
637 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
638 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
639 return nil, err
640 }
641 case "port":
642 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
643 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
644 return nil, err
645 }
khenaidoo297cd252019-02-07 22:10:23 -0500646 case kafka.TransactionKey:
647 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
648 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
649 return nil, err
650 }
khenaidoob9203542018-09-17 22:56:37 -0400651 }
652 }
khenaidoo297cd252019-02-07 22:10:23 -0500653 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
654
655 // Try to grab the transaction as this core may be competing with another Core
656 if rhp.competeForTransaction() {
657 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
658 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
659 // returning nil, nil instructs the callee to ignore this request
660 return nil, nil
661 } else {
662 defer txn.Close()
663 }
664 }
khenaidoob9203542018-09-17 22:56:37 -0400665
666 if rhp.TestMode { // Execute only for test cases
667 return nil, nil
668 }
khenaidoode93b462019-02-13 22:17:21 -0500669 if err := rhp.deviceMgr.addPort(deviceId.Id, port); err != nil {
670 return nil, err
671 }
khenaidoo92e62c52018-10-03 14:02:54 -0400672
khenaidoob9203542018-09-17 22:56:37 -0400673 return new(empty.Empty), nil
674}
675
khenaidoo79232702018-12-04 11:00:41 -0500676func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500677 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400678 log.Warn("invalid-number-of-args", log.Fields{"args": args})
679 err := errors.New("invalid-number-of-args")
680 return nil, err
681 }
682 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500683 init := &ic.BoolType{}
khenaidoo297cd252019-02-07 22:10:23 -0500684 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400685 for _, arg := range args {
686 switch arg.Key {
687 case "device_pm_config":
688 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
689 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
690 return nil, err
691 }
692 case "init":
693 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
694 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
695 return nil, err
696 }
khenaidoo297cd252019-02-07 22:10:23 -0500697 case kafka.TransactionKey:
698 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
699 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
700 return nil, err
701 }
khenaidoob9203542018-09-17 22:56:37 -0400702 }
703 }
khenaidoob9203542018-09-17 22:56:37 -0400704 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoode93b462019-02-13 22:17:21 -0500705 "init": init, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500706
707 // Try to grab the transaction as this core may be competing with another Core
708 if rhp.competeForTransaction() {
709 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
710 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
711 // returning nil, nil instructs the callee to ignore this request
712 return nil, nil
713 } else {
714 defer txn.Close()
715 }
716 }
khenaidoob9203542018-09-17 22:56:37 -0400717
718 if rhp.TestMode { // Execute only for test cases
719 return nil, nil
720 }
721
khenaidoode93b462019-02-13 22:17:21 -0500722 if err := rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs); err != nil {
723 return nil, err
724 }
khenaidoo92e62c52018-10-03 14:02:54 -0400725
khenaidoob9203542018-09-17 22:56:37 -0400726 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400727}
khenaidoofdbad6e2018-11-06 22:26:38 -0500728
khenaidoo79232702018-12-04 11:00:41 -0500729func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500730 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -0500731 log.Warn("invalid-number-of-args", log.Fields{"args": args})
732 err := errors.New("invalid-number-of-args")
733 return nil, err
734 }
735 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500736 portNo := &ic.IntType{}
737 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500738 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500739 for _, arg := range args {
740 switch arg.Key {
741 case "device_id":
742 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
743 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
744 return nil, err
745 }
746 case "port":
747 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
748 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
749 return nil, err
750 }
751 case "packet":
752 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
753 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
754 return nil, err
755 }
khenaidoo297cd252019-02-07 22:10:23 -0500756 case kafka.TransactionKey:
757 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
758 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
759 return nil, err
760 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500761 }
762 }
khenaidoo297cd252019-02-07 22:10:23 -0500763 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
764 "transactionID": transactionID.Val})
765
766 // For performance reason, we do not compete for packet-in. We process it and send the packet in. later in the
767 // processing flow the duplicate packet will be discarded
768
khenaidoofdbad6e2018-11-06 22:26:38 -0500769 if rhp.TestMode { // Execute only for test cases
770 return nil, nil
771 }
khenaidoode93b462019-02-13 22:17:21 -0500772 if err := rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload); err != nil {
773 return nil, err
774 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500775 return new(empty.Empty), nil
776}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500777
khenaidoof5a5bfa2019-01-23 22:20:29 -0500778func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
779 if len(args) < 2 {
780 log.Warn("invalid-number-of-args", log.Fields{"args": args})
781 err := errors.New("invalid-number-of-args")
782 return nil, err
783 }
784 deviceId := &voltha.ID{}
785 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -0500786 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500787 for _, arg := range args {
788 switch arg.Key {
789 case "device_id":
790 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
791 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
792 return nil, err
793 }
794 case "image_download":
795 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
796 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
797 return nil, err
798 }
khenaidoo297cd252019-02-07 22:10:23 -0500799 case kafka.TransactionKey:
800 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
801 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
802 return nil, err
803 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500804 }
805 }
khenaidoo297cd252019-02-07 22:10:23 -0500806 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
807 "transactionID": transactionID.Val})
808
809 // Try to grab the transaction as this core may be competing with another Core
810 if rhp.competeForTransaction() {
811 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
812 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
813 // returning nil, nil instructs the callee to ignore this request
814 return nil, nil
815 } else {
816 defer txn.Close()
817 }
818 }
819
khenaidoof5a5bfa2019-01-23 22:20:29 -0500820 if rhp.TestMode { // Execute only for test cases
821 return nil, nil
822 }
khenaidoode93b462019-02-13 22:17:21 -0500823 if err := rhp.deviceMgr.updateImageDownload(deviceId.Id, img); err != nil {
824 return nil, err
825 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500826 return new(empty.Empty), nil
827}