blob: ad8cd314fde28ccd90b643a7e6931e73057ae694 [file] [log] [blame]
khenaidooab1f7bd2019-11-14 14:00:27 -05001/*
2 * Copyright 2019-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 */
Kent Hagerman2b216042020-04-03 18:28:56 -040016package remote
khenaidooab1f7bd2019-11-14 14:00:27 -050017
18import (
19 "context"
20 "crypto/rand"
Kent Hagerman2a07b862020-06-19 15:23:07 -040021 "strings"
22 "testing"
23 "time"
24
khenaidoo442e7c72020-03-10 16:13:48 -040025 "github.com/golang/protobuf/ptypes"
26 any2 "github.com/golang/protobuf/ptypes/any"
khenaidooab1f7bd2019-11-14 14:00:27 -050027 cm "github.com/opencord/voltha-go/rw_core/mocks"
yasin sapli5458a1c2021-06-14 22:24:38 +000028 com "github.com/opencord/voltha-lib-go/v5/pkg/adapters/common"
29 "github.com/opencord/voltha-lib-go/v5/pkg/kafka"
30 "github.com/opencord/voltha-lib-go/v5/pkg/log"
31 mock_kafka "github.com/opencord/voltha-lib-go/v5/pkg/mocks/kafka"
Maninderdfadc982020-10-28 14:04:33 +053032 ic "github.com/opencord/voltha-protos/v4/go/inter_container"
33 of "github.com/opencord/voltha-protos/v4/go/openflow_13"
34 "github.com/opencord/voltha-protos/v4/go/voltha"
khenaidooab1f7bd2019-11-14 14:00:27 -050035 "github.com/stretchr/testify/assert"
36 "google.golang.org/grpc/codes"
37 "google.golang.org/grpc/status"
khenaidooab1f7bd2019-11-14 14:00:27 -050038)
39
40const (
41 coreName = "rw_core"
42 adapterName = "adapter_mock"
npujar1d86a522019-11-14 17:11:16 +053043 coreInstanceID = "1000"
khenaidooab1f7bd2019-11-14 14:00:27 -050044)
45
46var (
npujar467fe752020-01-16 20:17:45 +053047 coreKafkaICProxy kafka.InterContainerProxy
48 adapterKafkaICProxy kafka.InterContainerProxy
khenaidooab1f7bd2019-11-14 14:00:27 -050049 kc kafka.Client
50 adapterReqHandler *com.RequestHandlerProxy
51 adapter *cm.Adapter
52)
53
54func init() {
Girish Kumarf8d4f8d2020-08-18 11:45:30 +000055 ctx := context.Background()
npujar1d86a522019-11-14 17:11:16 +053056 if _, err := log.SetDefaultLogger(log.JSON, 0, log.Fields{"instanceId": coreInstanceID}); err != nil {
Girish Kumarf8d4f8d2020-08-18 11:45:30 +000057 logger.With(log.Fields{"error": err}).Fatal(ctx, "Cannot setup logging")
khenaidooab1f7bd2019-11-14 14:00:27 -050058 }
59 // Set the log level to Warning
khenaidoo442e7c72020-03-10 16:13:48 -040060 log.SetAllLogLevel(log.WarnLevel)
khenaidooab1f7bd2019-11-14 14:00:27 -050061
62 var err error
63
64 // Create the KV client
Matteo Scandolod525ae32020-04-02 17:27:29 -070065 kc = mock_kafka.NewKafkaClient()
khenaidooab1f7bd2019-11-14 14:00:27 -050066
67 // Setup core inter-container proxy and core request handler
npujar467fe752020-01-16 20:17:45 +053068 coreKafkaICProxy = kafka.NewInterContainerProxy(
khenaidooab1f7bd2019-11-14 14:00:27 -050069 kafka.MsgClient(kc),
npujar467fe752020-01-16 20:17:45 +053070 kafka.DefaultTopic(&kafka.Topic{Name: coreName}))
khenaidoo442e7c72020-03-10 16:13:48 -040071
Rohan Agrawal31f21802020-06-12 05:38:46 +000072 if err = coreKafkaICProxy.Start(ctx); err != nil {
73 logger.Fatalw(ctx, "Failure-starting-core-kafka-intercontainerProxy", log.Fields{"error": err})
khenaidooab1f7bd2019-11-14 14:00:27 -050074 }
Rohan Agrawal31f21802020-06-12 05:38:46 +000075 if err = coreKafkaICProxy.SubscribeWithDefaultRequestHandler(ctx, kafka.Topic{Name: coreName}, 0); err != nil {
76 logger.Fatalw(ctx, "Failure-subscribing-core-request-handler", log.Fields{"error": err})
khenaidooab1f7bd2019-11-14 14:00:27 -050077 }
78
79 // Setup adapter inter-container proxy and adapter request handler
Rohan Agrawal31f21802020-06-12 05:38:46 +000080 adapterCoreProxy := com.NewCoreProxy(ctx, nil, adapterName, coreName)
khenaidooab1f7bd2019-11-14 14:00:27 -050081 adapter = cm.NewAdapter(adapterCoreProxy)
npujar1d86a522019-11-14 17:11:16 +053082 adapterReqHandler = com.NewRequestHandlerProxy(coreInstanceID, adapter, adapterCoreProxy)
npujar467fe752020-01-16 20:17:45 +053083 adapterKafkaICProxy = kafka.NewInterContainerProxy(
khenaidooab1f7bd2019-11-14 14:00:27 -050084 kafka.MsgClient(kc),
85 kafka.DefaultTopic(&kafka.Topic{Name: adapterName}),
npujar467fe752020-01-16 20:17:45 +053086 kafka.RequestHandlerInterface(adapterReqHandler))
khenaidoo442e7c72020-03-10 16:13:48 -040087
Rohan Agrawal31f21802020-06-12 05:38:46 +000088 if err = adapterKafkaICProxy.Start(ctx); err != nil {
89 logger.Fatalw(ctx, "Failure-starting-adapter-kafka-intercontainerProxy", log.Fields{"error": err})
khenaidooab1f7bd2019-11-14 14:00:27 -050090 }
Rohan Agrawal31f21802020-06-12 05:38:46 +000091 if err = adapterKafkaICProxy.SubscribeWithDefaultRequestHandler(ctx, kafka.Topic{Name: adapterName}, 0); err != nil {
92 logger.Fatalw(ctx, "Failure-subscribing-adapter-request-handler", log.Fields{"error": err})
khenaidooab1f7bd2019-11-14 14:00:27 -050093 }
94}
95
96func getRandomBytes(size int) (bytes []byte, err error) {
97 bytes = make([]byte, size)
98 _, err = rand.Read(bytes)
99 return
100}
101
102func TestCreateAdapterProxy(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700103 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500104 assert.NotNil(t, ap)
105}
106
khenaidoo442e7c72020-03-10 16:13:48 -0400107func waitForResponse(ctx context.Context, ch chan *kafka.RpcResponse) (*any2.Any, error) {
108 select {
109 case rpcResponse, ok := <-ch:
110 if !ok {
111 return nil, status.Error(codes.Aborted, "channel-closed")
112 } else if rpcResponse.Err != nil {
113 return nil, rpcResponse.Err
114 } else {
115 return rpcResponse.Reply, nil
116 }
117 case <-ctx.Done():
118 return nil, ctx.Err()
119 }
120}
121
khenaidooab1f7bd2019-11-14 14:00:27 -0500122func testSimpleRequests(t *testing.T) {
khenaidoo442e7c72020-03-10 16:13:48 -0400123 type simpleRequest func(context.Context, *voltha.Device) (chan *kafka.RpcResponse, error)
Matteo Scandolod525ae32020-04-02 17:27:29 -0700124 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500125 simpleRequests := []simpleRequest{
Kent Hagerman2b216042020-04-03 18:28:56 -0400126 ap.AdoptDevice,
127 ap.DisableDevice,
128 ap.RebootDevice,
129 ap.DeleteDevice,
130 ap.ReconcileDevice,
131 ap.ReEnableDevice,
khenaidooab1f7bd2019-11-14 14:00:27 -0500132 }
133 for _, f := range simpleRequests {
khenaidoo442e7c72020-03-10 16:13:48 -0400134 // Success
khenaidooab1f7bd2019-11-14 14:00:27 -0500135 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
136 ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
khenaidoo442e7c72020-03-10 16:13:48 -0400137 rpcResponse, err := f(ctx, d)
khenaidooab1f7bd2019-11-14 14:00:27 -0500138 assert.Nil(t, err)
khenaidoo442e7c72020-03-10 16:13:48 -0400139 _, err = waitForResponse(ctx, rpcResponse)
140 assert.Nil(t, err)
141 cancel()
khenaidooab1f7bd2019-11-14 14:00:27 -0500142
143 // Failure - invalid adapter
khenaidoo442e7c72020-03-10 16:13:48 -0400144 expectedError := "context deadline exceeded"
khenaidooab1f7bd2019-11-14 14:00:27 -0500145 d = &voltha.Device{Id: "deviceId", Adapter: "adapter_mock_1"}
146 ctx, cancel = context.WithTimeout(context.Background(), 20*time.Millisecond)
khenaidoo442e7c72020-03-10 16:13:48 -0400147 rpcResponse, err = f(ctx, d)
148 assert.Nil(t, err)
149 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500150 cancel()
151 assert.NotNil(t, err)
khenaidoo442e7c72020-03-10 16:13:48 -0400152 assert.True(t, strings.Contains(err.Error(), expectedError))
khenaidooab1f7bd2019-11-14 14:00:27 -0500153
khenaidoo442e7c72020-03-10 16:13:48 -0400154 // Failure - timeout
khenaidooab1f7bd2019-11-14 14:00:27 -0500155 d = &voltha.Device{Id: "deviceId", Adapter: adapterName}
156 ctx, cancel = context.WithTimeout(context.Background(), 100*time.Nanosecond)
khenaidoo442e7c72020-03-10 16:13:48 -0400157 rpcResponse, err = f(ctx, d)
158 assert.Nil(t, err)
159 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500160 cancel()
161 assert.NotNil(t, err)
khenaidoo442e7c72020-03-10 16:13:48 -0400162 assert.True(t, strings.Contains(err.Error(), expectedError))
khenaidooab1f7bd2019-11-14 14:00:27 -0500163 }
164}
165
166func testGetSwitchCapabilityFromAdapter(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700167 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500168 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
169 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
khenaidoo442e7c72020-03-10 16:13:48 -0400170 defer cancel()
Kent Hagerman2b216042020-04-03 18:28:56 -0400171 rpcResponse, err := ap.GetOfpDeviceInfo(ctx, d)
khenaidoo442e7c72020-03-10 16:13:48 -0400172 assert.Nil(t, err)
173 response, err := waitForResponse(ctx, rpcResponse)
174 assert.Nil(t, err)
175 switchCap := &ic.SwitchCapability{}
176 err = ptypes.UnmarshalAny(response, switchCap)
khenaidooab1f7bd2019-11-14 14:00:27 -0500177 assert.Nil(t, err)
178 assert.NotNil(t, switchCap)
Rohan Agrawal31f21802020-06-12 05:38:46 +0000179 expectedCap, _ := adapter.Get_ofp_device_info(ctx, d)
khenaidooab1f7bd2019-11-14 14:00:27 -0500180 assert.Equal(t, switchCap.String(), expectedCap.String())
181}
182
khenaidooab1f7bd2019-11-14 14:00:27 -0500183func testPacketOut(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700184 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500185 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
186 outPort := uint32(1)
187 packet, err := getRandomBytes(50)
188 assert.Nil(t, err)
khenaidoo442e7c72020-03-10 16:13:48 -0400189 ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
190 defer cancel()
Kent Hagerman2b216042020-04-03 18:28:56 -0400191 rpcResponse, err := ap.PacketOut(ctx, adapterName, d.Id, outPort, &of.OfpPacketOut{Data: packet})
khenaidoo442e7c72020-03-10 16:13:48 -0400192 assert.Nil(t, err)
193 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500194 assert.Nil(t, err)
195}
196
197func testFlowUpdates(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700198 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500199 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
Kent Hagermana7c9d792020-07-16 17:39:01 -0400200 _, err := ap.UpdateFlowsBulk(context.Background(), d, nil, nil, &voltha.FlowMetadata{})
khenaidooab1f7bd2019-11-14 14:00:27 -0500201 assert.Nil(t, err)
202 flowChanges := &voltha.FlowChanges{ToAdd: &voltha.Flows{Items: nil}, ToRemove: &voltha.Flows{Items: nil}}
203 groupChanges := &voltha.FlowGroupChanges{ToAdd: &voltha.FlowGroups{Items: nil}, ToRemove: &voltha.FlowGroups{Items: nil}, ToUpdate: &voltha.FlowGroups{Items: nil}}
khenaidoo442e7c72020-03-10 16:13:48 -0400204 ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
205 defer cancel()
Kent Hagerman2b216042020-04-03 18:28:56 -0400206 rpcResponse, err := ap.UpdateFlowsIncremental(ctx, d, flowChanges, groupChanges, &voltha.FlowMetadata{})
khenaidoo442e7c72020-03-10 16:13:48 -0400207 assert.Nil(t, err)
208 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500209 assert.Nil(t, err)
210}
211
212func testPmUpdates(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700213 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500214 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
215 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
khenaidoo442e7c72020-03-10 16:13:48 -0400216 defer cancel()
Kent Hagerman2b216042020-04-03 18:28:56 -0400217 rpcResponse, err := ap.UpdatePmConfigs(ctx, d, &voltha.PmConfigs{})
khenaidoo442e7c72020-03-10 16:13:48 -0400218 assert.Nil(t, err)
219 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500220 assert.Nil(t, err)
221}
222
Matteo Scandolod525ae32020-04-02 17:27:29 -0700223func TestSuiteAdapterProxy(t *testing.T) {
khenaidooab1f7bd2019-11-14 14:00:27 -0500224 //1. Test the simple requests first
225 testSimpleRequests(t)
226
227 //2. Test get switch capability
228 testGetSwitchCapabilityFromAdapter(t)
229
khenaidooc6c7bda2020-06-17 17:20:18 -0400230 //3. Test PacketOut
khenaidooab1f7bd2019-11-14 14:00:27 -0500231 testPacketOut(t)
232
khenaidooc6c7bda2020-06-17 17:20:18 -0400233 //4. Test flow updates
khenaidooab1f7bd2019-11-14 14:00:27 -0500234 testFlowUpdates(t)
235
khenaidooc6c7bda2020-06-17 17:20:18 -0400236 //5. Pm configs
khenaidooab1f7bd2019-11-14 14:00:27 -0500237 testPmUpdates(t)
238}