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  }