blob: 4ed1a71f954acad58e9c2f1fe3689654e30e1962 [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 "context"
20 "github.com/golang/protobuf/ptypes"
khenaidoo92e62c52018-10-03 14:02:54 -040021 a "github.com/golang/protobuf/ptypes/any"
khenaidoob9203542018-09-17 22:56:37 -040022 "github.com/opencord/voltha-go/common/log"
23 "github.com/opencord/voltha-go/kafka"
William Kurkiandaa6bb22019-03-07 12:26:28 -050024 ic "github.com/opencord/voltha-protos/go/inter_container"
25 "github.com/opencord/voltha-protos/go/openflow_13"
26 "github.com/opencord/voltha-protos/go/voltha"
khenaidoob9203542018-09-17 22:56:37 -040027 "google.golang.org/grpc/codes"
28 "google.golang.org/grpc/status"
29)
30
31type AdapterProxy struct {
khenaidoo43c82122018-11-22 18:38:28 -050032 TestMode bool
khenaidoo54e0ddf2019-02-27 16:21:33 -050033 deviceTopicRegistered bool
34 coreTopic *kafka.Topic
khenaidoo43c82122018-11-22 18:38:28 -050035 kafkaICProxy *kafka.InterContainerProxy
khenaidoob9203542018-09-17 22:56:37 -040036}
37
khenaidoo43c82122018-11-22 18:38:28 -050038func NewAdapterProxy(kafkaProxy *kafka.InterContainerProxy) *AdapterProxy {
khenaidoob9203542018-09-17 22:56:37 -040039 var proxy AdapterProxy
khenaidoo43c82122018-11-22 18:38:28 -050040 proxy.kafkaICProxy = kafkaProxy
khenaidoo54e0ddf2019-02-27 16:21:33 -050041 proxy.deviceTopicRegistered = false
khenaidoob9203542018-09-17 22:56:37 -040042 return &proxy
43}
44
khenaidoo92e62c52018-10-03 14:02:54 -040045func unPackResponse(rpc string, deviceId string, success bool, response *a.Any) error {
46 if success {
47 return nil
48 } else {
khenaidoo79232702018-12-04 11:00:41 -050049 unpackResult := &ic.Error{}
khenaidoo92e62c52018-10-03 14:02:54 -040050 var err error
51 if err = ptypes.UnmarshalAny(response, unpackResult); err != nil {
52 log.Warnw("cannot-unmarshal-response", log.Fields{"error": err})
khenaidoo6d055132019-02-12 16:51:19 -050053 return err
khenaidoo92e62c52018-10-03 14:02:54 -040054 }
55 log.Debugw("response", log.Fields{"rpc": rpc, "deviceId": deviceId, "success": success, "error": err})
56 // TODO: Need to get the real error code
57 return status.Errorf(codes.Canceled, "%s", unpackResult.Reason)
58 }
59}
60
khenaidoo54e0ddf2019-02-27 16:21:33 -050061func (ap *AdapterProxy) updateCoreTopic(coreTopic *kafka.Topic) {
62 ap.coreTopic = coreTopic
63}
64
65func (ap *AdapterProxy) getCoreTopic() kafka.Topic{
66 if ap.coreTopic != nil {
67 return *ap.coreTopic
68 }
69 return kafka.Topic{Name:ap.kafkaICProxy.DefaultTopic.Name}
70}
71
72func (ap *AdapterProxy) getAdapterTopic(adapterName string) kafka.Topic{
73 return kafka.Topic{Name: adapterName}
74}
75
76
khenaidoob9203542018-09-17 22:56:37 -040077func (ap *AdapterProxy) AdoptDevice(ctx context.Context, device *voltha.Device) error {
78 log.Debugw("AdoptDevice", log.Fields{"device": device})
khenaidoo92e62c52018-10-03 14:02:54 -040079 rpc := "adopt_device"
khenaidoo54e0ddf2019-02-27 16:21:33 -050080 toTopic := ap.getAdapterTopic(device.Adapter)
81 //topic := kafka.Topic{Name: device.Adapter}
khenaidoob9203542018-09-17 22:56:37 -040082 args := make([]*kafka.KVArg, 1)
83 args[0] = &kafka.KVArg{
84 Key: "device",
85 Value: device,
86 }
khenaidoo43c82122018-11-22 18:38:28 -050087 // Use a device topic for the response as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -050088 replyToTopic := ap.getCoreTopic()
khenaidoo54e0ddf2019-02-27 16:21:33 -050089 ap.deviceTopicRegistered = true
khenaidoobdcb8e02019-03-06 16:28:56 -050090 success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoo43c82122018-11-22 18:38:28 -050091 log.Debugw("AdoptDevice-response", log.Fields{"replyTopic": replyToTopic, "deviceid": device.Id, "success": success})
khenaidoo92e62c52018-10-03 14:02:54 -040092 return unPackResponse(rpc, device.Id, success, result)
93}
94
95func (ap *AdapterProxy) DisableDevice(ctx context.Context, device *voltha.Device) error {
96 log.Debugw("DisableDevice", log.Fields{"deviceId": device.Id})
97 rpc := "disable_device"
khenaidoo54e0ddf2019-02-27 16:21:33 -050098 toTopic := ap.getAdapterTopic(device.Adapter)
99
khenaidoo43c82122018-11-22 18:38:28 -0500100 // Use a device specific topic to send the request. The adapter handling the device creates a device
101 // specific topic
khenaidoo54e0ddf2019-02-27 16:21:33 -0500102 //toTopic := kafka.CreateSubTopic(device.Adapter, device.Id)
khenaidoo92e62c52018-10-03 14:02:54 -0400103 args := make([]*kafka.KVArg, 1)
104 args[0] = &kafka.KVArg{
105 Key: "device",
106 Value: device,
khenaidoob9203542018-09-17 22:56:37 -0400107 }
khenaidoo43c82122018-11-22 18:38:28 -0500108 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500109 //replyToTopic := kafka.CreateSubTopic(ap.kafkaICProxy.DefaultTopic.Name, device.Id)
110 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500111 success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoo92e62c52018-10-03 14:02:54 -0400112 log.Debugw("DisableDevice-response", log.Fields{"deviceId": device.Id, "success": success})
113 return unPackResponse(rpc, device.Id, success, result)
khenaidoob9203542018-09-17 22:56:37 -0400114}
115
khenaidoo4d4802d2018-10-04 21:59:49 -0400116func (ap *AdapterProxy) ReEnableDevice(ctx context.Context, device *voltha.Device) error {
117 log.Debugw("ReEnableDevice", log.Fields{"deviceId": device.Id})
118 rpc := "reenable_device"
khenaidoo54e0ddf2019-02-27 16:21:33 -0500119 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoo4d4802d2018-10-04 21:59:49 -0400120 args := make([]*kafka.KVArg, 1)
121 args[0] = &kafka.KVArg{
122 Key: "device",
123 Value: device,
124 }
khenaidoo43c82122018-11-22 18:38:28 -0500125 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500126 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500127 success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoo4d4802d2018-10-04 21:59:49 -0400128 log.Debugw("ReEnableDevice-response", log.Fields{"deviceid": device.Id, "success": success})
129 return unPackResponse(rpc, device.Id, success, result)
130}
131
132func (ap *AdapterProxy) RebootDevice(ctx context.Context, device *voltha.Device) error {
133 log.Debugw("RebootDevice", log.Fields{"deviceId": device.Id})
134 rpc := "reboot_device"
khenaidoo54e0ddf2019-02-27 16:21:33 -0500135 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoo4d4802d2018-10-04 21:59:49 -0400136 args := make([]*kafka.KVArg, 1)
137 args[0] = &kafka.KVArg{
138 Key: "device",
139 Value: device,
140 }
khenaidoo43c82122018-11-22 18:38:28 -0500141 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500142 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500143 success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoo4d4802d2018-10-04 21:59:49 -0400144 log.Debugw("RebootDevice-response", log.Fields{"deviceid": device.Id, "success": success})
145 return unPackResponse(rpc, device.Id, success, result)
146}
147
148func (ap *AdapterProxy) DeleteDevice(ctx context.Context, device *voltha.Device) error {
149 log.Debugw("DeleteDevice", log.Fields{"deviceId": device.Id})
150 rpc := "delete_device"
khenaidoo54e0ddf2019-02-27 16:21:33 -0500151 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoo4d4802d2018-10-04 21:59:49 -0400152 args := make([]*kafka.KVArg, 1)
153 args[0] = &kafka.KVArg{
154 Key: "device",
155 Value: device,
156 }
khenaidoo43c82122018-11-22 18:38:28 -0500157 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500158 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500159 success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoo4d4802d2018-10-04 21:59:49 -0400160 log.Debugw("DeleteDevice-response", log.Fields{"deviceid": device.Id, "success": success})
khenaidoo43c82122018-11-22 18:38:28 -0500161
khenaidoo4d4802d2018-10-04 21:59:49 -0400162 return unPackResponse(rpc, device.Id, success, result)
163}
164
khenaidoo79232702018-12-04 11:00:41 -0500165func (ap *AdapterProxy) GetOfpDeviceInfo(ctx context.Context, device *voltha.Device) (*ic.SwitchCapability, error) {
khenaidoo4d4802d2018-10-04 21:59:49 -0400166 log.Debugw("GetOfpDeviceInfo", log.Fields{"deviceId": device.Id})
khenaidoo54e0ddf2019-02-27 16:21:33 -0500167 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoo4d4802d2018-10-04 21:59:49 -0400168 args := make([]*kafka.KVArg, 1)
169 args[0] = &kafka.KVArg{
170 Key: "device",
171 Value: device,
172 }
khenaidoo43c82122018-11-22 18:38:28 -0500173 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500174 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500175 success, result := ap.kafkaICProxy.InvokeRPC(ctx, "get_ofp_device_info", &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoo4d4802d2018-10-04 21:59:49 -0400176 log.Debugw("GetOfpDeviceInfo-response", log.Fields{"deviceId": device.Id, "success": success, "result": result})
177 if success {
khenaidoo79232702018-12-04 11:00:41 -0500178 unpackResult := &ic.SwitchCapability{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400179 if err := ptypes.UnmarshalAny(result, unpackResult); err != nil {
180 log.Warnw("cannot-unmarshal-response", log.Fields{"error": err})
181 return nil, status.Errorf(codes.InvalidArgument, "%s", err.Error())
182 }
183 return unpackResult, nil
184 } else {
khenaidoo79232702018-12-04 11:00:41 -0500185 unpackResult := &ic.Error{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400186 var err error
187 if err = ptypes.UnmarshalAny(result, unpackResult); err != nil {
188 log.Warnw("cannot-unmarshal-response", log.Fields{"error": err})
189 }
190 log.Debugw("GetOfpDeviceInfo-return", log.Fields{"deviceid": device.Id, "success": success, "error": err})
191 // TODO: Need to get the real error code
192 return nil, status.Errorf(codes.Internal, "%s", unpackResult.Reason)
193 }
194}
195
khenaidoo79232702018-12-04 11:00:41 -0500196func (ap *AdapterProxy) GetOfpPortInfo(ctx context.Context, device *voltha.Device, portNo uint32) (*ic.PortCapability, error) {
khenaidoo4d4802d2018-10-04 21:59:49 -0400197 log.Debugw("GetOfpPortInfo", log.Fields{"deviceId": device.Id})
khenaidoo54e0ddf2019-02-27 16:21:33 -0500198 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoo4d4802d2018-10-04 21:59:49 -0400199 args := make([]*kafka.KVArg, 2)
200 args[0] = &kafka.KVArg{
201 Key: "device",
202 Value: device,
203 }
khenaidoo79232702018-12-04 11:00:41 -0500204 pNo := &ic.IntType{Val: int64(portNo)}
khenaidoo4d4802d2018-10-04 21:59:49 -0400205 args[1] = &kafka.KVArg{
206 Key: "port_no",
207 Value: pNo,
208 }
khenaidoo43c82122018-11-22 18:38:28 -0500209 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500210 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500211 success, result := ap.kafkaICProxy.InvokeRPC(ctx, "get_ofp_port_info", &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoo4d4802d2018-10-04 21:59:49 -0400212 log.Debugw("GetOfpPortInfo-response", log.Fields{"deviceid": device.Id, "success": success})
213 if success {
khenaidoo79232702018-12-04 11:00:41 -0500214 unpackResult := &ic.PortCapability{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400215 if err := ptypes.UnmarshalAny(result, unpackResult); err != nil {
216 log.Warnw("cannot-unmarshal-response", log.Fields{"error": err})
217 return nil, status.Errorf(codes.InvalidArgument, "%s", err.Error())
218 }
219 return unpackResult, nil
220 } else {
khenaidoo79232702018-12-04 11:00:41 -0500221 unpackResult := &ic.Error{}
khenaidoo4d4802d2018-10-04 21:59:49 -0400222 var err error
223 if err = ptypes.UnmarshalAny(result, unpackResult); err != nil {
224 log.Warnw("cannot-unmarshal-response", log.Fields{"error": err})
225 }
226 log.Debugw("GetOfpPortInfo-return", log.Fields{"deviceid": device.Id, "success": success, "error": err})
227 // TODO: Need to get the real error code
228 return nil, status.Errorf(codes.Internal, "%s", unpackResult.Reason)
229 }
230}
231
232//TODO: Implement the functions below
233
khenaidoob9203542018-09-17 22:56:37 -0400234func (ap *AdapterProxy) AdapterDescriptor() (*voltha.Adapter, error) {
235 log.Debug("AdapterDescriptor")
236 return nil, nil
237}
238
239func (ap *AdapterProxy) DeviceTypes() (*voltha.DeviceType, error) {
240 log.Debug("DeviceTypes")
241 return nil, nil
242}
243
244func (ap *AdapterProxy) Health() (*voltha.HealthStatus, error) {
245 log.Debug("Health")
246 return nil, nil
247}
248
khenaidoo92e62c52018-10-03 14:02:54 -0400249func (ap *AdapterProxy) ReconcileDevice(device *voltha.Device) error {
khenaidoob9203542018-09-17 22:56:37 -0400250 log.Debug("ReconcileDevice")
251 return nil
252}
253
254func (ap *AdapterProxy) AbandonDevice(device voltha.Device) error {
255 log.Debug("AbandonDevice")
256 return nil
257}
258
khenaidoob9203542018-09-17 22:56:37 -0400259func (ap *AdapterProxy) GetDeviceDetails(device voltha.Device) (*voltha.Device, error) {
260 log.Debug("GetDeviceDetails")
261 return nil, nil
262}
263
khenaidoof5a5bfa2019-01-23 22:20:29 -0500264func (ap *AdapterProxy) DownloadImage(ctx context.Context, device *voltha.Device, download *voltha.ImageDownload) error {
265 log.Debugw("DownloadImage", log.Fields{"deviceId": device.Id, "image": download.Name})
266 rpc := "download_image"
khenaidoo54e0ddf2019-02-27 16:21:33 -0500267 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500268 args := make([]*kafka.KVArg, 2)
269 args[0] = &kafka.KVArg{
270 Key: "device",
271 Value: device,
272 }
273 args[1] = &kafka.KVArg{
274 Key: "request",
275 Value: download,
276 }
277 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500278 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500279 success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500280 log.Debugw("DownloadImage-response", log.Fields{"deviceId": device.Id, "success": success})
281
282 return unPackResponse(rpc, device.Id, success, result)
khenaidoob9203542018-09-17 22:56:37 -0400283}
284
khenaidoof5a5bfa2019-01-23 22:20:29 -0500285func (ap *AdapterProxy) GetImageDownloadStatus(ctx context.Context, device *voltha.Device, download *voltha.ImageDownload) (*voltha.ImageDownload, error) {
286 log.Debugw("GetImageDownloadStatus", log.Fields{"deviceId": device.Id, "image": download.Name})
287 rpc := "get_image_download_status"
khenaidoo54e0ddf2019-02-27 16:21:33 -0500288 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500289 args := make([]*kafka.KVArg, 2)
290 args[0] = &kafka.KVArg{
291 Key: "device",
292 Value: device,
293 }
294 args[1] = &kafka.KVArg{
295 Key: "request",
296 Value: download,
297 }
298 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500299 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500300 success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500301 log.Debugw("GetImageDownloadStatus-response", log.Fields{"deviceId": device.Id, "success": success})
302
303 if success {
304 unpackResult := &voltha.ImageDownload{}
305 if err := ptypes.UnmarshalAny(result, unpackResult); err != nil {
306 log.Warnw("cannot-unmarshal-response", log.Fields{"error": err})
307 return nil, status.Errorf(codes.InvalidArgument, "%s", err.Error())
308 }
309 return unpackResult, nil
310 } else {
311 unpackResult := &ic.Error{}
312 var err error
313 if err = ptypes.UnmarshalAny(result, unpackResult); err != nil {
314 log.Warnw("cannot-unmarshal-response", log.Fields{"error": err})
315 return nil, err
316 }
317 log.Debugw("GetImageDownloadStatus-return", log.Fields{"deviceid": device.Id, "success": success, "error": err})
318 return nil, status.Errorf(codes.Internal, "%s", unpackResult.Reason)
319 }
khenaidoob9203542018-09-17 22:56:37 -0400320}
321
khenaidoof5a5bfa2019-01-23 22:20:29 -0500322func (ap *AdapterProxy) CancelImageDownload(ctx context.Context, device *voltha.Device, download *voltha.ImageDownload) error {
323 log.Debugw("CancelImageDownload", log.Fields{"deviceId": device.Id, "image": download.Name})
324 rpc := "cancel_image_download"
khenaidoo54e0ddf2019-02-27 16:21:33 -0500325 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500326 args := make([]*kafka.KVArg, 2)
327 args[0] = &kafka.KVArg{
328 Key: "device",
329 Value: device,
330 }
331 args[1] = &kafka.KVArg{
332 Key: "request",
333 Value: download,
334 }
335 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500336 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500337 success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500338 log.Debugw("CancelImageDownload-response", log.Fields{"deviceId": device.Id, "success": success})
339
340 return unPackResponse(rpc, device.Id, success, result)
khenaidoob9203542018-09-17 22:56:37 -0400341}
342
khenaidoof5a5bfa2019-01-23 22:20:29 -0500343func (ap *AdapterProxy) ActivateImageUpdate(ctx context.Context, device *voltha.Device, download *voltha.ImageDownload) error {
344 log.Debugw("ActivateImageUpdate", log.Fields{"deviceId": device.Id, "image": download.Name})
345 rpc := "activate_image_update"
khenaidoo54e0ddf2019-02-27 16:21:33 -0500346 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500347 args := make([]*kafka.KVArg, 2)
348 args[0] = &kafka.KVArg{
349 Key: "device",
350 Value: device,
351 }
352 args[1] = &kafka.KVArg{
353 Key: "request",
354 Value: download,
355 }
356 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500357 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500358 success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500359 log.Debugw("ActivateImageUpdate-response", log.Fields{"deviceId": device.Id, "success": success})
360
361 return unPackResponse(rpc, device.Id, success, result)
khenaidoob9203542018-09-17 22:56:37 -0400362}
363
khenaidoof5a5bfa2019-01-23 22:20:29 -0500364func (ap *AdapterProxy) RevertImageUpdate(ctx context.Context, device *voltha.Device, download *voltha.ImageDownload) error {
365 log.Debugw("RevertImageUpdate", log.Fields{"deviceId": device.Id, "image": download.Name})
366 rpc := "revert_image_update"
khenaidoo54e0ddf2019-02-27 16:21:33 -0500367 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500368 args := make([]*kafka.KVArg, 2)
369 args[0] = &kafka.KVArg{
370 Key: "device",
371 Value: device,
372 }
373 args[1] = &kafka.KVArg{
374 Key: "request",
375 Value: download,
376 }
377 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500378 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500379 success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoof5a5bfa2019-01-23 22:20:29 -0500380 log.Debugw("RevertImageUpdate-response", log.Fields{"deviceId": device.Id, "success": success})
381
382 return unPackResponse(rpc, device.Id, success, result)
khenaidoob9203542018-09-17 22:56:37 -0400383}
384
385func (ap *AdapterProxy) SelfTestDevice(device voltha.Device) (*voltha.SelfTestResponse, error) {
386 log.Debug("SelfTestDevice")
387 return nil, nil
388}
389
khenaidoofdbad6e2018-11-06 22:26:38 -0500390func (ap *AdapterProxy) packetOut(deviceType string, deviceId string, outPort uint32, packet *openflow_13.OfpPacketOut) error {
391 log.Debugw("packetOut", log.Fields{"deviceId": deviceId})
khenaidoo54e0ddf2019-02-27 16:21:33 -0500392 toTopic := ap.getAdapterTopic(deviceType)
khenaidoofdbad6e2018-11-06 22:26:38 -0500393 rpc := "receive_packet_out"
khenaidoo79232702018-12-04 11:00:41 -0500394 dId := &ic.StrType{Val: deviceId}
khenaidoofdbad6e2018-11-06 22:26:38 -0500395 args := make([]*kafka.KVArg, 3)
396 args[0] = &kafka.KVArg{
397 Key: "deviceId",
398 Value: dId,
399 }
khenaidoo79232702018-12-04 11:00:41 -0500400 op := &ic.IntType{Val: int64(outPort)}
khenaidoofdbad6e2018-11-06 22:26:38 -0500401 args[1] = &kafka.KVArg{
402 Key: "outPort",
403 Value: op,
404 }
405 args[2] = &kafka.KVArg{
406 Key: "packet",
407 Value: packet,
408 }
409
410 // TODO: Do we need to wait for an ACK on a packet Out?
khenaidoo43c82122018-11-22 18:38:28 -0500411 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500412 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500413 success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, deviceId, args...)
khenaidoofdbad6e2018-11-06 22:26:38 -0500414 log.Debugw("packetOut", log.Fields{"deviceid": deviceId, "success": success})
415 return unPackResponse(rpc, deviceId, success, result)
416}
417
khenaidoo19d7b632018-10-30 10:49:50 -0400418func (ap *AdapterProxy) UpdateFlowsBulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups) error {
419 log.Debugw("UpdateFlowsBulk", log.Fields{"deviceId": device.Id})
khenaidoo54e0ddf2019-02-27 16:21:33 -0500420 toTopic := ap.getAdapterTopic(device.Adapter)
khenaidoo19d7b632018-10-30 10:49:50 -0400421 rpc := "update_flows_bulk"
422 args := make([]*kafka.KVArg, 3)
423 args[0] = &kafka.KVArg{
424 Key: "device",
425 Value: device,
426 }
427 args[1] = &kafka.KVArg{
428 Key: "flows",
429 Value: flows,
430 }
431 args[2] = &kafka.KVArg{
432 Key: "groups",
433 Value: groups,
434 }
435
khenaidoo43c82122018-11-22 18:38:28 -0500436 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500437 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500438 success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoo19d7b632018-10-30 10:49:50 -0400439 log.Debugw("UpdateFlowsBulk-response", log.Fields{"deviceid": device.Id, "success": success})
440 return unPackResponse(rpc, device.Id, success, result)
khenaidoob9203542018-09-17 22:56:37 -0400441}
442
khenaidoo19d7b632018-10-30 10:49:50 -0400443func (ap *AdapterProxy) UpdateFlowsIncremental(device *voltha.Device, flowChanges *openflow_13.FlowChanges, groupChanges *openflow_13.FlowGroupChanges) error {
444 log.Debugw("UpdateFlowsIncremental", log.Fields{"deviceId": device.Id})
khenaidoo54e0ddf2019-02-27 16:21:33 -0500445 toTopic := ap.getAdapterTopic(device.Adapter)
Matt Jeanneretb0037422019-03-23 14:36:51 -0400446 rpc := "update_flows_incrementally"
khenaidoo19d7b632018-10-30 10:49:50 -0400447 args := make([]*kafka.KVArg, 3)
448 args[0] = &kafka.KVArg{
449 Key: "device",
450 Value: device,
451 }
452 args[1] = &kafka.KVArg{
453 Key: "flow_changes",
454 Value: flowChanges,
455 }
456 args[2] = &kafka.KVArg{
457 Key: "group_changes",
458 Value: groupChanges,
459 }
460
khenaidoo43c82122018-11-22 18:38:28 -0500461 // Use a device specific topic as we are the only core handling requests for this device
khenaidoo54e0ddf2019-02-27 16:21:33 -0500462 replyToTopic := ap.getCoreTopic()
khenaidoobdcb8e02019-03-06 16:28:56 -0500463 success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
khenaidoo19d7b632018-10-30 10:49:50 -0400464 log.Debugw("UpdateFlowsIncremental-response", log.Fields{"deviceid": device.Id, "success": success})
465 return unPackResponse(rpc, device.Id, success, result)
khenaidoob9203542018-09-17 22:56:37 -0400466}
467
468func (ap *AdapterProxy) UpdatePmConfig(device voltha.Device, pmConfigs voltha.PmConfigs) error {
469 log.Debug("UpdatePmConfig")
470 return nil
471}
472
473func (ap *AdapterProxy) ReceivePacketOut(deviceId voltha.ID, egressPortNo int, msg interface{}) error {
474 log.Debug("ReceivePacketOut")
475 return nil
476}
477
478func (ap *AdapterProxy) SuppressAlarm(filter voltha.AlarmFilter) error {
479 log.Debug("SuppressAlarm")
480 return nil
481}
482
483func (ap *AdapterProxy) UnSuppressAlarm(filter voltha.AlarmFilter) error {
484 log.Debug("UnSuppressAlarm")
485 return nil
khenaidoo89b0e942018-10-21 21:11:33 -0400486}