blob: 5fede6814e7efea34c540bd2d24688ff46a6864a [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 {
33 TestMode bool
khenaidoo43c82122018-11-22 18:38:28 -050034 coreInstanceId string
khenaidoob9203542018-09-17 22:56:37 -040035 deviceMgr *DeviceManager
36 lDeviceMgr *LogicalDeviceManager
khenaidoo21d51152019-02-01 13:48:37 -050037 adapterMgr *AdapterManager
khenaidoob9203542018-09-17 22:56:37 -040038 localDataProxy *model.Proxy
39 clusterDataProxy *model.Proxy
khenaidoo297cd252019-02-07 22:10:23 -050040 defaultRequestTimeout int64
41 longRunningRequestTimeout int64
42 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 {
69 return nil, errors.New("fail-to-create-transaction")
70 } 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) {
khenaidoo297cd252019-02-07 22:10:23 -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) {
khenaidoo297cd252019-02-07 22:10:23 -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) {
khenaidoo297cd252019-02-07 22:10:23 -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 {
244 // An adapter request needs an Ack without having to wait for the update to be
245 // completed. We therefore run the update in its own routine.
246 go rhp.deviceMgr.updateDevice(updatedDevice)
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) {
khenaidoo297cd252019-02-07 22:10:23 -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) {
333 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
khenaidoo297cd252019-02-07 22:10:23 -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
494 go rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val), voltha.ConnectStatus_ConnectStatus(connStatus.Val))
495 return new(empty.Empty), nil
496}
497
khenaidoo79232702018-12-04 11:00:41 -0500498func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500499 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400500 log.Warn("invalid-number-of-args", log.Fields{"args": args})
501 err := errors.New("invalid-number-of-args")
502 return nil, err
503 }
504 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500505 operStatus := &ic.IntType{}
506 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500507 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400508 for _, arg := range args {
509 switch arg.Key {
510 case "device_id":
511 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
512 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
513 return nil, err
514 }
515 case "oper_status":
516 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
517 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
518 return nil, err
519 }
520 case "connect_status":
521 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
522 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
523 return nil, err
524 }
khenaidoo297cd252019-02-07 22:10:23 -0500525 case kafka.TransactionKey:
526 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
527 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
528 return nil, err
529 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400530 }
531 }
khenaidoo297cd252019-02-07 22:10:23 -0500532 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
533 "conn-status": connStatus, "transactionID": transactionID.Val})
534
535 // Try to grab the transaction as this core may be competing with another Core
536 if rhp.competeForTransaction() {
537 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
538 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
539 // returning nil, nil instructs the callee to ignore this request
540 return nil, nil
541 } else {
542 defer txn.Close()
543 }
544 }
545
khenaidoo4d4802d2018-10-04 21:59:49 -0400546 if rhp.TestMode { // Execute only for test cases
547 return nil, nil
548 }
549
550 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
551 go rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val), voltha.ConnectStatus_ConnectStatus(connStatus.Val))
552 return new(empty.Empty), nil
553}
554
khenaidoo79232702018-12-04 11:00:41 -0500555func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500556 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400557 log.Warn("invalid-number-of-args", log.Fields{"args": args})
558 err := errors.New("invalid-number-of-args")
559 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400560 }
khenaidoo92e62c52018-10-03 14:02:54 -0400561 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500562 portType := &ic.IntType{}
563 portNo := &ic.IntType{}
564 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500565 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400566 for _, arg := range args {
567 switch arg.Key {
568 case "device_id":
569 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
570 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
571 return nil, err
572 }
573 case "oper_status":
574 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
575 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
576 return nil, err
577 }
578 case "port_type":
579 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
580 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
581 return nil, err
582 }
583 case "port_no":
584 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
585 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
586 return nil, err
587 }
khenaidoo297cd252019-02-07 22:10:23 -0500588 case kafka.TransactionKey:
589 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
590 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
591 return nil, err
592 }
khenaidoo92e62c52018-10-03 14:02:54 -0400593 }
594 }
khenaidoo297cd252019-02-07 22:10:23 -0500595 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
596 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
597
598 // Try to grab the transaction as this core may be competing with another Core
599 if rhp.competeForTransaction() {
600 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
601 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
602 // returning nil, nil instructs the callee to ignore this request
603 return nil, nil
604 } else {
605 defer txn.Close()
606 }
607 }
608
khenaidoo92e62c52018-10-03 14:02:54 -0400609 if rhp.TestMode { // Execute only for test cases
610 return nil, nil
611 }
612 go rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val), voltha.OperStatus_OperStatus(operStatus.Val))
khenaidoob9203542018-09-17 22:56:37 -0400613 return new(empty.Empty), nil
614}
615
khenaidoo79232702018-12-04 11:00:41 -0500616func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500617 if len(args) != 3 {
khenaidoob9203542018-09-17 22:56:37 -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{}
623 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500624 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400625 for _, arg := range args {
626 switch arg.Key {
627 case "device_id":
628 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
629 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
630 return nil, err
631 }
632 case "port":
633 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
634 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
635 return nil, err
636 }
khenaidoo297cd252019-02-07 22:10:23 -0500637 case kafka.TransactionKey:
638 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
639 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
640 return nil, err
641 }
khenaidoob9203542018-09-17 22:56:37 -0400642 }
643 }
khenaidoo297cd252019-02-07 22:10:23 -0500644 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
645
646 // Try to grab the transaction as this core may be competing with another Core
647 if rhp.competeForTransaction() {
648 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
649 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
650 // returning nil, nil instructs the callee to ignore this request
651 return nil, nil
652 } else {
653 defer txn.Close()
654 }
655 }
khenaidoob9203542018-09-17 22:56:37 -0400656
657 if rhp.TestMode { // Execute only for test cases
658 return nil, nil
659 }
khenaidoo92e62c52018-10-03 14:02:54 -0400660 // Run port creation in its own go routine
661 go rhp.deviceMgr.addPort(deviceId.Id, port)
662
khenaidoob9203542018-09-17 22:56:37 -0400663 return new(empty.Empty), nil
664}
665
khenaidoo79232702018-12-04 11:00:41 -0500666func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500667 if len(args) != 3 {
khenaidoob9203542018-09-17 22:56:37 -0400668 log.Warn("invalid-number-of-args", log.Fields{"args": args})
669 err := errors.New("invalid-number-of-args")
670 return nil, err
671 }
672 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500673 init := &ic.BoolType{}
khenaidoo297cd252019-02-07 22:10:23 -0500674 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400675 for _, arg := range args {
676 switch arg.Key {
677 case "device_pm_config":
678 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
679 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
680 return nil, err
681 }
682 case "init":
683 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
684 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
685 return nil, err
686 }
khenaidoo297cd252019-02-07 22:10:23 -0500687 case kafka.TransactionKey:
688 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
689 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
690 return nil, err
691 }
khenaidoob9203542018-09-17 22:56:37 -0400692 }
693 }
khenaidoob9203542018-09-17 22:56:37 -0400694 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoo297cd252019-02-07 22:10:23 -0500695 "init": init, "transactionID": transactionID.Val})
696
697 // Try to grab the transaction as this core may be competing with another Core
698 if rhp.competeForTransaction() {
699 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
700 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
701 // returning nil, nil instructs the callee to ignore this request
702 return nil, nil
703 } else {
704 defer txn.Close()
705 }
706 }
khenaidoob9203542018-09-17 22:56:37 -0400707
708 if rhp.TestMode { // Execute only for test cases
709 return nil, nil
710 }
711
khenaidoo92e62c52018-10-03 14:02:54 -0400712 // Run PM config update in its own go routine
713 go rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs)
714
khenaidoob9203542018-09-17 22:56:37 -0400715 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400716}
khenaidoofdbad6e2018-11-06 22:26:38 -0500717
khenaidoo79232702018-12-04 11:00:41 -0500718func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500719 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -0500720 log.Warn("invalid-number-of-args", log.Fields{"args": args})
721 err := errors.New("invalid-number-of-args")
722 return nil, err
723 }
724 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500725 portNo := &ic.IntType{}
726 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500727 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500728 for _, arg := range args {
729 switch arg.Key {
730 case "device_id":
731 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
732 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
733 return nil, err
734 }
735 case "port":
736 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
737 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
738 return nil, err
739 }
740 case "packet":
741 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
742 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
743 return nil, err
744 }
khenaidoo297cd252019-02-07 22:10:23 -0500745 case kafka.TransactionKey:
746 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
747 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
748 return nil, err
749 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500750 }
751 }
khenaidoo297cd252019-02-07 22:10:23 -0500752 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
753 "transactionID": transactionID.Val})
754
755 // For performance reason, we do not compete for packet-in. We process it and send the packet in. later in the
756 // processing flow the duplicate packet will be discarded
757
khenaidoofdbad6e2018-11-06 22:26:38 -0500758 if rhp.TestMode { // Execute only for test cases
759 return nil, nil
760 }
khenaidoo297cd252019-02-07 22:10:23 -0500761 go rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload)
khenaidoofdbad6e2018-11-06 22:26:38 -0500762 return new(empty.Empty), nil
763}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500764
765
766func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
767 if len(args) < 2 {
768 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{}
773 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -0500774 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500775 for _, arg := range args {
776 switch arg.Key {
777 case "device_id":
778 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
779 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
780 return nil, err
781 }
782 case "image_download":
783 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
784 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
785 return nil, err
786 }
khenaidoo297cd252019-02-07 22:10:23 -0500787 case kafka.TransactionKey:
788 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
789 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
790 return nil, err
791 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500792 }
793 }
khenaidoo297cd252019-02-07 22:10:23 -0500794 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
795 "transactionID": transactionID.Val})
796
797 // Try to grab the transaction as this core may be competing with another Core
798 if rhp.competeForTransaction() {
799 if txn, err := rhp.acquireTransaction(transactionID.Val); err != nil {
800 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
801 // returning nil, nil instructs the callee to ignore this request
802 return nil, nil
803 } else {
804 defer txn.Close()
805 }
806 }
807
khenaidoof5a5bfa2019-01-23 22:20:29 -0500808 if rhp.TestMode { // Execute only for test cases
809 return nil, nil
810 }
811 go rhp.deviceMgr.updateImageDownload(deviceId.Id, img)
812 return new(empty.Empty), nil
813}