go.ligato.io/vpp-agent/v3@v3.5.0/tests/integration/vpp/010_interfaces_test.go (about) 1 // Copyright (c) 2019 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 "context" 19 "net" 20 "testing" 21 22 "go.ligato.io/cn-infra/v2/logging/logrus" 23 24 ifplugin_vppcalls "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/vppcalls" 25 vpp_interfaces "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" 26 27 _ "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin" 28 ) 29 30 func TestInterfaceIP(t *testing.T) { 31 test := setupVPP(t) 32 defer test.teardownVPP() 33 34 h := ifplugin_vppcalls.CompatibleInterfaceVppHandler(test.vppClient, logrus.NewLogger("test")) 35 36 tests := []struct { 37 name string 38 ipnet net.IPNet 39 }{ 40 {"basic ipv4", net.IPNet{IP: net.IPv4(10, 0, 0, 1), Mask: net.IPMask{255, 255, 255, 0}}}, 41 {"basic ipv6", net.IPNet{IP: net.ParseIP("::1"), Mask: net.IPMask{255, 255, 255, 0}}}, 42 } 43 for _, test := range tests { 44 t.Run(test.name, func(t *testing.T) { 45 ifIdx, err := h.AddLoopbackInterface("loop0") 46 if err != nil { 47 t.Fatalf("creating loopback interface failed: %v", err) 48 } 49 t.Logf("loop0 index: %+v", ifIdx) 50 51 if err := h.AddInterfaceIP(ifIdx, &test.ipnet); err != nil { 52 t.Fatalf("adding interface IP failed: %v", err) 53 } 54 }) 55 } 56 } 57 58 func TestInterfaceEnabledFieldWithLoopback(t *testing.T) { 59 test := setupVPP(t) 60 defer test.teardownVPP() 61 62 h := ifplugin_vppcalls.CompatibleInterfaceVppHandler(test.vppClient, logrus.NewLogger("test")) 63 64 ifIdx0, err := h.AddLoopbackInterface("loop0") 65 if err != nil { 66 t.Fatalf("creating loopback interface failed: %v", err) 67 } 68 69 // Test after creation 70 ifaces, err := h.DumpInterfaces(test.Ctx) 71 if err != nil { 72 t.Fatalf("dumping interfaces failed: %v", err) 73 } 74 iface := ifaces[ifIdx0] 75 if iface.Interface.Enabled != false { 76 t.Fatalf("expected interface to not be enabled") 77 } 78 if iface.Meta.IsAdminStateUp != false { 79 t.Fatalf("expected interface admin state to be down") 80 } 81 if iface.Meta.IsLinkStateUp != false { 82 t.Fatalf("expected interface link state to be down") 83 } 84 85 // Set AdminUp and test again 86 err = h.InterfaceAdminUp(test.Ctx, ifIdx0) 87 if err != nil { 88 t.Fatalf("enabling interface failed: %v", err) 89 } 90 ifaces, err = h.DumpInterfaces(test.Ctx) 91 if err != nil { 92 t.Fatalf("dumping interfaces failed: %v", err) 93 } 94 iface = ifaces[ifIdx0] 95 if iface.Interface.Enabled != true { 96 t.Fatalf("expected interface to be enabled") 97 } 98 if iface.Meta.IsAdminStateUp != true { 99 t.Fatalf("expected interface admin state to be up") 100 } 101 if iface.Meta.IsLinkStateUp != true { 102 t.Fatalf("expected interface link state to be up") 103 } 104 105 // Set AdminDown and test again 106 err = h.InterfaceAdminDown(test.Ctx, ifIdx0) 107 if err != nil { 108 t.Fatalf("disabling interface failed: %v", err) 109 } 110 ifaces, err = h.DumpInterfaces(test.Ctx) 111 if err != nil { 112 t.Fatalf("dumping interfaces failed: %v", err) 113 } 114 iface = ifaces[ifIdx0] 115 if iface.Interface.Enabled != false { 116 t.Fatalf("expected interface to not be enabled") 117 } 118 if iface.Meta.IsAdminStateUp != false { 119 t.Fatalf("expected interface admin state to be down") 120 } 121 if iface.Meta.IsLinkStateUp != false { 122 t.Fatalf("expected interface link state to be down") 123 } 124 } 125 126 // reason to do same test with Memif is because unlike 127 // loopback interface after calling InterfaceAdminUp 128 // memif should keep link state down 129 func TestInterfaceEnabledFieldWithMemif(t *testing.T) { 130 test := setupVPP(t) 131 defer test.teardownVPP() 132 133 h := ifplugin_vppcalls.CompatibleInterfaceVppHandler(test.vppClient, logrus.NewLogger("test")) 134 135 ctx := context.Background() 136 err := h.RegisterMemifSocketFilename(ctx, "/tmp/memif1.sock", 2) 137 if err != nil { 138 t.Fatalf("registering memif socket filename faild: %v", err) 139 } 140 memifIdx, err := h.AddMemifInterface(ctx, "memif1", &vpp_interfaces.MemifLink{ 141 Id: 1, 142 Master: true, 143 Secret: "secret", 144 SocketFilename: "/tmp/memif1.sock", 145 }, 2) 146 if err != nil { 147 t.Fatalf("creating memif interface failed: %v", err) 148 } 149 150 // Test after creation 151 ifaces, err := h.DumpInterfaces(test.Ctx) 152 if err != nil { 153 t.Fatalf("dumping interfaces failed: %v", err) 154 } 155 iface := ifaces[memifIdx] 156 if iface.Interface.Enabled != false { 157 t.Fatalf("expected interface to not be enabled") 158 } 159 if iface.Meta.IsAdminStateUp != false { 160 t.Fatalf("expected interface admin state to be down") 161 } 162 if iface.Meta.IsLinkStateUp != false { 163 t.Fatalf("expected interface link state to be down") 164 } 165 166 // Set AdminUp and test again 167 err = h.InterfaceAdminUp(test.Ctx, memifIdx) 168 if err != nil { 169 t.Fatalf("enabling interface failed: %v", err) 170 } 171 ifaces, err = h.DumpInterfaces(test.Ctx) 172 if err != nil { 173 t.Fatalf("dumping interfaces failed: %v", err) 174 } 175 iface = ifaces[memifIdx] 176 if iface.Interface.Enabled != true { 177 t.Fatalf("expected interface to be enabled") 178 } 179 if iface.Meta.IsAdminStateUp != true { 180 t.Fatalf("expected interface admin state to be up") 181 } 182 if iface.Meta.IsLinkStateUp != false { 183 t.Fatalf("expected interface link state to be down") 184 } 185 186 // Set AdminDown and test again 187 err = h.InterfaceAdminDown(test.Ctx, memifIdx) 188 if err != nil { 189 t.Fatalf("disabling interface failed: %v", err) 190 } 191 ifaces, err = h.DumpInterfaces(test.Ctx) 192 if err != nil { 193 t.Fatalf("dumping interfaces failed: %v", err) 194 } 195 iface = ifaces[memifIdx] 196 if iface.Interface.Enabled != false { 197 t.Fatalf("expected interface to not be enabled") 198 } 199 if iface.Meta.IsAdminStateUp != false { 200 t.Fatalf("expected interface admin state to be down") 201 } 202 if iface.Meta.IsLinkStateUp != false { 203 t.Fatalf("expected interface link state to be down") 204 } 205 } 206 207 func TestInterfaceDumpState(t *testing.T) { 208 test := setupVPP(t) 209 defer test.teardownVPP() 210 211 h := ifplugin_vppcalls.CompatibleInterfaceVppHandler(test.vppClient, logrus.NewLogger("test")) 212 213 ifIdx0, err := h.AddLoopbackInterface("loop0") 214 if err != nil { 215 t.Fatalf("creating loopback interface failed: %v", err) 216 } 217 t.Logf("loop0 index: %+v", ifIdx0) 218 219 ifIdx, err := h.AddLoopbackInterface("loop1") 220 if err != nil { 221 t.Fatalf("creating loopback interface failed: %v", err) 222 } 223 t.Logf("loop1 index: %+v", ifIdx) 224 225 ifaces, err := h.DumpInterfaceStates() 226 if err != nil { 227 t.Fatalf("dumping interface states failed: %v", err) 228 } 229 if len(ifaces) != 3 { 230 t.Errorf("expected 3 interface states in dump, got: %d", len(ifaces)) 231 } 232 233 ifaces, err = h.DumpInterfaceStates(ifIdx) 234 if err != nil { 235 t.Fatalf("dumping interface states failed: %v", err) 236 } 237 iface := ifaces[ifIdx] 238 t.Logf("interface state: %+v", iface) 239 240 if iface == nil { 241 t.Fatalf("expected interface, got: nil") 242 } 243 if iface.InternalName != "loop1" { 244 t.Errorf("expected interface internal name to be loop1, got: %v", iface.InternalName) 245 } 246 if len(iface.PhysAddress) == 0 { 247 t.Errorf("expected interface phys address to not be empty, got: %q", iface.PhysAddress) 248 } 249 } 250 251 func TestLoopbackInterface(t *testing.T) { 252 test := setupVPP(t) 253 defer test.teardownVPP() 254 255 h := ifplugin_vppcalls.CompatibleInterfaceVppHandler(test.vppClient, logrus.NewLogger("test")) 256 257 ifIdx, err := h.AddLoopbackInterface("loop1") 258 if err != nil { 259 t.Fatalf("creating loopback interface failed: %v", err) 260 } 261 t.Logf("loopback index: %+v", ifIdx) 262 263 ifaces, err := h.DumpInterfaces(test.Ctx) 264 if err != nil { 265 t.Fatalf("dumping interfaces failed: %v", err) 266 } 267 iface, ok := ifaces[ifIdx] 268 if !ok { 269 t.Fatalf("loopback interface not found in dump") 270 } 271 t.Logf("interface: %+v", iface.Interface) 272 273 if iface.Interface.Name != "loop1" { 274 t.Errorf("expected interface name to be loop1, got: %v", iface.Interface.Name) 275 } 276 if iface.Interface.PhysAddress == "" { 277 t.Errorf("expected interface phys address to not be empty, got: %v", iface.Interface.PhysAddress) 278 } 279 if iface.Interface.Enabled == true { 280 t.Errorf("expected interface to not be enabled") 281 } 282 if iface.Interface.Type != vpp_interfaces.Interface_SOFTWARE_LOOPBACK { 283 t.Errorf("expected interface type to be SOFTWARE_LOOPBACK, got: %v", iface.Interface.Type) 284 } 285 if iface.Interface.Link != nil { 286 t.Errorf("expected interface link to be nil, got: %T", iface.Interface.Link) 287 } 288 } 289 290 func TestMemifInterface(t *testing.T) { 291 test := setupVPP(t) 292 defer test.teardownVPP() 293 294 h := ifplugin_vppcalls.CompatibleInterfaceVppHandler(test.vppClient, logrus.NewLogger("test")) 295 296 ctx := context.Background() 297 ifIdx, err := h.AddMemifInterface(ctx, "memif1", &vpp_interfaces.MemifLink{ 298 Id: 1, 299 Mode: vpp_interfaces.MemifLink_ETHERNET, 300 Secret: "secret", 301 Master: true, 302 }, 0) 303 if err != nil { 304 t.Fatalf("creating memif interface failed: %v", err) 305 } 306 t.Logf("memif index: %+v", ifIdx) 307 308 ifaces, err := h.DumpInterfaces(test.Ctx) 309 if err != nil { 310 t.Fatalf("dumping interfaces failed: %v", err) 311 } 312 iface, ok := ifaces[ifIdx] 313 if !ok { 314 t.Fatalf("Memif interface not found in dump") 315 } 316 t.Logf("interface: %+v", iface.Interface) 317 318 if iface.Interface.Name != "memif1" { 319 t.Errorf("expected interface name to be memif1, got: %v", iface.Interface.Name) 320 } 321 if iface.Interface.Type != vpp_interfaces.Interface_MEMIF { 322 t.Errorf("expected interface type to be memif, got: %v", iface.Interface.Type) 323 } 324 link, ok := iface.Interface.Link.(*vpp_interfaces.Interface_Memif) 325 if !ok { 326 t.Fatalf("expected interface link to be memif, got: %T", iface.Interface.Link) 327 } 328 if link.Memif.Id != 1 { 329 t.Errorf("expected memif ID to be 1, got: %v", link.Memif.Id) 330 } 331 if link.Memif.Mode != vpp_interfaces.MemifLink_ETHERNET { 332 t.Errorf("expected memif mode to be ETHERNET, got: %v", link.Memif.Mode) 333 } 334 }