blob: ed9f761692e386323b27a073c52da052e69175ed [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
khenaidoo79232702018-12-04 11:00:41 -0500680func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500681 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400682 log.Warn("invalid-number-of-args", log.Fields{"args": args})
683 err := errors.New("invalid-number-of-args")
684 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400685 }
khenaidoo92e62c52018-10-03 14:02:54 -0400686 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500687 portType := &ic.IntType{}
688 portNo := &ic.IntType{}
689 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500690 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400691 for _, arg := range args {
692 switch arg.Key {
693 case "device_id":
694 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
695 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
696 return nil, err
697 }
698 case "oper_status":
699 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
700 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
701 return nil, err
702 }
703 case "port_type":
704 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
705 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
706 return nil, err
707 }
708 case "port_no":
709 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
710 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
711 return nil, err
712 }
khenaidoo297cd252019-02-07 22:10:23 -0500713 case kafka.TransactionKey:
714 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
715 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
716 return nil, err
717 }
khenaidoo92e62c52018-10-03 14:02:54 -0400718 }
719 }
khenaidoo297cd252019-02-07 22:10:23 -0500720 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
721 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
722
723 // Try to grab the transaction as this core may be competing with another Core
724 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400725 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500726 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
727 // returning nil, nil instructs the callee to ignore this request
728 return nil, nil
729 } else {
730 defer txn.Close()
731 }
732 }
733
khenaidoo92e62c52018-10-03 14:02:54 -0400734 if rhp.TestMode { // Execute only for test cases
735 return nil, nil
736 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400737
738 go rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
739 voltha.OperStatus_OperStatus(operStatus.Val))
740
741 //if err := rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
742 // voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
743 // return nil, err
744 //}
khenaidoob9203542018-09-17 22:56:37 -0400745 return new(empty.Empty), nil
746}
747
khenaidoo79232702018-12-04 11:00:41 -0500748func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500749 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400750 log.Warn("invalid-number-of-args", log.Fields{"args": args})
751 err := errors.New("invalid-number-of-args")
752 return nil, err
753 }
754 deviceId := &voltha.ID{}
755 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500756 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400757 for _, arg := range args {
758 switch arg.Key {
759 case "device_id":
760 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
761 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
762 return nil, err
763 }
764 case "port":
765 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
766 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
767 return nil, err
768 }
khenaidoo297cd252019-02-07 22:10:23 -0500769 case kafka.TransactionKey:
770 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
771 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
772 return nil, err
773 }
khenaidoob9203542018-09-17 22:56:37 -0400774 }
775 }
khenaidoo297cd252019-02-07 22:10:23 -0500776 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
777
778 // Try to grab the transaction as this core may be competing with another Core
779 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400780 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500781 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
782 // returning nil, nil instructs the callee to ignore this request
783 return nil, nil
784 } else {
785 defer txn.Close()
786 }
787 }
khenaidoob9203542018-09-17 22:56:37 -0400788
789 if rhp.TestMode { // Execute only for test cases
790 return nil, nil
791 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400792 go rhp.deviceMgr.addPort(deviceId.Id, port)
khenaidoo92e62c52018-10-03 14:02:54 -0400793
khenaidoob9203542018-09-17 22:56:37 -0400794 return new(empty.Empty), nil
795}
796
khenaidoo79232702018-12-04 11:00:41 -0500797func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500798 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400799 log.Warn("invalid-number-of-args", log.Fields{"args": args})
800 err := errors.New("invalid-number-of-args")
801 return nil, err
802 }
803 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500804 init := &ic.BoolType{}
khenaidoo297cd252019-02-07 22:10:23 -0500805 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400806 for _, arg := range args {
807 switch arg.Key {
808 case "device_pm_config":
809 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
810 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
811 return nil, err
812 }
813 case "init":
814 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
815 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
816 return nil, err
817 }
khenaidoo297cd252019-02-07 22:10:23 -0500818 case kafka.TransactionKey:
819 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
820 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
821 return nil, err
822 }
khenaidoob9203542018-09-17 22:56:37 -0400823 }
824 }
khenaidoob9203542018-09-17 22:56:37 -0400825 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoode93b462019-02-13 22:17:21 -0500826 "init": init, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500827
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, pmConfigs.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 }
842
khenaidoo1ce37ad2019-03-24 22:07:24 -0400843 go rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs)
844 //if err := rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs); err != nil {
845 // return nil, err
846 //}
khenaidoo92e62c52018-10-03 14:02:54 -0400847
khenaidoob9203542018-09-17 22:56:37 -0400848 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400849}
khenaidoofdbad6e2018-11-06 22:26:38 -0500850
khenaidoo79232702018-12-04 11:00:41 -0500851func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500852 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -0500853 log.Warn("invalid-number-of-args", log.Fields{"args": args})
854 err := errors.New("invalid-number-of-args")
855 return nil, err
856 }
857 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500858 portNo := &ic.IntType{}
859 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500860 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500861 for _, arg := range args {
862 switch arg.Key {
863 case "device_id":
864 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
865 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
866 return nil, err
867 }
868 case "port":
869 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
870 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
871 return nil, err
872 }
873 case "packet":
874 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
875 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
876 return nil, err
877 }
khenaidoo297cd252019-02-07 22:10:23 -0500878 case kafka.TransactionKey:
879 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
880 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
881 return nil, err
882 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500883 }
884 }
khenaidoo297cd252019-02-07 22:10:23 -0500885 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
886 "transactionID": transactionID.Val})
887
888 // For performance reason, we do not compete for packet-in. We process it and send the packet in. later in the
889 // processing flow the duplicate packet will be discarded
890
khenaidoofdbad6e2018-11-06 22:26:38 -0500891 if rhp.TestMode { // Execute only for test cases
892 return nil, nil
893 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400894 go rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload)
895 //if err := rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload); err != nil {
896 // return nil, err
897 //}
khenaidoofdbad6e2018-11-06 22:26:38 -0500898 return new(empty.Empty), nil
899}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500900
khenaidoof5a5bfa2019-01-23 22:20:29 -0500901func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
902 if len(args) < 2 {
903 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{}
908 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -0500909 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500910 for _, arg := range args {
911 switch arg.Key {
912 case "device_id":
913 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
914 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
915 return nil, err
916 }
917 case "image_download":
918 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
919 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
920 return nil, err
921 }
khenaidoo297cd252019-02-07 22:10:23 -0500922 case kafka.TransactionKey:
923 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
924 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
925 return nil, err
926 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500927 }
928 }
khenaidoo297cd252019-02-07 22:10:23 -0500929 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
930 "transactionID": transactionID.Val})
931
932 // Try to grab the transaction as this core may be competing with another Core
933 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400934 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500935 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
936 // returning nil, nil instructs the callee to ignore this request
937 return nil, nil
938 } else {
939 defer txn.Close()
940 }
941 }
942
khenaidoof5a5bfa2019-01-23 22:20:29 -0500943 if rhp.TestMode { // Execute only for test cases
944 return nil, nil
945 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400946 go rhp.deviceMgr.updateImageDownload(deviceId.Id, img)
947 //if err := rhp.deviceMgr.updateImageDownload(deviceId.Id, img); err != nil {
948 // return nil, err
949 //}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500950 return new(empty.Empty), nil
951}