blob: 1a00db8eb30793693814098d55594affecc612d0 [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
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700270 log.Debugw("DeviceUpdate got txn", log.Fields{"deviceId": device.Id, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400271 if rhp.TestMode { // Execute only for test cases
272 return new(empty.Empty), nil
273 }
khenaidoo92e62c52018-10-03 14:02:54 -0400274
275 //Merge the adapter device info (only the ones an adapter can change) with the latest device data
276 if updatedDevice, err := rhp.mergeDeviceInfoFromAdapter(device); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400277 return nil, status.Errorf(codes.Internal, "%s", err.Error())
khenaidoo92e62c52018-10-03 14:02:54 -0400278 } else {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400279 go rhp.deviceMgr.updateDevice(updatedDevice)
280 //if err := rhp.deviceMgr.updateDevice(updatedDevice); err != nil {
281 // return nil, err
282 //}
khenaidoob9203542018-09-17 22:56:37 -0400283 }
khenaidoo92e62c52018-10-03 14:02:54 -0400284
khenaidoob9203542018-09-17 22:56:37 -0400285 return new(empty.Empty), nil
286}
287
khenaidoo79232702018-12-04 11:00:41 -0500288func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500289 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400290 log.Warn("invalid-number-of-args", log.Fields{"args": args})
291 err := errors.New("invalid-number-of-args")
292 return nil, err
293 }
khenaidoo297cd252019-02-07 22:10:23 -0500294
khenaidoo2c6f1672018-09-20 23:14:41 -0400295 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500296 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500297 serialNumber := &ic.StrType{}
298 onuId := &ic.IntType{}
299 parentPortNo := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500300 for _, arg := range args {
301 switch arg.Key {
302 case "device_id":
303 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
304 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
305 return nil, err
306 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500307 case "serial_number":
308 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
309 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
310 return nil, err
311 }
312 case "onu_id":
313 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
314 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
315 return nil, err
316 }
317 case "parent_port_no":
318 if err := ptypes.UnmarshalAny(arg.Value, parentPortNo); err != nil {
319 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
320 return nil, err
321 }
khenaidoo297cd252019-02-07 22:10:23 -0500322 case kafka.TransactionKey:
323 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
324 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
325 return nil, err
326 }
327 }
khenaidoob9203542018-09-17 22:56:37 -0400328 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500329 log.Debugw("GetChildDevice", log.Fields{"parentDeviceId": pID.Id, "args": args, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500330
331 // Try to grab the transaction as this core may be competing with another Core
332 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400333 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500334 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
335 // returning nil, nil instructs the callee to ignore this request
336 return nil, nil
337 } else {
338 defer txn.Close()
339 }
340 }
khenaidoob9203542018-09-17 22:56:37 -0400341
342 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400343 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400344 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500345 return rhp.deviceMgr.GetChildDevice(pID.Id, serialNumber.Val, onuId.Val, parentPortNo.Val)
khenaidoob9203542018-09-17 22:56:37 -0400346}
347
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500348func (rhp *AdapterRequestHandlerProxy) GetChildDeviceWithProxyAddress(args []*ic.Argument) (*voltha.Device, error) {
349 if len(args) < 2 {
350 log.Warn("invalid-number-of-args", log.Fields{"args": args})
351 err := errors.New("invalid-number-of-args")
352 return nil, err
353 }
354
355 proxyAddress := &voltha.Device_ProxyAddress{}
356 transactionID := &ic.StrType{}
357 for _, arg := range args {
358 switch arg.Key {
359 case "proxy_address":
360 if err := ptypes.UnmarshalAny(arg.Value, proxyAddress); err != nil {
361 log.Warnw("cannot-unmarshal-proxy-address", log.Fields{"error": err})
362 return nil, err
363 }
364 case kafka.TransactionKey:
365 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
366 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
367 return nil, err
368 }
369 }
370 }
371 log.Debugw("GetChildDeviceWithProxyAddress", log.Fields{"proxyAddress": proxyAddress, "transactionID": transactionID.Val})
372
373 // Try to grab the transaction as this core may be competing with another Core
374 if rhp.competeForTransaction() {
khenaidoo1ce37ad2019-03-24 22:07:24 -0400375 if txn, err := rhp.takeRequestOwnership(transactionID.Val, proxyAddress.DeviceId); err != nil {
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500376 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500377 return nil, nil
378 } else {
379 defer txn.Close()
380 }
381 }
382
383 if rhp.TestMode { // Execute only for test cases
384 return &voltha.Device{Id: proxyAddress.DeviceId}, nil
385 }
386 return rhp.deviceMgr.GetChildDeviceWithProxyAddress(proxyAddress)
387}
388
khenaidoo79232702018-12-04 11:00:41 -0500389func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500390 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400391 log.Warn("invalid-number-of-args", log.Fields{"args": args})
392 err := errors.New("invalid-number-of-args")
393 return nil, err
394 }
khenaidoo92e62c52018-10-03 14:02:54 -0400395 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500396 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500397 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400398 for _, arg := range args {
399 switch arg.Key {
400 case "device_id":
401 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
402 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
403 return nil, err
404 }
405 case "port_type":
406 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
407 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
408 return nil, err
409 }
khenaidoo297cd252019-02-07 22:10:23 -0500410 case kafka.TransactionKey:
411 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
412 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
413 return nil, err
414 }
khenaidoo92e62c52018-10-03 14:02:54 -0400415 }
khenaidoob9203542018-09-17 22:56:37 -0400416 }
khenaidoo297cd252019-02-07 22:10:23 -0500417 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoob9203542018-09-17 22:56:37 -0400418 if rhp.TestMode { // Execute only for test cases
419 aPort := &voltha.Port{Label: "test_port"}
420 allPorts := &voltha.Ports{}
421 allPorts.Items = append(allPorts.Items, aPort)
422 return allPorts, nil
423 }
khenaidoo92e62c52018-10-03 14:02:54 -0400424 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400425}
426
khenaidoo297cd252019-02-07 22:10:23 -0500427func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500428 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400429 log.Warn("invalid-number-of-args", log.Fields{"args": args})
430 err := errors.New("invalid-number-of-args")
431 return nil, err
432 }
khenaidoo297cd252019-02-07 22:10:23 -0500433
khenaidoo2c6f1672018-09-20 23:14:41 -0400434 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500435 transactionID := &ic.StrType{}
436 for _, arg := range args {
437 switch arg.Key {
438 case "device_id":
439 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
440 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
441 return nil, err
442 }
443 case kafka.TransactionKey:
444 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
445 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
446 return nil, err
447 }
448 }
khenaidoob9203542018-09-17 22:56:37 -0400449 }
khenaidoo297cd252019-02-07 22:10:23 -0500450 log.Debugw("GetChildDevices", log.Fields{"deviceId": pID.Id, "transactionID": transactionID.Val})
451
452 // Try to grab the transaction as this core may be competing with another Core
453 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400454 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500455 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
456 // returning nil, nil instructs the callee to ignore this request
457 return nil, nil
458 } else {
459 defer txn.Close()
460 }
461 }
khenaidoob9203542018-09-17 22:56:37 -0400462
463 if rhp.TestMode { // Execute only for test cases
khenaidoode93b462019-02-13 22:17:21 -0500464 return &voltha.Devices{Items: nil}, nil
khenaidoob9203542018-09-17 22:56:37 -0400465 }
khenaidoo297cd252019-02-07 22:10:23 -0500466
467 return rhp.deviceMgr.getAllChildDevices(pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400468}
469
470// ChildDeviceDetected is invoked when a child device is detected. The following
471// parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500472// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700473func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500474 if len(args) < 5 {
khenaidoob9203542018-09-17 22:56:37 -0400475 log.Warn("invalid-number-of-args", log.Fields{"args": args})
476 err := errors.New("invalid-number-of-args")
477 return nil, err
478 }
479
480 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500481 portNo := &ic.IntType{}
482 dt := &ic.StrType{}
483 chnlId := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500484 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500485 serialNumber := &ic.StrType{}
486 vendorId := &ic.StrType{}
487 onuId := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400488 for _, arg := range args {
489 switch arg.Key {
490 case "parent_device_id":
491 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
492 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
493 return nil, err
494 }
495 case "parent_port_no":
496 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
497 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
498 return nil, err
499 }
500 case "child_device_type":
501 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
502 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
503 return nil, err
504 }
505 case "channel_id":
506 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
507 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
508 return nil, err
509 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500510 case "vendor_id":
511 if err := ptypes.UnmarshalAny(arg.Value, vendorId); err != nil {
512 log.Warnw("cannot-unmarshal-vendor-id", log.Fields{"error": err})
513 return nil, err
514 }
515 case "serial_number":
516 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
517 log.Warnw("cannot-unmarshal-serial-number", log.Fields{"error": err})
518 return nil, err
519 }
520 case "onu_id":
521 if err := ptypes.UnmarshalAny(arg.Value, onuId); err != nil {
522 log.Warnw("cannot-unmarshal-onu-id", log.Fields{"error": err})
523 return nil, err
524 }
khenaidoo297cd252019-02-07 22:10:23 -0500525 case kafka.TransactionKey:
526 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
527 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
528 return nil, err
529 }
khenaidoob9203542018-09-17 22:56:37 -0400530 }
531 }
khenaidoob9203542018-09-17 22:56:37 -0400532 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
Matt Jeanneret4e241952019-02-28 11:16:04 -0500533 "deviceType": dt.Val, "channelId": chnlId.Val, "serialNumber": serialNumber.Val,
534 "vendorId": vendorId.Val, "onuId": onuId.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500535
536 // Try to grab the transaction as this core may be competing with another Core
537 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400538 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pID.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500539 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
540 // returning nil, nil instructs the callee to ignore this request
541 return nil, nil
542 } else {
543 defer txn.Close()
544 }
545 }
khenaidoob9203542018-09-17 22:56:37 -0400546
547 if rhp.TestMode { // Execute only for test cases
548 return nil, nil
549 }
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700550 device, err := rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val, vendorId.Val, serialNumber.Val, onuId.Val)
551 if err != nil {
khenaidoo59ef7be2019-06-21 12:40:28 -0400552 log.Errorw("child-detection-failed", log.Fields{"parentId": pID.Id, "onuId": onuId.Val, "error": err})
553 return nil, err
554 }
khenaidoob9203542018-09-17 22:56:37 -0400555
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700556 return device, nil
khenaidoob9203542018-09-17 22:56:37 -0400557}
558
khenaidoo79232702018-12-04 11:00:41 -0500559func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500560 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400561 log.Warn("invalid-number-of-args", log.Fields{"args": args})
562 err := errors.New("invalid-number-of-args")
563 return nil, err
564 }
565 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500566 operStatus := &ic.IntType{}
567 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500568 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400569 for _, arg := range args {
570 switch arg.Key {
571 case "device_id":
572 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
573 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
574 return nil, err
575 }
576 case "oper_status":
577 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
578 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
579 return nil, err
580 }
khenaidoob9203542018-09-17 22:56:37 -0400581 case "connect_status":
582 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
583 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
584 return nil, err
585 }
khenaidoo297cd252019-02-07 22:10:23 -0500586 case kafka.TransactionKey:
587 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
588 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
589 return nil, err
590 }
khenaidoob9203542018-09-17 22:56:37 -0400591 }
592 }
khenaidoo297cd252019-02-07 22:10:23 -0500593 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
594 "conn-status": connStatus, "transactionID": transactionID.Val})
595
596 // Try to grab the transaction as this core may be competing with another Core
597 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400598 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500599 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
600 // returning nil, nil instructs the callee to ignore this request
601 return nil, nil
602 } else {
603 defer txn.Close()
604 }
605 }
606
khenaidoob9203542018-09-17 22:56:37 -0400607 if rhp.TestMode { // Execute only for test cases
608 return nil, nil
609 }
khenaidoo92e62c52018-10-03 14:02:54 -0400610 // 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 -0400611 go rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
612 voltha.ConnectStatus_ConnectStatus(connStatus.Val))
613
614 //if err := rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
615 // voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
616 // return nil, err
617 //}
khenaidoo92e62c52018-10-03 14:02:54 -0400618 return new(empty.Empty), nil
619}
620
khenaidoo79232702018-12-04 11:00:41 -0500621func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500622 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400623 log.Warn("invalid-number-of-args", log.Fields{"args": args})
624 err := errors.New("invalid-number-of-args")
625 return nil, err
626 }
627 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500628 operStatus := &ic.IntType{}
629 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500630 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400631 for _, arg := range args {
632 switch arg.Key {
633 case "device_id":
634 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
635 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
636 return nil, err
637 }
638 case "oper_status":
639 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
640 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
641 return nil, err
642 }
643 case "connect_status":
644 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
645 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
646 return nil, err
647 }
khenaidoo297cd252019-02-07 22:10:23 -0500648 case kafka.TransactionKey:
649 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
650 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
651 return nil, err
652 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400653 }
654 }
khenaidoo297cd252019-02-07 22:10:23 -0500655 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus,
656 "conn-status": connStatus, "transactionID": transactionID.Val})
657
658 // Try to grab the transaction as this core may be competing with another Core
659 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400660 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500661 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
662 // returning nil, nil instructs the callee to ignore this request
663 return nil, nil
664 } else {
665 defer txn.Close()
666 }
667 }
668
khenaidoo4d4802d2018-10-04 21:59:49 -0400669 if rhp.TestMode { // Execute only for test cases
670 return nil, nil
671 }
672
673 // 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 -0400674 go rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
675 voltha.ConnectStatus_ConnectStatus(connStatus.Val))
676
677 //if err := rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val),
678 // voltha.ConnectStatus_ConnectStatus(connStatus.Val)); err != nil {
679 // return nil, err
680 //}
khenaidoo4d4802d2018-10-04 21:59:49 -0400681 return new(empty.Empty), nil
682}
683
khenaidoo3ab34882019-05-02 21:33:30 -0400684func (rhp *AdapterRequestHandlerProxy) PortsStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
685 if len(args) < 2 {
686 log.Warn("invalid-number-of-args", log.Fields{"args": args})
687 err := errors.New("invalid-number-of-args")
688 return nil, err
689 }
690 deviceId := &voltha.ID{}
691 operStatus := &ic.IntType{}
692 transactionID := &ic.StrType{}
693 for _, arg := range args {
694 switch arg.Key {
695 case "device_id":
696 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
697 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
698 return nil, err
699 }
700 case "oper_status":
701 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
702 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
703 return nil, err
704 }
705 case kafka.TransactionKey:
706 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
707 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
708 return nil, err
709 }
710 }
711 }
712 log.Debugw("PortsStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus, "transactionID": transactionID.Val})
713
714 // Try to grab the transaction as this core may be competing with another Core
715 if rhp.competeForTransaction() {
716 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
717 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
718 // returning nil, nil instructs the callee to ignore this request
719 return nil, nil
720 } else {
721 defer txn.Close()
722 }
723 }
724
725 if rhp.TestMode { // Execute only for test cases
726 return nil, nil
727 }
728
729 go rhp.deviceMgr.updatePortsState(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val))
730
731 return new(empty.Empty), nil
732}
733
khenaidoo79232702018-12-04 11:00:41 -0500734func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500735 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400736 log.Warn("invalid-number-of-args", log.Fields{"args": args})
737 err := errors.New("invalid-number-of-args")
738 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400739 }
khenaidoo92e62c52018-10-03 14:02:54 -0400740 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500741 portType := &ic.IntType{}
742 portNo := &ic.IntType{}
743 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500744 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400745 for _, arg := range args {
746 switch arg.Key {
747 case "device_id":
748 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
749 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
750 return nil, err
751 }
752 case "oper_status":
753 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
754 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
755 return nil, err
756 }
757 case "port_type":
758 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
759 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
760 return nil, err
761 }
762 case "port_no":
763 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
764 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
765 return nil, err
766 }
khenaidoo297cd252019-02-07 22:10:23 -0500767 case kafka.TransactionKey:
768 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
769 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
770 return nil, err
771 }
khenaidoo92e62c52018-10-03 14:02:54 -0400772 }
773 }
khenaidoo297cd252019-02-07 22:10:23 -0500774 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus,
775 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
776
777 // Try to grab the transaction as this core may be competing with another Core
778 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400779 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500780 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
781 // returning nil, nil instructs the callee to ignore this request
782 return nil, nil
783 } else {
784 defer txn.Close()
785 }
786 }
787
khenaidoo92e62c52018-10-03 14:02:54 -0400788 if rhp.TestMode { // Execute only for test cases
789 return nil, nil
790 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400791
792 go rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
793 voltha.OperStatus_OperStatus(operStatus.Val))
794
795 //if err := rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
796 // voltha.OperStatus_OperStatus(operStatus.Val)); err != nil {
797 // return nil, err
798 //}
khenaidoob9203542018-09-17 22:56:37 -0400799 return new(empty.Empty), nil
800}
801
khenaidoo0a822f92019-05-08 15:15:57 -0400802func (rhp *AdapterRequestHandlerProxy) DeleteAllPorts(args []*ic.Argument) (*empty.Empty, error) {
803 if len(args) < 3 {
804 log.Warn("invalid-number-of-args", log.Fields{"args": args})
805 err := errors.New("invalid-number-of-args")
806 return nil, err
807 }
808 deviceId := &voltha.ID{}
809 transactionID := &ic.StrType{}
810 for _, arg := range args {
811 switch arg.Key {
812 case "device_id":
813 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
814 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
815 return nil, err
816 }
817 case kafka.TransactionKey:
818 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
819 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
820 return nil, err
821 }
822 }
823 }
824 log.Debugw("DeleteAllPorts", log.Fields{"deviceId": deviceId.Id, "transactionID": transactionID.Val})
825
826 // Try to grab the transaction as this core may be competing with another Core
827 if rhp.competeForTransaction() {
828 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
829 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
830 // returning nil, nil instructs the callee to ignore this request
831 return nil, nil
832 } else {
833 defer txn.Close()
834 }
835 }
836
837 if rhp.TestMode { // Execute only for test cases
838 return nil, nil
839 }
840
841 go rhp.deviceMgr.deleteAllPorts(deviceId.Id)
842
843 return new(empty.Empty), nil
844}
845
846func (rhp *AdapterRequestHandlerProxy) ChildDevicesLost(args []*ic.Argument) (*empty.Empty, error) {
847 if len(args) < 2 {
848 log.Warn("invalid-number-of-args", log.Fields{"args": args})
849 err := errors.New("invalid-number-of-args")
850 return nil, err
851 }
852 parentDeviceId := &voltha.ID{}
853 transactionID := &ic.StrType{}
854 for _, arg := range args {
855 switch arg.Key {
856 case "parent_device_id":
857 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceId); err != nil {
858 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
859 return nil, err
860 }
861 case kafka.TransactionKey:
862 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
863 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
864 return nil, err
865 }
866 }
867 }
868 log.Debugw("ChildDevicesLost", log.Fields{"deviceId": parentDeviceId.Id, "transactionID": transactionID.Val})
869
870 // Try to grab the transaction as this core may be competing with another Core
871 if rhp.competeForTransaction() {
872 if txn, err := rhp.takeRequestOwnership(transactionID.Val, parentDeviceId.Id); err != nil {
873 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
874 // returning nil, nil instructs the callee to ignore this request
875 return nil, nil
876 } else {
877 defer txn.Close()
878 }
879 }
880
881 if rhp.TestMode { // Execute only for test cases
882 return nil, nil
883 }
884
885 go rhp.deviceMgr.childDevicesLost(parentDeviceId.Id)
886
887 return new(empty.Empty), nil
888}
889
890func (rhp *AdapterRequestHandlerProxy) ChildDevicesDetected(args []*ic.Argument) (*empty.Empty, error) {
891 if len(args) < 2 {
892 log.Warn("invalid-number-of-args", log.Fields{"args": args})
893 err := errors.New("invalid-number-of-args")
894 return nil, err
895 }
896 parentDeviceId := &voltha.ID{}
897 transactionID := &ic.StrType{}
898 for _, arg := range args {
899 switch arg.Key {
900 case "parent_device_id":
901 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceId); err != nil {
902 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
903 return nil, err
904 }
905 case kafka.TransactionKey:
906 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
907 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
908 return nil, err
909 }
910 }
911 }
912 log.Debugw("ChildDevicesDetected", log.Fields{"deviceId": parentDeviceId.Id, "transactionID": transactionID.Val})
913
914 // Try to grab the transaction as this core may be competing with another Core
915 if rhp.competeForTransaction() {
916 if txn, err := rhp.takeRequestOwnership(transactionID.Val, parentDeviceId.Id); err != nil {
917 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
918 // returning nil, nil instructs the callee to ignore this request
919 return nil, nil
920 } else {
921 defer txn.Close()
922 }
923 }
924
925 if rhp.TestMode { // Execute only for test cases
926 return nil, nil
927 }
928
khenaidoo59ef7be2019-06-21 12:40:28 -0400929 if err := rhp.deviceMgr.childDevicesDetected(parentDeviceId.Id); err != nil {
930 log.Errorw("child-devices-dection-failed", log.Fields{"parentId": parentDeviceId.Id, "error": err})
931 return nil, err
932 }
khenaidoo0a822f92019-05-08 15:15:57 -0400933
934 return new(empty.Empty), nil
935}
936
khenaidoo79232702018-12-04 11:00:41 -0500937func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500938 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400939 log.Warn("invalid-number-of-args", log.Fields{"args": args})
940 err := errors.New("invalid-number-of-args")
941 return nil, err
942 }
943 deviceId := &voltha.ID{}
944 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500945 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400946 for _, arg := range args {
947 switch arg.Key {
948 case "device_id":
949 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
950 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
951 return nil, err
952 }
953 case "port":
954 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
955 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
956 return nil, err
957 }
khenaidoo297cd252019-02-07 22:10:23 -0500958 case kafka.TransactionKey:
959 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
960 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
961 return nil, err
962 }
khenaidoob9203542018-09-17 22:56:37 -0400963 }
964 }
khenaidoo297cd252019-02-07 22:10:23 -0500965 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port, "transactionID": transactionID.Val})
966
967 // Try to grab the transaction as this core may be competing with another Core
968 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -0400969 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500970 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
971 // returning nil, nil instructs the callee to ignore this request
972 return nil, nil
973 } else {
974 defer txn.Close()
975 }
976 }
khenaidoob9203542018-09-17 22:56:37 -0400977
978 if rhp.TestMode { // Execute only for test cases
979 return nil, nil
980 }
khenaidoo1ce37ad2019-03-24 22:07:24 -0400981 go rhp.deviceMgr.addPort(deviceId.Id, port)
khenaidoo92e62c52018-10-03 14:02:54 -0400982
khenaidoob9203542018-09-17 22:56:37 -0400983 return new(empty.Empty), nil
984}
985
khenaidoo79232702018-12-04 11:00:41 -0500986func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob3127472019-07-24 21:04:55 -0400987 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400988 log.Warn("invalid-number-of-args", log.Fields{"args": args})
989 err := errors.New("invalid-number-of-args")
990 return nil, err
991 }
992 pmConfigs := &voltha.PmConfigs{}
khenaidoo297cd252019-02-07 22:10:23 -0500993 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400994 for _, arg := range args {
995 switch arg.Key {
996 case "device_pm_config":
997 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
998 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
999 return nil, err
1000 }
khenaidoo297cd252019-02-07 22:10:23 -05001001 case kafka.TransactionKey:
1002 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1003 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1004 return nil, err
1005 }
khenaidoob9203542018-09-17 22:56:37 -04001006 }
1007 }
khenaidoob9203542018-09-17 22:56:37 -04001008 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
khenaidoob3127472019-07-24 21:04:55 -04001009 "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -05001010
1011 // Try to grab the transaction as this core may be competing with another Core
1012 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -04001013 if txn, err := rhp.takeRequestOwnership(transactionID.Val, pmConfigs.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -05001014 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
1015 // returning nil, nil instructs the callee to ignore this request
1016 return nil, nil
1017 } else {
1018 defer txn.Close()
1019 }
1020 }
khenaidoob9203542018-09-17 22:56:37 -04001021
1022 if rhp.TestMode { // Execute only for test cases
1023 return nil, nil
1024 }
1025
khenaidoob3127472019-07-24 21:04:55 -04001026 go rhp.deviceMgr.initPmConfigs(pmConfigs.Id, pmConfigs)
khenaidoo92e62c52018-10-03 14:02:54 -04001027
khenaidoob9203542018-09-17 22:56:37 -04001028 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -04001029}
khenaidoofdbad6e2018-11-06 22:26:38 -05001030
khenaidoo79232702018-12-04 11:00:41 -05001031func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -05001032 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -05001033 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1034 err := errors.New("invalid-number-of-args")
1035 return nil, err
1036 }
1037 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -05001038 portNo := &ic.IntType{}
1039 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -05001040 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -05001041 for _, arg := range args {
1042 switch arg.Key {
1043 case "device_id":
1044 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
1045 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1046 return nil, err
1047 }
1048 case "port":
1049 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
1050 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
1051 return nil, err
1052 }
1053 case "packet":
1054 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
1055 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
1056 return nil, err
1057 }
khenaidoo297cd252019-02-07 22:10:23 -05001058 case kafka.TransactionKey:
1059 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1060 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1061 return nil, err
1062 }
khenaidoofdbad6e2018-11-06 22:26:38 -05001063 }
1064 }
khenaidoo297cd252019-02-07 22:10:23 -05001065 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet,
1066 "transactionID": transactionID.Val})
1067
khenaidoo3d3b8c22019-05-22 18:10:39 -04001068 // Try to grab the transaction as this core may be competing with another Core
1069 // TODO: If this adds too much latencies then needs to remove transaction and let OFAgent filter out
1070 // duplicates.
1071 if rhp.competeForTransaction() {
1072 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
1073 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
1074 return nil, nil
1075 } else {
1076 defer txn.Close()
1077 }
1078 }
khenaidoofdbad6e2018-11-06 22:26:38 -05001079 if rhp.TestMode { // Execute only for test cases
1080 return nil, nil
1081 }
khenaidoo1ce37ad2019-03-24 22:07:24 -04001082 go rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), transactionID.Val, packet.Payload)
khenaidoo3d3b8c22019-05-22 18:10:39 -04001083
khenaidoofdbad6e2018-11-06 22:26:38 -05001084 return new(empty.Empty), nil
1085}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001086
khenaidoof5a5bfa2019-01-23 22:20:29 -05001087func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
1088 if len(args) < 2 {
1089 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1090 err := errors.New("invalid-number-of-args")
1091 return nil, err
1092 }
1093 deviceId := &voltha.ID{}
1094 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -05001095 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001096 for _, arg := range args {
1097 switch arg.Key {
1098 case "device_id":
1099 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
1100 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1101 return nil, err
1102 }
1103 case "image_download":
1104 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
1105 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
1106 return nil, err
1107 }
khenaidoo297cd252019-02-07 22:10:23 -05001108 case kafka.TransactionKey:
1109 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1110 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1111 return nil, err
1112 }
khenaidoof5a5bfa2019-01-23 22:20:29 -05001113 }
1114 }
khenaidoo297cd252019-02-07 22:10:23 -05001115 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img,
1116 "transactionID": transactionID.Val})
1117
1118 // Try to grab the transaction as this core may be competing with another Core
1119 if rhp.competeForTransaction() {
Richard Jankowski199fd862019-03-18 14:49:51 -04001120 if txn, err := rhp.takeRequestOwnership(transactionID.Val, deviceId.Id); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -05001121 log.Debugw("Another core handled the request", log.Fields{"transactionID": transactionID})
1122 // returning nil, nil instructs the callee to ignore this request
1123 return nil, nil
1124 } else {
1125 defer txn.Close()
1126 }
1127 }
1128
khenaidoof5a5bfa2019-01-23 22:20:29 -05001129 if rhp.TestMode { // Execute only for test cases
1130 return nil, nil
1131 }
khenaidoo1ce37ad2019-03-24 22:07:24 -04001132 go rhp.deviceMgr.updateImageDownload(deviceId.Id, img)
1133 //if err := rhp.deviceMgr.updateImageDownload(deviceId.Id, img); err != nil {
1134 // return nil, err
1135 //}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001136 return new(empty.Empty), nil
1137}