go.ligato.io/vpp-agent/v3@v3.5.0/tests/integration/vpp/080_gre_test.go (about)

     1  package vpp
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"go.ligato.io/cn-infra/v2/logging/logrus"
     8  
     9  	ifplugin_vppcalls "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/vppcalls"
    10  	interfaces "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces"
    11  
    12  	_ "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin"
    13  )
    14  
    15  func TestGre(t *testing.T) {
    16  	ctx := setupVPP(t)
    17  	defer ctx.teardownVPP()
    18  
    19  	h := ifplugin_vppcalls.CompatibleInterfaceVppHandler(ctx.vppClient, logrus.NewLogger("test"))
    20  
    21  	tests := []struct {
    22  		name    string
    23  		greLink *interfaces.GreLink
    24  		isFail  bool
    25  	}{
    26  		{
    27  			name: "create UNKNOWN GRE tunnel with IPv4",
    28  			greLink: &interfaces.GreLink{
    29  				TunnelType: interfaces.GreLink_UNKNOWN,
    30  				SrcAddr:    "2000::8:13",
    31  				DstAddr:    "2019::8:13",
    32  			},
    33  			isFail: true,
    34  		},
    35  		{
    36  			name: "create L3 GRE tunnel with IPv4",
    37  			greLink: &interfaces.GreLink{
    38  				TunnelType: interfaces.GreLink_L3,
    39  				SrcAddr:    "2000::8:23",
    40  				DstAddr:    "2019::8:23",
    41  			},
    42  			isFail: false,
    43  		},
    44  		{
    45  			name: "create TEB GRE tunnel with IPv4",
    46  			greLink: &interfaces.GreLink{
    47  				TunnelType: interfaces.GreLink_TEB,
    48  				SrcAddr:    "2000::8:33",
    49  				DstAddr:    "2019::8:33",
    50  			},
    51  			isFail: false,
    52  		},
    53  		{
    54  			name: "create ERSPAN GRE tunnel with IPv4",
    55  			greLink: &interfaces.GreLink{
    56  				TunnelType: interfaces.GreLink_ERSPAN,
    57  				SrcAddr:    "2000::8:43",
    58  				DstAddr:    "2019::8:43",
    59  			},
    60  			isFail: false,
    61  		},
    62  
    63  		{
    64  			name: "create ERSPAN GRE tunnel with out of range session id",
    65  			greLink: &interfaces.GreLink{
    66  				TunnelType: interfaces.GreLink_ERSPAN,
    67  				SrcAddr:    "10.10.10.10",
    68  				DstAddr:    "20.20.20.20",
    69  				SessionId:  1024,
    70  			},
    71  			isFail: true,
    72  		},
    73  		{
    74  			name: "create GRE tunnel with bad source address",
    75  			greLink: &interfaces.GreLink{
    76  				TunnelType: interfaces.GreLink_ERSPAN,
    77  				SrcAddr:    "badip",
    78  				DstAddr:    "20.20.20.20",
    79  			},
    80  			isFail: true,
    81  		},
    82  		{
    83  			name: "create GRE tunnel with destination address not set",
    84  			greLink: &interfaces.GreLink{
    85  				TunnelType: interfaces.GreLink_ERSPAN,
    86  				SrcAddr:    "10.10.10.10",
    87  			},
    88  			isFail: true,
    89  		},
    90  
    91  		{
    92  			name: "create GRE tunnel with equal source and destination addresses",
    93  			greLink: &interfaces.GreLink{
    94  				TunnelType: interfaces.GreLink_ERSPAN,
    95  				SrcAddr:    "10.10.10.10",
    96  				DstAddr:    "10.10.10.10",
    97  			},
    98  			isFail: true,
    99  		},
   100  		{
   101  			name: "create GRE tunnel with addresses in IPv4 and IPv6",
   102  			greLink: &interfaces.GreLink{
   103  				TunnelType: interfaces.GreLink_ERSPAN,
   104  				SrcAddr:    "10.10.10.10",
   105  				DstAddr:    "2019::8:23",
   106  			},
   107  			isFail: true,
   108  		},
   109  	}
   110  	for i, test := range tests {
   111  		t.Run(test.name, func(t *testing.T) {
   112  			ifName := fmt.Sprintf("test%d", i)
   113  			ifIdx, err := h.AddGreTunnel(ifName, test.greLink)
   114  
   115  			if err != nil {
   116  				if test.isFail {
   117  					return
   118  				}
   119  				t.Fatalf("create GRE tunnel failed: %v\n", err)
   120  			} else {
   121  				if test.isFail {
   122  					t.Fatal("create GRE tunnel must fail, but it's not")
   123  				}
   124  			}
   125  
   126  			ifaces, err := h.DumpInterfaces(ctx.Ctx)
   127  			if err != nil {
   128  				t.Fatalf("dumping interfaces failed: %v", err)
   129  			}
   130  			iface, ok := ifaces[ifIdx]
   131  			if !ok {
   132  				t.Fatalf("GRE interface not found in dump")
   133  			}
   134  
   135  			gre := iface.Interface.GetGre()
   136  
   137  			if test.greLink.TunnelType != gre.TunnelType {
   138  				t.Fatalf("expected tunnel type <%s>, got: <%s>", test.greLink.TunnelType, gre.TunnelType)
   139  			}
   140  			if test.greLink.SrcAddr != gre.SrcAddr {
   141  				t.Fatalf("expected source address <%s>, got: <%s>", test.greLink.SrcAddr, gre.SrcAddr)
   142  			}
   143  			if test.greLink.DstAddr != gre.DstAddr {
   144  				t.Fatalf("expected destination address <%s>, got: <%s>", test.greLink.DstAddr, gre.DstAddr)
   145  			}
   146  			if test.greLink.OuterFibId != gre.OuterFibId {
   147  				t.Fatalf("expected outer FIB id <%d>, got: <%d>", test.greLink.OuterFibId, gre.OuterFibId)
   148  			}
   149  			if test.greLink.SessionId != gre.SessionId {
   150  				t.Fatalf("expected session id <%d>, got: <%d>", test.greLink.SessionId, gre.SessionId)
   151  			}
   152  
   153  			ifIdx, err = h.DelGreTunnel(ifName, test.greLink)
   154  			if err != nil {
   155  				t.Fatalf("delete GRE tunnel failed: %v\n", err)
   156  			}
   157  
   158  			ifaces, err = h.DumpInterfaces(ctx.Ctx)
   159  			if err != nil {
   160  				t.Fatalf("dumping interfaces failed: %v", err)
   161  			}
   162  			_, ok = ifaces[ifIdx]
   163  			if ok {
   164  				t.Fatalf("GRE interface was found in dump")
   165  			}
   166  		})
   167  	}
   168  }