go.ligato.io/vpp-agent/v3@v3.5.0/tests/integration/vpp/170_vrrp_test.go (about) 1 // Copyright (c) 2020 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 vpp 16 17 import ( 18 "testing" 19 20 "go.ligato.io/cn-infra/v2/logging/logrus" 21 netalloc_mock "go.ligato.io/vpp-agent/v3/plugins/netalloc/mock" 22 "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/ifaceidx" 23 ifplugin_vppcalls "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/vppcalls" 24 l3plugin_vppcalls "go.ligato.io/vpp-agent/v3/plugins/vpp/l3plugin/vppcalls" 25 "go.ligato.io/vpp-agent/v3/plugins/vpp/l3plugin/vrfidx" 26 l3 "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/l3" 27 ) 28 29 func TestVrrp(t *testing.T) { 30 ctx := setupVPP(t) 31 defer ctx.teardownVPP() 32 33 release := ctx.versionInfo.Release() 34 if release < "20.05" { 35 t.Skipf("VRRP: skipped for VPP < 20.05 (%s)", release) 36 } 37 38 ifIndexes := ifaceidx.NewIfaceIndex(logrus.NewLogger("test-if"), "test-if") 39 vrfIndexes := vrfidx.NewVRFIndex(logrus.NewLogger("test-vrrp"), "test-vrrp") 40 l3Handler := l3plugin_vppcalls.CompatibleL3VppHandler(ctx.vppClient, ifIndexes, vrfIndexes, 41 netalloc_mock.NewMockNetAlloc(), logrus.NewLogger("test-l3")) 42 43 ifHandler := ifplugin_vppcalls.CompatibleInterfaceVppHandler(ctx.vppClient, logrus.NewLogger("test-if")) 44 45 tests := []struct { 46 name string 47 vrrp *l3.VRRPEntry 48 shouldFail bool 49 }{ 50 { 51 name: "Create VRRP entry (localhost)", 52 vrrp: &l3.VRRPEntry{ 53 Interface: "if0", 54 VrId: 1, 55 Priority: 100, 56 Interval: 150, 57 Preempt: false, 58 Accept: false, 59 Unicast: false, 60 IpAddresses: []string{"11.11.11.11"}, 61 Enabled: false, 62 }, 63 shouldFail: false, 64 }, 65 { 66 name: "Create VRRP entry (IPv6)", 67 vrrp: &l3.VRRPEntry{ 68 Interface: "if1", 69 VrId: 1, 70 Priority: 244, 71 Interval: 150, 72 Preempt: false, 73 Accept: false, 74 Unicast: false, 75 IpAddresses: []string{"2001:db8:11a3:9d7:1f34:8a2e:7a0:765d"}, 76 Enabled: false, 77 }, 78 shouldFail: false, 79 }, 80 { 81 name: "Create VRRP entry with empty IpAddresses", 82 vrrp: &l3.VRRPEntry{ 83 Interface: "if2", 84 VrId: 33, 85 Priority: 200, 86 Interval: 200, 87 Preempt: false, 88 Accept: false, 89 Unicast: false, 90 IpAddresses: []string{}, 91 Enabled: false, 92 }, 93 shouldFail: true, 94 }, 95 { 96 name: "Create VRRP entry (IPv6) with invalid interval", 97 vrrp: &l3.VRRPEntry{ 98 Interface: "if3", 99 VrId: 33, 100 Priority: 100, 101 Interval: 0, 102 Preempt: false, 103 Accept: false, 104 Unicast: false, 105 IpAddresses: []string{"2001:db8:11a3:9d7:1f34:8a2e:7a0:765d"}, 106 Enabled: false, 107 }, 108 shouldFail: true, 109 }, 110 } 111 for _, test := range tests { 112 t.Run(test.name, func(t *testing.T) { 113 ifIdx, err := ifHandler.AddLoopbackInterface(test.vrrp.Interface) 114 if err != nil { 115 t.Fatalf("creating interface failed: %v", err) 116 } 117 ifIndexes.Put(test.vrrp.Interface, &ifaceidx.IfaceMetadata{SwIfIndex: ifIdx}) 118 119 err = l3Handler.VppAddVrrp(test.vrrp) 120 if err != nil { 121 if test.shouldFail { 122 return 123 } 124 t.Fatalf("create VRRP entry failed: %v\n", err) 125 } else { 126 if test.shouldFail { 127 t.Fatal("create VRRP entry must fail, but it's not") 128 } 129 } 130 131 entries, err := l3Handler.DumpVrrpEntries() 132 if err != nil { 133 t.Fatalf("dump VRRP entries failed: %v\n", err) 134 } 135 if len(entries) == 0 { 136 t.Fatalf("no VRRP entries dumped") 137 } 138 139 if entries[0].Vrrp.VrId != test.vrrp.VrId { 140 t.Fatalf("expected VrId <%v>, got: <%v>", test.vrrp.VrId, entries[0].Vrrp.VrId) 141 } 142 if entries[0].Vrrp.Interface != test.vrrp.Interface { 143 t.Fatalf("expected Interface <%v>, got: <%v>", test.vrrp.Interface, entries[0].Vrrp.Interface) 144 } 145 if entries[0].Vrrp.Interval != test.vrrp.Interval { 146 t.Fatalf("expected Interval <%v>, got: <%v>", test.vrrp.Interval, entries[0].Vrrp.Interval) 147 } 148 if entries[0].Vrrp.Priority != test.vrrp.Priority { 149 t.Fatalf("expected Priority <%v>, got: <%v>", test.vrrp.Priority, entries[0].Vrrp.Priority) 150 } 151 if entries[0].Vrrp.Enabled != test.vrrp.Enabled { 152 t.Fatalf("expected Enabled <%v>, got: <%v>", test.vrrp.Enabled, entries[0].Vrrp.Enabled) 153 } 154 if entries[0].Vrrp.Preempt != test.vrrp.Preempt { 155 t.Fatalf("expected Preempt <%v>, got: <%v>", test.vrrp.Preempt, entries[0].Vrrp.Preempt) 156 } 157 if entries[0].Vrrp.Unicast != test.vrrp.Unicast { 158 t.Fatalf("expected Unicast <%v>, got: <%v>", test.vrrp.Unicast, entries[0].Vrrp.Unicast) 159 } 160 if entries[0].Vrrp.Accept != test.vrrp.Accept { 161 t.Fatalf("expected Accept <%v>, got: <%v>", test.vrrp.Accept, entries[0].Vrrp.Accept) 162 } 163 164 for i := 0; i < len(test.vrrp.IpAddresses); i++ { 165 if entries[0].Vrrp.IpAddresses[i] != test.vrrp.IpAddresses[i] { 166 t.Fatalf("expected IpAddresses[%v] <%v>, got: <%v>", i, test.vrrp.IpAddresses[i], entries[0].Vrrp.IpAddresses[i]) 167 } 168 } 169 170 err = l3Handler.VppDelVrrp(test.vrrp) 171 if err != nil { 172 t.Fatalf("delete VRRP entry failed: %v\n", err) 173 } 174 175 entries, err = l3Handler.DumpVrrpEntries() 176 if err != nil { 177 t.Fatalf("dump VRRP entries failed: %v\n", err) 178 } 179 if len(entries) != 0 { 180 t.Fatalf("%d VRRP entries dumped after delete", len(entries)) 181 } 182 183 err = ifHandler.DeleteLoopbackInterface(test.vrrp.Interface, ifIdx) 184 if err != nil { 185 t.Fatalf("delete interface failed: %v", err) 186 } 187 ifIndexes.Delete(test.vrrp.Interface) 188 }) 189 } 190 }