blob: 95ad69de3714d942b83eb96f2672a2eaf22b8b6c [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"
20 "github.com/golang/protobuf/ptypes"
21 "github.com/golang/protobuf/ptypes/empty"
22 "github.com/opencord/voltha-go/common/log"
23 "github.com/opencord/voltha-go/db/model"
24 ca "github.com/opencord/voltha-go/protos/core_adapter"
25 "github.com/opencord/voltha-go/protos/voltha"
26 "google.golang.org/grpc/codes"
27 "google.golang.org/grpc/status"
28)
29
30type AdapterRequestHandlerProxy struct {
31 TestMode bool
32 deviceMgr *DeviceManager
33 lDeviceMgr *LogicalDeviceManager
34 localDataProxy *model.Proxy
35 clusterDataProxy *model.Proxy
36}
37
38func NewAdapterRequestHandlerProxy(dMgr *DeviceManager, ldMgr *LogicalDeviceManager, cdProxy *model.Proxy, ldProxy *model.Proxy) *AdapterRequestHandlerProxy {
39 var proxy AdapterRequestHandlerProxy
40 proxy.deviceMgr = dMgr
41 proxy.lDeviceMgr = ldMgr
42 proxy.clusterDataProxy = cdProxy
43 proxy.localDataProxy = ldProxy
44 return &proxy
45}
46
47func (rhp *AdapterRequestHandlerProxy) Register(args []*ca.Argument) (*voltha.CoreInstance, error) {
48 if len(args) != 1 {
49 log.Warn("invalid-number-of-args", log.Fields{"args": args})
50 err := errors.New("invalid-number-of-args")
51 return nil, err
52 }
53 adapter := &voltha.Adapter{}
54 if err := ptypes.UnmarshalAny(args[0].Value, adapter); err != nil {
55 log.Warnw("cannot-unmarshal-adapter", log.Fields{"error": err})
56 return nil, err
57 }
58 log.Debugw("Register", log.Fields{"Adapter": *adapter})
59 // TODO process the request and store the data in the KV store
60
61 if rhp.TestMode { // Execute only for test cases
62 return &voltha.CoreInstance{InstanceId: "CoreInstance"}, nil
63 }
64 return &voltha.CoreInstance{InstanceId: "CoreInstance"}, nil
65}
66
67func (rhp *AdapterRequestHandlerProxy) GetDevice(args []*ca.Argument) (*voltha.Device, error) {
68 if len(args) != 1 {
69 log.Warn("invalid-number-of-args", log.Fields{"args": args})
70 err := errors.New("invalid-number-of-args")
71 return nil, err
72 }
73 pID := &voltha.ID{}
74 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
75 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
76 return nil, err
77 }
78 log.Debugw("GetDevice", log.Fields{"deviceId": pID.Id})
79
80 if rhp.TestMode { // Execute only for test cases
81 return &voltha.Device{Id: pID.Id}, nil
82 }
83
84 // Get the device via the device manager
85 if device, err := rhp.deviceMgr.getDevice(pID.Id); err != nil {
86 return nil, status.Errorf(codes.NotFound, "%s", err.Error())
87 } else {
88 return device, nil
89 }
90}
91
92func (rhp *AdapterRequestHandlerProxy) DeviceUpdate(args []*ca.Argument) (*empty.Empty, error) {
93 if len(args) != 1 {
94 log.Warn("invalid-number-of-args", log.Fields{"args": args})
95 err := errors.New("invalid-number-of-args")
96 return nil, err
97 }
98 device := &voltha.Device{}
99 if err := ptypes.UnmarshalAny(args[0].Value, device); err != nil {
100 log.Warnw("cannot-unmarshal-device", log.Fields{"error": err})
101 return nil, err
102 }
103 log.Debugw("DeviceUpdate", log.Fields{"device": device})
104
105 if rhp.TestMode { // Execute only for test cases
106 return new(empty.Empty), nil
107 }
108 if err := rhp.deviceMgr.updateDevice(device); err != nil {
109 log.Debugw("DeviceUpdate-error", log.Fields{"device": device, "error": err})
110 return nil, status.Errorf(codes.Internal, "%s", err.Error())
111 }
112 return new(empty.Empty), nil
113}
114
115func (rhp *AdapterRequestHandlerProxy) GetChildDevice(args []*ca.Argument) (*voltha.Device, error) {
116 if len(args) < 1 {
117 log.Warn("invalid-number-of-args", log.Fields{"args": args})
118 err := errors.New("invalid-number-of-args")
119 return nil, err
120 }
121 pID := &ca.StrType{}
122 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
123 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
124 return nil, err
125 }
126 log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Val})
127
128 if rhp.TestMode { // Execute only for test cases
129 return &voltha.Device{Id: pID.Val}, nil
130 }
131 return nil, nil
132}
133
134func (rhp *AdapterRequestHandlerProxy) GetPorts(args []*ca.Argument) (*voltha.Ports, error) {
135 if len(args) != 2 {
136 log.Warn("invalid-number-of-args", log.Fields{"args": args})
137 err := errors.New("invalid-number-of-args")
138 return nil, err
139 }
140 pID := &ca.StrType{}
141 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
142 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
143 return nil, err
144 }
145 // Porttype is an enum sent as an integer proto
146 pt := &ca.IntType{}
147 if err := ptypes.UnmarshalAny(args[1].Value, pt); err != nil {
148 log.Warnw("cannot-unmarshal-porttype", log.Fields{"error": err})
149 return nil, err
150 }
151
152 log.Debugw("GetPorts", log.Fields{"deviceID": pID.Val, "portype": pt.Val})
153
154 if rhp.TestMode { // Execute only for test cases
155 aPort := &voltha.Port{Label: "test_port"}
156 allPorts := &voltha.Ports{}
157 allPorts.Items = append(allPorts.Items, aPort)
158 return allPorts, nil
159 }
160 return nil, nil
161
162}
163
164func (rhp *AdapterRequestHandlerProxy) GetChildDevices(args []*ca.Argument) (*voltha.Device, error) {
165 if len(args) != 1 {
166 log.Warn("invalid-number-of-args", log.Fields{"args": args})
167 err := errors.New("invalid-number-of-args")
168 return nil, err
169 }
170 pID := &ca.StrType{}
171 if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
172 log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
173 return nil, err
174 }
175 log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Val})
176
177 if rhp.TestMode { // Execute only for test cases
178 return &voltha.Device{Id: pID.Val}, nil
179 }
180 //TODO: Complete
181 return nil, nil
182}
183
184// ChildDeviceDetected is invoked when a child device is detected. The following
185// parameters are expected:
186// {parent_device_id, parent_port_no, child_device_type, proxy_address, admin_state, **kw)
187func (rhp *AdapterRequestHandlerProxy) ChildDeviceDetected(args []*ca.Argument) (*empty.Empty, error) {
188 if len(args) < 4 {
189 log.Warn("invalid-number-of-args", log.Fields{"args": args})
190 err := errors.New("invalid-number-of-args")
191 return nil, err
192 }
193
194 pID := &voltha.ID{}
195 portNo := &ca.IntType{}
196 dt := &ca.StrType{}
197 chnlId := &ca.IntType{}
198 for _, arg := range args {
199 switch arg.Key {
200 case "parent_device_id":
201 if err := ptypes.UnmarshalAny(arg.Value, pID); err != nil {
202 log.Warnw("cannot-unmarshal-parent-device-id", log.Fields{"error": err})
203 return nil, err
204 }
205 case "parent_port_no":
206 if err := ptypes.UnmarshalAny(arg.Value, portNo); err != nil {
207 log.Warnw("cannot-unmarshal-parent-port", log.Fields{"error": err})
208 return nil, err
209 }
210 case "child_device_type":
211 if err := ptypes.UnmarshalAny(arg.Value, dt); err != nil {
212 log.Warnw("cannot-unmarshal-child-device-type", log.Fields{"error": err})
213 return nil, err
214 }
215 case "channel_id":
216 if err := ptypes.UnmarshalAny(arg.Value, chnlId); err != nil {
217 log.Warnw("cannot-unmarshal-channel-id", log.Fields{"error": err})
218 return nil, err
219 }
220 }
221 }
222
223 log.Debugw("ChildDeviceDetected", log.Fields{"parentDeviceId": pID.Id, "parentPortNo": portNo.Val,
224 "deviceType": dt.Val, "channelId": chnlId.Val})
225
226 if rhp.TestMode { // Execute only for test cases
227 return nil, nil
228 }
229
230 // Run child detection in it's own go routine as it can be a lengthy process
231 go rhp.deviceMgr.childDeviceDetected(pID.Id, portNo.Val, dt.Val, chnlId.Val)
232
233 return new(empty.Empty), nil
234}
235
236func (rhp *AdapterRequestHandlerProxy) DeviceStateUpdate(args []*ca.Argument) (*empty.Empty, error) {
237 if len(args) < 2 {
238 log.Warn("invalid-number-of-args", log.Fields{"args": args})
239 err := errors.New("invalid-number-of-args")
240 return nil, err
241 }
242 deviceId := &voltha.ID{}
243 operStatus := &ca.IntType{}
244 connStatus := &ca.IntType{}
245 for _, arg := range args {
246 switch arg.Key {
247 case "device_id":
248 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
249 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
250 return nil, err
251 }
252 case "oper_status":
253 if err := ptypes.UnmarshalAny(arg.Value, operStatus); err != nil {
254 log.Warnw("cannot-unmarshal-operStatus", log.Fields{"error": err})
255 return nil, err
256 }
257 if operStatus.Val == -1 {
258 operStatus = nil
259 }
260 case "connect_status":
261 if err := ptypes.UnmarshalAny(arg.Value, connStatus); err != nil {
262 log.Warnw("cannot-unmarshal-connStatus", log.Fields{"error": err})
263 return nil, err
264 }
265 if connStatus.Val == -1 {
266 connStatus = nil
267 }
268 }
269 }
270
271 log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId.Id, "oper-status": operStatus, "conn-status": connStatus})
272
273 if rhp.TestMode { // Execute only for test cases
274 return nil, nil
275 }
276 if err := rhp.deviceMgr.updateDeviceState(deviceId.Id, operStatus, connStatus); err != nil {
277 log.Debugw("DeviceUpdate-error", log.Fields{"deviceId": deviceId.Id, "error": err})
278 return nil, status.Errorf(codes.Internal, "%s", err.Error())
279 }
280 return new(empty.Empty), nil
281}
282
283func (rhp *AdapterRequestHandlerProxy) PortCreated(args []*ca.Argument) (*empty.Empty, error) {
284 if len(args) != 2 {
285 log.Warn("invalid-number-of-args", log.Fields{"args": args})
286 err := errors.New("invalid-number-of-args")
287 return nil, err
288 }
289 deviceId := &voltha.ID{}
290 port := &voltha.Port{}
291 for _, arg := range args {
292 switch arg.Key {
293 case "device_id":
294 if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
295 log.Warnw("cannot-unmarshal-device-id", log.Fields{"error": err})
296 return nil, err
297 }
298 case "port":
299 if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
300 log.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
301 return nil, err
302 }
303 }
304 }
305
306 log.Debugw("PortCreated", log.Fields{"deviceId": deviceId.Id, "port": port})
307
308 if rhp.TestMode { // Execute only for test cases
309 return nil, nil
310 }
311
312 if err := rhp.deviceMgr.addPort(deviceId.Id, port); err != nil {
313 log.Debugw("addport-error", log.Fields{"deviceId": deviceId.Id, "error": err})
314 return nil, status.Errorf(codes.Internal, "%s", err.Error())
315 }
316 return new(empty.Empty), nil
317}
318
319func (rhp *AdapterRequestHandlerProxy) DevicePMConfigUpdate(args []*ca.Argument) (*empty.Empty, error) {
320 if len(args) != 2 {
321 log.Warn("invalid-number-of-args", log.Fields{"args": args})
322 err := errors.New("invalid-number-of-args")
323 return nil, err
324 }
325 pmConfigs := &voltha.PmConfigs{}
326 init := &ca.BoolType{}
327 for _, arg := range args {
328 switch arg.Key {
329 case "device_pm_config":
330 if err := ptypes.UnmarshalAny(arg.Value, pmConfigs); err != nil {
331 log.Warnw("cannot-unmarshal-pm-config", log.Fields{"error": err})
332 return nil, err
333 }
334 case "init":
335 if err := ptypes.UnmarshalAny(arg.Value, init); err != nil {
336 log.Warnw("cannot-unmarshal-boolean", log.Fields{"error": err})
337 return nil, err
338 }
339 }
340 }
341
342 log.Debugw("DevicePMConfigUpdate", log.Fields{"deviceId": pmConfigs.Id, "configs": pmConfigs,
343 "init": init})
344
345 if rhp.TestMode { // Execute only for test cases
346 return nil, nil
347 }
348
349 if err := rhp.deviceMgr.updatePmConfigs(pmConfigs.Id, pmConfigs); err != nil {
350 log.Debugw("update-pmconfigs-error", log.Fields{"deviceId": pmConfigs.Id, "error": err})
351 return nil, status.Errorf(codes.Internal, "%s", err.Error())
352 }
353 return new(empty.Empty), nil
354
355}