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  }