blob: 85af539a6a81faedb57fff0f20fe523022d4fb8f [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 */
npujar1d86a522019-11-14 17:11:16 +053016
khenaidoob9203542018-09-17 22:56:37 -040017package core
18
19import (
npujar1d86a522019-11-14 17:11:16 +053020 "context"
khenaidoob9203542018-09-17 22:56:37 -040021 "errors"
22 "github.com/golang/protobuf/ptypes"
23 "github.com/golang/protobuf/ptypes/empty"
sbarbari17d7e222019-11-05 10:02:29 -050024 "github.com/opencord/voltha-go/db/model"
khenaidoo1ce37ad2019-03-24 22:07:24 -040025 "github.com/opencord/voltha-go/rw_core/utils"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080026 "github.com/opencord/voltha-lib-go/v3/pkg/kafka"
27 "github.com/opencord/voltha-lib-go/v3/pkg/log"
28 ic "github.com/opencord/voltha-protos/v3/go/inter_container"
29 "github.com/opencord/voltha-protos/v3/go/voltha"
khenaidoo442e7c72020-03-10 16:13:48 -040030 "time"
khenaidoob9203542018-09-17 22:56:37 -040031)
32
npujar1d86a522019-11-14 17:11:16 +053033// AdapterRequestHandlerProxy represent adapter request handler proxy attributes
khenaidoob9203542018-09-17 22:56:37 -040034type AdapterRequestHandlerProxy struct {
npujar1d86a522019-11-14 17:11:16 +053035 coreInstanceID string
khenaidoode93b462019-02-13 22:17:21 -050036 deviceMgr *DeviceManager
37 lDeviceMgr *LogicalDeviceManager
38 adapterMgr *AdapterManager
39 localDataProxy *model.Proxy
40 clusterDataProxy *model.Proxy
khenaidoo442e7c72020-03-10 16:13:48 -040041 defaultRequestTimeout time.Duration
42 longRunningRequestTimeout time.Duration
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
npujar1d86a522019-11-14 17:11:16 +053047// NewAdapterRequestHandlerProxy assigns values for adapter request handler proxy attributes and returns the new instance
48func NewAdapterRequestHandlerProxy(core *Core, coreInstanceID string, dMgr *DeviceManager, ldMgr *LogicalDeviceManager,
khenaidoo442e7c72020-03-10 16:13:48 -040049 aMgr *AdapterManager, cdProxy *model.Proxy, ldProxy *model.Proxy, incompetingMode bool, longRunningRequestTimeout time.Duration,
50 defaultRequestTimeout time.Duration) *AdapterRequestHandlerProxy {
khenaidoob9203542018-09-17 22:56:37 -040051 var proxy AdapterRequestHandlerProxy
Richard Jankowski199fd862019-03-18 14:49:51 -040052 proxy.core = core
npujar1d86a522019-11-14 17:11:16 +053053 proxy.coreInstanceID = coreInstanceID
khenaidoob9203542018-09-17 22:56:37 -040054 proxy.deviceMgr = dMgr
55 proxy.lDeviceMgr = ldMgr
56 proxy.clusterDataProxy = cdProxy
57 proxy.localDataProxy = ldProxy
khenaidoo21d51152019-02-01 13:48:37 -050058 proxy.adapterMgr = aMgr
khenaidoo297cd252019-02-07 22:10:23 -050059 proxy.coreInCompetingMode = incompetingMode
60 proxy.defaultRequestTimeout = defaultRequestTimeout
61 proxy.longRunningRequestTimeout = longRunningRequestTimeout
khenaidoob9203542018-09-17 22:56:37 -040062 return &proxy
63}
64
Richard Jankowski199fd862019-03-18 14:49:51 -040065// This is a helper function that attempts to acquire the request by using the device ownership model
npujar467fe752020-01-16 20:17:45 +053066func (rhp *AdapterRequestHandlerProxy) takeRequestOwnership(ctx context.Context, transactionID string, devID string, maxTimeout ...int64) (*KVTransaction, error) {
khenaidoo442e7c72020-03-10 16:13:48 -040067 timeout := rhp.defaultRequestTimeout.Milliseconds()
Richard Jankowski199fd862019-03-18 14:49:51 -040068 if len(maxTimeout) > 0 {
69 timeout = maxTimeout[0]
70 }
npujar1d86a522019-11-14 17:11:16 +053071 txn := NewKVTransaction(transactionID)
Richard Jankowski199fd862019-03-18 14:49:51 -040072 if txn == nil {
73 return nil, errors.New("fail-to-create-transaction")
74 }
75
khenaidoo09771ef2019-10-11 14:25:02 -040076 var acquired bool
77 var err error
npujar1d86a522019-11-14 17:11:16 +053078 if devID != "" {
khenaidoo09771ef2019-10-11 14:25:02 -040079 var ownedByMe bool
npujar467fe752020-01-16 20:17:45 +053080 if ownedByMe, err = rhp.core.deviceOwnership.OwnedByMe(ctx, &utils.DeviceID{ID: devID}); err != nil {
npujar1d86a522019-11-14 17:11:16 +053081 log.Warnw("getting-ownership-failed", log.Fields{"deviceId": devID, "error": err})
khenaidoo09771ef2019-10-11 14:25:02 -040082 return nil, kafka.ErrorTransactionInvalidId
Richard Jankowski199fd862019-03-18 14:49:51 -040083 }
npujar467fe752020-01-16 20:17:45 +053084 acquired, err = txn.Acquired(ctx, timeout, ownedByMe)
Richard Jankowski199fd862019-03-18 14:49:51 -040085 } else {
npujar467fe752020-01-16 20:17:45 +053086 acquired, err = txn.Acquired(ctx, timeout)
khenaidoo09771ef2019-10-11 14:25:02 -040087 }
88 if err == nil && acquired {
npujar1d86a522019-11-14 17:11:16 +053089 log.Debugw("transaction-acquired", log.Fields{"transactionId": txn.txnID})
khenaidoo09771ef2019-10-11 14:25:02 -040090 return txn, nil
Richard Jankowski199fd862019-03-18 14:49:51 -040091 }
npujar1d86a522019-11-14 17:11:16 +053092 log.Debugw("transaction-not-acquired", log.Fields{"transactionId": txn.txnID, "error": err})
93 return nil, kafka.ErrorTransactionNotAcquired
Richard Jankowski199fd862019-03-18 14:49:51 -040094}
95
khenaidoo297cd252019-02-07 22:10:23 -050096// competeForTransaction is a helper function to determine whether every request needs to compete with another
97// Core to execute the request
98func (rhp *AdapterRequestHandlerProxy) competeForTransaction() bool {
99 return rhp.coreInCompetingMode
100}
101
npujar1d86a522019-11-14 17:11:16 +0530102// Register registers the adapter
khenaidoo79232702018-12-04 11:00:41 -0500103func (rhp *AdapterRequestHandlerProxy) Register(args []*ic.Argument) (*voltha.CoreInstance, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500104 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400105 log.Warn("invalid-number-of-args", log.Fields{"args": args})
106 err := errors.New("invalid-number-of-args")
107 return nil, err
108 }
109 adapter := &voltha.Adapter{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500110 deviceTypes := &voltha.DeviceTypes{}
npujar1d86a522019-11-14 17:11:16 +0530111 transactionID := &ic.StrType{}
khenaidoo91ecfd62018-11-04 17:13:42 -0500112 for _, arg := range args {
113 switch arg.Key {
114 case "adapter":
115 if err := ptypes.UnmarshalAny(arg.Value, adapter); err != nil {
116 log.Warnw("cannot-unmarshal-adapter", log.Fields{"error": err})
117 return nil, err
118 }
119 case "deviceTypes":
120 if err := ptypes.UnmarshalAny(arg.Value, deviceTypes); err != nil {
121 log.Warnw("cannot-unmarshal-device-types", log.Fields{"error": err})
122 return nil, err
123 }
khenaidoo297cd252019-02-07 22:10:23 -0500124 case kafka.TransactionKey:
npujar1d86a522019-11-14 17:11:16 +0530125 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
khenaidoo297cd252019-02-07 22:10:23 -0500126 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
127 return nil, err
128 }
khenaidoo91ecfd62018-11-04 17:13:42 -0500129 }
khenaidoob9203542018-09-17 22:56:37 -0400130 }
khenaidoo442e7c72020-03-10 16:13:48 -0400131 log.Debugw("Register", log.Fields{"adapter": *adapter, "device-types": deviceTypes, "transaction-id": transactionID.Val, "core-id": rhp.coreInstanceID})
khenaidoo297cd252019-02-07 22:10:23 -0500132
133 // Try to grab the transaction as this core may be competing with another Core
134 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530135 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, "")
npujar1d86a522019-11-14 17:11:16 +0530136 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400137 if err.Error() == kafka.ErrorTransactionNotAcquired.Error() {
npujar1d86a522019-11-14 17:11:16 +0530138 log.Debugw("Another core handled the request", log.Fields{"transactionId": transactionID})
khenaidoo09771ef2019-10-11 14:25:02 -0400139 // Update our adapters in memory
npujar467fe752020-01-16 20:17:45 +0530140 go rhp.adapterMgr.updateAdaptersAndDevicetypesInMemory(context.TODO(), adapter)
khenaidoo09771ef2019-10-11 14:25:02 -0400141 }
142 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500143 }
npujar467fe752020-01-16 20:17:45 +0530144 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500145 }
Thomas Lee Se5a44012019-11-07 20:32:24 +0530146 return rhp.adapterMgr.registerAdapter(adapter, deviceTypes)
khenaidoob9203542018-09-17 22:56:37 -0400147}
148
npujar1d86a522019-11-14 17:11:16 +0530149// GetDevice returns device info
khenaidoo79232702018-12-04 11:00:41 -0500150func (rhp *AdapterRequestHandlerProxy) GetDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500151 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400152 log.Warn("invalid-number-of-args", log.Fields{"args": args})
153 err := errors.New("invalid-number-of-args")
154 return nil, err
155 }
khenaidoo297cd252019-02-07 22:10:23 -0500156
khenaidoob9203542018-09-17 22:56:37 -0400157 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500158 transactionID := &ic.StrType{}
159 for _, arg := range args {
160 switch arg.Key {
161 case "device_id":
162 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
163 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
164 return nil, err
165 }
166 case kafka.TransactionKey:
167 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
168 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
169 return nil, err
170 }
171 }
khenaidoob9203542018-09-17 22:56:37 -0400172 }
npujar1d86a522019-11-14 17:11:16 +0530173 log.Debugw("GetDevice", log.Fields{"deviceID": pID.Id, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500174
175 // Try to grab the transaction as this core may be competing with another Core
176 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530177 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530178 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400179 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
180 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500181 }
npujar467fe752020-01-16 20:17:45 +0530182 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500183 }
khenaidoob9203542018-09-17 22:56:37 -0400184
khenaidoob9203542018-09-17 22:56:37 -0400185 // Get the device via the device manager
npujar467fe752020-01-16 20:17:45 +0530186 device, err := rhp.deviceMgr.GetDevice(context.TODO(), pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530187 if err != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400188 log.Debugw("get-device-failed", log.Fields{"deviceID": pID.Id, "error": err})
khenaidoob9203542018-09-17 22:56:37 -0400189 }
khenaidoo442e7c72020-03-10 16:13:48 -0400190 return device, err
khenaidoob9203542018-09-17 22:56:37 -0400191}
192
npujar1d86a522019-11-14 17:11:16 +0530193// DeviceUpdate updates device using adapter data
khenaidoo79232702018-12-04 11:00:41 -0500194func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500195 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400196 log.Warn("invalid-number-of-args", log.Fields{"args": args})
197 err := errors.New("invalid-number-of-args")
198 return nil, err
199 }
khenaidoo297cd252019-02-07 22:10:23 -0500200
khenaidoob9203542018-09-17 22:56:37 -0400201 device := &voltha.Device{}
khenaidoo297cd252019-02-07 22:10:23 -0500202 transactionID := &ic.StrType{}
203 for _, arg := range args {
204 switch arg.Key {
205 case "device":
206 if err := ptypes.UnmarshalAny(arg.Value, device); err != nil {
207 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
208 return nil, err
209 }
210 case kafka.TransactionKey:
211 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
212 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
213 return nil, err
214 }
215 }
khenaidoob9203542018-09-17 22:56:37 -0400216 }
npujar1d86a522019-11-14 17:11:16 +0530217 log.Debugw("DeviceUpdate", log.Fields{"deviceID": device.Id, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500218
219 // Try to grab the transaction as this core may be competing with another Core
220 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530221 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, device.Id)
npujar1d86a522019-11-14 17:11:16 +0530222 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400223 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
224 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500225 }
npujar467fe752020-01-16 20:17:45 +0530226 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500227 }
khenaidoob9203542018-09-17 22:56:37 -0400228
npujar1d86a522019-11-14 17:11:16 +0530229 log.Debugw("DeviceUpdate got txn", log.Fields{"deviceID": device.Id, "transactionID": transactionID.Val})
khenaidoo442e7c72020-03-10 16:13:48 -0400230
231 if err := rhp.deviceMgr.updateDeviceUsingAdapterData(context.TODO(), device); err != nil {
232 log.Debugw("unable-to-update-device-using-adapter-data", log.Fields{"error": err})
233 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400234 }
khenaidoo442e7c72020-03-10 16:13:48 -0400235 return &empty.Empty{}, nil
khenaidoob9203542018-09-17 22:56:37 -0400236}
237
npujar1d86a522019-11-14 17:11:16 +0530238// GetChildDevice returns details of child device
khenaidoo79232702018-12-04 11:00:41 -0500239func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500240 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400241 log.Warn("invalid-number-of-args", log.Fields{"args": args})
242 err := errors.New("invalid-number-of-args")
243 return nil, err
244 }
khenaidoo297cd252019-02-07 22:10:23 -0500245
khenaidoo2c6f1672018-09-20 23:14:41 -0400246 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500247 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500248 serialNumber := &ic.StrType{}
npujar1d86a522019-11-14 17:11:16 +0530249 onuID := &ic.IntType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500250 parentPortNo := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500251 for _, arg := range args {
252 switch arg.Key {
253 case "device_id":
254 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
255 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
256 return nil, err
257 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500258 case "serial_number":
259 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
260 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
261 return nil, err
262 }
263 case "onu_id":
npujar1d86a522019-11-14 17:11:16 +0530264 if err := ptypes.UnmarshalAny(arg.Value, onuID); err != nil {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500265 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
266 return nil, err
267 }
268 case "parent_port_no":
269 if err := ptypes.UnmarshalAny(arg.Value, parentPortNo); err != nil {
270 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
271 return nil, err
272 }
khenaidoo297cd252019-02-07 22:10:23 -0500273 case kafka.TransactionKey:
274 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
275 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
276 return nil, err
277 }
278 }
khenaidoob9203542018-09-17 22:56:37 -0400279 }
npujar1d86a522019-11-14 17:11:16 +0530280 log.Debugw("GetChildDevice", log.Fields{"parentDeviceID": pID.Id, "args": args, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500281
282 // Try to grab the transaction as this core may be competing with another Core
283 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530284 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530285 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400286 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
287 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500288 }
npujar467fe752020-01-16 20:17:45 +0530289 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500290 }
khenaidoob9203542018-09-17 22:56:37 -0400291
npujar467fe752020-01-16 20:17:45 +0530292 return rhp.deviceMgr.GetChildDevice(context.TODO(), pID.Id, serialNumber.Val, onuID.Val, parentPortNo.Val)
khenaidoob9203542018-09-17 22:56:37 -0400293}
294
npujar1d86a522019-11-14 17:11:16 +0530295// GetChildDeviceWithProxyAddress returns details of child device with proxy address
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500296func (rhp *AdapterRequestHandlerProxy) GetChildDeviceWithProxyAddress(args []*ic.Argument) (*voltha.Device, error) {
297 if len(args) < 2 {
298 log.Warn("invalid-number-of-args", log.Fields{"args": args})
299 err := errors.New("invalid-number-of-args")
300 return nil, err
301 }
302
303 proxyAddress := &voltha.Device_ProxyAddress{}
304 transactionID := &ic.StrType{}
305 for _, arg := range args {
306 switch arg.Key {
307 case "proxy_address":
308 if err := ptypes.UnmarshalAny(arg.Value, proxyAddress); err != nil {
309 log.Warnw("cannot-unmarshal-proxy-address", log.Fields{"error": err})
310 return nil, err
311 }
312 case kafka.TransactionKey:
313 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
314 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
315 return nil, err
316 }
317 }
318 }
319 log.Debugw("GetChildDeviceWithProxyAddress", log.Fields{"proxyAddress": proxyAddress, "transactionID": transactionID.Val})
320
321 // Try to grab the transaction as this core may be competing with another Core
322 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530323 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, proxyAddress.DeviceId)
npujar1d86a522019-11-14 17:11:16 +0530324 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400325 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
326 return nil, err
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500327 }
npujar467fe752020-01-16 20:17:45 +0530328 defer txn.Close(context.TODO())
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500329 }
330
npujar467fe752020-01-16 20:17:45 +0530331 return rhp.deviceMgr.GetChildDeviceWithProxyAddress(context.TODO(), proxyAddress)
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500332}
333
npujar1d86a522019-11-14 17:11:16 +0530334// GetPorts returns the ports information of the device based on the port type.
khenaidoo79232702018-12-04 11:00:41 -0500335func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500336 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400337 log.Warn("invalid-number-of-args", log.Fields{"args": args})
338 err := errors.New("invalid-number-of-args")
339 return nil, err
340 }
npujar1d86a522019-11-14 17:11:16 +0530341 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500342 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500343 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400344 for _, arg := range args {
345 switch arg.Key {
346 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530347 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400348 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
349 return nil, err
350 }
351 case "port_type":
352 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
353 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
354 return nil, err
355 }
khenaidoo297cd252019-02-07 22:10:23 -0500356 case kafka.TransactionKey:
357 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
358 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
359 return nil, err
360 }
khenaidoo92e62c52018-10-03 14:02:54 -0400361 }
khenaidoob9203542018-09-17 22:56:37 -0400362 }
npujar1d86a522019-11-14 17:11:16 +0530363 log.Debugw("GetPorts", log.Fields{"deviceID": deviceID.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoo442e7c72020-03-10 16:13:48 -0400364
khenaidoo09771ef2019-10-11 14:25:02 -0400365 // Try to grab the transaction as this core may be competing with another Core
366 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530367 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530368 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400369 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
370 return nil, err
khenaidoo09771ef2019-10-11 14:25:02 -0400371 }
npujar467fe752020-01-16 20:17:45 +0530372 defer txn.Close(context.TODO())
khenaidoo09771ef2019-10-11 14:25:02 -0400373 }
374
npujar1d86a522019-11-14 17:11:16 +0530375 return rhp.deviceMgr.getPorts(context.TODO(), deviceID.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400376}
377
npujar1d86a522019-11-14 17:11:16 +0530378// GetChildDevices gets all the child device IDs from the device passed as parameter
khenaidoo297cd252019-02-07 22:10:23 -0500379func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500380 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400381 log.Warn("invalid-number-of-args", log.Fields{"args": args})
382 err := errors.New("invalid-number-of-args")
383 return nil, err
384 }
khenaidoo297cd252019-02-07 22:10:23 -0500385
khenaidoo2c6f1672018-09-20 23:14:41 -0400386 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500387 transactionID := &ic.StrType{}
388 for _, arg := range args {
389 switch arg.Key {
390 case "device_id":
391 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
392 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
393 return nil, err
394 }
395 case kafka.TransactionKey:
396 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
397 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
398 return nil, err
399 }
400 }
khenaidoob9203542018-09-17 22:56:37 -0400401 }
npujar1d86a522019-11-14 17:11:16 +0530402 log.Debugw("GetChildDevices", log.Fields{"deviceID": pID.Id, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500403
404 // Try to grab the transaction as this core may be competing with another Core
405 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530406 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530407 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400408 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
409 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500410 }
npujar467fe752020-01-16 20:17:45 +0530411 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500412 }
khenaidoob9203542018-09-17 22:56:37 -0400413
npujar467fe752020-01-16 20:17:45 +0530414 return rhp.deviceMgr.getAllChildDevices(context.TODO(), pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400415}
416
khenaidoo442e7c72020-03-10 16:13:48 -0400417// ChildDeviceDetected is invoked when a child device is detected. The following parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500418// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700419func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*voltha.Device, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500420 if len(args) < 5 {
khenaidoob9203542018-09-17 22:56:37 -0400421 log.Warn("invalid-number-of-args", log.Fields{"args": args})
422 err := errors.New("invalid-number-of-args")
423 return nil, err
424 }
425
426 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500427 portNo := &ic.IntType{}
428 dt := &ic.StrType{}
npujar1d86a522019-11-14 17:11:16 +0530429 chnlID := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500430 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500431 serialNumber := &ic.StrType{}
npujar1d86a522019-11-14 17:11:16 +0530432 vendorID := &ic.StrType{}
433 onuID := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400434 for _, arg := range args {
435 switch arg.Key {
436 case "parent_device_id":
437 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
438 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
439 return nil, err
440 }
441 case "parent_port_no":
442 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
443 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
444 return nil, err
445 }
446 case "child_device_type":
447 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
448 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
449 return nil, err
450 }
451 case "channel_id":
npujar1d86a522019-11-14 17:11:16 +0530452 if err := ptypes.UnmarshalAny(arg.Value, chnlID); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400453 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
454 return nil, err
455 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500456 case "vendor_id":
npujar1d86a522019-11-14 17:11:16 +0530457 if err := ptypes.UnmarshalAny(arg.Value, vendorID); err != nil {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500458 log.Warnw("cannot-unmarshal-vendor-id", log.Fields{"error": err})
459 return nil, err
460 }
461 case "serial_number":
462 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
463 log.Warnw("cannot-unmarshal-serial-number", log.Fields{"error": err})
464 return nil, err
465 }
466 case "onu_id":
npujar1d86a522019-11-14 17:11:16 +0530467 if err := ptypes.UnmarshalAny(arg.Value, onuID); err != nil {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500468 log.Warnw("cannot-unmarshal-onu-id", log.Fields{"error": err})
469 return nil, err
470 }
khenaidoo297cd252019-02-07 22:10:23 -0500471 case kafka.TransactionKey:
472 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
473 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
474 return nil, err
475 }
khenaidoob9203542018-09-17 22:56:37 -0400476 }
477 }
npujar1d86a522019-11-14 17:11:16 +0530478 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceID": pID.Id, "parentPortNo": portNo.Val,
479 "deviceType": dt.Val, "channelID": chnlID.Val, "serialNumber": serialNumber.Val,
480 "vendorID": vendorID.Val, "onuID": onuID.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500481
482 // Try to grab the transaction as this core may be competing with another Core
483 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530484 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pID.Id)
npujar1d86a522019-11-14 17:11:16 +0530485 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400486 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
487 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500488 }
npujar467fe752020-01-16 20:17:45 +0530489 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500490 }
khenaidoob9203542018-09-17 22:56:37 -0400491
npujar467fe752020-01-16 20:17:45 +0530492 device, err := rhp.deviceMgr.childDeviceDetected(context.TODO(), pID.Id, portNo.Val, dt.Val, chnlID.Val, vendorID.Val, serialNumber.Val, onuID.Val)
Mahir Gunyel6deaa242019-06-27 04:53:33 -0700493 if err != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400494 log.Debugw("child-detection-failed", log.Fields{"parentID": pID.Id, "onuID": onuID.Val, "error": err})
khenaidoo59ef7be2019-06-21 12:40:28 -0400495 }
khenaidoo442e7c72020-03-10 16:13:48 -0400496 return device, err
khenaidoob9203542018-09-17 22:56:37 -0400497}
498
npujar1d86a522019-11-14 17:11:16 +0530499// DeviceStateUpdate updates device status
khenaidoo79232702018-12-04 11:00:41 -0500500func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500501 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400502 log.Warn("invalid-number-of-args", log.Fields{"args": args})
503 err := errors.New("invalid-number-of-args")
504 return nil, err
505 }
npujar1d86a522019-11-14 17:11:16 +0530506 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500507 operStatus := &ic.IntType{}
508 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500509 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400510 for _, arg := range args {
511 switch arg.Key {
512 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530513 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400514 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
515 return nil, err
516 }
517 case "oper_status":
518 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
519 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
520 return nil, err
521 }
khenaidoob9203542018-09-17 22:56:37 -0400522 case "connect_status":
523 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
524 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
525 return nil, err
526 }
khenaidoo297cd252019-02-07 22:10:23 -0500527 case kafka.TransactionKey:
528 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
529 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
530 return nil, err
531 }
khenaidoob9203542018-09-17 22:56:37 -0400532 }
533 }
npujar1d86a522019-11-14 17:11:16 +0530534 log.Debugw("DeviceStateUpdate", log.Fields{"deviceID": deviceID.Id, "oper-status": operStatus,
khenaidoo297cd252019-02-07 22:10:23 -0500535 "conn-status": connStatus, "transactionID": transactionID.Val})
536
537 // Try to grab the transaction as this core may be competing with another Core
538 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530539 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530540 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400541 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
542 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500543 }
npujar467fe752020-01-16 20:17:45 +0530544 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500545 }
546
khenaidoo442e7c72020-03-10 16:13:48 -0400547 if err := rhp.deviceMgr.updateDeviceStatus(context.TODO(), deviceID.Id, voltha.OperStatus_Types(operStatus.Val),
548 voltha.ConnectStatus_Types(connStatus.Val)); err != nil {
549 log.Debugw("unable-to-update-device-status", log.Fields{"error": err})
550 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400551 }
khenaidoo442e7c72020-03-10 16:13:48 -0400552 return &empty.Empty{}, nil
khenaidoo92e62c52018-10-03 14:02:54 -0400553}
554
npujar1d86a522019-11-14 17:11:16 +0530555// ChildrenStateUpdate updates child device status
khenaidoo79232702018-12-04 11:00:41 -0500556func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500557 if len(args) < 3 {
khenaidoo4d4802d2018-10-04 21:59:49 -0400558 log.Warn("invalid-number-of-args", log.Fields{"args": args})
559 err := errors.New("invalid-number-of-args")
560 return nil, err
561 }
npujar1d86a522019-11-14 17:11:16 +0530562 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500563 operStatus := &ic.IntType{}
564 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500565 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400566 for _, arg := range args {
567 switch arg.Key {
568 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530569 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo4d4802d2018-10-04 21:59:49 -0400570 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
571 return nil, err
572 }
573 case "oper_status":
574 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
575 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
576 return nil, err
577 }
578 case "connect_status":
579 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
580 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
581 return nil, err
582 }
khenaidoo297cd252019-02-07 22:10:23 -0500583 case kafka.TransactionKey:
584 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
585 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
586 return nil, err
587 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400588 }
589 }
npujar1d86a522019-11-14 17:11:16 +0530590 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceID": deviceID.Id, "oper-status": operStatus,
khenaidoo297cd252019-02-07 22:10:23 -0500591 "conn-status": connStatus, "transactionID": transactionID.Val})
592
593 // Try to grab the transaction as this core may be competing with another Core
594 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530595 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530596 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400597 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
598 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500599 }
npujar467fe752020-01-16 20:17:45 +0530600 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500601 }
602
khenaidoo4d4802d2018-10-04 21:59:49 -0400603 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
khenaidoo442e7c72020-03-10 16:13:48 -0400604 if err := rhp.deviceMgr.updateChildrenStatus(context.TODO(), deviceID.Id, voltha.OperStatus_Types(operStatus.Val),
605 voltha.ConnectStatus_Types(connStatus.Val)); err != nil {
606 log.Debugw("unable-to-update-children-status", log.Fields{"error": err})
607 return nil, err
608 }
609 return &empty.Empty{}, nil
khenaidoo4d4802d2018-10-04 21:59:49 -0400610}
611
npujar1d86a522019-11-14 17:11:16 +0530612// PortsStateUpdate updates the ports state related to the device
khenaidoo3ab34882019-05-02 21:33:30 -0400613func (rhp *AdapterRequestHandlerProxy) PortsStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
614 if len(args) < 2 {
615 log.Warn("invalid-number-of-args", log.Fields{"args": args})
616 err := errors.New("invalid-number-of-args")
617 return nil, err
618 }
npujar1d86a522019-11-14 17:11:16 +0530619 deviceID := &voltha.ID{}
khenaidoo3ab34882019-05-02 21:33:30 -0400620 operStatus := &ic.IntType{}
621 transactionID := &ic.StrType{}
622 for _, arg := range args {
623 switch arg.Key {
624 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530625 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo3ab34882019-05-02 21:33:30 -0400626 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
627 return nil, err
628 }
629 case "oper_status":
630 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
631 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
632 return nil, err
633 }
634 case kafka.TransactionKey:
635 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
636 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
637 return nil, err
638 }
639 }
640 }
npujar1d86a522019-11-14 17:11:16 +0530641 log.Debugw("PortsStateUpdate", log.Fields{"deviceID": deviceID.Id, "operStatus": operStatus, "transactionID": transactionID.Val})
khenaidoo3ab34882019-05-02 21:33:30 -0400642
643 // Try to grab the transaction as this core may be competing with another Core
644 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530645 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530646 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400647 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
648 return nil, err
khenaidoo3ab34882019-05-02 21:33:30 -0400649 }
npujar467fe752020-01-16 20:17:45 +0530650 defer txn.Close(context.TODO())
khenaidoo3ab34882019-05-02 21:33:30 -0400651 }
652
khenaidoo442e7c72020-03-10 16:13:48 -0400653 if err := rhp.deviceMgr.updatePortsState(context.TODO(), deviceID.Id, voltha.OperStatus_Types(operStatus.Val)); err != nil {
654 log.Debugw("unable-to-update-ports-state", log.Fields{"error": err})
655 return nil, err
khenaidoo3ab34882019-05-02 21:33:30 -0400656 }
khenaidoo442e7c72020-03-10 16:13:48 -0400657 return &empty.Empty{}, nil
khenaidoo3ab34882019-05-02 21:33:30 -0400658}
659
npujar1d86a522019-11-14 17:11:16 +0530660// PortStateUpdate updates the port state of the device
khenaidoo79232702018-12-04 11:00:41 -0500661func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500662 if len(args) < 3 {
khenaidoo92e62c52018-10-03 14:02:54 -0400663 log.Warn("invalid-number-of-args", log.Fields{"args": args})
664 err := errors.New("invalid-number-of-args")
665 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400666 }
npujar1d86a522019-11-14 17:11:16 +0530667 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500668 portType := &ic.IntType{}
669 portNo := &ic.IntType{}
670 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500671 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400672 for _, arg := range args {
673 switch arg.Key {
674 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530675 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400676 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
677 return nil, err
678 }
679 case "oper_status":
680 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
681 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
682 return nil, err
683 }
684 case "port_type":
685 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
686 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
687 return nil, err
688 }
689 case "port_no":
690 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
691 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
692 return nil, err
693 }
khenaidoo297cd252019-02-07 22:10:23 -0500694 case kafka.TransactionKey:
695 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
696 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
697 return nil, err
698 }
khenaidoo92e62c52018-10-03 14:02:54 -0400699 }
700 }
npujar1d86a522019-11-14 17:11:16 +0530701 log.Debugw("PortStateUpdate", log.Fields{"deviceID": deviceID.Id, "operStatus": operStatus,
khenaidoo297cd252019-02-07 22:10:23 -0500702 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
703
704 // Try to grab the transaction as this core may be competing with another Core
705 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530706 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530707 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400708 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
709 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500710 }
npujar467fe752020-01-16 20:17:45 +0530711 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500712 }
713
khenaidoo442e7c72020-03-10 16:13:48 -0400714 if err := rhp.deviceMgr.updatePortState(context.TODO(), deviceID.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
715 voltha.OperStatus_Types(operStatus.Val)); err != nil {
716 // If the error doesn't change behavior and is essentially ignored, it is not an error, it is a
717 // warning.
718 // TODO: VOL-2707
719 log.Debugw("unable-to-update-port-state", log.Fields{"error": err})
720 return nil, err
khenaidoo92e62c52018-10-03 14:02:54 -0400721 }
khenaidoo442e7c72020-03-10 16:13:48 -0400722 return &empty.Empty{}, nil
khenaidoob9203542018-09-17 22:56:37 -0400723}
724
npujar1d86a522019-11-14 17:11:16 +0530725// DeleteAllPorts deletes all ports of device
khenaidoo0a822f92019-05-08 15:15:57 -0400726func (rhp *AdapterRequestHandlerProxy) DeleteAllPorts(args []*ic.Argument) (*empty.Empty, error) {
727 if len(args) < 3 {
728 log.Warn("invalid-number-of-args", log.Fields{"args": args})
729 err := errors.New("invalid-number-of-args")
730 return nil, err
731 }
npujar1d86a522019-11-14 17:11:16 +0530732 deviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400733 transactionID := &ic.StrType{}
734 for _, arg := range args {
735 switch arg.Key {
736 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530737 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400738 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
739 return nil, err
740 }
741 case kafka.TransactionKey:
742 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
743 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
744 return nil, err
745 }
746 }
747 }
npujar1d86a522019-11-14 17:11:16 +0530748 log.Debugw("DeleteAllPorts", log.Fields{"deviceID": deviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400749
750 // Try to grab the transaction as this core may be competing with another Core
751 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530752 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530753 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400754 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
755 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400756 }
npujar467fe752020-01-16 20:17:45 +0530757 defer txn.Close(context.TODO())
khenaidoo0a822f92019-05-08 15:15:57 -0400758 }
759
khenaidoo442e7c72020-03-10 16:13:48 -0400760 if err := rhp.deviceMgr.deleteAllPorts(context.TODO(), deviceID.Id); err != nil {
761 log.Debugw("unable-to-delete-ports", log.Fields{"error": err})
762 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400763 }
khenaidoo442e7c72020-03-10 16:13:48 -0400764 return &empty.Empty{}, nil
khenaidoo0a822f92019-05-08 15:15:57 -0400765}
766
npujar1d86a522019-11-14 17:11:16 +0530767// ChildDevicesLost indicates that a parent device is in a state (Disabled) where it cannot manage the child devices.
768// This will trigger the Core to disable all the child devices.
khenaidoo0a822f92019-05-08 15:15:57 -0400769func (rhp *AdapterRequestHandlerProxy) ChildDevicesLost(args []*ic.Argument) (*empty.Empty, error) {
770 if len(args) < 2 {
771 log.Warn("invalid-number-of-args", log.Fields{"args": args})
772 err := errors.New("invalid-number-of-args")
773 return nil, err
774 }
npujar1d86a522019-11-14 17:11:16 +0530775 parentDeviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400776 transactionID := &ic.StrType{}
777 for _, arg := range args {
778 switch arg.Key {
779 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +0530780 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400781 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
782 return nil, err
783 }
784 case kafka.TransactionKey:
785 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
786 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
787 return nil, err
788 }
789 }
790 }
npujar1d86a522019-11-14 17:11:16 +0530791 log.Debugw("ChildDevicesLost", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400792
793 // Try to grab the transaction as this core may be competing with another Core
794 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530795 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530796 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400797 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
798 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400799 }
npujar467fe752020-01-16 20:17:45 +0530800 defer txn.Close(context.TODO())
khenaidoo0a822f92019-05-08 15:15:57 -0400801 }
802
khenaidoo442e7c72020-03-10 16:13:48 -0400803 if err := rhp.deviceMgr.childDevicesLost(context.TODO(), parentDeviceID.Id); err != nil {
804 log.Debugw("unable-to-disable-child-devices", log.Fields{"error": err})
805 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400806 }
khenaidoo442e7c72020-03-10 16:13:48 -0400807 return &empty.Empty{}, nil
khenaidoo0a822f92019-05-08 15:15:57 -0400808}
809
npujar1d86a522019-11-14 17:11:16 +0530810// ChildDevicesDetected invoked by an adapter when child devices are found, typically after after a disable/enable sequence.
811// This will trigger the Core to Enable all the child devices of that parent.
khenaidoo0a822f92019-05-08 15:15:57 -0400812func (rhp *AdapterRequestHandlerProxy) ChildDevicesDetected(args []*ic.Argument) (*empty.Empty, error) {
813 if len(args) < 2 {
814 log.Warn("invalid-number-of-args", log.Fields{"args": args})
815 err := errors.New("invalid-number-of-args")
816 return nil, err
817 }
npujar1d86a522019-11-14 17:11:16 +0530818 parentDeviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400819 transactionID := &ic.StrType{}
820 for _, arg := range args {
821 switch arg.Key {
822 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +0530823 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400824 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
825 return nil, err
826 }
827 case kafka.TransactionKey:
828 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
829 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
830 return nil, err
831 }
832 }
833 }
npujar1d86a522019-11-14 17:11:16 +0530834 log.Debugw("ChildDevicesDetected", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400835
836 // Try to grab the transaction as this core may be competing with another Core
837 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530838 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530839 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400840 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
841 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400842 }
npujar467fe752020-01-16 20:17:45 +0530843 defer txn.Close(context.TODO())
khenaidoo0a822f92019-05-08 15:15:57 -0400844 }
845
npujar467fe752020-01-16 20:17:45 +0530846 if err := rhp.deviceMgr.childDevicesDetected(context.TODO(), parentDeviceID.Id); err != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400847 log.Debugw("child-devices-detection-failed", log.Fields{"parentID": parentDeviceID.Id, "error": err})
khenaidoo59ef7be2019-06-21 12:40:28 -0400848 return nil, err
849 }
khenaidoo442e7c72020-03-10 16:13:48 -0400850 return &empty.Empty{}, nil
khenaidoo0a822f92019-05-08 15:15:57 -0400851}
852
npujar1d86a522019-11-14 17:11:16 +0530853// PortCreated adds port to device
khenaidoo79232702018-12-04 11:00:41 -0500854func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500855 if len(args) < 3 {
khenaidoob9203542018-09-17 22:56:37 -0400856 log.Warn("invalid-number-of-args", log.Fields{"args": args})
857 err := errors.New("invalid-number-of-args")
858 return nil, err
859 }
npujar1d86a522019-11-14 17:11:16 +0530860 deviceID := &voltha.ID{}
khenaidoob9203542018-09-17 22:56:37 -0400861 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500862 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400863 for _, arg := range args {
864 switch arg.Key {
865 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530866 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400867 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
868 return nil, err
869 }
870 case "port":
871 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
872 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
873 return nil, err
874 }
khenaidoo297cd252019-02-07 22:10:23 -0500875 case kafka.TransactionKey:
876 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
877 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
878 return nil, err
879 }
khenaidoob9203542018-09-17 22:56:37 -0400880 }
881 }
npujar1d86a522019-11-14 17:11:16 +0530882 log.Debugw("PortCreated", log.Fields{"deviceID": deviceID.Id, "port": port, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500883
884 // Try to grab the transaction as this core may be competing with another Core
885 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530886 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530887 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400888 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
889 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500890 }
npujar467fe752020-01-16 20:17:45 +0530891 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500892 }
khenaidoob9203542018-09-17 22:56:37 -0400893
khenaidoo442e7c72020-03-10 16:13:48 -0400894 if err := rhp.deviceMgr.addPort(context.TODO(), deviceID.Id, port); err != nil {
895 log.Debugw("unable-to-add-port", log.Fields{"error": err})
896 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400897 }
khenaidoo442e7c72020-03-10 16:13:48 -0400898 return &empty.Empty{}, nil
khenaidoob9203542018-09-17 22:56:37 -0400899}
900
npujar1d86a522019-11-14 17:11:16 +0530901// DevicePMConfigUpdate initializes the pm configs as defined by the adapter.
khenaidoo79232702018-12-04 11:00:41 -0500902func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob3127472019-07-24 21:04:55 -0400903 if len(args) < 2 {
khenaidoob9203542018-09-17 22:56:37 -0400904 log.Warn("invalid-number-of-args", log.Fields{"args": args})
905 err := errors.New("invalid-number-of-args")
906 return nil, err
907 }
908 pmConfigs := &voltha.PmConfigs{}
khenaidoo297cd252019-02-07 22:10:23 -0500909 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400910 for _, arg := range args {
911 switch arg.Key {
912 case "device_pm_config":
913 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
914 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
915 return nil, err
916 }
khenaidoo297cd252019-02-07 22:10:23 -0500917 case kafka.TransactionKey:
918 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
919 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
920 return nil, err
921 }
khenaidoob9203542018-09-17 22:56:37 -0400922 }
923 }
npujar1d86a522019-11-14 17:11:16 +0530924 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceID": pmConfigs.Id, "configs": pmConfigs,
khenaidoob3127472019-07-24 21:04:55 -0400925 "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500926
927 // Try to grab the transaction as this core may be competing with another Core
928 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530929 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, pmConfigs.Id)
npujar1d86a522019-11-14 17:11:16 +0530930 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400931 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
932 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -0500933 }
npujar467fe752020-01-16 20:17:45 +0530934 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -0500935 }
khenaidoob9203542018-09-17 22:56:37 -0400936
khenaidoo442e7c72020-03-10 16:13:48 -0400937 if err := rhp.deviceMgr.initPmConfigs(context.TODO(), pmConfigs.Id, pmConfigs); err != nil {
938 log.Debugw("unable-to-initialize-pm-configs", log.Fields{"error": err})
939 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400940 }
khenaidoo442e7c72020-03-10 16:13:48 -0400941 return &empty.Empty{}, nil
khenaidoob9203542018-09-17 22:56:37 -0400942}
khenaidoofdbad6e2018-11-06 22:26:38 -0500943
npujar1d86a522019-11-14 17:11:16 +0530944// PacketIn sends the incoming packet of device
khenaidoo79232702018-12-04 11:00:41 -0500945func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500946 if len(args) < 4 {
khenaidoofdbad6e2018-11-06 22:26:38 -0500947 log.Warn("invalid-number-of-args", log.Fields{"args": args})
948 err := errors.New("invalid-number-of-args")
949 return nil, err
950 }
npujar1d86a522019-11-14 17:11:16 +0530951 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500952 portNo := &ic.IntType{}
953 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500954 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500955 for _, arg := range args {
956 switch arg.Key {
957 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530958 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoofdbad6e2018-11-06 22:26:38 -0500959 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
960 return nil, err
961 }
962 case "port":
963 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
964 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
965 return nil, err
966 }
967 case "packet":
968 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
969 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
970 return nil, err
971 }
khenaidoo297cd252019-02-07 22:10:23 -0500972 case kafka.TransactionKey:
973 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
974 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
975 return nil, err
976 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500977 }
978 }
npujar1d86a522019-11-14 17:11:16 +0530979 log.Debugw("PacketIn", log.Fields{"deviceID": deviceID.Id, "port": portNo.Val, "packet": packet,
khenaidoo297cd252019-02-07 22:10:23 -0500980 "transactionID": transactionID.Val})
981
khenaidoo3d3b8c22019-05-22 18:10:39 -0400982 // Try to grab the transaction as this core may be competing with another Core
983 // TODO: If this adds too much latencies then needs to remove transaction and let OFAgent filter out
984 // duplicates.
985 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +0530986 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +0530987 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -0400988 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
989 return nil, err
khenaidoo3d3b8c22019-05-22 18:10:39 -0400990 }
npujar467fe752020-01-16 20:17:45 +0530991 defer txn.Close(context.TODO())
khenaidoo3d3b8c22019-05-22 18:10:39 -0400992 }
khenaidoo3d3b8c22019-05-22 18:10:39 -0400993
khenaidoo442e7c72020-03-10 16:13:48 -0400994 if err := rhp.deviceMgr.PacketIn(context.TODO(), deviceID.Id, uint32(portNo.Val), transactionID.Val, packet.Payload); err != nil {
995 log.Debugw("unable-to-receive-packet-from-adapter", log.Fields{"error": err})
996 return nil, err
997
998 }
999 return &empty.Empty{}, nil
khenaidoofdbad6e2018-11-06 22:26:38 -05001000}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001001
npujar1d86a522019-11-14 17:11:16 +05301002// UpdateImageDownload updates image download
khenaidoof5a5bfa2019-01-23 22:20:29 -05001003func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
1004 if len(args) < 2 {
1005 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1006 err := errors.New("invalid-number-of-args")
1007 return nil, err
1008 }
npujar1d86a522019-11-14 17:11:16 +05301009 deviceID := &voltha.ID{}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001010 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -05001011 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -05001012 for _, arg := range args {
1013 switch arg.Key {
1014 case "device_id":
npujar1d86a522019-11-14 17:11:16 +05301015 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
khenaidoof5a5bfa2019-01-23 22:20:29 -05001016 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1017 return nil, err
1018 }
1019 case "image_download":
1020 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
1021 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
1022 return nil, err
1023 }
khenaidoo297cd252019-02-07 22:10:23 -05001024 case kafka.TransactionKey:
1025 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1026 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1027 return nil, err
1028 }
khenaidoof5a5bfa2019-01-23 22:20:29 -05001029 }
1030 }
npujar1d86a522019-11-14 17:11:16 +05301031 log.Debugw("UpdateImageDownload", log.Fields{"deviceID": deviceID.Id, "image-download": img,
khenaidoo297cd252019-02-07 22:10:23 -05001032 "transactionID": transactionID.Val})
1033
1034 // Try to grab the transaction as this core may be competing with another Core
1035 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301036 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301037 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001038 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1039 return nil, err
khenaidoo297cd252019-02-07 22:10:23 -05001040 }
npujar467fe752020-01-16 20:17:45 +05301041 defer txn.Close(context.TODO())
khenaidoo297cd252019-02-07 22:10:23 -05001042 }
1043
khenaidoo442e7c72020-03-10 16:13:48 -04001044 if err := rhp.deviceMgr.updateImageDownload(context.TODO(), deviceID.Id, img); err != nil {
1045 log.Debugw("unable-to-update-image-download", log.Fields{"error": err})
1046 return nil, err
khenaidoof5a5bfa2019-01-23 22:20:29 -05001047 }
khenaidoo442e7c72020-03-10 16:13:48 -04001048 return &empty.Empty{}, nil
khenaidoof5a5bfa2019-01-23 22:20:29 -05001049}
khenaidooba6b6c42019-08-02 09:11:56 -04001050
npujar1d86a522019-11-14 17:11:16 +05301051// ReconcileChildDevices reconciles child devices
khenaidooba6b6c42019-08-02 09:11:56 -04001052func (rhp *AdapterRequestHandlerProxy) ReconcileChildDevices(args []*ic.Argument) (*empty.Empty, error) {
1053 if len(args) < 2 {
1054 log.Warn("invalid-number-of-args", log.Fields{"args": args})
1055 err := errors.New("invalid-number-of-args")
1056 return nil, err
1057 }
npujar1d86a522019-11-14 17:11:16 +05301058 parentDeviceID := &voltha.ID{}
khenaidooba6b6c42019-08-02 09:11:56 -04001059 transactionID := &ic.StrType{}
1060 for _, arg := range args {
1061 switch arg.Key {
1062 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +05301063 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
khenaidooba6b6c42019-08-02 09:11:56 -04001064 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1065 return nil, err
1066 }
1067 case kafka.TransactionKey:
1068 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1069 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1070 return nil, err
1071 }
1072 }
1073 }
npujar1d86a522019-11-14 17:11:16 +05301074 log.Debugw("ReconcileChildDevices", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidooba6b6c42019-08-02 09:11:56 -04001075
1076 // Try to grab the transaction as this core may be competing with another Core
1077 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301078 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, parentDeviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301079 if err != nil {
khenaidoo09771ef2019-10-11 14:25:02 -04001080 log.Debugw("Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1081 return nil, err
khenaidooba6b6c42019-08-02 09:11:56 -04001082 }
npujar467fe752020-01-16 20:17:45 +05301083 defer txn.Close(context.TODO())
khenaidooba6b6c42019-08-02 09:11:56 -04001084 }
1085
khenaidoo442e7c72020-03-10 16:13:48 -04001086 if err := rhp.deviceMgr.reconcileChildDevices(context.TODO(), parentDeviceID.Id); err != nil {
1087 log.Debugw("unable-to-reconcile-child-devices", log.Fields{"error": err})
1088 return nil, err
khenaidooba6b6c42019-08-02 09:11:56 -04001089 }
khenaidoo442e7c72020-03-10 16:13:48 -04001090 return &empty.Empty{}, nil
khenaidooba6b6c42019-08-02 09:11:56 -04001091}
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001092
npujar1d86a522019-11-14 17:11:16 +05301093// DeviceReasonUpdate updates device reason
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001094func (rhp *AdapterRequestHandlerProxy) DeviceReasonUpdate(args []*ic.Argument) (*empty.Empty, error) {
1095 if len(args) < 2 {
1096 log.Warn("DeviceReasonUpdate: invalid-number-of-args", log.Fields{"args": args})
1097 err := errors.New("DeviceReasonUpdate: invalid-number-of-args")
1098 return nil, err
1099 }
npujar1d86a522019-11-14 17:11:16 +05301100 deviceID := &voltha.ID{}
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001101 reason := &ic.StrType{}
1102 transactionID := &ic.StrType{}
1103 for _, arg := range args {
1104 switch arg.Key {
1105 case "device_id":
npujar1d86a522019-11-14 17:11:16 +05301106 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001107 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
1108 return nil, err
1109 }
1110 case "device_reason":
1111 if err := ptypes.UnmarshalAny(arg.Value, reason); err != nil {
1112 log.Warnw("cannot-unmarshal-reason", log.Fields{"error": err})
1113 return nil, err
1114 }
1115 case kafka.TransactionKey:
1116 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
1117 log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
1118 return nil, err
1119 }
1120 }
1121 }
npujar1d86a522019-11-14 17:11:16 +05301122 log.Debugw("DeviceReasonUpdate", log.Fields{"deviceId": deviceID.Id, "reason": reason.Val,
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001123 "transactionID": transactionID.Val})
1124
1125 // Try to grab the transaction as this core may be competing with another Core
1126 if rhp.competeForTransaction() {
npujar467fe752020-01-16 20:17:45 +05301127 txn, err := rhp.takeRequestOwnership(context.TODO(), transactionID.Val, deviceID.Id)
npujar1d86a522019-11-14 17:11:16 +05301128 if err != nil {
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001129 log.Debugw("DeviceReasonUpdate: Core did not process request", log.Fields{"transactionID": transactionID, "error": err})
1130 return nil, err
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001131 }
npujar467fe752020-01-16 20:17:45 +05301132 defer txn.Close(context.TODO())
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001133 }
1134
khenaidoo442e7c72020-03-10 16:13:48 -04001135 if err := rhp.deviceMgr.updateDeviceReason(context.TODO(), deviceID.Id, reason.Val); err != nil {
1136 log.Debugw("unable-to-update-device-reason", log.Fields{"error": err})
1137 return nil, err
1138
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001139 }
khenaidoo442e7c72020-03-10 16:13:48 -04001140 return &empty.Empty{}, nil
Mahir Gunyelfdee9212019-10-16 16:52:21 -07001141}