diff options
| author | Daniil Baturin <daniil@vyos.io> | 2025-10-21 15:15:18 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-21 15:15:18 +0100 |
| commit | 33099a929ad51b980b77d7427bbb89cd71a560b6 (patch) | |
| tree | 12d7a2a95d8e42b7788ed81435d923a870f73577 /smoketest/scripts/cli | |
| parent | fd8794f36b487ba2102cc50437056e93eb62f7f3 (diff) | |
| parent | d290b2661f0d71168a4d6b16691f48b7fb741a4c (diff) | |
| download | vyos-1x-33099a929ad51b980b77d7427bbb89cd71a560b6.tar.gz vyos-1x-33099a929ad51b980b77d7427bbb89cd71a560b6.zip | |
Merge pull request #4783 from hedrok/T5942-failover-dhcp-gateway
T5942: Make failover support dhcp-interface
Diffstat (limited to 'smoketest/scripts/cli')
| -rwxr-xr-x | smoketest/scripts/cli/test_protocols_failover.py | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/smoketest/scripts/cli/test_protocols_failover.py b/smoketest/scripts/cli/test_protocols_failover.py index 26f5e87b5..132d427ec 100755 --- a/smoketest/scripts/cli/test_protocols_failover.py +++ b/smoketest/scripts/cli/test_protocols_failover.py @@ -34,6 +34,7 @@ config_dir_root = '/run/vyos-failover.conf.d' check_timeout = 1 wait_timeout = 5 +wait_dhcp_timeout = 10 # Use numeric value to not get ip errors while # /etc/iproute2/rt_protos.d/failover.conf is not installed yet @@ -43,6 +44,9 @@ dummy_if1 = 'dum3711' dummy_if2 = 'dum3712' dummy_if3 = 'dum3713' +veth_if1 = 'veth71' +veth_if2 = 'veth72' + route_prefix = '203.0.113.0/24' route2_prefix = '172.16.0.0/24' route_base_path = base_path + ['route', route_prefix] @@ -51,6 +55,12 @@ dummy_if1_addr = '192.168.30.1' dummy_if2_addr = '10.0.70.1' dummy_if3_addr = '10.20.0.1' +# These three must be in same subnet: +dhcp_prefix = '10.133.0' +veth_if1_addr = f'{dhcp_prefix}.1' +dhcp_gateway_addr_1 = f'{dhcp_prefix}.99' +dhcp_gateway_addr_2 = f'{dhcp_prefix}.117' + class RoutesChecker: def __init__(self, required_routes, allow_extra=False): @@ -101,13 +111,26 @@ class TestProtocolsFailover(VyOSUnitTestSHIM.TestCase): self.cli_set(['interfaces', 'dummy', dummy_if1]) self.cli_set(['interfaces', 'dummy', dummy_if2]) self.cli_set(['interfaces', 'dummy', dummy_if3]) + self.cli_set( + ['interfaces', 'virtual-ethernet', veth_if1, 'peer-name', veth_if2] + ) + self.cli_set( + ['interfaces', 'virtual-ethernet', veth_if2, 'peer-name', veth_if1] + ) self.clean_and_stop_daemon() + self.clean_dhclient_lease_files = set() + self.need_dhcp_dir_cleanup = False + def tearDown(self): + self.cli_delete(['interfaces', 'virtual-ethernet', veth_if2]) + self.cli_delete(['interfaces', 'virtual-ethernet', veth_if1]) self.cli_delete(['interfaces', 'dummy', dummy_if3]) self.cli_delete(['interfaces', 'dummy', dummy_if2]) self.cli_delete(['interfaces', 'dummy', dummy_if1]) + self.cli_delete(['service', 'dhcp-server']) + self.cli_delete(['service', 'dns']) self.clean_and_stop_daemon() @@ -503,5 +526,120 @@ class TestProtocolsFailover(VyOSUnitTestSHIM.TestCase): self.assertTrue(res, f"No routes should have been left, got: {output}") + def test_04_dhcp(self): + res, output = self.wait_for_ip_output( + f'route show proto {failover_protocol_value}', + [], + timeout=wait_timeout, + ) + self.assertTrue( + res, f"No failover routes must exist before test, last result: {output}" + ) + + # Setup DHCP server + self.cli_set( + [ + 'interfaces', + 'virtual-ethernet', + veth_if1, + 'address', + f'{dhcp_prefix}.1/24', + ] + ) + self.cli_set(['interfaces', 'virtual-ethernet', veth_if1, 'description', 'LAN']) + + service_base = [ + 'service', + 'dhcp-server', + 'shared-network-name', + 'LAN', + 'subnet', + f'{dhcp_prefix}.0/24', + ] + self.cli_set(service_base + ['option', 'name-server', f'{dhcp_prefix}.1']) + self.cli_set(service_base + ['option', 'domain-name', 'vyos']) + self.cli_set(service_base + ['lease', '86400']) + self.cli_set(service_base + ['range', '0', 'start', f'{dhcp_prefix}.9']) + self.cli_set(service_base + ['range', '0', 'stop', f'{dhcp_prefix}.254']) + self.cli_set(service_base + ['subnet-id', '1952']) + + self.cli_set(['service', 'dns', 'forwarding', 'cache-size', '0']) + self.cli_set( + ['service', 'dns', 'forwarding', 'listen-address', f'{dhcp_prefix}.1'] + ) + self.cli_set( + ['service', 'dns', 'forwarding', 'allow-from', f'{dhcp_prefix}.0/24'] + ) + # End setup DHCP server + + # Setting first DHCP Gateway address + self.cli_set(service_base + ['option', 'default-router', dhcp_gateway_addr_1]) + + self.cli_set( + ['interfaces', 'dummy', dummy_if1, 'address', dummy_if1_addr + '/24'] + ) + self.cli_set( + ['interfaces', 'dummy', dummy_if2, 'address', dummy_if2_addr + '/24'] + ) + self.cli_set(['interfaces', 'virtual-ethernet', veth_if2, 'address', 'dhcp']) + self.cli_set(route_base_path + ['dhcp-interface', veth_if2]) + base_dhcp_interface = route_base_path + ['dhcp-interface', veth_if2] + self.cli_set(base_dhcp_interface + ['metric', '30']) + self.cli_set( + base_dhcp_interface + + [ + 'check', + 'target', + dummy_if1_addr, + 'interface', + dummy_if1, + ] + ) + self.cli_set(base_dhcp_interface + ['check', 'timeout', str(check_timeout)]) + self.cli_commit() + + # Now vyos-failover must be launched, it should create route to first dhcp address + checker = RoutesChecker([{'dst': route_prefix, 'gateway': dhcp_gateway_addr_1}]) + res, output = self.wait_for_ip_output( + f"route show proto {failover_protocol_value}", + checker, + timeout=wait_dhcp_timeout, + ) + self.assertTrue( + res, + f"Route must have been created via fist dhcp address. Checker error: {checker.error}", + ) + + # Change DHCP gateway address + renew_cmd = ['renew', 'dhcp', 'interface', veth_if2] + self.cli_set(service_base + ['option', 'default-router', dhcp_gateway_addr_2]) + self.cli_commit() + self.op_mode(renew_cmd) + + checker = RoutesChecker([{'dst': route_prefix, 'gateway': dhcp_gateway_addr_2}]) + res, output = self.wait_for_ip_output( + f"route show proto {failover_protocol_value}", + checker, + timeout=wait_dhcp_timeout, + ) + self.assertTrue( + res, + f"Route must have been created via second dhcp address. Checker error: {checker.error}", + ) + + # DHCP server down + self.cli_delete(['service', 'dhcp-server']) + self.cli_delete(['service', 'dns']) + self.cli_commit() + self.op_mode(renew_cmd) + + res, output = self.wait_for_ip_output( + f'route show proto {failover_protocol_value}', + [], + timeout=wait_dhcp_timeout, + ) + self.assertTrue(res, f"Route must have been deleted, last result: {output}") + + if __name__ == '__main__': unittest.main(verbosity=2) |
