blob: d7e1b0a24450911323a40bbba565ce922facbe82 [file] [log] [blame]
khenaidoob9203542018-09-17 22:56:37 -04001/*
2 * Copyright 2018-present Open Networking Foundation
3
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package core
17
18import (
19 "errors"
khenaidoo19d7b632018-10-30 10:49:50 -040020 "github.com/gogo/protobuf/proto"
khenaidoob9203542018-09-17 22:56:37 -040021 "github.com/golang/protobuf/ptypes"
22 "github.com/golang/protobuf/ptypes/empty"
23 "github.com/opencord/voltha-go/common/log"
24 "github.com/opencord/voltha-go/db/model"
khenaidoo79232702018-12-04 11:00:41 -050025 ic "github.com/opencord/voltha-go/protos/inter_container"
khenaidoob9203542018-09-17 22:56:37 -040026 "github.com/opencord/voltha-go/protos/voltha"
27 "google.golang.org/grpc/codes"
28 "google.golang.org/grpc/status"
29)
30
31type AdapterRequestHandlerProxy struct {
32 TestMode bool
khenaidoo43c82122018-11-22 18:38:28 -050033 coreInstanceId string
khenaidoob9203542018-09-17 22:56:37 -040034 deviceMgr *DeviceManager
35 lDeviceMgr *LogicalDeviceManager
36 localDataProxy *model.Proxy
37 clusterDataProxy *model.Proxy
38}
39
khenaidoo91ecfd62018-11-04 17:13:42 -050040func NewAdapterRequestHandlerProxy(coreInstanceId string, dMgr *DeviceManager, ldMgr *LogicalDeviceManager, cdProxy *model.Proxy, ldProxy *model.Proxy) *AdapterRequestHandlerProxy {
khenaidoob9203542018-09-17 22:56:37 -040041 var proxy AdapterRequestHandlerProxy
khenaidoo91ecfd62018-11-04 17:13:42 -050042 proxy.coreInstanceId = coreInstanceId
khenaidoob9203542018-09-17 22:56:37 -040043 proxy.deviceMgr = dMgr
44 proxy.lDeviceMgr = ldMgr
45 proxy.clusterDataProxy = cdProxy
46 proxy.localDataProxy = ldProxy
47 return &proxy
48}
49
khenaidoo79232702018-12-04 11:00:41 -050050func (rhp *AdapterRequestHandlerProxy) Register(args []*ic.Argument) (*voltha.CoreInstance, error) {
khenaidoo91ecfd62018-11-04 17:13:42 -050051 if len(args) != 2 {
khenaidoob9203542018-09-17 22:56:37 -040052 log.Warn("invalid-number-of-args", log.Fields{"args": args})
53 err := errors.New("invalid-number-of-args")
54 return nil, err
55 }
56 adapter := &voltha.Adapter{}
khenaidoo91ecfd62018-11-04 17:13:42 -050057 deviceTypes := &voltha.DeviceTypes{}
58 for _, arg := range args {
59 switch arg.Key {
60 case "adapter":
61 if err := ptypes.UnmarshalAny(arg.Value, adapter); err != nil {
62 log.Warnw("cannot-unmarshal-adapter", log.Fields{"error": err})
63 return nil, err
64 }
65 case "deviceTypes":
66 if err := ptypes.UnmarshalAny(arg.Value, deviceTypes); err != nil {
67 log.Warnw("cannot-unmarshal-device-types", log.Fields{"error": err})
68 return nil, err
69 }
70 }
khenaidoob9203542018-09-17 22:56:37 -040071 }
khenaidoo91ecfd62018-11-04 17:13:42 -050072 log.Debugw("Register", log.Fields{"Adapter": *adapter, "DeviceTypes": deviceTypes, "coreId": rhp.coreInstanceId})
khenaidoob9203542018-09-17 22:56:37 -040073 // TODO process the request and store the data in the KV store
74
75 if rhp.TestMode { // Execute only for test cases
76 return &voltha.CoreInstance{InstanceId: "CoreInstance"}, nil
77 }
khenaidoo91ecfd62018-11-04 17:13:42 -050078 return &voltha.CoreInstance{InstanceId: rhp.coreInstanceId}, nil
khenaidoob9203542018-09-17 22:56:37 -040079}
80
khenaidoo79232702018-12-04 11:00:41 -050081func (rhp *AdapterRequestHandlerProxy) GetDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoob9203542018-09-17 22:56:37 -040082 if len(args) != 1 {
83 log.Warn("invalid-number-of-args", log.Fields{"args": args})
84 err := errors.New("invalid-number-of-args")
85 return nil, err
86 }
87 pID := &voltha.ID{}
88 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
89 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
90 return nil, err
91 }
92 log.Debugw("GetDevice", log.Fields{"deviceId": pID.Id})
93
94 if rhp.TestMode { // Execute only for test cases
95 return &voltha.Device{Id: pID.Id}, nil
96 }
97
98 // Get the device via the device manager
khenaidoo19d7b632018-10-30 10:49:50 -040099 if device, err := rhp.deviceMgr.GetDevice(pID.Id); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400100 return nil, status.Errorf(codes.NotFound, "%s", err.Error())
101 } else {
khenaidoo79232702018-12-04 11:00:41 -0500102 log.Debugw("GetDevice-response", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400103 return device, nil
104 }
105}
106
khenaidoo92e62c52018-10-03 14:02:54 -0400107// updatePartialDeviceData updates a subset of a device that an Adapter can update.
108// TODO: May need a specific proto to handle only a subset of a device that can be changed by an adapter
109func (rhp *AdapterRequestHandlerProxy) mergeDeviceInfoFromAdapter(device *voltha.Device) (*voltha.Device, error) {
110 // First retrieve the most up to date device info
111 var currentDevice *voltha.Device
112 var err error
khenaidoo19d7b632018-10-30 10:49:50 -0400113 if currentDevice, err = rhp.deviceMgr.GetDevice(device.Id); err != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400114 return nil, err
115 }
khenaidoo19d7b632018-10-30 10:49:50 -0400116 cloned := proto.Clone(currentDevice).(*voltha.Device)
khenaidoo92e62c52018-10-03 14:02:54 -0400117 cloned.Root = device.Root
118 cloned.Vendor = device.Vendor
119 cloned.Model = device.Model
120 cloned.SerialNumber = device.SerialNumber
121 cloned.MacAddress = device.MacAddress
khenaidoo19d7b632018-10-30 10:49:50 -0400122 cloned.Vlan = device.Vlan
123 return cloned, nil
khenaidoo92e62c52018-10-03 14:02:54 -0400124}
125
khenaidoo79232702018-12-04 11:00:41 -0500126func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400127 if len(args) != 1 {
128 log.Warn("invalid-number-of-args", log.Fields{"args": args})
129 err := errors.New("invalid-number-of-args")
130 return nil, err
131 }
132 device := &voltha.Device{}
133 if err := ptypes.UnmarshalAny(args[0].Value, device); err != nil {
134 log.Warnw("cannot-unmarshal-device", log.Fields{"error": err})
135 return nil, err
136 }
khenaidoo92e62c52018-10-03 14:02:54 -0400137 log.Debugw("DeviceUpdate", log.Fields{"deviceId": device.Id})
khenaidoob9203542018-09-17 22:56:37 -0400138
139 if rhp.TestMode { // Execute only for test cases
140 return new(empty.Empty), nil
141 }
khenaidoo92e62c52018-10-03 14:02:54 -0400142
143 //Merge the adapter device info (only the ones an adapter can change) with the latest device data
144 if updatedDevice, err := rhp.mergeDeviceInfoFromAdapter(device); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400145 return nil, status.Errorf(codes.Internal, "%s", err.Error())
khenaidoo92e62c52018-10-03 14:02:54 -0400146 } else {
147 // An adapter request needs an Ack without having to wait for the update to be
148 // completed. We therefore run the update in its own routine.
149 go rhp.deviceMgr.updateDevice(updatedDevice)
khenaidoob9203542018-09-17 22:56:37 -0400150 }
khenaidoo92e62c52018-10-03 14:02:54 -0400151
khenaidoob9203542018-09-17 22:56:37 -0400152 return new(empty.Empty), nil
153}
154
khenaidoo79232702018-12-04 11:00:41 -0500155func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoob9203542018-09-17 22:56:37 -0400156 if len(args) < 1 {
157 log.Warn("invalid-number-of-args", log.Fields{"args": args})
158 err := errors.New("invalid-number-of-args")
159 return nil, err
160 }
khenaidoo2c6f1672018-09-20 23:14:41 -0400161 pID := &voltha.ID{}
khenaidoob9203542018-09-17 22:56:37 -0400162 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
163 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
164 return nil, err
165 }
khenaidoo2c6f1672018-09-20 23:14:41 -0400166 log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400167
168 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400169 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400170 }
171 return nil, nil
172}
173
khenaidoo79232702018-12-04 11:00:41 -0500174func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoob9203542018-09-17 22:56:37 -0400175 if len(args) != 2 {
176 log.Warn("invalid-number-of-args", log.Fields{"args": args})
177 err := errors.New("invalid-number-of-args")
178 return nil, err
179 }
khenaidoo92e62c52018-10-03 14:02:54 -0400180 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500181 pt := &ic.IntType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400182 for _, arg := range args {
183 switch arg.Key {
184 case "device_id":
185 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
186 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
187 return nil, err
188 }
189 case "port_type":
190 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
191 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
192 return nil, err
193 }
194 }
khenaidoob9203542018-09-17 22:56:37 -0400195 }
khenaidoo92e62c52018-10-03 14:02:54 -0400196 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val})
khenaidoob9203542018-09-17 22:56:37 -0400197 if rhp.TestMode { // Execute only for test cases
198 aPort := &voltha.Port{Label: "test_port"}
199 allPorts := &voltha.Ports{}
200 allPorts.Items = append(allPorts.Items, aPort)
201 return allPorts, nil
202 }
khenaidoo92e62c52018-10-03 14:02:54 -0400203 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400204}
205
khenaidoo79232702018-12-04 11:00:41 -0500206func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Device, error) {
khenaidoob9203542018-09-17 22:56:37 -0400207 if len(args) != 1 {
208 log.Warn("invalid-number-of-args", log.Fields{"args": args})
209 err := errors.New("invalid-number-of-args")
210 return nil, err
211 }
khenaidoo2c6f1672018-09-20 23:14:41 -0400212 pID := &voltha.ID{}
khenaidoob9203542018-09-17 22:56:37 -0400213 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
214 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
215 return nil, err
216 }
khenaidoo2c6f1672018-09-20 23:14:41 -0400217 log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400218
219 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400220 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400221 }
222 //TODO: Complete
223 return nil, nil
224}
225
226// ChildDeviceDetected is invoked when a child device is detected. The following
227// parameters are expected:
228// {parent_device_id, parent_port_no, child_device_type, proxy_address, admin_state, **kw)
khenaidoo79232702018-12-04 11:00:41 -0500229func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400230 if len(args) < 4 {
231 log.Warn("invalid-number-of-args", log.Fields{"args": args})
232 err := errors.New("invalid-number-of-args")
233 return nil, err
234 }
235
236 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500237 portNo := &ic.IntType{}
238 dt := &ic.StrType{}
239 chnlId := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400240 for _, arg := range args {
241 switch arg.Key {
242 case "parent_device_id":
243 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
244 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
245 return nil, err
246 }
247 case "parent_port_no":
248 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
249 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
250 return nil, err
251 }
252 case "child_device_type":
253 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
254 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
255 return nil, err
256 }
257 case "channel_id":
258 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
259 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
260 return nil, err
261 }
262 }
263 }
khenaidoob9203542018-09-17 22:56:37 -0400264 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
265 "deviceType": dt.Val, "channelId": chnlId.Val})
266
267 if rhp.TestMode { // Execute only for test cases
268 return nil, nil
269 }
khenaidoob9203542018-09-17 22:56:37 -0400270 // Run child detection in it's own go routine as it can be a lengthy process
271 go rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val)
272
273 return new(empty.Empty), nil
274}
275
khenaidoo79232702018-12-04 11:00:41 -0500276func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400277 if len(args) < 2 {
278 log.Warn("invalid-number-of-args", log.Fields{"args": args})
279 err := errors.New("invalid-number-of-args")
280 return nil, err
281 }
282 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500283 operStatus := &ic.IntType{}
284 connStatus := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400285 for _, arg := range args {
286 switch arg.Key {
287 case "device_id":
288 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
289 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
290 return nil, err
291 }
292 case "oper_status":
293 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
294 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
295 return nil, err
296 }
khenaidoob9203542018-09-17 22:56:37 -0400297 case "connect_status":
298 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
299 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
300 return nil, err
301 }
khenaidoob9203542018-09-17 22:56:37 -0400302 }
303 }
khenaidoob9203542018-09-17 22:56:37 -0400304 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus, "conn-status": connStatus})
khenaidoob9203542018-09-17 22:56:37 -0400305 if rhp.TestMode { // Execute only for test cases
306 return nil, nil
307 }
khenaidoo92e62c52018-10-03 14:02:54 -0400308 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
309 go rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val), voltha.ConnectStatus_ConnectStatus(connStatus.Val))
310 return new(empty.Empty), nil
311}
312
khenaidoo79232702018-12-04 11:00:41 -0500313func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo4d4802d2018-10-04 21:59:49 -0400314 if len(args) < 2 {
315 log.Warn("invalid-number-of-args", log.Fields{"args": args})
316 err := errors.New("invalid-number-of-args")
317 return nil, err
318 }
319 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500320 operStatus := &ic.IntType{}
321 connStatus := &ic.IntType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400322 for _, arg := range args {
323 switch arg.Key {
324 case "device_id":
325 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
326 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
327 return nil, err
328 }
329 case "oper_status":
330 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
331 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
332 return nil, err
333 }
334 case "connect_status":
335 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
336 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
337 return nil, err
338 }
339 }
340 }
341 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus, "conn-status": connStatus})
342 if rhp.TestMode { // Execute only for test cases
343 return nil, nil
344 }
345
346 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
347 go rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val), voltha.ConnectStatus_ConnectStatus(connStatus.Val))
348 return new(empty.Empty), nil
349}
350
khenaidoo79232702018-12-04 11:00:41 -0500351func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo92e62c52018-10-03 14:02:54 -0400352 if len(args) < 2 {
353 log.Warn("invalid-number-of-args", log.Fields{"args": args})
354 err := errors.New("invalid-number-of-args")
355 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400356 }
khenaidoo92e62c52018-10-03 14:02:54 -0400357 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500358 portType := &ic.IntType{}
359 portNo := &ic.IntType{}
360 operStatus := &ic.IntType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400361 for _, arg := range args {
362 switch arg.Key {
363 case "device_id":
364 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
365 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
366 return nil, err
367 }
368 case "oper_status":
369 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
370 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
371 return nil, err
372 }
373 case "port_type":
374 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
375 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
376 return nil, err
377 }
378 case "port_no":
379 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
380 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
381 return nil, err
382 }
383
384 }
385 }
386 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus, "portType": portType, "portNo": portNo})
387 if rhp.TestMode { // Execute only for test cases
388 return nil, nil
389 }
390 go rhp.deviceMgr.updatePortState(deviceId.Id, voltha.Port_PortType(portType.Val), uint32(portNo.Val), voltha.OperStatus_OperStatus(operStatus.Val))
khenaidoob9203542018-09-17 22:56:37 -0400391 return new(empty.Empty), nil
392}
393
khenaidoo79232702018-12-04 11:00:41 -0500394func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400395 if len(args) != 2 {
396 log.Warn("invalid-number-of-args", log.Fields{"args": args})
397 err := errors.New("invalid-number-of-args")
398 return nil, err
399 }
400 deviceId := &voltha.ID{}
401 port := &voltha.Port{}
402 for _, arg := range args {
403 switch arg.Key {
404 case "device_id":
405 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
406 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
407 return nil, err
408 }
409 case "port":
410 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
411 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
412 return nil, err
413 }
414 }
415 }
khenaidoob9203542018-09-17 22:56:37 -0400416 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port})
417
418 if rhp.TestMode { // Execute only for test cases
419 return nil, nil
420 }
khenaidoo92e62c52018-10-03 14:02:54 -0400421 // Run port creation in its own go routine
422 go rhp.deviceMgr.addPort(deviceId.Id, port)
423
khenaidoob9203542018-09-17 22:56:37 -0400424 return new(empty.Empty), nil
425}
426
khenaidoo79232702018-12-04 11:00:41 -0500427func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400428 if len(args) != 2 {
429 log.Warn("invalid-number-of-args", log.Fields{"args": args})
430 err := errors.New("invalid-number-of-args")
431 return nil, err
432 }
433 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500434 init := &ic.BoolType{}
khenaidoob9203542018-09-17 22:56:37 -0400435 for _, arg := range args {
436 switch arg.Key {
437 case "device_pm_config":
438 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
439 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
440 return nil, err
441 }
442 case "init":
443 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
444 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
445 return nil, err
446 }
447 }
448 }
khenaidoob9203542018-09-17 22:56:37 -0400449 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
450 "init": init})
451
452 if rhp.TestMode { // Execute only for test cases
453 return nil, nil
454 }
455
khenaidoo92e62c52018-10-03 14:02:54 -0400456 // Run PM config update in its own go routine
457 go rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs)
458
khenaidoob9203542018-09-17 22:56:37 -0400459 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400460}
khenaidoofdbad6e2018-11-06 22:26:38 -0500461
khenaidoo79232702018-12-04 11:00:41 -0500462func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoofdbad6e2018-11-06 22:26:38 -0500463 if len(args) < 3 {
464 log.Warn("invalid-number-of-args", log.Fields{"args": args})
465 err := errors.New("invalid-number-of-args")
466 return nil, err
467 }
468 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500469 portNo := &ic.IntType{}
470 packet := &ic.Packet{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500471 for _, arg := range args {
472 switch arg.Key {
473 case "device_id":
474 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
475 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
476 return nil, err
477 }
478 case "port":
479 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
480 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
481 return nil, err
482 }
483 case "packet":
484 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
485 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
486 return nil, err
487 }
488
489 }
490 }
khenaidoo43c82122018-11-22 18:38:28 -0500491 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet})
khenaidoofdbad6e2018-11-06 22:26:38 -0500492 if rhp.TestMode { // Execute only for test cases
493 return nil, nil
494 }
495 go rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), packet.Payload)
496 return new(empty.Empty), nil
497}