go.ligato.io/vpp-agent/v3@v3.5.0/plugins/vpp/l3plugin/vppcalls/vpp2210/vrf_vppcalls_test.go (about) 1 // Copyright (c) 2022 Cisco and/or its affiliates. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at: 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package vpp2210_test 16 17 import ( 18 "testing" 19 20 . "github.com/onsi/gomega" 21 "go.fd.io/govpp/binapi/ip_types" 22 "go.ligato.io/cn-infra/v2/logging/logrus" 23 24 "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2210/ip" 25 vpp_ip "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2210/ip" 26 "go.ligato.io/vpp-agent/v3/plugins/vpp/l3plugin/vppcalls" 27 vpp2210 "go.ligato.io/vpp-agent/v3/plugins/vpp/l3plugin/vppcalls/vpp2210" 28 "go.ligato.io/vpp-agent/v3/plugins/vpp/vppmock" 29 l3 "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/l3" 30 ) 31 32 var vrfTables = []*l3.VrfTable{ 33 { 34 Id: 1, 35 Protocol: l3.VrfTable_IPV4, 36 Label: "table1", 37 }, 38 { 39 Id: 1, 40 Protocol: l3.VrfTable_IPV6, 41 Label: "table1", 42 }, 43 { 44 Id: 2, 45 Protocol: l3.VrfTable_IPV6, 46 Label: "table2", 47 }, 48 } 49 50 // Test adding routes 51 func TestAddVrfTable(t *testing.T) { 52 ctx, vtHandler := vrfTableTestSetup(t) 53 defer ctx.TeardownTestCtx() 54 55 ctx.MockVpp.MockReply(&vpp_ip.IPTableAddDelReply{}) 56 err := vtHandler.AddVrfTable(vrfTables[0]) 57 Expect(err).To(Succeed()) 58 59 vppMsg, ok := ctx.MockChannel.Msg.(*vpp_ip.IPTableAddDel) 60 Expect(ok).To(BeTrue()) 61 Expect(vppMsg.Table.TableID).To(BeEquivalentTo(1)) 62 Expect(vppMsg.Table.IsIP6).To(BeFalse()) 63 Expect(vppMsg.IsAdd).To(BeTrue()) 64 Expect(vppMsg.Table.Name).To(BeEquivalentTo([]byte("table1"))) 65 66 ctx.MockVpp.MockReply(&vpp_ip.IPTableAddDelReply{}) 67 err = vtHandler.AddVrfTable(vrfTables[1]) 68 Expect(err).To(Succeed()) 69 70 vppMsg, ok = ctx.MockChannel.Msg.(*vpp_ip.IPTableAddDel) 71 Expect(ok).To(BeTrue()) 72 Expect(vppMsg.Table.TableID).To(BeEquivalentTo(1)) 73 Expect(vppMsg.Table.IsIP6).To(BeTrue()) 74 Expect(vppMsg.IsAdd).To(BeTrue()) 75 Expect(vppMsg.Table.Name).To(BeEquivalentTo([]byte("table1"))) 76 77 ctx.MockVpp.MockReply(&vpp_ip.IPTableAddDelReply{}) 78 err = vtHandler.AddVrfTable(vrfTables[2]) 79 Expect(err).To(Succeed()) 80 81 vppMsg, ok = ctx.MockChannel.Msg.(*vpp_ip.IPTableAddDel) 82 Expect(ok).To(BeTrue()) 83 Expect(vppMsg.Table.TableID).To(BeEquivalentTo(2)) 84 Expect(vppMsg.Table.IsIP6).To(BeTrue()) 85 Expect(vppMsg.IsAdd).To(BeTrue()) 86 Expect(vppMsg.Table.Name).To(BeEquivalentTo([]byte("table2"))) 87 88 ctx.MockVpp.MockReply(&vpp_ip.IPTableAddDelReply{Retval: 1}) 89 err = vtHandler.AddVrfTable(vrfTables[0]) 90 Expect(err).To(Not(BeNil())) 91 } 92 93 // Test deleting routes 94 func TestDeleteVrfTable(t *testing.T) { 95 ctx, vtHandler := vrfTableTestSetup(t) 96 defer ctx.TeardownTestCtx() 97 98 ctx.MockVpp.MockReply(&vpp_ip.IPTableAddDelReply{}) 99 err := vtHandler.DelVrfTable(vrfTables[0]) 100 Expect(err).To(Succeed()) 101 102 vppMsg, ok := ctx.MockChannel.Msg.(*vpp_ip.IPTableAddDel) 103 Expect(ok).To(BeTrue()) 104 Expect(vppMsg.Table.TableID).To(BeEquivalentTo(1)) 105 Expect(vppMsg.Table.IsIP6).To(BeFalse()) 106 Expect(vppMsg.IsAdd).To(BeFalse()) 107 Expect(vppMsg.Table.Name).To(BeEquivalentTo([]byte("table1"))) 108 109 ctx.MockVpp.MockReply(&vpp_ip.IPTableAddDelReply{}) 110 err = vtHandler.DelVrfTable(vrfTables[1]) 111 Expect(err).To(Succeed()) 112 113 vppMsg, ok = ctx.MockChannel.Msg.(*vpp_ip.IPTableAddDel) 114 Expect(ok).To(BeTrue()) 115 Expect(vppMsg.Table.TableID).To(BeEquivalentTo(1)) 116 Expect(vppMsg.Table.IsIP6).To(BeTrue()) 117 Expect(vppMsg.IsAdd).To(BeFalse()) 118 Expect(vppMsg.Table.Name).To(BeEquivalentTo([]byte("table1"))) 119 120 ctx.MockVpp.MockReply(&vpp_ip.IPTableAddDelReply{}) 121 err = vtHandler.DelVrfTable(vrfTables[2]) 122 Expect(err).To(Succeed()) 123 124 vppMsg, ok = ctx.MockChannel.Msg.(*vpp_ip.IPTableAddDel) 125 Expect(ok).To(BeTrue()) 126 Expect(vppMsg.Table.TableID).To(BeEquivalentTo(2)) 127 Expect(vppMsg.Table.IsIP6).To(BeTrue()) 128 Expect(vppMsg.IsAdd).To(BeFalse()) 129 Expect(vppMsg.Table.Name).To(BeEquivalentTo([]byte("table2"))) 130 131 ctx.MockVpp.MockReply(&vpp_ip.IPTableAddDelReply{Retval: 1}) 132 err = vtHandler.DelVrfTable(vrfTables[0]) 133 Expect(err).To(Not(BeNil())) 134 } 135 136 // Test VRF flow hash settings 137 func TestVrfFlowHashSettings(t *testing.T) { 138 ctx, vtHandler := vrfTableTestSetup(t) 139 defer ctx.TeardownTestCtx() 140 141 ctx.MockVpp.MockReply(&vpp_ip.SetIPFlowHashV2Reply{}) 142 err := vtHandler.SetVrfFlowHashSettings(5, true, 143 &l3.VrfTable_FlowHashSettings{ 144 UseSrcIp: true, 145 UseSrcPort: true, 146 Symmetric: true, 147 }) 148 Expect(err).To(Succeed()) 149 150 vppMsg, ok := ctx.MockChannel.Msg.(*vpp_ip.SetIPFlowHashV2) 151 Expect(ok).To(BeTrue()) 152 Expect(vppMsg.TableID).To(BeEquivalentTo(5)) 153 Expect(vppMsg.Af).To(BeEquivalentTo(ip_types.ADDRESS_IP6)) 154 Expect(vppMsg.FlowHashConfig).To(BeEquivalentTo( 155 ip.IP_API_FLOW_HASH_SRC_IP + ip.IP_API_FLOW_HASH_SRC_PORT + ip.IP_API_FLOW_HASH_SYMETRIC)) 156 } 157 158 func vrfTableTestSetup(t *testing.T) (*vppmock.TestCtx, vppcalls.VrfTableVppAPI) { 159 ctx := vppmock.SetupTestCtx(t) 160 log := logrus.NewLogger("test-log") 161 vtHandler := vpp2210.NewVrfTableVppHandler(ctx.MockChannel, log) 162 return ctx, vtHandler 163 }