@@ -1393,6 +1393,93 @@ def test_17_vpp_nat(self):
13931393 _ , out = rc_cmd ('sudo vppctl show nat44 summary' )
13941394 self .assertIn (f'max translations per thread: { sess_limit } fib 0' , out )
13951395
1396+ def test_18_vpp_vrrp (self ):
1397+ base_vrrp = base_path + ['vrrp' , 'group' ]
1398+ addresses_first = ['192.0.10.1' ]
1399+ vrid_first = '10'
1400+ advertise_interval = '5'
1401+ priority = '150'
1402+ peer_addresses = ['192.0.2.11' , '192.0.2.12' ]
1403+ addresses_second = ['2001:db8:1111::1' , '2001:db8:1112::1' ]
1404+ vrid_second = '20'
1405+ addresses_third = ['192.0.20.1' ]
1406+ vrid_third = '30'
1407+
1408+ # Set VRRP group FIRST (ipv4)
1409+ self .cli_set (base_vrrp + ['FIRST' , 'interface' , interface ])
1410+ self .cli_set (base_vrrp + ['FIRST' , 'vrid' , vrid_first ])
1411+ self .cli_set (base_vrrp + ['FIRST' , 'advertise-interval' , advertise_interval ])
1412+ self .cli_set (base_vrrp + ['FIRST' , 'priority' , priority ])
1413+ for address in addresses_first :
1414+ self .cli_set (base_vrrp + ['FIRST' , 'address' , address ])
1415+ for address in peer_addresses :
1416+ self .cli_set (base_vrrp + ['FIRST' , 'peer-address' , address ])
1417+
1418+ # Interface should have IP address
1419+ # expect raise ConfigError
1420+ with self .assertRaises (ConfigSessionError ):
1421+ self .cli_commit ()
1422+
1423+ self .cli_set (['interfaces' , 'ethernet' , interface , 'address' , '192.0.2.11/24' ])
1424+
1425+ self .cli_commit ()
1426+
1427+ # Check information for group FIRST
1428+ _ , out = rc_cmd ('sudo vppctl show vrrp vr' )
1429+ self .assertIn (f'[0] sw_if_index 1 VR ID { vrid_first } IPv4' , out )
1430+ self .assertIn ('flags: preempt yes accept no unicast yes' , out )
1431+ self .assertIn (f'priority: configured { priority } ' , out )
1432+ self .assertIn (f'timers: adv interval { advertise_interval } 00' , out )
1433+ self .assertIn (f'addresses { " " .join (addresses_first )} ' , out )
1434+ self .assertIn (f'peer addresses { " " .join (peer_addresses )} ' , out )
1435+
1436+ # Set VRRP group SECOND (ipv6)
1437+ self .cli_set (base_vrrp + ['SECOND' , 'interface' , interface ])
1438+ self .cli_set (base_vrrp + ['SECOND' , 'vrid' , vrid_second ])
1439+ for address in addresses_second :
1440+ self .cli_set (base_vrrp + ['SECOND' , 'address' , address ])
1441+
1442+ self .cli_commit ()
1443+
1444+ # Check information for group SECOND
1445+ _ , out = rc_cmd ('sudo vppctl show vrrp vr' )
1446+ self .assertIn (f'[1] sw_if_index 1 VR ID { vrid_second } IPv6' , out )
1447+ self .assertIn ('flags: preempt yes accept no unicast no' , out )
1448+ self .assertIn ('priority: configured 100' , out ) # default priority
1449+ self .assertIn ('timers: adv interval 100' , out ) # default advertise-interval
1450+ self .assertIn (f'addresses { " " .join (addresses_second )} ' , out )
1451+
1452+ # VRID can only be used once on interface with the same address family
1453+ self .cli_set (base_vrrp + ['THIRD' , 'interface' , interface ])
1454+ self .cli_set (base_vrrp + ['THIRD' , 'vrid' , vrid_first ])
1455+ self .cli_set (base_vrrp + ['THIRD' , 'no-preempt' ])
1456+ for address in addresses_third :
1457+ self .cli_set (base_vrrp + ['THIRD' , 'address' , address ])
1458+
1459+ # expect raise ConfigError
1460+ with self .assertRaises (ConfigSessionError ):
1461+ self .cli_commit ()
1462+
1463+ self .cli_set (base_vrrp + ['THIRD' , 'vrid' , vrid_third ])
1464+
1465+ # Virtual address should not be used in another group
1466+ self .cli_set (base_vrrp + ['THIRD' , 'address' , addresses_first [0 ]])
1467+ # expect raise ConfigError
1468+ with self .assertRaises (ConfigSessionError ):
1469+ self .cli_commit ()
1470+
1471+ self .cli_delete (base_vrrp + ['THIRD' , 'address' , addresses_first [0 ]])
1472+
1473+ self .cli_commit ()
1474+
1475+ # Check information for group THIRD
1476+ _ , out = rc_cmd ('sudo vppctl show vrrp vr' )
1477+ self .assertIn (f'[2] sw_if_index 1 VR ID { vrid_third } IPv4' , out )
1478+ self .assertIn ('flags: preempt no accept no unicast no' , out )
1479+ self .assertIn ('priority: configured 100' , out ) # default priority
1480+ self .assertIn ('timers: adv interval 100' , out ) # default advertise-interval
1481+ self .assertIn (f'addresses { " " .join (addresses_third )} ' , out )
1482+
13961483
13971484if __name__ == '__main__' :
13981485 unittest .main (verbosity = 2 )
0 commit comments