blob: 98cc6885d9a702a78e0489fa28470a22397b2114 [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
khenaidoo21d51152019-02-01 13:48:37 -050036 adapterMgr *AdapterManager
khenaidoob9203542018-09-17 22:56:37 -040037 localDataProxy *model.Proxy
38 clusterDataProxy *model.Proxy
39}
40
khenaidoo21d51152019-02-01 13:48:37 -050041func NewAdapterRequestHandlerProxy(coreInstanceId string, dMgr *DeviceManager, ldMgr *LogicalDeviceManager, aMgr *AdapterManager, cdProxy *model.Proxy, ldProxy *model.Proxy) *AdapterRequestHandlerProxy {
khenaidoob9203542018-09-17 22:56:37 -040042 var proxy AdapterRequestHandlerProxy
khenaidoo91ecfd62018-11-04 17:13:42 -050043 proxy.coreInstanceId = coreInstanceId
khenaidoob9203542018-09-17 22:56:37 -040044 proxy.deviceMgr = dMgr
45 proxy.lDeviceMgr = ldMgr
46 proxy.clusterDataProxy = cdProxy
47 proxy.localDataProxy = ldProxy
khenaidoo21d51152019-02-01 13:48:37 -050048 proxy.adapterMgr = aMgr
khenaidoob9203542018-09-17 22:56:37 -040049 return &proxy
50}
51
khenaidoo79232702018-12-04 11:00:41 -050052func (rhp *AdapterRequestHandlerProxy) Register(args []*ic.Argument) (*voltha.CoreInstance, error) {
khenaidoo91ecfd62018-11-04 17:13:42 -050053 if len(args) != 2 {
khenaidoob9203542018-09-17 22:56:37 -040054 log.Warn("invalid-number-of-args", log.Fields{"args": args})
55 err := errors.New("invalid-number-of-args")
56 return nil, err
57 }
58 adapter := &voltha.Adapter{}
khenaidoo91ecfd62018-11-04 17:13:42 -050059 deviceTypes := &voltha.DeviceTypes{}
60 for _, arg := range args {
61 switch arg.Key {
62 case "adapter":
63 if err := ptypes.UnmarshalAny(arg.Value, adapter); err != nil {
64 log.Warnw("cannot-unmarshal-adapter", log.Fields{"error": err})
65 return nil, err
66 }
67 case "deviceTypes":
68 if err := ptypes.UnmarshalAny(arg.Value, deviceTypes); err != nil {
69 log.Warnw("cannot-unmarshal-device-types", log.Fields{"error": err})
70 return nil, err
71 }
72 }
khenaidoob9203542018-09-17 22:56:37 -040073 }
khenaidoo91ecfd62018-11-04 17:13:42 -050074 log.Debugw("Register", log.Fields{"Adapter": *adapter, "DeviceTypes": deviceTypes, "coreId": rhp.coreInstanceId})
khenaidoob9203542018-09-17 22:56:37 -040075
76 if rhp.TestMode { // Execute only for test cases
77 return &voltha.CoreInstance{InstanceId: "CoreInstance"}, nil
78 }
khenaidoo21d51152019-02-01 13:48:37 -050079 return rhp.adapterMgr.registerAdapter(adapter, deviceTypes), nil
khenaidoob9203542018-09-17 22:56:37 -040080}
81
khenaidoo79232702018-12-04 11:00:41 -050082func (rhp *AdapterRequestHandlerProxy) GetDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoob9203542018-09-17 22:56:37 -040083 if len(args) != 1 {
84 log.Warn("invalid-number-of-args", log.Fields{"args": args})
85 err := errors.New("invalid-number-of-args")
86 return nil, err
87 }
88 pID := &voltha.ID{}
89 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
90 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
91 return nil, err
92 }
93 log.Debugw("GetDevice", log.Fields{"deviceId": pID.Id})
94
95 if rhp.TestMode { // Execute only for test cases
96 return &voltha.Device{Id: pID.Id}, nil
97 }
98
99 // Get the device via the device manager
khenaidoo19d7b632018-10-30 10:49:50 -0400100 if device, err := rhp.deviceMgr.GetDevice(pID.Id); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400101 return nil, status.Errorf(codes.NotFound, "%s", err.Error())
102 } else {
khenaidoo79232702018-12-04 11:00:41 -0500103 log.Debugw("GetDevice-response", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400104 return device, nil
105 }
106}
107
khenaidoo92e62c52018-10-03 14:02:54 -0400108// updatePartialDeviceData updates a subset of a device that an Adapter can update.
109// TODO: May need a specific proto to handle only a subset of a device that can be changed by an adapter
110func (rhp *AdapterRequestHandlerProxy) mergeDeviceInfoFromAdapter(device *voltha.Device) (*voltha.Device, error) {
111 // First retrieve the most up to date device info
112 var currentDevice *voltha.Device
113 var err error
khenaidoo19d7b632018-10-30 10:49:50 -0400114 if currentDevice, err = rhp.deviceMgr.GetDevice(device.Id); err != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400115 return nil, err
116 }
khenaidoo19d7b632018-10-30 10:49:50 -0400117 cloned := proto.Clone(currentDevice).(*voltha.Device)
khenaidoo92e62c52018-10-03 14:02:54 -0400118 cloned.Root = device.Root
119 cloned.Vendor = device.Vendor
120 cloned.Model = device.Model
121 cloned.SerialNumber = device.SerialNumber
122 cloned.MacAddress = device.MacAddress
khenaidoo19d7b632018-10-30 10:49:50 -0400123 cloned.Vlan = device.Vlan
124 return cloned, nil
khenaidoo92e62c52018-10-03 14:02:54 -0400125}
126
khenaidoo79232702018-12-04 11:00:41 -0500127func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400128 if len(args) != 1 {
129 log.Warn("invalid-number-of-args", log.Fields{"args": args})
130 err := errors.New("invalid-number-of-args")
131 return nil, err
132 }
133 device := &voltha.Device{}
134 if err := ptypes.UnmarshalAny(args[0].Value, device); err != nil {
135 log.Warnw("cannot-unmarshal-device", log.Fields{"error": err})
136 return nil, err
137 }
khenaidoo92e62c52018-10-03 14:02:54 -0400138 log.Debugw("DeviceUpdate", log.Fields{"deviceId": device.Id})
khenaidoob9203542018-09-17 22:56:37 -0400139
140 if rhp.TestMode { // Execute only for test cases
141 return new(empty.Empty), nil
142 }
khenaidoo92e62c52018-10-03 14:02:54 -0400143
144 //Merge the adapter device info (only the ones an adapter can change) with the latest device data
145 if updatedDevice, err := rhp.mergeDeviceInfoFromAdapter(device); err != nil {
khenaidoob9203542018-09-17 22:56:37 -0400146 return nil, status.Errorf(codes.Internal, "%s", err.Error())
khenaidoo92e62c52018-10-03 14:02:54 -0400147 } else {
148 // An adapter request needs an Ack without having to wait for the update to be
149 // completed. We therefore run the update in its own routine.
150 go rhp.deviceMgr.updateDevice(updatedDevice)
khenaidoob9203542018-09-17 22:56:37 -0400151 }
khenaidoo92e62c52018-10-03 14:02:54 -0400152
khenaidoob9203542018-09-17 22:56:37 -0400153 return new(empty.Empty), nil
154}
155
khenaidoo79232702018-12-04 11:00:41 -0500156func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ic.Argument) (*voltha.Device, error) {
khenaidoob9203542018-09-17 22:56:37 -0400157 if len(args) < 1 {
158 log.Warn("invalid-number-of-args", log.Fields{"args": args})
159 err := errors.New("invalid-number-of-args")
160 return nil, err
161 }
khenaidoo2c6f1672018-09-20 23:14:41 -0400162 pID := &voltha.ID{}
khenaidoob9203542018-09-17 22:56:37 -0400163 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
164 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
165 return nil, err
166 }
khenaidoo2c6f1672018-09-20 23:14:41 -0400167 log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400168
169 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400170 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400171 }
172 return nil, nil
173}
174
khenaidoo79232702018-12-04 11:00:41 -0500175func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ic.Argument) (*voltha.Ports, error) {
khenaidoob9203542018-09-17 22:56:37 -0400176 if len(args) != 2 {
177 log.Warn("invalid-number-of-args", log.Fields{"args": args})
178 err := errors.New("invalid-number-of-args")
179 return nil, err
180 }
khenaidoo92e62c52018-10-03 14:02:54 -0400181 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500182 pt := &ic.IntType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400183 for _, arg := range args {
184 switch arg.Key {
185 case "device_id":
186 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
187 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
188 return nil, err
189 }
190 case "port_type":
191 if err := ptypes.UnmarshalAny(arg.Value, pt); err != nil {
192 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
193 return nil, err
194 }
195 }
khenaidoob9203542018-09-17 22:56:37 -0400196 }
khenaidoo92e62c52018-10-03 14:02:54 -0400197 log.Debugw("GetPorts", log.Fields{"deviceID": deviceId.Id, "portype": pt.Val})
khenaidoob9203542018-09-17 22:56:37 -0400198 if rhp.TestMode { // Execute only for test cases
199 aPort := &voltha.Port{Label: "test_port"}
200 allPorts := &voltha.Ports{}
201 allPorts.Items = append(allPorts.Items, aPort)
202 return allPorts, nil
203 }
khenaidoo92e62c52018-10-03 14:02:54 -0400204 return rhp.deviceMgr.getPorts(nil, deviceId.Id, voltha.Port_PortType(pt.Val))
khenaidoob9203542018-09-17 22:56:37 -0400205}
206
khenaidoo79232702018-12-04 11:00:41 -0500207func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ic.Argument) (*voltha.Device, error) {
khenaidoob9203542018-09-17 22:56:37 -0400208 if len(args) != 1 {
209 log.Warn("invalid-number-of-args", log.Fields{"args": args})
210 err := errors.New("invalid-number-of-args")
211 return nil, err
212 }
khenaidoo2c6f1672018-09-20 23:14:41 -0400213 pID := &voltha.ID{}
khenaidoob9203542018-09-17 22:56:37 -0400214 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
215 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
216 return nil, err
217 }
khenaidoo2c6f1672018-09-20 23:14:41 -0400218 log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Id})
khenaidoob9203542018-09-17 22:56:37 -0400219
220 if rhp.TestMode { // Execute only for test cases
khenaidoo2c6f1672018-09-20 23:14:41 -0400221 return &voltha.Device{Id: pID.Id}, nil
khenaidoob9203542018-09-17 22:56:37 -0400222 }
223 //TODO: Complete
224 return nil, nil
225}
226
227// ChildDeviceDetected is invoked when a child device is detected. The following
228// parameters are expected:
229// {parent_device_id, parent_port_no, child_device_type, proxy_address, admin_state, **kw)
khenaidoo79232702018-12-04 11:00:41 -0500230func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400231 if len(args) < 4 {
232 log.Warn("invalid-number-of-args", log.Fields{"args": args})
233 err := errors.New("invalid-number-of-args")
234 return nil, err
235 }
236
237 pID := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500238 portNo := &ic.IntType{}
239 dt := &ic.StrType{}
240 chnlId := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400241 for _, arg := range args {
242 switch arg.Key {
243 case "parent_device_id":
244 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
245 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
246 return nil, err
247 }
248 case "parent_port_no":
249 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
250 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
251 return nil, err
252 }
253 case "child_device_type":
254 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
255 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
256 return nil, err
257 }
258 case "channel_id":
259 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
260 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
261 return nil, err
262 }
263 }
264 }
khenaidoob9203542018-09-17 22:56:37 -0400265 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
266 "deviceType": dt.Val, "channelId": chnlId.Val})
267
268 if rhp.TestMode { // Execute only for test cases
269 return nil, nil
270 }
khenaidoob9203542018-09-17 22:56:37 -0400271 // Run child detection in it's own go routine as it can be a lengthy process
272 go rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val)
273
274 return new(empty.Empty), nil
275}
276
khenaidoo79232702018-12-04 11:00:41 -0500277func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400278 if len(args) < 2 {
279 log.Warn("invalid-number-of-args", log.Fields{"args": args})
280 err := errors.New("invalid-number-of-args")
281 return nil, err
282 }
283 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500284 operStatus := &ic.IntType{}
285 connStatus := &ic.IntType{}
khenaidoob9203542018-09-17 22:56:37 -0400286 for _, arg := range args {
287 switch arg.Key {
288 case "device_id":
289 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
290 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
291 return nil, err
292 }
293 case "oper_status":
294 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
295 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
296 return nil, err
297 }
khenaidoob9203542018-09-17 22:56:37 -0400298 case "connect_status":
299 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
300 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
301 return nil, err
302 }
khenaidoob9203542018-09-17 22:56:37 -0400303 }
304 }
khenaidoob9203542018-09-17 22:56:37 -0400305 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus, "conn-status": connStatus})
khenaidoob9203542018-09-17 22:56:37 -0400306 if rhp.TestMode { // Execute only for test cases
307 return nil, nil
308 }
khenaidoo92e62c52018-10-03 14:02:54 -0400309 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
310 go rhp.deviceMgr.updateDeviceStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val), voltha.ConnectStatus_ConnectStatus(connStatus.Val))
311 return new(empty.Empty), nil
312}
313
khenaidoo79232702018-12-04 11:00:41 -0500314func (rhp *AdapterRequestHandlerProxy) ChildrenStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo4d4802d2018-10-04 21:59:49 -0400315 if len(args) < 2 {
316 log.Warn("invalid-number-of-args", log.Fields{"args": args})
317 err := errors.New("invalid-number-of-args")
318 return nil, err
319 }
320 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500321 operStatus := &ic.IntType{}
322 connStatus := &ic.IntType{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400323 for _, arg := range args {
324 switch arg.Key {
325 case "device_id":
326 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
327 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
328 return nil, err
329 }
330 case "oper_status":
331 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
332 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
333 return nil, err
334 }
335 case "connect_status":
336 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
337 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
338 return nil, err
339 }
340 }
341 }
342 log.Debugw("ChildrenStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus, "conn-status": connStatus})
343 if rhp.TestMode { // Execute only for test cases
344 return nil, nil
345 }
346
347 // When the enum is not set (i.e. -1), Go still convert to the Enum type with the value being -1
348 go rhp.deviceMgr.updateChildrenStatus(deviceId.Id, voltha.OperStatus_OperStatus(operStatus.Val), voltha.ConnectStatus_ConnectStatus(connStatus.Val))
349 return new(empty.Empty), nil
350}
351
khenaidoo79232702018-12-04 11:00:41 -0500352func (rhp *AdapterRequestHandlerProxy) PortStateUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoo92e62c52018-10-03 14:02:54 -0400353 if len(args) < 2 {
354 log.Warn("invalid-number-of-args", log.Fields{"args": args})
355 err := errors.New("invalid-number-of-args")
356 return nil, err
khenaidoob9203542018-09-17 22:56:37 -0400357 }
khenaidoo92e62c52018-10-03 14:02:54 -0400358 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500359 portType := &ic.IntType{}
360 portNo := &ic.IntType{}
361 operStatus := &ic.IntType{}
khenaidoo92e62c52018-10-03 14:02:54 -0400362 for _, arg := range args {
363 switch arg.Key {
364 case "device_id":
365 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
366 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
367 return nil, err
368 }
369 case "oper_status":
370 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
371 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
372 return nil, err
373 }
374 case "port_type":
375 if err := ptypes.UnmarshalAny(arg.Value, portType); err != nil {
376 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
377 return nil, err
378 }
379 case "port_no":
380 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
381 log.Warnw("cannot-unmarshal-portno", log.Fields{"error": err})
382 return nil, err
383 }
384
385 }
386 }
387 log.Debugw("PortStateUpdate", log.Fields{"deviceId": deviceId.Id, "operStatus": operStatus, "portType": portType, "portNo": portNo})
388 if rhp.TestMode { // Execute only for test cases
389 return nil, nil
390 }
391 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 -0400392 return new(empty.Empty), nil
393}
394
khenaidoo79232702018-12-04 11:00:41 -0500395func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400396 if len(args) != 2 {
397 log.Warn("invalid-number-of-args", log.Fields{"args": args})
398 err := errors.New("invalid-number-of-args")
399 return nil, err
400 }
401 deviceId := &voltha.ID{}
402 port := &voltha.Port{}
403 for _, arg := range args {
404 switch arg.Key {
405 case "device_id":
406 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
407 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
408 return nil, err
409 }
410 case "port":
411 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
412 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
413 return nil, err
414 }
415 }
416 }
khenaidoob9203542018-09-17 22:56:37 -0400417 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port})
418
419 if rhp.TestMode { // Execute only for test cases
420 return nil, nil
421 }
khenaidoo92e62c52018-10-03 14:02:54 -0400422 // Run port creation in its own go routine
423 go rhp.deviceMgr.addPort(deviceId.Id, port)
424
khenaidoob9203542018-09-17 22:56:37 -0400425 return new(empty.Empty), nil
426}
427
khenaidoo79232702018-12-04 11:00:41 -0500428func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ic.Argument) (*empty.Empty, error) {
khenaidoob9203542018-09-17 22:56:37 -0400429 if len(args) != 2 {
430 log.Warn("invalid-number-of-args", log.Fields{"args": args})
431 err := errors.New("invalid-number-of-args")
432 return nil, err
433 }
434 pmConfigs := &voltha.PmConfigs{}
khenaidoo79232702018-12-04 11:00:41 -0500435 init := &ic.BoolType{}
khenaidoob9203542018-09-17 22:56:37 -0400436 for _, arg := range args {
437 switch arg.Key {
438 case "device_pm_config":
439 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
440 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
441 return nil, err
442 }
443 case "init":
444 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
445 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
446 return nil, err
447 }
448 }
449 }
khenaidoob9203542018-09-17 22:56:37 -0400450 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
451 "init": init})
452
453 if rhp.TestMode { // Execute only for test cases
454 return nil, nil
455 }
456
khenaidoo92e62c52018-10-03 14:02:54 -0400457 // Run PM config update in its own go routine
458 go rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs)
459
khenaidoob9203542018-09-17 22:56:37 -0400460 return new(empty.Empty), nil
khenaidoob9203542018-09-17 22:56:37 -0400461}
khenaidoofdbad6e2018-11-06 22:26:38 -0500462
khenaidoo79232702018-12-04 11:00:41 -0500463func (rhp *AdapterRequestHandlerProxy) PacketIn(args []*ic.Argument) (*empty.Empty, error) {
khenaidoofdbad6e2018-11-06 22:26:38 -0500464 if len(args) < 3 {
465 log.Warn("invalid-number-of-args", log.Fields{"args": args})
466 err := errors.New("invalid-number-of-args")
467 return nil, err
468 }
469 deviceId := &voltha.ID{}
khenaidoo79232702018-12-04 11:00:41 -0500470 portNo := &ic.IntType{}
471 packet := &ic.Packet{}
khenaidoofdbad6e2018-11-06 22:26:38 -0500472 for _, arg := range args {
473 switch arg.Key {
474 case "device_id":
475 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
476 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
477 return nil, err
478 }
479 case "port":
480 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
481 log.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
482 return nil, err
483 }
484 case "packet":
485 if err := ptypes.UnmarshalAny(arg.Value, packet); err != nil {
486 log.Warnw("cannot-unmarshal-packet", log.Fields{"error": err})
487 return nil, err
488 }
489
490 }
491 }
khenaidoo43c82122018-11-22 18:38:28 -0500492 log.Debugw("PacketIn", log.Fields{"deviceId": deviceId.Id, "port": portNo.Val, "packet": packet})
khenaidoofdbad6e2018-11-06 22:26:38 -0500493 if rhp.TestMode { // Execute only for test cases
494 return nil, nil
495 }
496 go rhp.deviceMgr.PacketIn(deviceId.Id, uint32(portNo.Val), packet.Payload)
497 return new(empty.Empty), nil
498}
khenaidoof5a5bfa2019-01-23 22:20:29 -0500499
500
501func (rhp *AdapterRequestHandlerProxy) UpdateImageDownload(args []*ic.Argument) (*empty.Empty, error) {
502 if len(args) < 2 {
503 log.Warn("invalid-number-of-args", log.Fields{"args": args})
504 err := errors.New("invalid-number-of-args")
505 return nil, err
506 }
507 deviceId := &voltha.ID{}
508 img := &voltha.ImageDownload{}
509 for _, arg := range args {
510 switch arg.Key {
511 case "device_id":
512 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
513 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
514 return nil, err
515 }
516 case "image_download":
517 if err := ptypes.UnmarshalAny(arg.Value, img); err != nil {
518 log.Warnw("cannot-unmarshal-imgaeDownload", log.Fields{"error": err})
519 return nil, err
520 }
521 }
522 }
523 log.Debugw("UpdateImageDownload", log.Fields{"deviceId": deviceId.Id, "image-download": img})
524 if rhp.TestMode { // Execute only for test cases
525 return nil, nil
526 }
527 go rhp.deviceMgr.updateImageDownload(deviceId.Id, img)
528 return new(empty.Empty), nil
529}