blob: 88aed6352a8f83dcaab7da01b351be18aa69a1d0 [file] [log] [blame]
khenaidooab1f7bd2019-11-14 14:00:27 -05001/*
Joey Armstrong7a9af442024-01-03 19:26:36 -05002 * Copyright 2019-2024 Open Networking Foundation (ONF) and the ONF Contributors
khenaidooab1f7bd2019-11-14 14:00:27 -05003
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
khenaidooab1f7bd2019-11-14 14:00:27 -050017package mocks
18
19import (
Rohan Agrawal31f21802020-06-12 05:38:46 +000020 "context"
khenaidoo8b4abbf2020-04-24 17:04:30 -040021 "fmt"
npujar1d86a522019-11-14 17:11:16 +053022 "strconv"
23 "strings"
24 "sync"
khenaidood948f772021-08-11 17:49:24 -040025 "time"
npujar1d86a522019-11-14 17:11:16 +053026
khenaidood948f772021-08-11 17:49:24 -040027 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
28 "github.com/opencord/voltha-lib-go/v7/pkg/log"
29 "github.com/opencord/voltha-lib-go/v7/pkg/probe"
khenaidoo9beaaf12021-10-19 17:32:01 -040030 "github.com/opencord/voltha-protos/v5/go/adapter_service"
khenaidood948f772021-08-11 17:49:24 -040031 "github.com/opencord/voltha-protos/v5/go/common"
khenaidoo9beaaf12021-10-19 17:32:01 -040032 "github.com/opencord/voltha-protos/v5/go/core_service"
33 "github.com/opencord/voltha-protos/v5/go/health"
khenaidood948f772021-08-11 17:49:24 -040034 "google.golang.org/grpc"
bseenivab18867a2026-02-12 19:15:25 +053035 "google.golang.org/protobuf/types/known/emptypb"
khenaidood948f772021-08-11 17:49:24 -040036
khenaidoo9beaaf12021-10-19 17:32:01 -040037 ca "github.com/opencord/voltha-protos/v5/go/core_adapter"
khenaidood948f772021-08-11 17:49:24 -040038 "github.com/opencord/voltha-protos/v5/go/extension"
khenaidoo9beaaf12021-10-19 17:32:01 -040039 "github.com/opencord/voltha-protos/v5/go/omci"
khenaidood948f772021-08-11 17:49:24 -040040 "github.com/opencord/voltha-protos/v5/go/openflow_13"
41 "github.com/opencord/voltha-protos/v5/go/voltha"
42)
43
44const (
45 numONUPerOLT = 4
46 startingUNIPortNo = 100
khenaidooab1f7bd2019-11-14 14:00:27 -050047)
48
49func macAddressToUint32Array(mac string) []uint32 {
50 slist := strings.Split(mac, ":")
51 result := make([]uint32, len(slist))
52 var err error
53 var tmp int64
54 for index, val := range slist {
55 if tmp, err = strconv.ParseInt(val, 16, 32); err != nil {
56 return []uint32{1, 2, 3, 4, 5, 6}
57 }
58 result[index] = uint32(tmp)
59 }
60 return result
61}
62
khenaidood948f772021-08-11 17:49:24 -040063// GetNumONUPerOLT returns number of ONUs per OLT
64func GetNumONUPerOLT() int {
65 return numONUPerOLT
66}
67
68// Returns the starting UNI port number
69func GetStartingUNIPortNo() int {
70 return startingUNIPortNo
71}
72
npujar1d86a522019-11-14 17:11:16 +053073// Adapter represents adapter attributes
khenaidooab1f7bd2019-11-14 14:00:27 -050074type Adapter struct {
bseenivab18867a2026-02-12 19:15:25 +053075 adapter_service.UnimplementedAdapterServiceServer
khenaidood948f772021-08-11 17:49:24 -040076 flows map[string]map[uint64]*openflow_13.OfpFlowStats
khenaidood948f772021-08-11 17:49:24 -040077 devices map[string]*voltha.Device
khenaidood948f772021-08-11 17:49:24 -040078 failFlowAdd map[string]bool
khenaidood948f772021-08-11 17:49:24 -040079 failFlowDelete map[string]bool
khenaidood948f772021-08-11 17:49:24 -040080 failDeleteDevice map[string]bool
khenaidood948f772021-08-11 17:49:24 -040081 coreClient *vgrpc.Client
Akash Reddy Kankanala929cc002025-04-08 15:05:21 +053082 Probe *probe.Probe
83 coreEnpoint string
khenaidood948f772021-08-11 17:49:24 -040084 serviceEndpoint string
85 DeviceType string
86 vendor string
Akash Reddy Kankanala929cc002025-04-08 15:05:21 +053087 flowLock sync.RWMutex
88 deviceLock sync.RWMutex
89 failFlowAddLock sync.RWMutex
90 failFlowDeleteLock sync.RWMutex
91 failDeleteDeviceLock sync.RWMutex
khenaidooab1f7bd2019-11-14 14:00:27 -050092}
93
npujar1d86a522019-11-14 17:11:16 +053094// NewAdapter creates adapter instance
khenaidood948f772021-08-11 17:49:24 -040095func NewAdapter(serviceEndpoint, coreEndpoint, deviceType, vendor string) *Adapter {
khenaidooab1f7bd2019-11-14 14:00:27 -050096 return &Adapter{
khenaidood948f772021-08-11 17:49:24 -040097 flows: map[string]map[uint64]*openflow_13.OfpFlowStats{},
98 devices: map[string]*voltha.Device{},
99 failFlowAdd: map[string]bool{},
100 failFlowDelete: map[string]bool{},
101 failDeleteDevice: map[string]bool{},
102 coreEnpoint: coreEndpoint,
103 serviceEndpoint: serviceEndpoint,
104 DeviceType: deviceType,
105 vendor: vendor,
khenaidooab1f7bd2019-11-14 14:00:27 -0500106 }
107}
108
khenaidood948f772021-08-11 17:49:24 -0400109func (ta *Adapter) IsReady() bool {
110 return ta.Probe.IsReady()
111}
112
khenaidooab1f7bd2019-11-14 14:00:27 -0500113func (ta *Adapter) storeDevice(d *voltha.Device) {
khenaidoo8b4abbf2020-04-24 17:04:30 -0400114 ta.deviceLock.Lock()
115 defer ta.deviceLock.Unlock()
khenaidooab1f7bd2019-11-14 14:00:27 -0500116 if d != nil {
khenaidoo8b4abbf2020-04-24 17:04:30 -0400117 ta.devices[d.Id] = d
khenaidooab1f7bd2019-11-14 14:00:27 -0500118 }
119}
120
khenaidooab1f7bd2019-11-14 14:00:27 -0500121func (ta *Adapter) getDevice(id string) *voltha.Device {
khenaidoo8b4abbf2020-04-24 17:04:30 -0400122 ta.deviceLock.RLock()
123 defer ta.deviceLock.RUnlock()
124 return ta.devices[id]
khenaidooab1f7bd2019-11-14 14:00:27 -0500125}
126
khenaidoo8b4abbf2020-04-24 17:04:30 -0400127func (ta *Adapter) updateDevice(d *voltha.Device) {
128 ta.storeDevice(d)
khenaidooab1f7bd2019-11-14 14:00:27 -0500129}
130
khenaidood948f772021-08-11 17:49:24 -0400131func (ta *Adapter) GetEndPoint() string {
132 return ta.serviceEndpoint
khenaidooab1f7bd2019-11-14 14:00:27 -0500133}
npujar1d86a522019-11-14 17:11:16 +0530134
khenaidoo9beaaf12021-10-19 17:32:01 -0400135func (ta *Adapter) GetCoreClient() (core_service.CoreServiceClient, error) {
khenaidood948f772021-08-11 17:49:24 -0400136 // Wait until the Core is up and running
137 for {
138 if ta.coreClient != nil {
139 client, err := ta.coreClient.GetClient()
140 if err != nil {
141 logger.Infow(context.Background(), "got-error-core-client", log.Fields{"error": err})
142 time.Sleep(1 * time.Second)
143 continue
144 }
khenaidoo9beaaf12021-10-19 17:32:01 -0400145 c, ok := client.(core_service.CoreServiceClient)
khenaidood948f772021-08-11 17:49:24 -0400146 if ok {
147 logger.Debug(context.Background(), "got-valid-client")
148 return c, nil
149 }
150 }
151 logger.Info(context.Background(), "waiting-for-grpc-core-client")
152 time.Sleep(1 * time.Second)
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530153 }
khenaidooab1f7bd2019-11-14 14:00:27 -0500154}
155
khenaidood948f772021-08-11 17:49:24 -0400156// Helper methods
157// startGRPCService creates the grpc service handlers, registers it to the grpc server and starts the server
khenaidoo9beaaf12021-10-19 17:32:01 -0400158func (ta *Adapter) startGRPCService(ctx context.Context, server *vgrpc.GrpcServer, handler adapter_service.AdapterServiceServer, serviceName string) {
khenaidood948f772021-08-11 17:49:24 -0400159 logger.Infow(ctx, "service-created", log.Fields{"service": serviceName})
160
khenaidoo9beaaf12021-10-19 17:32:01 -0400161 server.AddService(func(gs *grpc.Server) { adapter_service.RegisterAdapterServiceServer(gs, handler) })
khenaidood948f772021-08-11 17:49:24 -0400162 logger.Infow(ctx, "service-added", log.Fields{"service": serviceName})
163
164 ta.Probe.UpdateStatus(ctx, serviceName, probe.ServiceStatusRunning)
165 logger.Infow(ctx, "service-started", log.Fields{"service": serviceName})
166
167 // Note that there is a small window here in which the core could return its status as ready,
168 // when it really isn't. This is unlikely to cause issues, as the delay is incredibly short.
169 server.Start(ctx)
170 ta.Probe.UpdateStatus(ctx, serviceName, probe.ServiceStatusStopped)
khenaidooab1f7bd2019-11-14 14:00:27 -0500171}
172
khenaidooa46458b2021-12-15 16:50:44 -0500173func setCoreServiceHandler(ctx context.Context, conn *grpc.ClientConn) interface{} {
174 if conn == nil {
khenaidood948f772021-08-11 17:49:24 -0400175 return nil
176 }
khenaidooa46458b2021-12-15 16:50:44 -0500177 return core_service.NewCoreServiceClient(conn)
khenaidooab1f7bd2019-11-14 14:00:27 -0500178}
179
khenaidood948f772021-08-11 17:49:24 -0400180// gRPC service
khenaidoo25057da2021-12-08 14:40:45 -0500181func (ta *Adapter) GetHealthStatus(ctx context.Context, clientConn *common.Connection) (*health.HealthStatus, error) {
khenaidoo9beaaf12021-10-19 17:32:01 -0400182 return &health.HealthStatus{State: health.HealthStatus_HEALTHY}, nil
khenaidood948f772021-08-11 17:49:24 -0400183}
184
185// Device
186
bseenivab18867a2026-02-12 19:15:25 +0530187func (ta *Adapter) AdoptDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
188 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400189}
190
bseenivab18867a2026-02-12 19:15:25 +0530191func (ta *Adapter) ReconcileDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
192 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400193}
194
bseenivab18867a2026-02-12 19:15:25 +0530195func (ta *Adapter) DeleteDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
khenaidood948f772021-08-11 17:49:24 -0400196 ta.failDeleteDeviceLock.RLock()
197 haveToFail, ok := ta.failDeleteDevice[device.Id]
198 if ok && haveToFail {
199 ta.failDeleteDeviceLock.RUnlock()
200 return nil, fmt.Errorf("delete-device-failure")
201 }
202 ta.failDeleteDeviceLock.RUnlock()
203 if ok {
204 ta.RemoveDevice(device.Id)
205 }
206 logger.Debugw(ctx, "device-deleted-in-adapter", log.Fields{"device-id": device.Id})
bseenivab18867a2026-02-12 19:15:25 +0530207 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400208}
209
bseenivab18867a2026-02-12 19:15:25 +0530210func (ta *Adapter) DisableDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
211 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400212}
213
bseenivab18867a2026-02-12 19:15:25 +0530214func (ta *Adapter) ReEnableDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
215 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400216}
217
bseenivab18867a2026-02-12 19:15:25 +0530218func (ta *Adapter) RebootDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
219 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400220}
221
bseenivab18867a2026-02-12 19:15:25 +0530222func (ta *Adapter) SelfTestDevice(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
223 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400224}
225
bseenivab18867a2026-02-12 19:15:25 +0530226func (ta *Adapter) ChildDeviceLost(ctx context.Context, device *voltha.Device) (*emptypb.Empty, error) {
227 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400228}
229
khenaidoo9beaaf12021-10-19 17:32:01 -0400230func (ta *Adapter) GetOfpDeviceInfo(ctx context.Context, device *voltha.Device) (*ca.SwitchCapability, error) {
khenaidood948f772021-08-11 17:49:24 -0400231 return nil, nil
232}
233
234// Ports
235
bseenivab18867a2026-02-12 19:15:25 +0530236func (ta *Adapter) EnablePort(ctx context.Context, port *voltha.Port) (*emptypb.Empty, error) {
237 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400238}
239
bseenivab18867a2026-02-12 19:15:25 +0530240func (ta *Adapter) DisablePort(ctx context.Context, port *voltha.Port) (*emptypb.Empty, error) {
241 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400242}
243
244// Flows
bseenivab18867a2026-02-12 19:15:25 +0530245func (ta *Adapter) UpdateFlowsBulk(ctx context.Context, flows *ca.BulkFlows) (*emptypb.Empty, error) {
246 return &emptypb.Empty{}, nil
khenaidood948f772021-08-11 17:49:24 -0400247}
248
bseenivab18867a2026-02-12 19:15:25 +0530249func (ta *Adapter) UpdateFlowsIncrementally(ctx context.Context, incrFlows *ca.IncrementalFlows) (*emptypb.Empty, error) {
khenaidoo8b4abbf2020-04-24 17:04:30 -0400250 ta.flowLock.Lock()
251 defer ta.flowLock.Unlock()
252
khenaidood948f772021-08-11 17:49:24 -0400253 if _, ok := ta.flows[incrFlows.Device.Id]; !ok {
254 ta.flows[incrFlows.Device.Id] = map[uint64]*openflow_13.OfpFlowStats{}
255 }
256
257 if incrFlows.Flows.ToAdd != nil && len(incrFlows.Flows.ToAdd.Items) > 0 {
258 ta.failFlowAddLock.RLock()
259 if haveToFail, ok := ta.failFlowAdd[incrFlows.Device.Id]; ok && haveToFail {
260 ta.failFlowAddLock.RUnlock()
261 return nil, fmt.Errorf("flow-add-error")
khenaidoo8b4abbf2020-04-24 17:04:30 -0400262 }
khenaidood948f772021-08-11 17:49:24 -0400263 ta.failFlowAddLock.RUnlock()
264 for _, f := range incrFlows.Flows.ToAdd.Items {
265 ta.flows[incrFlows.Device.Id][f.Id] = f
khenaidoo8b4abbf2020-04-24 17:04:30 -0400266 }
267 }
khenaidood948f772021-08-11 17:49:24 -0400268 if incrFlows.Flows.ToRemove != nil && len(incrFlows.Flows.ToRemove.Items) > 0 {
269 ta.failFlowDeleteLock.RLock()
270 if haveToFail, ok := ta.failFlowDelete[incrFlows.Device.Id]; ok && haveToFail {
271 ta.failFlowDeleteLock.RUnlock()
272 return nil, fmt.Errorf("flow-delete-error")
khenaidoo8b4abbf2020-04-24 17:04:30 -0400273 }
khenaidood948f772021-08-11 17:49:24 -0400274 ta.failFlowDeleteLock.RUnlock()
275 for _, f := range incrFlows.Flows.ToRemove.Items {
276 delete(ta.flows[incrFlows.Device.Id], f.Id)
khenaidoo8b4abbf2020-04-24 17:04:30 -0400277 }
278 }
bseenivab18867a2026-02-12 19:15:25 +0530279 return &emptypb.Empty{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500280}
281
Joey Armstrong393daca2023-07-06 08:47:54 -0400282// Packets
bseenivab18867a2026-02-12 19:15:25 +0530283func (ta *Adapter) SendPacketOut(ctx context.Context, packet *ca.PacketOut) (*emptypb.Empty, error) {
284 return &emptypb.Empty{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500285}
286
khenaidood948f772021-08-11 17:49:24 -0400287// PM
bseenivab18867a2026-02-12 19:15:25 +0530288func (ta *Adapter) UpdatePmConfig(ctx context.Context, configs *ca.PmConfigsInfo) (*emptypb.Empty, error) {
289 return &emptypb.Empty{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500290}
291
khenaidood948f772021-08-11 17:49:24 -0400292// Image
293func (ta *Adapter) DownloadOnuImage(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
294 return &voltha.DeviceImageResponse{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500295}
296
khenaidood948f772021-08-11 17:49:24 -0400297func (ta *Adapter) GetOnuImageStatus(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
298 return &voltha.DeviceImageResponse{}, nil
npujar1d86a522019-11-14 17:11:16 +0530299}
300
khenaidood948f772021-08-11 17:49:24 -0400301func (ta *Adapter) AbortOnuImageUpgrade(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
302 return &voltha.DeviceImageResponse{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500303}
304
khenaidood948f772021-08-11 17:49:24 -0400305func (ta *Adapter) GetOnuImages(ctx context.Context, id *common.ID) (*voltha.OnuImages, error) {
306 return &voltha.OnuImages{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500307}
308
khenaidood948f772021-08-11 17:49:24 -0400309func (ta *Adapter) ActivateOnuImage(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
310 return &voltha.DeviceImageResponse{}, nil
311}
312
313func (ta *Adapter) CommitOnuImage(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
314 return &voltha.DeviceImageResponse{}, nil
315}
316
317// Deprecated image APIs
khenaidoo9beaaf12021-10-19 17:32:01 -0400318func (ta *Adapter) DownloadImage(ctx context.Context, in *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidood948f772021-08-11 17:49:24 -0400319 return &voltha.ImageDownload{}, nil
320}
321
khenaidoo9beaaf12021-10-19 17:32:01 -0400322func (ta *Adapter) GetImageDownloadStatus(ctx context.Context, in *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidood948f772021-08-11 17:49:24 -0400323 return &voltha.ImageDownload{}, nil
324}
325
khenaidoo9beaaf12021-10-19 17:32:01 -0400326func (ta *Adapter) CancelImageDownload(ctx context.Context, in *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidood948f772021-08-11 17:49:24 -0400327 return &voltha.ImageDownload{}, nil
328}
329
khenaidoo9beaaf12021-10-19 17:32:01 -0400330func (ta *Adapter) ActivateImageUpdate(ctx context.Context, in *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidood948f772021-08-11 17:49:24 -0400331 return &voltha.ImageDownload{}, nil
332}
333
khenaidoo9beaaf12021-10-19 17:32:01 -0400334func (ta *Adapter) RevertImageUpdate(ctx context.Context, in *ca.ImageDownloadMessage) (*voltha.ImageDownload, error) {
khenaidood948f772021-08-11 17:49:24 -0400335 return &voltha.ImageDownload{}, nil
336}
337
338// OMCI test
khenaidoo9beaaf12021-10-19 17:32:01 -0400339func (ta *Adapter) StartOmciTest(ctx context.Context, test *ca.OMCITest) (*omci.TestResponse, error) {
khenaidooab1f7bd2019-11-14 14:00:27 -0500340 return nil, nil
341}
342
khenaidood948f772021-08-11 17:49:24 -0400343// Events
bseenivab18867a2026-02-12 19:15:25 +0530344func (ta *Adapter) SuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*emptypb.Empty, error) {
345 return &emptypb.Empty{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500346}
347
bseenivab18867a2026-02-12 19:15:25 +0530348func (ta *Adapter) UnSuppressEvent(ctx context.Context, filter *voltha.EventFilter) (*emptypb.Empty, error) {
349 return &emptypb.Empty{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500350}
351
khenaidoo9beaaf12021-10-19 17:32:01 -0400352func (ta *Adapter) SimulateAlarm(context.Context, *ca.SimulateAlarmMessage) (*common.OperationResp, error) {
khenaidood948f772021-08-11 17:49:24 -0400353 return &common.OperationResp{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500354}
355
khenaidoo9beaaf12021-10-19 17:32:01 -0400356func (ta *Adapter) GetExtValue(context.Context, *ca.GetExtValueMessage) (*extension.ReturnValues, error) {
357 return &extension.ReturnValues{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500358}
kesavandbc2d1622020-01-21 00:42:01 -0500359
bseenivab18867a2026-02-12 19:15:25 +0530360func (ta *Adapter) SetExtValue(context.Context, *ca.SetExtValueMessage) (*emptypb.Empty, error) {
361 return &emptypb.Empty{}, nil
kesavandbc2d1622020-01-21 00:42:01 -0500362}
363
khenaidood948f772021-08-11 17:49:24 -0400364func (ta *Adapter) GetSingleValue(context.Context, *extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
365 return &extension.SingleGetValueResponse{}, nil
kesavandbc2d1622020-01-21 00:42:01 -0500366}
Scott Baker0e78ba22020-02-24 17:58:47 -0800367
khenaidood948f772021-08-11 17:49:24 -0400368func (ta *Adapter) SetSingleValue(context.Context, *extension.SingleSetValueRequest) (*extension.SingleSetValueResponse, error) {
369 return &extension.SingleSetValueResponse{}, nil
Scott Baker0e78ba22020-02-24 17:58:47 -0800370}
Scott Baker432f9be2020-03-26 11:56:30 -0700371
khenaidood948f772021-08-11 17:49:24 -0400372// APIs for test ONLY
khenaidoo8b4abbf2020-04-24 17:04:30 -0400373// GetFlowCount returns the total number of flows presently under this adapter
khenaidood948f772021-08-11 17:49:24 -0400374func (ta *Adapter) GetFlowCount(deviceID string) int {
khenaidoo8b4abbf2020-04-24 17:04:30 -0400375 ta.flowLock.RLock()
376 defer ta.flowLock.RUnlock()
377
khenaidood948f772021-08-11 17:49:24 -0400378 if _, ok := ta.flows[deviceID]; ok {
379 return len(ta.flows[deviceID])
380 }
381 return 0
khenaidoo8b4abbf2020-04-24 17:04:30 -0400382}
383
khenaidood948f772021-08-11 17:49:24 -0400384// RemoveDevice removes all flows in this adapter
385func (ta *Adapter) RemoveDevice(deviceID string) {
khenaidoo8b4abbf2020-04-24 17:04:30 -0400386 ta.flowLock.Lock()
387 defer ta.flowLock.Unlock()
khenaidood948f772021-08-11 17:49:24 -0400388 ta.failFlowAddLock.Lock()
389 defer ta.failFlowAddLock.Unlock()
390 ta.failFlowDeleteLock.Lock()
391 defer ta.failFlowDeleteLock.Unlock()
khenaidoo8b4abbf2020-04-24 17:04:30 -0400392
khenaidood948f772021-08-11 17:49:24 -0400393 delete(ta.flows, deviceID)
394 delete(ta.failFlowAdd, deviceID)
395 delete(ta.failFlowDelete, deviceID)
khenaidoo8b4abbf2020-04-24 17:04:30 -0400396}
397
398// SetFlowAction sets the adapter action on addition and deletion of flows
khenaidood948f772021-08-11 17:49:24 -0400399func (ta *Adapter) SetFlowAction(deviceID string, failFlowAdd, failFlowDelete bool) {
400 ta.failFlowAddLock.Lock()
401 defer ta.failFlowAddLock.Unlock()
402 ta.failFlowDeleteLock.Lock()
403 defer ta.failFlowDeleteLock.Unlock()
404 ta.failFlowAdd[deviceID] = failFlowAdd
405 ta.failFlowDelete[deviceID] = failFlowDelete
khenaidoo8b4abbf2020-04-24 17:04:30 -0400406}
Himani Chawla2ba1c9c2020-10-07 13:19:03 +0530407
408// SetDeleteAction sets the adapter action on delete device
khenaidood948f772021-08-11 17:49:24 -0400409func (ta *Adapter) SetDeleteAction(deviceID string, failDeleteDevice bool) {
410 ta.failDeleteDeviceLock.Lock()
411 defer ta.failDeleteDeviceLock.Unlock()
412 ta.failDeleteDevice[deviceID] = failDeleteDevice
yasin sapli5458a1c2021-06-14 22:24:38 +0000413}