blob: d1e655e9be2aa7af3feffc9f60c5b955f21b8f48 [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
Kent Hagerman2b216042020-04-03 18:28:56 -040017package api
khenaidoob9203542018-09-17 22:56:37 -040018
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"
Kent Hagerman2f0d0552020-04-23 17:28:52 -040024 "github.com/opencord/voltha-go/rw_core/core/adapter"
25 "github.com/opencord/voltha-go/rw_core/core/device"
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"
khenaidoob9203542018-09-17 22:56:37 -040030)
31
npujar1d86a522019-11-14 17:11:16 +053032// AdapterRequestHandlerProxy represent adapter request handler proxy attributes
khenaidoob9203542018-09-17 22:56:37 -040033type AdapterRequestHandlerProxy struct {
Kent Hagerman2f0d0552020-04-23 17:28:52 -040034 deviceMgr *device.Manager
35 adapterMgr *adapter.Manager
khenaidoob9203542018-09-17 22:56:37 -040036}
37
npujar1d86a522019-11-14 17:11:16 +053038// NewAdapterRequestHandlerProxy assigns values for adapter request handler proxy attributes and returns the new instance
Kent Hagerman2f0d0552020-04-23 17:28:52 -040039func NewAdapterRequestHandlerProxy(dMgr *device.Manager, aMgr *adapter.Manager) *AdapterRequestHandlerProxy {
40 return &AdapterRequestHandlerProxy{
41 deviceMgr: dMgr,
42 adapterMgr: aMgr,
43 }
khenaidoob9203542018-09-17 22:56:37 -040044}
45
Rohan Agrawal31f21802020-06-12 05:38:46 +000046func (rhp *AdapterRequestHandlerProxy) Register(ctx context.Context, args []*ic.Argument) (*voltha.CoreInstance, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -050047 if len(args) < 3 {
Rohan Agrawal31f21802020-06-12 05:38:46 +000048 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -040049 err := errors.New("invalid-number-of-args")
50 return nil, err
51 }
52 adapter := &voltha.Adapter{}
khenaidoo91ecfd62018-11-04 17:13:42 -050053 deviceTypes := &voltha.DeviceTypes{}
npujar1d86a522019-11-14 17:11:16 +053054 transactionID := &ic.StrType{}
khenaidoo91ecfd62018-11-04 17:13:42 -050055 for _, arg := range args {
56 switch arg.Key {
57 case "adapter":
58 if err := ptypes.UnmarshalAny(arg.Value, adapter); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +000059 logger.Warnw(ctx, "cannot-unmarshal-adapter", log.Fields{"error": err})
khenaidoo91ecfd62018-11-04 17:13:42 -050060 return nil, err
61 }
62 case "deviceTypes":
63 if err := ptypes.UnmarshalAny(arg.Value, deviceTypes); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +000064 logger.Warnw(ctx, "cannot-unmarshal-device-types", log.Fields{"error": err})
khenaidoo91ecfd62018-11-04 17:13:42 -050065 return nil, err
66 }
khenaidoo297cd252019-02-07 22:10:23 -050067 case kafka.TransactionKey:
npujar1d86a522019-11-14 17:11:16 +053068 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +000069 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -050070 return nil, err
71 }
khenaidoo91ecfd62018-11-04 17:13:42 -050072 }
khenaidoob9203542018-09-17 22:56:37 -040073 }
Rohan Agrawal31f21802020-06-12 05:38:46 +000074 logger.Debugw(ctx, "Register", log.Fields{"adapter": *adapter, "device-types": deviceTypes, "transaction-id": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -050075
Rohan Agrawal31f21802020-06-12 05:38:46 +000076 return rhp.adapterMgr.RegisterAdapter(ctx, adapter, deviceTypes)
khenaidoob9203542018-09-17 22:56:37 -040077}
78
npujar1d86a522019-11-14 17:11:16 +053079// GetDevice returns device info
Rohan Agrawal31f21802020-06-12 05:38:46 +000080func (rhp *AdapterRequestHandlerProxy) GetDevice(ctx context.Context, args []*ic.Argument) (*voltha.Device, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -050081 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +000082 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -040083 err := errors.New("invalid-number-of-args")
84 return nil, err
85 }
khenaidoo297cd252019-02-07 22:10:23 -050086
khenaidoob9203542018-09-17 22:56:37 -040087 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -050088 transactionID := &ic.StrType{}
89 for _, arg := range args {
90 switch arg.Key {
91 case "device_id":
92 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +000093 logger.Warnw(ctx, "cannot-unmarshal-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -050094 return nil, err
95 }
96 case kafka.TransactionKey:
97 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +000098 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -050099 return nil, err
100 }
101 }
khenaidoob9203542018-09-17 22:56:37 -0400102 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000103 logger.Debugw(ctx, "getDevice", log.Fields{"deviceID": pID.Id, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500104
khenaidoob9203542018-09-17 22:56:37 -0400105 // Get the device via the device manager
Kent Hagerman45a13e42020-04-13 12:23:50 -0400106 device, err := rhp.deviceMgr.GetDevice(context.TODO(), pID)
npujar1d86a522019-11-14 17:11:16 +0530107 if err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000108 logger.Debugw(ctx, "get-device-failed", log.Fields{"deviceID": pID.Id, "error": err})
khenaidoob9203542018-09-17 22:56:37 -0400109 }
khenaidoo442e7c72020-03-10 16:13:48 -0400110 return device, err
khenaidoob9203542018-09-17 22:56:37 -0400111}
112
npujar1d86a522019-11-14 17:11:16 +0530113// DeviceUpdate updates device using adapter data
Rohan Agrawal31f21802020-06-12 05:38:46 +0000114func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500115 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000116 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -0400117 err := errors.New("invalid-number-of-args")
118 return nil, err
119 }
khenaidoo297cd252019-02-07 22:10:23 -0500120
khenaidoob9203542018-09-17 22:56:37 -0400121 device := &voltha.Device{}
khenaidoo297cd252019-02-07 22:10:23 -0500122 transactionID := &ic.StrType{}
123 for _, arg := range args {
124 switch arg.Key {
125 case "device":
126 if err := ptypes.UnmarshalAny(arg.Value, device); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000127 logger.Warnw(ctx, "cannot-unmarshal-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500128 return nil, err
129 }
130 case kafka.TransactionKey:
131 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000132 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500133 return nil, err
134 }
135 }
khenaidoob9203542018-09-17 22:56:37 -0400136 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000137 logger.Debugw(ctx, "DeviceUpdate", log.Fields{"deviceID": device.Id, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500138
Kent Hagerman2b216042020-04-03 18:28:56 -0400139 if err := rhp.deviceMgr.UpdateDeviceUsingAdapterData(context.TODO(), device); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000140 logger.Debugw(ctx, "unable-to-update-device-using-adapter-data", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400141 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400142 }
khenaidoo442e7c72020-03-10 16:13:48 -0400143 return &empty.Empty{}, nil
khenaidoob9203542018-09-17 22:56:37 -0400144}
145
npujar1d86a522019-11-14 17:11:16 +0530146// GetChildDevice returns details of child device
Rohan Agrawal31f21802020-06-12 05:38:46 +0000147func (rhp *AdapterRequestHandlerProxy) GetChildDevice(ctx context.Context, args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret4e241952019-02-28 11:16:04 -0500148 if len(args) < 3 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000149 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -0400150 err := errors.New("invalid-number-of-args")
151 return nil, err
152 }
khenaidoo297cd252019-02-07 22:10:23 -0500153
khenaidoo2c6f1672018-09-20 23:14:41 -0400154 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500155 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500156 serialNumber := &ic.StrType{}
npujar1d86a522019-11-14 17:11:16 +0530157 onuID := &ic.IntType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500158 parentPortNo := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500159 for _, arg := range args {
160 switch arg.Key {
161 case "device_id":
162 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000163 logger.Warnw(ctx, "cannot-unmarshal-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500164 return nil, err
165 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500166 case "serial_number":
167 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000168 logger.Warnw(ctx, "cannot-unmarshal-ID", log.Fields{"error": err})
Matt Jeanneret4e241952019-02-28 11:16:04 -0500169 return nil, err
170 }
171 case "onu_id":
npujar1d86a522019-11-14 17:11:16 +0530172 if err := ptypes.UnmarshalAny(arg.Value, onuID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000173 logger.Warnw(ctx, "cannot-unmarshal-ID", log.Fields{"error": err})
Matt Jeanneret4e241952019-02-28 11:16:04 -0500174 return nil, err
175 }
176 case "parent_port_no":
177 if err := ptypes.UnmarshalAny(arg.Value, parentPortNo); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000178 logger.Warnw(ctx, "cannot-unmarshal-ID", log.Fields{"error": err})
Matt Jeanneret4e241952019-02-28 11:16:04 -0500179 return nil, err
180 }
khenaidoo297cd252019-02-07 22:10:23 -0500181 case kafka.TransactionKey:
182 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000183 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500184 return nil, err
185 }
186 }
khenaidoob9203542018-09-17 22:56:37 -0400187 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000188 logger.Debugw(ctx, "GetChildDevice", log.Fields{"parentDeviceID": pID.Id, "args": args, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500189
npujar467fe752020-01-16 20:17:45 +0530190 return rhp.deviceMgr.GetChildDevice(context.TODO(), pID.Id, serialNumber.Val, onuID.Val, parentPortNo.Val)
khenaidoob9203542018-09-17 22:56:37 -0400191}
192
npujar1d86a522019-11-14 17:11:16 +0530193// GetChildDeviceWithProxyAddress returns details of child device with proxy address
Rohan Agrawal31f21802020-06-12 05:38:46 +0000194func (rhp *AdapterRequestHandlerProxy) GetChildDeviceWithProxyAddress(ctx context.Context, args []*ic.Argument) (*voltha.Device, error) {
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500195 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000196 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500197 err := errors.New("invalid-number-of-args")
198 return nil, err
199 }
200
201 proxyAddress := &voltha.Device_ProxyAddress{}
202 transactionID := &ic.StrType{}
203 for _, arg := range args {
204 switch arg.Key {
205 case "proxy_address":
206 if err := ptypes.UnmarshalAny(arg.Value, proxyAddress); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000207 logger.Warnw(ctx, "cannot-unmarshal-proxy-address", log.Fields{"error": err})
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500208 return nil, err
209 }
210 case kafka.TransactionKey:
211 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000212 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500213 return nil, err
214 }
215 }
216 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000217 logger.Debugw(ctx, "GetChildDeviceWithProxyAddress", log.Fields{"proxyAddress": proxyAddress, "transactionID": transactionID.Val})
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500218
npujar467fe752020-01-16 20:17:45 +0530219 return rhp.deviceMgr.GetChildDeviceWithProxyAddress(context.TODO(), proxyAddress)
Matt Jeanneret2a20aaa2019-03-05 21:04:02 -0500220}
221
npujar1d86a522019-11-14 17:11:16 +0530222// GetPorts returns the ports information of the device based on the port type.
Rohan Agrawal31f21802020-06-12 05:38:46 +0000223func (rhp *AdapterRequestHandlerProxy) GetPorts(ctx context.Context, args []*ic.Argument) (*voltha.Ports, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500224 if len(args) < 3 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000225 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -0400226 err := errors.New("invalid-number-of-args")
227 return nil, err
228 }
npujar1d86a522019-11-14 17:11:16 +0530229 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500230 pt := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500231 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400232 for _, arg := range args {
233 switch arg.Key {
234 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530235 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000236 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoo92e62c52018-10-03 14:02:54 -0400237 return nil, err
238 }
239 case "port_type":
240 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000241 logger.Warnw(ctx, "cannot-unmarshal-porttype", log.Fields{"error": err})
khenaidoo92e62c52018-10-03 14:02:54 -0400242 return nil, err
243 }
khenaidoo297cd252019-02-07 22:10:23 -0500244 case kafka.TransactionKey:
245 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000246 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500247 return nil, err
248 }
khenaidoo92e62c52018-10-03 14:02:54 -0400249 }
khenaidoob9203542018-09-17 22:56:37 -0400250 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000251 logger.Debugw(ctx, "GetPorts", log.Fields{"deviceID": deviceID.Id, "portype": pt.Val, "transactionID": transactionID.Val})
khenaidoo442e7c72020-03-10 16:13:48 -0400252
Kent Hagerman2b216042020-04-03 18:28:56 -0400253 return rhp.deviceMgr.GetPorts(context.TODO(), deviceID.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400254}
255
npujar1d86a522019-11-14 17:11:16 +0530256// GetChildDevices gets all the child device IDs from the device passed as parameter
Rohan Agrawal31f21802020-06-12 05:38:46 +0000257func (rhp *AdapterRequestHandlerProxy) GetChildDevices(ctx context.Context, args []*ic.Argument) (*voltha.Devices, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500258 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000259 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -0400260 err := errors.New("invalid-number-of-args")
261 return nil, err
262 }
khenaidoo297cd252019-02-07 22:10:23 -0500263
khenaidoo2c6f1672018-09-20 23:14:41 -0400264 pID := &voltha.ID{}
khenaidoo297cd252019-02-07 22:10:23 -0500265 transactionID := &ic.StrType{}
266 for _, arg := range args {
267 switch arg.Key {
268 case "device_id":
269 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000270 logger.Warnw(ctx, "cannot-unmarshal-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500271 return nil, err
272 }
273 case kafka.TransactionKey:
274 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000275 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500276 return nil, err
277 }
278 }
khenaidoob9203542018-09-17 22:56:37 -0400279 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000280 logger.Debugw(ctx, "GetChildDevices", log.Fields{"deviceID": pID.Id, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500281
Kent Hagerman2b216042020-04-03 18:28:56 -0400282 return rhp.deviceMgr.GetAllChildDevices(context.TODO(), pID.Id)
khenaidoob9203542018-09-17 22:56:37 -0400283}
284
khenaidoo442e7c72020-03-10 16:13:48 -0400285// ChildDeviceDetected is invoked when a child device is detected. The following parameters are expected:
Matt Jeanneret4e241952019-02-28 11:16:04 -0500286// {parent_device_id, parent_port_no, child_device_type, channel_id, vendor_id, serial_number)
Rohan Agrawal31f21802020-06-12 05:38:46 +0000287func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(ctx context.Context, args []*ic.Argument) (*voltha.Device, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500288 if len(args) < 5 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000289 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -0400290 err := errors.New("invalid-number-of-args")
291 return nil, err
292 }
293
294 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500295 portNo := &ic.IntType{}
296 dt := &ic.StrType{}
npujar1d86a522019-11-14 17:11:16 +0530297 chnlID := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500298 transactionID := &ic.StrType{}
Matt Jeanneret4e241952019-02-28 11:16:04 -0500299 serialNumber := &ic.StrType{}
npujar1d86a522019-11-14 17:11:16 +0530300 vendorID := &ic.StrType{}
301 onuID := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400302 for _, arg := range args {
303 switch arg.Key {
304 case "parent_device_id":
305 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000306 logger.Warnw(ctx, "cannot-unmarshal-parent-device-id", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400307 return nil, err
308 }
309 case "parent_port_no":
310 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000311 logger.Warnw(ctx, "cannot-unmarshal-parent-port", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400312 return nil, err
313 }
314 case "child_device_type":
315 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000316 logger.Warnw(ctx, "cannot-unmarshal-child-device-type", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400317 return nil, err
318 }
319 case "channel_id":
npujar1d86a522019-11-14 17:11:16 +0530320 if err := ptypes.UnmarshalAny(arg.Value, chnlID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000321 logger.Warnw(ctx, "cannot-unmarshal-channel-id", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400322 return nil, err
323 }
Matt Jeanneret4e241952019-02-28 11:16:04 -0500324 case "vendor_id":
npujar1d86a522019-11-14 17:11:16 +0530325 if err := ptypes.UnmarshalAny(arg.Value, vendorID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000326 logger.Warnw(ctx, "cannot-unmarshal-vendor-id", log.Fields{"error": err})
Matt Jeanneret4e241952019-02-28 11:16:04 -0500327 return nil, err
328 }
329 case "serial_number":
330 if err := ptypes.UnmarshalAny(arg.Value, serialNumber); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000331 logger.Warnw(ctx, "cannot-unmarshal-serial-number", log.Fields{"error": err})
Matt Jeanneret4e241952019-02-28 11:16:04 -0500332 return nil, err
333 }
334 case "onu_id":
npujar1d86a522019-11-14 17:11:16 +0530335 if err := ptypes.UnmarshalAny(arg.Value, onuID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000336 logger.Warnw(ctx, "cannot-unmarshal-onu-id", log.Fields{"error": err})
Matt Jeanneret4e241952019-02-28 11:16:04 -0500337 return nil, err
338 }
khenaidoo297cd252019-02-07 22:10:23 -0500339 case kafka.TransactionKey:
340 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000341 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500342 return nil, err
343 }
khenaidoob9203542018-09-17 22:56:37 -0400344 }
345 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000346 logger.Debugw(ctx, "ChildDeviceDetected", log.Fields{"parentDeviceID": pID.Id, "parentPortNo": portNo.Val,
npujar1d86a522019-11-14 17:11:16 +0530347 "deviceType": dt.Val, "channelID": chnlID.Val, "serialNumber": serialNumber.Val,
348 "vendorID": vendorID.Val, "onuID": onuID.Val, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500349
Kent Hagerman2b216042020-04-03 18:28:56 -0400350 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 -0700351 if err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000352 logger.Debugw(ctx, "child-detection-failed", log.Fields{"parentID": pID.Id, "onuID": onuID.Val, "error": err})
khenaidoo59ef7be2019-06-21 12:40:28 -0400353 }
khenaidoo442e7c72020-03-10 16:13:48 -0400354 return device, err
khenaidoob9203542018-09-17 22:56:37 -0400355}
356
npujar1d86a522019-11-14 17:11:16 +0530357// DeviceStateUpdate updates device status
Rohan Agrawal31f21802020-06-12 05:38:46 +0000358func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500359 if len(args) < 3 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000360 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -0400361 err := errors.New("invalid-number-of-args")
362 return nil, err
363 }
npujar1d86a522019-11-14 17:11:16 +0530364 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500365 operStatus := &ic.IntType{}
366 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500367 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400368 for _, arg := range args {
369 switch arg.Key {
370 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530371 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000372 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400373 return nil, err
374 }
375 case "oper_status":
376 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000377 logger.Warnw(ctx, "cannot-unmarshal-operStatus", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400378 return nil, err
379 }
khenaidoob9203542018-09-17 22:56:37 -0400380 case "connect_status":
381 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000382 logger.Warnw(ctx, "cannot-unmarshal-connStatus", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400383 return nil, err
384 }
khenaidoo297cd252019-02-07 22:10:23 -0500385 case kafka.TransactionKey:
386 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000387 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500388 return nil, err
389 }
khenaidoob9203542018-09-17 22:56:37 -0400390 }
391 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000392 logger.Debugw(ctx, "DeviceStateUpdate", log.Fields{"deviceID": deviceID.Id, "oper-status": operStatus,
khenaidoo297cd252019-02-07 22:10:23 -0500393 "conn-status": connStatus, "transactionID": transactionID.Val})
394
Kent Hagerman2b216042020-04-03 18:28:56 -0400395 if err := rhp.deviceMgr.UpdateDeviceStatus(context.TODO(), deviceID.Id, voltha.OperStatus_Types(operStatus.Val),
khenaidoo442e7c72020-03-10 16:13:48 -0400396 voltha.ConnectStatus_Types(connStatus.Val)); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000397 logger.Debugw(ctx, "unable-to-update-device-status", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400398 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400399 }
khenaidoo442e7c72020-03-10 16:13:48 -0400400 return &empty.Empty{}, nil
khenaidoo92e62c52018-10-03 14:02:54 -0400401}
402
npujar1d86a522019-11-14 17:11:16 +0530403// ChildrenStateUpdate updates child device status
Rohan Agrawal31f21802020-06-12 05:38:46 +0000404func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500405 if len(args) < 3 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000406 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoo4d4802d2018-10-04 21:59:49 -0400407 err := errors.New("invalid-number-of-args")
408 return nil, err
409 }
npujar1d86a522019-11-14 17:11:16 +0530410 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500411 operStatus := &ic.IntType{}
412 connStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500413 transactionID := &ic.StrType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400414 for _, arg := range args {
415 switch arg.Key {
416 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530417 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000418 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoo4d4802d2018-10-04 21:59:49 -0400419 return nil, err
420 }
421 case "oper_status":
422 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000423 logger.Warnw(ctx, "cannot-unmarshal-operStatus", log.Fields{"error": err})
khenaidoo4d4802d2018-10-04 21:59:49 -0400424 return nil, err
425 }
426 case "connect_status":
427 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000428 logger.Warnw(ctx, "cannot-unmarshal-connStatus", log.Fields{"error": err})
khenaidoo4d4802d2018-10-04 21:59:49 -0400429 return nil, err
430 }
khenaidoo297cd252019-02-07 22:10:23 -0500431 case kafka.TransactionKey:
432 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000433 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500434 return nil, err
435 }
khenaidoo4d4802d2018-10-04 21:59:49 -0400436 }
437 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000438 logger.Debugw(ctx, "ChildrenStateUpdate", log.Fields{"deviceID": deviceID.Id, "oper-status": operStatus,
khenaidoo297cd252019-02-07 22:10:23 -0500439 "conn-status": connStatus, "transactionID": transactionID.Val})
440
khenaidoo4d4802d2018-10-04 21:59:49 -0400441 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
Kent Hagerman2b216042020-04-03 18:28:56 -0400442 if err := rhp.deviceMgr.UpdateChildrenStatus(context.TODO(), deviceID.Id, voltha.OperStatus_Types(operStatus.Val),
khenaidoo442e7c72020-03-10 16:13:48 -0400443 voltha.ConnectStatus_Types(connStatus.Val)); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000444 logger.Debugw(ctx, "unable-to-update-children-status", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400445 return nil, err
446 }
447 return &empty.Empty{}, nil
khenaidoo4d4802d2018-10-04 21:59:49 -0400448}
449
npujar1d86a522019-11-14 17:11:16 +0530450// PortsStateUpdate updates the ports state related to the device
Rohan Agrawal31f21802020-06-12 05:38:46 +0000451func (rhp *AdapterRequestHandlerProxy) PortsStateUpdate(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo3ab34882019-05-02 21:33:30 -0400452 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000453 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoo3ab34882019-05-02 21:33:30 -0400454 err := errors.New("invalid-number-of-args")
455 return nil, err
456 }
npujar1d86a522019-11-14 17:11:16 +0530457 deviceID := &voltha.ID{}
khenaidoo3ab34882019-05-02 21:33:30 -0400458 operStatus := &ic.IntType{}
459 transactionID := &ic.StrType{}
460 for _, arg := range args {
461 switch arg.Key {
462 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530463 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000464 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoo3ab34882019-05-02 21:33:30 -0400465 return nil, err
466 }
467 case "oper_status":
468 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000469 logger.Warnw(ctx, "cannot-unmarshal-operStatus", log.Fields{"error": err})
khenaidoo3ab34882019-05-02 21:33:30 -0400470 return nil, err
471 }
472 case kafka.TransactionKey:
473 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000474 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo3ab34882019-05-02 21:33:30 -0400475 return nil, err
476 }
477 }
478 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000479 logger.Debugw(ctx, "PortsStateUpdate", log.Fields{"deviceID": deviceID.Id, "operStatus": operStatus, "transactionID": transactionID.Val})
khenaidoo3ab34882019-05-02 21:33:30 -0400480
Kent Hagerman2b216042020-04-03 18:28:56 -0400481 if err := rhp.deviceMgr.UpdatePortsState(context.TODO(), deviceID.Id, voltha.OperStatus_Types(operStatus.Val)); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000482 logger.Debugw(ctx, "unable-to-update-ports-state", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400483 return nil, err
khenaidoo3ab34882019-05-02 21:33:30 -0400484 }
khenaidoo442e7c72020-03-10 16:13:48 -0400485 return &empty.Empty{}, nil
khenaidoo3ab34882019-05-02 21:33:30 -0400486}
487
npujar1d86a522019-11-14 17:11:16 +0530488// PortStateUpdate updates the port state of the device
Rohan Agrawal31f21802020-06-12 05:38:46 +0000489func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500490 if len(args) < 3 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000491 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoo92e62c52018-10-03 14:02:54 -0400492 err := errors.New("invalid-number-of-args")
493 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400494 }
npujar1d86a522019-11-14 17:11:16 +0530495 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500496 portType := &ic.IntType{}
497 portNo := &ic.IntType{}
498 operStatus := &ic.IntType{}
khenaidoo297cd252019-02-07 22:10:23 -0500499 transactionID := &ic.StrType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400500 for _, arg := range args {
501 switch arg.Key {
502 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530503 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000504 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoo92e62c52018-10-03 14:02:54 -0400505 return nil, err
506 }
507 case "oper_status":
508 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000509 logger.Warnw(ctx, "cannot-unmarshal-operStatus", log.Fields{"error": err})
khenaidoo92e62c52018-10-03 14:02:54 -0400510 return nil, err
511 }
512 case "port_type":
513 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000514 logger.Warnw(ctx, "cannot-unmarshal-porttype", log.Fields{"error": err})
khenaidoo92e62c52018-10-03 14:02:54 -0400515 return nil, err
516 }
517 case "port_no":
518 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000519 logger.Warnw(ctx, "cannot-unmarshal-portno", log.Fields{"error": err})
khenaidoo92e62c52018-10-03 14:02:54 -0400520 return nil, err
521 }
khenaidoo297cd252019-02-07 22:10:23 -0500522 case kafka.TransactionKey:
523 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000524 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500525 return nil, err
526 }
khenaidoo92e62c52018-10-03 14:02:54 -0400527 }
528 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000529 logger.Debugw(ctx, "PortStateUpdate", log.Fields{"deviceID": deviceID.Id, "operStatus": operStatus,
khenaidoo297cd252019-02-07 22:10:23 -0500530 "portType": portType, "portNo": portNo, "transactionID": transactionID.Val})
531
Kent Hagerman2b216042020-04-03 18:28:56 -0400532 if err := rhp.deviceMgr.UpdatePortState(context.TODO(), deviceID.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val),
khenaidoo442e7c72020-03-10 16:13:48 -0400533 voltha.OperStatus_Types(operStatus.Val)); err != nil {
534 // If the error doesn't change behavior and is essentially ignored, it is not an error, it is a
535 // warning.
536 // TODO: VOL-2707
Rohan Agrawal31f21802020-06-12 05:38:46 +0000537 logger.Debugw(ctx, "unable-to-update-port-state", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400538 return nil, err
khenaidoo92e62c52018-10-03 14:02:54 -0400539 }
khenaidoo442e7c72020-03-10 16:13:48 -0400540 return &empty.Empty{}, nil
khenaidoob9203542018-09-17 22:56:37 -0400541}
542
npujar1d86a522019-11-14 17:11:16 +0530543// DeleteAllPorts deletes all ports of device
Rohan Agrawal31f21802020-06-12 05:38:46 +0000544func (rhp *AdapterRequestHandlerProxy) DeleteAllPorts(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo0a822f92019-05-08 15:15:57 -0400545 if len(args) < 3 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000546 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoo0a822f92019-05-08 15:15:57 -0400547 err := errors.New("invalid-number-of-args")
548 return nil, err
549 }
npujar1d86a522019-11-14 17:11:16 +0530550 deviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400551 transactionID := &ic.StrType{}
552 for _, arg := range args {
553 switch arg.Key {
554 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530555 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000556 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400557 return nil, err
558 }
559 case kafka.TransactionKey:
560 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000561 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400562 return nil, err
563 }
564 }
565 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000566 logger.Debugw(ctx, "DeleteAllPorts", log.Fields{"deviceID": deviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400567
Kent Hagerman2b216042020-04-03 18:28:56 -0400568 if err := rhp.deviceMgr.DeleteAllPorts(context.TODO(), deviceID.Id); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000569 logger.Debugw(ctx, "unable-to-delete-ports", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400570 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400571 }
khenaidoo442e7c72020-03-10 16:13:48 -0400572 return &empty.Empty{}, nil
khenaidoo0a822f92019-05-08 15:15:57 -0400573}
574
npujar1d86a522019-11-14 17:11:16 +0530575// ChildDevicesLost indicates that a parent device is in a state (Disabled) where it cannot manage the child devices.
576// This will trigger the Core to disable all the child devices.
Rohan Agrawal31f21802020-06-12 05:38:46 +0000577func (rhp *AdapterRequestHandlerProxy) ChildDevicesLost(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo0a822f92019-05-08 15:15:57 -0400578 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000579 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoo0a822f92019-05-08 15:15:57 -0400580 err := errors.New("invalid-number-of-args")
581 return nil, err
582 }
npujar1d86a522019-11-14 17:11:16 +0530583 parentDeviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400584 transactionID := &ic.StrType{}
585 for _, arg := range args {
586 switch arg.Key {
587 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +0530588 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000589 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400590 return nil, err
591 }
592 case kafka.TransactionKey:
593 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000594 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400595 return nil, err
596 }
597 }
598 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000599 logger.Debugw(ctx, "ChildDevicesLost", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400600
Kent Hagerman2b216042020-04-03 18:28:56 -0400601 if err := rhp.deviceMgr.ChildDevicesLost(context.TODO(), parentDeviceID.Id); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000602 logger.Debugw(ctx, "unable-to-disable-child-devices", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400603 return nil, err
khenaidoo0a822f92019-05-08 15:15:57 -0400604 }
khenaidoo442e7c72020-03-10 16:13:48 -0400605 return &empty.Empty{}, nil
khenaidoo0a822f92019-05-08 15:15:57 -0400606}
607
npujar1d86a522019-11-14 17:11:16 +0530608// ChildDevicesDetected invoked by an adapter when child devices are found, typically after after a disable/enable sequence.
609// This will trigger the Core to Enable all the child devices of that parent.
Rohan Agrawal31f21802020-06-12 05:38:46 +0000610func (rhp *AdapterRequestHandlerProxy) ChildDevicesDetected(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo0a822f92019-05-08 15:15:57 -0400611 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000612 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoo0a822f92019-05-08 15:15:57 -0400613 err := errors.New("invalid-number-of-args")
614 return nil, err
615 }
npujar1d86a522019-11-14 17:11:16 +0530616 parentDeviceID := &voltha.ID{}
khenaidoo0a822f92019-05-08 15:15:57 -0400617 transactionID := &ic.StrType{}
618 for _, arg := range args {
619 switch arg.Key {
620 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +0530621 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000622 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400623 return nil, err
624 }
625 case kafka.TransactionKey:
626 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000627 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400628 return nil, err
629 }
630 }
631 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000632 logger.Debugw(ctx, "ChildDevicesDetected", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidoo0a822f92019-05-08 15:15:57 -0400633
Kent Hagerman2b216042020-04-03 18:28:56 -0400634 if err := rhp.deviceMgr.ChildDevicesDetected(context.TODO(), parentDeviceID.Id); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000635 logger.Debugw(ctx, "child-devices-detection-failed", log.Fields{"parentID": parentDeviceID.Id, "error": err})
khenaidoo59ef7be2019-06-21 12:40:28 -0400636 return nil, err
637 }
khenaidoo442e7c72020-03-10 16:13:48 -0400638 return &empty.Empty{}, nil
khenaidoo0a822f92019-05-08 15:15:57 -0400639}
640
npujar1d86a522019-11-14 17:11:16 +0530641// PortCreated adds port to device
Rohan Agrawal31f21802020-06-12 05:38:46 +0000642func (rhp *AdapterRequestHandlerProxy) PortCreated(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo54e0ddf2019-02-27 16:21:33 -0500643 if len(args) < 3 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000644 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -0400645 err := errors.New("invalid-number-of-args")
646 return nil, err
647 }
npujar1d86a522019-11-14 17:11:16 +0530648 deviceID := &voltha.ID{}
khenaidoob9203542018-09-17 22:56:37 -0400649 port := &voltha.Port{}
khenaidoo297cd252019-02-07 22:10:23 -0500650 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400651 for _, arg := range args {
652 switch arg.Key {
653 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530654 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000655 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400656 return nil, err
657 }
658 case "port":
659 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000660 logger.Warnw(ctx, "cannot-unmarshal-port", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400661 return nil, err
662 }
khenaidoo297cd252019-02-07 22:10:23 -0500663 case kafka.TransactionKey:
664 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000665 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500666 return nil, err
667 }
khenaidoob9203542018-09-17 22:56:37 -0400668 }
669 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000670 logger.Debugw(ctx, "PortCreated", log.Fields{"deviceID": deviceID.Id, "port": port, "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500671
Kent Hagerman2b216042020-04-03 18:28:56 -0400672 if err := rhp.deviceMgr.AddPort(context.TODO(), deviceID.Id, port); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000673 logger.Debugw(ctx, "unable-to-add-port", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400674 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400675 }
khenaidoo442e7c72020-03-10 16:13:48 -0400676 return &empty.Empty{}, nil
khenaidoob9203542018-09-17 22:56:37 -0400677}
678
npujar1d86a522019-11-14 17:11:16 +0530679// DevicePMConfigUpdate initializes the pm configs as defined by the adapter.
Rohan Agrawal31f21802020-06-12 05:38:46 +0000680func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoob3127472019-07-24 21:04:55 -0400681 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000682 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoob9203542018-09-17 22:56:37 -0400683 err := errors.New("invalid-number-of-args")
684 return nil, err
685 }
686 pmConfigs := &voltha.PmConfigs{}
khenaidoo297cd252019-02-07 22:10:23 -0500687 transactionID := &ic.StrType{}
khenaidoob9203542018-09-17 22:56:37 -0400688 for _, arg := range args {
689 switch arg.Key {
690 case "device_pm_config":
691 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000692 logger.Warnw(ctx, "cannot-unmarshal-pm-config", log.Fields{"error": err})
khenaidoob9203542018-09-17 22:56:37 -0400693 return nil, err
694 }
khenaidoo297cd252019-02-07 22:10:23 -0500695 case kafka.TransactionKey:
696 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000697 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500698 return nil, err
699 }
khenaidoob9203542018-09-17 22:56:37 -0400700 }
701 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000702 logger.Debugw(ctx, "DevicePMConfigUpdate", log.Fields{"deviceID": pmConfigs.Id, "configs": pmConfigs,
khenaidoob3127472019-07-24 21:04:55 -0400703 "transactionID": transactionID.Val})
khenaidoo297cd252019-02-07 22:10:23 -0500704
Kent Hagerman2b216042020-04-03 18:28:56 -0400705 if err := rhp.deviceMgr.InitPmConfigs(context.TODO(), pmConfigs.Id, pmConfigs); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000706 logger.Debugw(ctx, "unable-to-initialize-pm-configs", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400707 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400708 }
khenaidoo442e7c72020-03-10 16:13:48 -0400709 return &empty.Empty{}, nil
khenaidoob9203542018-09-17 22:56:37 -0400710}
khenaidoofdbad6e2018-11-06 22:26:38 -0500711
npujar1d86a522019-11-14 17:11:16 +0530712// PacketIn sends the incoming packet of device
Rohan Agrawal31f21802020-06-12 05:38:46 +0000713func (rhp *AdapterRequestHandlerProxy) PacketIn(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoo297cd252019-02-07 22:10:23 -0500714 if len(args) < 4 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000715 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoofdbad6e2018-11-06 22:26:38 -0500716 err := errors.New("invalid-number-of-args")
717 return nil, err
718 }
npujar1d86a522019-11-14 17:11:16 +0530719 deviceID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500720 portNo := &ic.IntType{}
721 packet := &ic.Packet{}
khenaidoo297cd252019-02-07 22:10:23 -0500722 transactionID := &ic.StrType{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500723 for _, arg := range args {
724 switch arg.Key {
725 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530726 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000727 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoofdbad6e2018-11-06 22:26:38 -0500728 return nil, err
729 }
730 case "port":
731 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000732 logger.Warnw(ctx, "cannot-unmarshal-port-no", log.Fields{"error": err})
khenaidoofdbad6e2018-11-06 22:26:38 -0500733 return nil, err
734 }
735 case "packet":
736 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000737 logger.Warnw(ctx, "cannot-unmarshal-packet", log.Fields{"error": err})
khenaidoofdbad6e2018-11-06 22:26:38 -0500738 return nil, err
739 }
khenaidoo297cd252019-02-07 22:10:23 -0500740 case kafka.TransactionKey:
741 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000742 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500743 return nil, err
744 }
khenaidoofdbad6e2018-11-06 22:26:38 -0500745 }
746 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000747 logger.Debugw(ctx, "PacketIn", log.Fields{"deviceID": deviceID.Id, "port": portNo.Val, "packet": packet,
khenaidoo297cd252019-02-07 22:10:23 -0500748 "transactionID": transactionID.Val})
749
khenaidoo442e7c72020-03-10 16:13:48 -0400750 if err := rhp.deviceMgr.PacketIn(context.TODO(), deviceID.Id, uint32(portNo.Val), transactionID.Val, packet.Payload); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000751 logger.Debugw(ctx, "unable-to-receive-packet-from-adapter", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400752 return nil, err
753
754 }
755 return &empty.Empty{}, nil
khenaidoofdbad6e2018-11-06 22:26:38 -0500756}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500757
npujar1d86a522019-11-14 17:11:16 +0530758// UpdateImageDownload updates image download
Rohan Agrawal31f21802020-06-12 05:38:46 +0000759func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidoof5a5bfa2019-01-23 22:20:29 -0500760 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000761 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidoof5a5bfa2019-01-23 22:20:29 -0500762 err := errors.New("invalid-number-of-args")
763 return nil, err
764 }
npujar1d86a522019-11-14 17:11:16 +0530765 deviceID := &voltha.ID{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500766 img := &voltha.ImageDownload{}
khenaidoo297cd252019-02-07 22:10:23 -0500767 transactionID := &ic.StrType{}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500768 for _, arg := range args {
769 switch arg.Key {
770 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530771 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000772 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidoof5a5bfa2019-01-23 22:20:29 -0500773 return nil, err
774 }
775 case "image_download":
776 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000777 logger.Warnw(ctx, "cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
khenaidoof5a5bfa2019-01-23 22:20:29 -0500778 return nil, err
779 }
khenaidoo297cd252019-02-07 22:10:23 -0500780 case kafka.TransactionKey:
781 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000782 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidoo297cd252019-02-07 22:10:23 -0500783 return nil, err
784 }
khenaidoof5a5bfa2019-01-23 22:20:29 -0500785 }
786 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000787 logger.Debugw(ctx, "UpdateImageDownload", log.Fields{"deviceID": deviceID.Id, "image-download": img,
khenaidoo297cd252019-02-07 22:10:23 -0500788 "transactionID": transactionID.Val})
789
Kent Hagerman2b216042020-04-03 18:28:56 -0400790 if err := rhp.deviceMgr.UpdateImageDownload(context.TODO(), deviceID.Id, img); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000791 logger.Debugw(ctx, "unable-to-update-image-download", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400792 return nil, err
khenaidoof5a5bfa2019-01-23 22:20:29 -0500793 }
khenaidoo442e7c72020-03-10 16:13:48 -0400794 return &empty.Empty{}, nil
khenaidoof5a5bfa2019-01-23 22:20:29 -0500795}
khenaidooba6b6c42019-08-02 09:11:56 -0400796
npujar1d86a522019-11-14 17:11:16 +0530797// ReconcileChildDevices reconciles child devices
Rohan Agrawal31f21802020-06-12 05:38:46 +0000798func (rhp *AdapterRequestHandlerProxy) ReconcileChildDevices(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
khenaidooba6b6c42019-08-02 09:11:56 -0400799 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000800 logger.Warn(ctx, "invalid-number-of-args", log.Fields{"args": args})
khenaidooba6b6c42019-08-02 09:11:56 -0400801 err := errors.New("invalid-number-of-args")
802 return nil, err
803 }
npujar1d86a522019-11-14 17:11:16 +0530804 parentDeviceID := &voltha.ID{}
khenaidooba6b6c42019-08-02 09:11:56 -0400805 transactionID := &ic.StrType{}
806 for _, arg := range args {
807 switch arg.Key {
808 case "parent_device_id":
npujar1d86a522019-11-14 17:11:16 +0530809 if err := ptypes.UnmarshalAny(arg.Value, parentDeviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000810 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
khenaidooba6b6c42019-08-02 09:11:56 -0400811 return nil, err
812 }
813 case kafka.TransactionKey:
814 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000815 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
khenaidooba6b6c42019-08-02 09:11:56 -0400816 return nil, err
817 }
818 }
819 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000820 logger.Debugw(ctx, "ReconcileChildDevices", log.Fields{"deviceID": parentDeviceID.Id, "transactionID": transactionID.Val})
khenaidooba6b6c42019-08-02 09:11:56 -0400821
Kent Hagerman2b216042020-04-03 18:28:56 -0400822 if err := rhp.deviceMgr.ReconcileChildDevices(context.TODO(), parentDeviceID.Id); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000823 logger.Debugw(ctx, "unable-to-reconcile-child-devices", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400824 return nil, err
khenaidooba6b6c42019-08-02 09:11:56 -0400825 }
khenaidoo442e7c72020-03-10 16:13:48 -0400826 return &empty.Empty{}, nil
khenaidooba6b6c42019-08-02 09:11:56 -0400827}
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700828
npujar1d86a522019-11-14 17:11:16 +0530829// DeviceReasonUpdate updates device reason
Rohan Agrawal31f21802020-06-12 05:38:46 +0000830func (rhp *AdapterRequestHandlerProxy) DeviceReasonUpdate(ctx context.Context, args []*ic.Argument) (*empty.Empty, error) {
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700831 if len(args) < 2 {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000832 logger.Warn(ctx, "DeviceReasonUpdate: invalid-number-of-args", log.Fields{"args": args})
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700833 err := errors.New("DeviceReasonUpdate: invalid-number-of-args")
834 return nil, err
835 }
npujar1d86a522019-11-14 17:11:16 +0530836 deviceID := &voltha.ID{}
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700837 reason := &ic.StrType{}
838 transactionID := &ic.StrType{}
839 for _, arg := range args {
840 switch arg.Key {
841 case "device_id":
npujar1d86a522019-11-14 17:11:16 +0530842 if err := ptypes.UnmarshalAny(arg.Value, deviceID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000843 logger.Warnw(ctx, "cannot-unmarshal-device-id", log.Fields{"error": err})
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700844 return nil, err
845 }
846 case "device_reason":
847 if err := ptypes.UnmarshalAny(arg.Value, reason); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000848 logger.Warnw(ctx, "cannot-unmarshal-reason", log.Fields{"error": err})
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700849 return nil, err
850 }
851 case kafka.TransactionKey:
852 if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000853 logger.Warnw(ctx, "cannot-unmarshal-transaction-ID", log.Fields{"error": err})
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700854 return nil, err
855 }
856 }
857 }
Rohan Agrawal31f21802020-06-12 05:38:46 +0000858 logger.Debugw(ctx, "DeviceReasonUpdate", log.Fields{"deviceId": deviceID.Id, "reason": reason.Val,
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700859 "transactionID": transactionID.Val})
860
Kent Hagerman2b216042020-04-03 18:28:56 -0400861 if err := rhp.deviceMgr.UpdateDeviceReason(context.TODO(), deviceID.Id, reason.Val); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000862 logger.Debugw(ctx, "unable-to-update-device-reason", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400863 return nil, err
864
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700865 }
khenaidoo442e7c72020-03-10 16:13:48 -0400866 return &empty.Empty{}, nil
Mahir Gunyelfdee9212019-10-16 16:52:21 -0700867}