blob: 151483a3955930148af0670ac496faab2caaa7e3 [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"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080028 com "github.com/opencord/voltha-lib-go/v3/pkg/adapters/common"
29 "github.com/opencord/voltha-lib-go/v3/pkg/kafka"
30 "github.com/opencord/voltha-lib-go/v3/pkg/log"
Matteo Scandolod525ae32020-04-02 17:27:29 -070031 mock_kafka "github.com/opencord/voltha-lib-go/v3/pkg/mocks/kafka"
khenaidoo442e7c72020-03-10 16:13:48 -040032 ic "github.com/opencord/voltha-protos/v3/go/inter_container"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080033 of "github.com/opencord/voltha-protos/v3/go/openflow_13"
34 "github.com/opencord/voltha-protos/v3/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() {
npujar1d86a522019-11-14 17:11:16 +053055 if _, err := log.SetDefaultLogger(log.JSON, 0, log.Fields{"instanceId": coreInstanceID}); err != nil {
khenaidooab1f7bd2019-11-14 14:00:27 -050056 log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
57 }
58 // Set the log level to Warning
khenaidoo442e7c72020-03-10 16:13:48 -040059 log.SetAllLogLevel(log.WarnLevel)
khenaidooab1f7bd2019-11-14 14:00:27 -050060
61 var err error
62
63 // Create the KV client
Matteo Scandolod525ae32020-04-02 17:27:29 -070064 kc = mock_kafka.NewKafkaClient()
khenaidooab1f7bd2019-11-14 14:00:27 -050065
66 // Setup core inter-container proxy and core request handler
npujar467fe752020-01-16 20:17:45 +053067 coreKafkaICProxy = kafka.NewInterContainerProxy(
khenaidooab1f7bd2019-11-14 14:00:27 -050068 kafka.MsgClient(kc),
npujar467fe752020-01-16 20:17:45 +053069 kafka.DefaultTopic(&kafka.Topic{Name: coreName}))
khenaidoo442e7c72020-03-10 16:13:48 -040070
Rohan Agrawal31f21802020-06-12 05:38:46 +000071 ctx := context.Background()
72
73 if err = coreKafkaICProxy.Start(ctx); err != nil {
74 logger.Fatalw(ctx, "Failure-starting-core-kafka-intercontainerProxy", log.Fields{"error": err})
khenaidooab1f7bd2019-11-14 14:00:27 -050075 }
Rohan Agrawal31f21802020-06-12 05:38:46 +000076 if err = coreKafkaICProxy.SubscribeWithDefaultRequestHandler(ctx, kafka.Topic{Name: coreName}, 0); err != nil {
77 logger.Fatalw(ctx, "Failure-subscribing-core-request-handler", log.Fields{"error": err})
khenaidooab1f7bd2019-11-14 14:00:27 -050078 }
79
80 // Setup adapter inter-container proxy and adapter request handler
Rohan Agrawal31f21802020-06-12 05:38:46 +000081 adapterCoreProxy := com.NewCoreProxy(ctx, nil, adapterName, coreName)
khenaidooab1f7bd2019-11-14 14:00:27 -050082 adapter = cm.NewAdapter(adapterCoreProxy)
npujar1d86a522019-11-14 17:11:16 +053083 adapterReqHandler = com.NewRequestHandlerProxy(coreInstanceID, adapter, adapterCoreProxy)
npujar467fe752020-01-16 20:17:45 +053084 adapterKafkaICProxy = kafka.NewInterContainerProxy(
khenaidooab1f7bd2019-11-14 14:00:27 -050085 kafka.MsgClient(kc),
86 kafka.DefaultTopic(&kafka.Topic{Name: adapterName}),
npujar467fe752020-01-16 20:17:45 +053087 kafka.RequestHandlerInterface(adapterReqHandler))
khenaidoo442e7c72020-03-10 16:13:48 -040088
Rohan Agrawal31f21802020-06-12 05:38:46 +000089 if err = adapterKafkaICProxy.Start(ctx); err != nil {
90 logger.Fatalw(ctx, "Failure-starting-adapter-kafka-intercontainerProxy", log.Fields{"error": err})
khenaidooab1f7bd2019-11-14 14:00:27 -050091 }
Rohan Agrawal31f21802020-06-12 05:38:46 +000092 if err = adapterKafkaICProxy.SubscribeWithDefaultRequestHandler(ctx, kafka.Topic{Name: adapterName}, 0); err != nil {
93 logger.Fatalw(ctx, "Failure-subscribing-adapter-request-handler", log.Fields{"error": err})
khenaidooab1f7bd2019-11-14 14:00:27 -050094 }
95}
96
97func getRandomBytes(size int) (bytes []byte, err error) {
98 bytes = make([]byte, size)
99 _, err = rand.Read(bytes)
100 return
101}
102
103func TestCreateAdapterProxy(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700104 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500105 assert.NotNil(t, ap)
106}
107
khenaidoo442e7c72020-03-10 16:13:48 -0400108func waitForResponse(ctx context.Context, ch chan *kafka.RpcResponse) (*any2.Any, error) {
109 select {
110 case rpcResponse, ok := <-ch:
111 if !ok {
112 return nil, status.Error(codes.Aborted, "channel-closed")
113 } else if rpcResponse.Err != nil {
114 return nil, rpcResponse.Err
115 } else {
116 return rpcResponse.Reply, nil
117 }
118 case <-ctx.Done():
119 return nil, ctx.Err()
120 }
121}
122
khenaidooab1f7bd2019-11-14 14:00:27 -0500123func testSimpleRequests(t *testing.T) {
khenaidoo442e7c72020-03-10 16:13:48 -0400124 type simpleRequest func(context.Context, *voltha.Device) (chan *kafka.RpcResponse, error)
Matteo Scandolod525ae32020-04-02 17:27:29 -0700125 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500126 simpleRequests := []simpleRequest{
Kent Hagerman2b216042020-04-03 18:28:56 -0400127 ap.AdoptDevice,
128 ap.DisableDevice,
129 ap.RebootDevice,
130 ap.DeleteDevice,
131 ap.ReconcileDevice,
132 ap.ReEnableDevice,
khenaidooab1f7bd2019-11-14 14:00:27 -0500133 }
134 for _, f := range simpleRequests {
khenaidoo442e7c72020-03-10 16:13:48 -0400135 // Success
khenaidooab1f7bd2019-11-14 14:00:27 -0500136 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
137 ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
khenaidoo442e7c72020-03-10 16:13:48 -0400138 rpcResponse, err := f(ctx, d)
khenaidooab1f7bd2019-11-14 14:00:27 -0500139 assert.Nil(t, err)
khenaidoo442e7c72020-03-10 16:13:48 -0400140 _, err = waitForResponse(ctx, rpcResponse)
141 assert.Nil(t, err)
142 cancel()
khenaidooab1f7bd2019-11-14 14:00:27 -0500143
144 // Failure - invalid adapter
khenaidoo442e7c72020-03-10 16:13:48 -0400145 expectedError := "context deadline exceeded"
khenaidooab1f7bd2019-11-14 14:00:27 -0500146 d = &voltha.Device{Id: "deviceId", Adapter: "adapter_mock_1"}
147 ctx, cancel = context.WithTimeout(context.Background(), 20*time.Millisecond)
khenaidoo442e7c72020-03-10 16:13:48 -0400148 rpcResponse, err = f(ctx, d)
149 assert.Nil(t, err)
150 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500151 cancel()
152 assert.NotNil(t, err)
khenaidoo442e7c72020-03-10 16:13:48 -0400153 assert.True(t, strings.Contains(err.Error(), expectedError))
khenaidooab1f7bd2019-11-14 14:00:27 -0500154
khenaidoo442e7c72020-03-10 16:13:48 -0400155 // Failure - timeout
khenaidooab1f7bd2019-11-14 14:00:27 -0500156 d = &voltha.Device{Id: "deviceId", Adapter: adapterName}
157 ctx, cancel = context.WithTimeout(context.Background(), 100*time.Nanosecond)
khenaidoo442e7c72020-03-10 16:13:48 -0400158 rpcResponse, err = f(ctx, d)
159 assert.Nil(t, err)
160 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500161 cancel()
162 assert.NotNil(t, err)
khenaidoo442e7c72020-03-10 16:13:48 -0400163 assert.True(t, strings.Contains(err.Error(), expectedError))
khenaidooab1f7bd2019-11-14 14:00:27 -0500164 }
165}
166
167func testGetSwitchCapabilityFromAdapter(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700168 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500169 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
170 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
khenaidoo442e7c72020-03-10 16:13:48 -0400171 defer cancel()
Kent Hagerman2b216042020-04-03 18:28:56 -0400172 rpcResponse, err := ap.GetOfpDeviceInfo(ctx, d)
khenaidoo442e7c72020-03-10 16:13:48 -0400173 assert.Nil(t, err)
174 response, err := waitForResponse(ctx, rpcResponse)
175 assert.Nil(t, err)
176 switchCap := &ic.SwitchCapability{}
177 err = ptypes.UnmarshalAny(response, switchCap)
khenaidooab1f7bd2019-11-14 14:00:27 -0500178 assert.Nil(t, err)
179 assert.NotNil(t, switchCap)
Rohan Agrawal31f21802020-06-12 05:38:46 +0000180 expectedCap, _ := adapter.Get_ofp_device_info(ctx, d)
khenaidooab1f7bd2019-11-14 14:00:27 -0500181 assert.Equal(t, switchCap.String(), expectedCap.String())
182}
183
khenaidooab1f7bd2019-11-14 14:00:27 -0500184func testPacketOut(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700185 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500186 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
187 outPort := uint32(1)
188 packet, err := getRandomBytes(50)
189 assert.Nil(t, err)
khenaidoo442e7c72020-03-10 16:13:48 -0400190 ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
191 defer cancel()
Kent Hagerman2b216042020-04-03 18:28:56 -0400192 rpcResponse, err := ap.PacketOut(ctx, adapterName, d.Id, outPort, &of.OfpPacketOut{Data: packet})
khenaidoo442e7c72020-03-10 16:13:48 -0400193 assert.Nil(t, err)
194 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500195 assert.Nil(t, err)
196}
197
198func testFlowUpdates(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700199 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500200 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
Kent Hagermana7c9d792020-07-16 17:39:01 -0400201 _, err := ap.UpdateFlowsBulk(context.Background(), d, nil, nil, &voltha.FlowMetadata{})
khenaidooab1f7bd2019-11-14 14:00:27 -0500202 assert.Nil(t, err)
203 flowChanges := &voltha.FlowChanges{ToAdd: &voltha.Flows{Items: nil}, ToRemove: &voltha.Flows{Items: nil}}
204 groupChanges := &voltha.FlowGroupChanges{ToAdd: &voltha.FlowGroups{Items: nil}, ToRemove: &voltha.FlowGroups{Items: nil}, ToUpdate: &voltha.FlowGroups{Items: nil}}
khenaidoo442e7c72020-03-10 16:13:48 -0400205 ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
206 defer cancel()
Kent Hagerman2b216042020-04-03 18:28:56 -0400207 rpcResponse, err := ap.UpdateFlowsIncremental(ctx, d, flowChanges, groupChanges, &voltha.FlowMetadata{})
khenaidoo442e7c72020-03-10 16:13:48 -0400208 assert.Nil(t, err)
209 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500210 assert.Nil(t, err)
211}
212
213func testPmUpdates(t *testing.T) {
Matteo Scandolod525ae32020-04-02 17:27:29 -0700214 ap := NewAdapterProxy(coreKafkaICProxy, coreName, mock_kafka.NewEndpointManager())
khenaidooab1f7bd2019-11-14 14:00:27 -0500215 d := &voltha.Device{Id: "deviceId", Adapter: adapterName}
216 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
khenaidoo442e7c72020-03-10 16:13:48 -0400217 defer cancel()
Kent Hagerman2b216042020-04-03 18:28:56 -0400218 rpcResponse, err := ap.UpdatePmConfigs(ctx, d, &voltha.PmConfigs{})
khenaidoo442e7c72020-03-10 16:13:48 -0400219 assert.Nil(t, err)
220 _, err = waitForResponse(ctx, rpcResponse)
khenaidooab1f7bd2019-11-14 14:00:27 -0500221 assert.Nil(t, err)
222}
223
Matteo Scandolod525ae32020-04-02 17:27:29 -0700224func TestSuiteAdapterProxy(t *testing.T) {
khenaidooab1f7bd2019-11-14 14:00:27 -0500225 //1. Test the simple requests first
226 testSimpleRequests(t)
227
228 //2. Test get switch capability
229 testGetSwitchCapabilityFromAdapter(t)
230
khenaidooc6c7bda2020-06-17 17:20:18 -0400231 //3. Test PacketOut
khenaidooab1f7bd2019-11-14 14:00:27 -0500232 testPacketOut(t)
233
khenaidooc6c7bda2020-06-17 17:20:18 -0400234 //4. Test flow updates
khenaidooab1f7bd2019-11-14 14:00:27 -0500235 testFlowUpdates(t)
236
khenaidooc6c7bda2020-06-17 17:20:18 -0400237 //5. Pm configs
khenaidooab1f7bd2019-11-14 14:00:27 -0500238 testPmUpdates(t)
239}