blob: 9eae89eb215f59a9f7fb4754db2f3aeee2b410ee [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
khenaidoo2c6a0992019-04-29 13:46:56 -040091 if rhp.core.deviceOwnership.OwnedByMe(&utils.DeviceID{Id: devId}) {
khenaidoo1ce37ad2019-03-24 22:07:24 -040092 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
Matt Jeanneret5f0aa182019-05-01 11:57:05 -0400230 cloned.Reason = device.Reason
khenaidoo19d7b632018-10-30 10:49:50 -0400231 return cloned, nil
khenaidoo92e62c52018-10-03 14:02:54 -0400232}
233
khenaidoo79232702018-12-04 11:00:41 -0500234func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500235 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400236 log.Warn("invalid-number-of-args", log.Fields{"args": args})
237 err := errors.New("invalid-number-of-args")
238 return nil, err
239 }
khenaidoo297cd252019-02-07 22:10:23 -0500240
khenaidoob9203542018-09-17 22:56:37 -0400241 device := &voltha.Device{}
khenaidoo297cd252019-02-07 22:10:23 -0500242 transactionID := &ic.StrType{}
243 for _, arg := range args {
244 switch arg.Key {
245 case "device":
246 if err := ptypes.UnmarshalAny(arg.Value, device); err != nil {
247 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
248 return nil, err
249 }
250 case kafka.TransactionKey:
251 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
252 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
253 return nil, err
254 }
255 }
khenaidoob9203542018-09-17 22:56:37 -0400256 }
khenaidoo297cd252019-02-07 22:10:23 -0500257 log.Debugw("DeviceUpdate", log.Fields{"deviceId": device.Id, "transactionID": transactionID.Val})
258
259 // Try to grab the transaction as this core may be competing with another Core
260 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400261 if txn, err := rhp.takeRequestOwnership(transactionID.Val, device.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500262 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
263 // returning nil, nil instructs the callee to ignore this request
264 return nil, nil
265 } else {
266 defer txn.Close()
267 }
268 }
khenaidoob9203542018-09-17 22:56:37 -0400269
270 if rhp.TestMode { // Execute only for test cases
271 return new(empty.Empty), nil
272 }
khenaidoo92e62c52018-10-03 14:02:54 -0400273
274 //Merge the adapter device info (only the ones an adapter can change) with the latest device data
275 if updatedDevice, err := rhp.mergeDeviceInfoFromAdapter(device); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400276 return nil, status.Errorf(codes.Internal, "%s", err.Error())
khenaidoo92e62c52018-10-03 14:02:54 -0400277 } else {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400278 go rhp.deviceMgr.updateDevice(updatedDevice)
279 //if err := rhp.deviceMgr.updateDevice(updatedDevice); err != nil {
280 // return nil, err
281 //}
khenaidoob9203542018-09-17 22:56:37 -0400282 }
khenaidoo92e62c52018-10-03 14:02:54 -0400283
khenaidoob9203542018-09-17 22:56:37 -0400284 return new(empty.Empty), nil
285}
286
khenaidoo79232702018-12-04 11:00:41 -0500287func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500288 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400289 log.Warn("invalid-number-of-args", log.Fields{"args": args})
290 err := errors.New("invalid-number-of-args")
291 return nil, err
292 }
khenaidoo297cd252019-02-07 22:10:23 -0500293
khenaidoo2c6f1672018-09-20 23:14:41 -0400294 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500295 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500296 serialNumber := &ic.StrType{}
297 onuId := &ic.IntType{}
298 parentPortNo := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500299 for _, arg := range args {
300 switch arg.Key {
301 case "device_id":
302 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
303 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
304 return nil, err
305 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500306 case "serial_number":
307 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
308 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
309 return nil, err
310 }
311 case "onu_id":
312 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
313 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
314 return nil, err
315 }
316 case "parent_port_no":
317 if err := ptypes.UnmarshalAny(arg.Value, parentPortNo); err != nil {
318 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
319 return nil, err
320 }
khenaidoo297cd252019-02-07 22:10:23 -0500321 case kafka.TransactionKey:
322 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
323 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
324 return nil, err
325 }
326 }
khenaidoob9203542018-09-17 22:56:37 -0400327 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500328 log.Debugw("GetChildDevice", log.Fields{"parentDeviceId": pID.Id, "args": args, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500329
330 // Try to grab the transaction as this core may be competing with another Core
331 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400332 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500333 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
334 // returning nil, nil instructs the callee to ignore this request
335 return nil, nil
336 } else {
337 defer txn.Close()
338 }
339 }
khenaidoob9203542018-09-17 22:56:37 -0400340
341 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400342 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400343 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500344 return rhp.deviceMgr.GetChildDevice(pID.Id, serialNumber.Val, onuId.Val, parentPortNo.Val)
khenaidoob9203542018-09-17 22:56:37 -0400345}
346
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500347func (rhp *AdapterRequestHandlerProxy) GetChildDeviceWithProxyAddress(args []*ic.Argument) (*voltha.Device, error) {
348 if len(args) < 2 {
349 log.Warn("invalid-number-of-args", log.Fields{"args": args})
350 err := errors.New("invalid-number-of-args")
351 return nil, err
352 }
353
354 proxyAddress := &voltha.Device_ProxyAddress{}
355 transactionID := &ic.StrType{}
356 for _, arg := range args {
357 switch arg.Key {
358 case "proxy_address":
359 if err := ptypes.UnmarshalAny(arg.Value, proxyAddress); err != nil {
360 log.Warnw("cannot-unmarshal-proxy-address", log.Fields{"error": err})
361 return nil, err
362 }
363 case kafka.TransactionKey:
364 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
365 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
366 return nil, err
367 }
368 }
369 }
370 log.Debugw("GetChildDeviceWithProxyAddress", log.Fields{"proxyAddress": proxyAddress, "transactionID": transactionID.Val})
371
372 // Try to grab the transaction as this core may be competing with another Core
373 if rhp.competeForTransaction() {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400374 if txn, err := rhp.takeRequestOwnership(transactionID.Val, proxyAddress.DeviceId); err != nil {
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500375 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500376 return nil, nil
377 } else {
378 defer txn.Close()
379 }
380 }
381
382 if rhp.TestMode { // Execute only for test cases
383 return &voltha.Device{Id: proxyAddress.DeviceId}, nil
384 }
385 return rhp.deviceMgr.GetChildDeviceWithProxyAddress(proxyAddress)
386}
387
khenaidoo79232702018-12-04 11:00:41 -0500388func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500389 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400390 log.Warn("invalid-number-of-args", log.Fields{"args": args})
391 err := errors.New("invalid-number-of-args")
392 return nil, err
393 }
khenaidoo92e62c52018-10-03 14:02:54 -0400394 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500395 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500396 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400397 for _, arg := range args {
398 switch arg.Key {
399 case "device_id":
400 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
401 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
402 return nil, err
403 }
404 case "port_type":
405 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
406 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
407 return nil, err
408 }
khenaidoo297cd252019-02-07 22:10:23 -0500409 case kafka.TransactionKey:
410 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
411 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
412 return nil, err
413 }
khenaidoo92e62c52018-10-03 14:02:54 -0400414 }
khenaidoob9203542018-09-17 22:56:37 -0400415 }
khenaidoo297cd252019-02-07 22:10:23 -0500416 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400417 if rhp.TestMode { // Execute only for test cases
418 aPort := &voltha.Port{Label: "test_port"}
419 allPorts := &voltha.Ports{}
420 allPorts.Items = append(allPorts.Items, aPort)
421 return allPorts, nil
422 }
khenaidoo92e62c52018-10-03 14:02:54 -0400423 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400424}
425
khenaidoo297cd252019-02-07 22:10:23 -0500426func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500427 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400428 log.Warn("invalid-number-of-args", log.Fields{"args": args})
429 err := errors.New("invalid-number-of-args")
430 return nil, err
431 }
khenaidoo297cd252019-02-07 22:10:23 -0500432
khenaidoo2c6f1672018-09-20 23:14:41 -0400433 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500434 transactionID := &ic.StrType{}
435 for _, arg := range args {
436 switch arg.Key {
437 case "device_id":
438 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
439 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
440 return nil, err
441 }
442 case kafka.TransactionKey:
443 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
444 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
445 return nil, err
446 }
447 }
khenaidoob9203542018-09-17 22:56:37 -0400448 }
khenaidoo297cd252019-02-07 22:10:23 -0500449 log.Debugw("GetChildDevices", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
450
451 // Try to grab the transaction as this core may be competing with another Core
452 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400453 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500454 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
455 // returning nil, nil instructs the callee to ignore this request
456 return nil, nil
457 } else {
458 defer txn.Close()
459 }
460 }
khenaidoob9203542018-09-17 22:56:37 -0400461
462 if rhp.TestMode { // Execute only for test cases
khenaidoode93b462019-02-13 22:17:21 -0500463 return &voltha.Devices{Items: nil}, nil
khenaidoob9203542018-09-17 22:56:37 -0400464 }
khenaidoo297cd252019-02-07 22:10:23 -0500465
466 return rhp.deviceMgr.getAllChildDevices(pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400467}
468
469// ChildDeviceDetected is invoked when a child device is detected. The following
470// parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500471// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
khenaidoo79232702018-12-04 11:00:41 -0500472func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500473 if len(args) < 5 {
khenaidoob9203542018-09-17 22:56:37 -0400474 log.Warn("invalid-number-of-args", log.Fields{"args": args})
475 err := errors.New("invalid-number-of-args")
476 return nil, err
477 }
478
479 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500480 portNo := &ic.IntType{}
481 dt := &ic.StrType{}
482 chnlId := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500483 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500484 serialNumber := &ic.StrType{}
485 vendorId := &ic.StrType{}
486 onuId := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400487 for _, arg := range args {
488 switch arg.Key {
489 case "parent_device_id":
490 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
491 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
492 return nil, err
493 }
494 case "parent_port_no":
495 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
496 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
497 return nil, err
498 }
499 case "child_device_type":
500 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
501 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
502 return nil, err
503 }
504 case "channel_id":
505 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
506 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
507 return nil, err
508 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500509 case "vendor_id":
510 if err := ptypes.UnmarshalAny(arg.Value, vendorId); err != nil {
511 log.Warnw("cannot-unmarshal-vendor-id", log.Fields{"error": err})
512 return nil, err
513 }
514 case "serial_number":
515 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
516 log.Warnw("cannot-unmarshal-serial-number", log.Fields{"error": err})
517 return nil, err
518 }
519 case "onu_id":
520 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
521 log.Warnw("cannot-unmarshal-onu-id", log.Fields{"error": err})
522 return nil, err
523 }
khenaidoo297cd252019-02-07 22:10:23 -0500524 case kafka.TransactionKey:
525 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
526 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
527 return nil, err
528 }
khenaidoob9203542018-09-17 22:56:37 -0400529 }
530 }
khenaidoob9203542018-09-17 22:56:37 -0400531 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
Matt Jeanneret4e241952019-02-28 11:16:04 -0500532 "deviceType": dt.Val, "channelId": chnlId.Val, "serialNumber": serialNumber.Val,
533 "vendorId": vendorId.Val, "onuId": onuId.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500534
535 // Try to grab the transaction as this core may be competing with another Core
536 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400537 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500538 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 }
khenaidoob9203542018-09-17 22:56:37 -0400545
546 if rhp.TestMode { // Execute only for test cases
547 return nil, nil
548 }
khenaidoob9203542018-09-17 22:56:37 -0400549 // Run child detection in it's own go routine as it can be a lengthy process
Matt Jeanneret4e241952019-02-28 11:16:04 -0500550 go rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val, vendorId.Val, serialNumber.Val, onuId.Val)
khenaidoob9203542018-09-17 22:56:37 -0400551
552 return new(empty.Empty), nil
553}
554
khenaidoo79232702018-12-04 11:00:41 -0500555func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500556 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400557 log.Warn("invalid-number-of-args", log.Fields{"args": args})
558 err := errors.New("invalid-number-of-args")
559 return nil, err
560 }
561 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500562 operStatus := &ic.IntType{}
563 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500564 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400565 for _, arg := range args {
566 switch arg.Key {
567 case "device_id":
568 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
569 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
570 return nil, err
571 }
572 case "oper_status":
573 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
574 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
575 return nil, err
576 }
khenaidoob9203542018-09-17 22:56:37 -0400577 case "connect_status":
578 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
579 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
580 return nil, err
581 }
khenaidoo297cd252019-02-07 22:10:23 -0500582 case kafka.TransactionKey:
583 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
584 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
585 return nil, err
586 }
khenaidoob9203542018-09-17 22:56:37 -0400587 }
588 }
khenaidoo297cd252019-02-07 22:10:23 -0500589 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
590 "conn-status": connStatus, "transactionID": transactionID.Val})
591
592 // Try to grab the transaction as this core may be competing with another Core
593 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400594 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500595 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
596 // returning nil, nil instructs the callee to ignore this request
597 return nil, nil
598 } else {
599 defer txn.Close()
600 }
601 }
602
khenaidoob9203542018-09-17 22:56:37 -0400603 if rhp.TestMode { // Execute only for test cases
604 return nil, nil
605 }
khenaidoo92e62c52018-10-03 14:02:54 -0400606 // 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 -0400607 go rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
608 voltha.ConnectStatus_ConnectStatus(connStatus.Val))
609
610 //if err := rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
611 // voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
612 // return nil, err
613 //}
khenaidoo92e62c52018-10-03 14:02:54 -0400614 return new(empty.Empty), nil
615}
616
khenaidoo79232702018-12-04 11:00:41 -0500617func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500618 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400619 log.Warn("invalid-number-of-args", log.Fields{"args": args})
620 err := errors.New("invalid-number-of-args")
621 return nil, err
622 }
623 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500624 operStatus := &ic.IntType{}
625 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500626 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400627 for _, arg := range args {
628 switch arg.Key {
629 case "device_id":
630 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
631 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
632 return nil, err
633 }
634 case "oper_status":
635 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
636 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
637 return nil, err
638 }
639 case "connect_status":
640 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
641 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
642 return nil, err
643 }
khenaidoo297cd252019-02-07 22:10:23 -0500644 case kafka.TransactionKey:
645 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
646 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
647 return nil, err
648 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400649 }
650 }
khenaidoo297cd252019-02-07 22:10:23 -0500651 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
652 "conn-status": connStatus, "transactionID": transactionID.Val})
653
654 // Try to grab the transaction as this core may be competing with another Core
655 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400656 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500657 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
658 // returning nil, nil instructs the callee to ignore this request
659 return nil, nil
660 } else {
661 defer txn.Close()
662 }
663 }
664
khenaidoo4d4802d2018-10-04 21:59:49 -0400665 if rhp.TestMode { // Execute only for test cases
666 return nil, nil
667 }
668
669 // 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 -0400670 go rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
671 voltha.ConnectStatus_ConnectStatus(connStatus.Val))
672
673 //if err := rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
674 // voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
675 // return nil, err
676 //}
khenaidoo4d4802d2018-10-04 21:59:49 -0400677 return new(empty.Empty), nil
678}
679
khenaidoo3ab34882019-05-02 21:33:30 -0400680func (rhp *AdapterRequestHandlerProxy) PortsStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
681 if len(args) < 2 {
682 log.Warn("invalid-number-of-args", log.Fields{"args": args})
683 err := errors.New("invalid-number-of-args")
684 return nil, err
685 }
686 deviceId := &voltha.ID{}
687 operStatus := &ic.IntType{}
688 transactionID := &ic.StrType{}
689 for _, arg := range args {
690 switch arg.Key {
691 case "device_id":
692 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
693 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
694 return nil, err
695 }
696 case "oper_status":
697 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
698 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
699 return nil, err
700 }
701 case kafka.TransactionKey:
702 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
703 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
704 return nil, err
705 }
706 }
707 }
708 log.Debugw("PortsStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus, "transactionID": transactionID.Val})
709
710 // Try to grab the transaction as this core may be competing with another Core
711 if rhp.competeForTransaction() {
712 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
713 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
714 // returning nil, nil instructs the callee to ignore this request
715 return nil, nil
716 } else {
717 defer txn.Close()
718 }
719 }
720
721 if rhp.TestMode { // Execute only for test cases
722 return nil, nil
723 }
724
725 go rhp.deviceMgr.updatePortsState(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val))
726
727 return new(empty.Empty), nil
728}
729
khenaidoo79232702018-12-04 11:00:41 -0500730func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500731 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400732 log.Warn("invalid-number-of-args", log.Fields{"args": args})
733 err := errors.New("invalid-number-of-args")
734 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400735 }
khenaidoo92e62c52018-10-03 14:02:54 -0400736 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500737 portType := &ic.IntType{}
738 portNo := &ic.IntType{}
739 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500740 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400741 for _, arg := range args {
742 switch arg.Key {
743 case "device_id":
744 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
745 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
746 return nil, err
747 }
748 case "oper_status":
749 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
750 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
751 return nil, err
752 }
753 case "port_type":
754 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
755 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
756 return nil, err
757 }
758 case "port_no":
759 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
760 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
761 return nil, err
762 }
khenaidoo297cd252019-02-07 22:10:23 -0500763 case kafka.TransactionKey:
764 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
765 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
766 return nil, err
767 }
khenaidoo92e62c52018-10-03 14:02:54 -0400768 }
769 }
khenaidoo297cd252019-02-07 22:10:23 -0500770 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
771 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
772
773 // Try to grab the transaction as this core may be competing with another Core
774 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400775 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500776 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
777 // returning nil, nil instructs the callee to ignore this request
778 return nil, nil
779 } else {
780 defer txn.Close()
781 }
782 }
783
khenaidoo92e62c52018-10-03 14:02:54 -0400784 if rhp.TestMode { // Execute only for test cases
785 return nil, nil
786 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400787
788 go rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
789 voltha.OperStatus_OperStatus(operStatus.Val))
790
791 //if err := rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
792 // voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
793 // return nil, err
794 //}
khenaidoob9203542018-09-17 22:56:37 -0400795 return new(empty.Empty), nil
796}
797
khenaidoo79232702018-12-04 11:00:41 -0500798func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500799 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400800 log.Warn("invalid-number-of-args", log.Fields{"args": args})
801 err := errors.New("invalid-number-of-args")
802 return nil, err
803 }
804 deviceId := &voltha.ID{}
805 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500806 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400807 for _, arg := range args {
808 switch arg.Key {
809 case "device_id":
810 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
811 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
812 return nil, err
813 }
814 case "port":
815 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
816 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
817 return nil, err
818 }
khenaidoo297cd252019-02-07 22:10:23 -0500819 case kafka.TransactionKey:
820 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
821 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
822 return nil, err
823 }
khenaidoob9203542018-09-17 22:56:37 -0400824 }
825 }
khenaidoo297cd252019-02-07 22:10:23 -0500826 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
827
828 // Try to grab the transaction as this core may be competing with another Core
829 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400830 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500831 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
832 // returning nil, nil instructs the callee to ignore this request
833 return nil, nil
834 } else {
835 defer txn.Close()
836 }
837 }
khenaidoob9203542018-09-17 22:56:37 -0400838
839 if rhp.TestMode { // Execute only for test cases
840 return nil, nil
841 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400842 go rhp.deviceMgr.addPort(deviceId.Id, port)
khenaidoo92e62c52018-10-03 14:02:54 -0400843
khenaidoob9203542018-09-17 22:56:37 -0400844 return new(empty.Empty), nil
845}
846
khenaidoo79232702018-12-04 11:00:41 -0500847func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500848 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400849 log.Warn("invalid-number-of-args", log.Fields{"args": args})
850 err := errors.New("invalid-number-of-args")
851 return nil, err
852 }
853 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500854 init := &ic.BoolType{}
khenaidoo297cd252019-02-07 22:10:23 -0500855 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400856 for _, arg := range args {
857 switch arg.Key {
858 case "device_pm_config":
859 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
860 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
861 return nil, err
862 }
863 case "init":
864 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
865 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
866 return nil, err
867 }
khenaidoo297cd252019-02-07 22:10:23 -0500868 case kafka.TransactionKey:
869 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
870 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
871 return nil, err
872 }
khenaidoob9203542018-09-17 22:56:37 -0400873 }
874 }
khenaidoob9203542018-09-17 22:56:37 -0400875 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoode93b462019-02-13 22:17:21 -0500876 "init": init, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500877
878 // Try to grab the transaction as this core may be competing with another Core
879 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400880 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pmConfigs.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500881 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
882 // returning nil, nil instructs the callee to ignore this request
883 return nil, nil
884 } else {
885 defer txn.Close()
886 }
887 }
khenaidoob9203542018-09-17 22:56:37 -0400888
889 if rhp.TestMode { // Execute only for test cases
890 return nil, nil
891 }
892
khenaidoo1ce37ad2019-03-24 22:07:24 -0400893 go rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs)
894 //if err := rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs); err != nil {
895 // return nil, err
896 //}
khenaidoo92e62c52018-10-03 14:02:54 -0400897
khenaidoob9203542018-09-17 22:56:37 -0400898 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400899}
khenaidoofdbad6e2018-11-06 22:26:38 -0500900
khenaidoo79232702018-12-04 11:00:41 -0500901func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500902 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -0500903 log.Warn("invalid-number-of-args", log.Fields{"args": args})
904 err := errors.New("invalid-number-of-args")
905 return nil, err
906 }
907 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500908 portNo := &ic.IntType{}
909 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500910 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500911 for _, arg := range args {
912 switch arg.Key {
913 case "device_id":
914 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
915 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
916 return nil, err
917 }
918 case "port":
919 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
920 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
921 return nil, err
922 }
923 case "packet":
924 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
925 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
926 return nil, err
927 }
khenaidoo297cd252019-02-07 22:10:23 -0500928 case kafka.TransactionKey:
929 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
930 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
931 return nil, err
932 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500933 }
934 }
khenaidoo297cd252019-02-07 22:10:23 -0500935 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
936 "transactionID": transactionID.Val})
937
938 // For performance reason, we do not compete for packet-in. We process it and send the packet in. later in the
939 // processing flow the duplicate packet will be discarded
940
khenaidoofdbad6e2018-11-06 22:26:38 -0500941 if rhp.TestMode { // Execute only for test cases
942 return nil, nil
943 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400944 go rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload)
945 //if err := rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload); err != nil {
946 // return nil, err
947 //}
khenaidoofdbad6e2018-11-06 22:26:38 -0500948 return new(empty.Empty), nil
949}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500950
khenaidoof5a5bfa2019-01-23 22:20:29 -0500951func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
952 if len(args) < 2 {
953 log.Warn("invalid-number-of-args", log.Fields{"args": args})
954 err := errors.New("invalid-number-of-args")
955 return nil, err
956 }
957 deviceId := &voltha.ID{}
958 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -0500959 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500960 for _, arg := range args {
961 switch arg.Key {
962 case "device_id":
963 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
964 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
965 return nil, err
966 }
967 case "image_download":
968 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
969 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
970 return nil, err
971 }
khenaidoo297cd252019-02-07 22:10:23 -0500972 case kafka.TransactionKey:
973 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
974 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
975 return nil, err
976 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500977 }
978 }
khenaidoo297cd252019-02-07 22:10:23 -0500979 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
980 "transactionID": transactionID.Val})
981
982 // Try to grab the transaction as this core may be competing with another Core
983 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400984 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500985 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
986 // returning nil, nil instructs the callee to ignore this request
987 return nil, nil
988 } else {
989 defer txn.Close()
990 }
991 }
992
khenaidoof5a5bfa2019-01-23 22:20:29 -0500993 if rhp.TestMode { // Execute only for test cases
994 return nil, nil
995 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400996 go rhp.deviceMgr.updateImageDownload(deviceId.Id, img)
997 //if err := rhp.deviceMgr.updateImageDownload(deviceId.Id, img); err != nil {
998 // return nil, err
999 //}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001000 return new(empty.Empty), nil
1001}