blob: 5ab01275e2809cdadf0f5fba263be6887b0c0696 [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"
khenaidoo442e7c72020-03-10 16:13:48 -040021 "github.com/golang/protobuf/ptypes"
22 any2 "github.com/golang/protobuf/ptypes/any"
khenaidooab1f7bd2019-11-14 14:00:27 -050023 cm "github.com/opencord/voltha-go/rw_core/mocks"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080024 com "github.com/opencord/voltha-lib-go/v3/pkg/adapters/common"
25 "github.com/opencord/voltha-lib-go/v3/pkg/kafka"
26 "github.com/opencord/voltha-lib-go/v3/pkg/log"
Matteo Scandolod525ae32020-04-02 17:27:29 -070027 mock_kafka "github.com/opencord/voltha-lib-go/v3/pkg/mocks/kafka"
khenaidoo442e7c72020-03-10 16:13:48 -040028 ic "github.com/opencord/voltha-protos/v3/go/inter_container"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080029 of "github.com/opencord/voltha-protos/v3/go/openflow_13"
30 "github.com/opencord/voltha-protos/v3/go/voltha"
khenaidooab1f7bd2019-11-14 14:00:27 -050031 "github.com/stretchr/testify/assert"
32 "google.golang.org/grpc/codes"
33 "google.golang.org/grpc/status"
khenaidoo442e7c72020-03-10 16:13:48 -040034 "strings"
35 "testing"
36 "time"
khenaidooab1f7bd2019-11-14 14:00:27 -050037)
38
39const (
40 coreName = "rw_core"
41 adapterName = "adapter_mock"
npujar1d86a522019-11-14 17:11:16 +053042 coreInstanceID = "1000"
khenaidooab1f7bd2019-11-14 14:00:27 -050043)
44
45var (
npujar467fe752020-01-16 20:17:45 +053046 coreKafkaICProxy kafka.InterContainerProxy
47 adapterKafkaICProxy kafka.InterContainerProxy
khenaidooab1f7bd2019-11-14 14:00:27 -050048 kc kafka.Client
49 adapterReqHandler *com.RequestHandlerProxy
50 adapter *cm.Adapter
51)
52
53func init() {
npujar1d86a522019-11-14 17:11:16 +053054 if _, err := log.SetDefaultLogger(log.JSON, 0, log.Fields{"instanceId": coreInstanceID}); err != nil {
khenaidooab1f7bd2019-11-14 14:00:27 -050055 log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
56 }
57 // Set the log level to Warning
khenaidoo442e7c72020-03-10 16:13:48 -040058 log.SetAllLogLevel(log.WarnLevel)
khenaidooab1f7bd2019-11-14 14:00:27 -050059
60 var err error
61
62 // Create the KV client
Matteo Scandolod525ae32020-04-02 17:27:29 -070063 kc = mock_kafka.NewKafkaClient()
khenaidooab1f7bd2019-11-14 14:00:27 -050064
65 // Setup core inter-container proxy and core request handler
npujar467fe752020-01-16 20:17:45 +053066 coreKafkaICProxy = kafka.NewInterContainerProxy(
khenaidooab1f7bd2019-11-14 14:00:27 -050067 kafka.MsgClient(kc),
npujar467fe752020-01-16 20:17:45 +053068 kafka.DefaultTopic(&kafka.Topic{Name: coreName}))
khenaidoo442e7c72020-03-10 16:13:48 -040069
Rohan Agrawal31f21802020-06-12 05:38:46 +000070 ctx := context.Background()
71
72 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 Hagerman2b216042020-04-03 18:28:56 -0400200 _, err := ap.UpdateFlowsBulk(context.Background(), d, &voltha.Flows{}, &voltha.FlowGroups{}, &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}