|
20 | 20 | from json import loads
|
21 | 21 |
|
22 | 22 | from base_vyostest_shim import VyOSUnitTestSHIM
|
| 23 | +from time import sleep |
23 | 24 |
|
| 25 | +from vyos.hostsd_client import Client as hostsd_client |
24 | 26 | from vyos.configsession import ConfigSessionError
|
| 27 | +from vyos.kea import kea_add_lease |
| 28 | +from vyos.kea import kea_delete_lease |
| 29 | +from vyos.utils.process import run |
25 | 30 | from vyos.utils.process import process_named_running
|
26 | 31 | from vyos.utils.file import read_file
|
27 | 32 | from vyos.template import inc_ip
|
@@ -842,6 +847,88 @@ def test_dhcp_on_interface_with_vrf(self):
|
842 | 847 | self.cli_delete(['vrf', 'name', 'SMOKE-DHCP'])
|
843 | 848 | self.cli_commit()
|
844 | 849 |
|
| 850 | + def test_dhcp_hostsd_lease_sync(self): |
| 851 | + hc = hostsd_client() |
| 852 | + shared_net_name = 'SMOKE-LEASE-SYNC' |
| 853 | + domain_name = 'sync.private' |
| 854 | + |
| 855 | + client_range = range(1, 4) |
| 856 | + subnet_range_start = inc_ip(subnet, 10) |
| 857 | + subnet_range_stop = inc_ip(subnet, 20) |
| 858 | + |
| 859 | + def local_cleanup(): |
| 860 | + print('Cleaning up started') |
| 861 | + for seq in client_range: |
| 862 | + ip_addr = inc_ip(subnet, seq) |
| 863 | + kea_delete_lease(4, ip_addr) |
| 864 | + # zmq.Socket(zmq.REQ) throws unclosed socket warning |
| 865 | + # hc.delete_hosts([f'dhcp-server-{ip_addr}']) |
| 866 | + # hc.apply() |
| 867 | + run(f'/usr/bin/vyos-hostsd-client --delete-hosts --tag dhcp-server-{ip_addr} --apply') |
| 868 | + print('Cleaning up ended') |
| 869 | + |
| 870 | + self.addCleanup(local_cleanup) |
| 871 | + |
| 872 | + pool = base_path + ['shared-network-name', shared_net_name, 'subnet', subnet] |
| 873 | + self.cli_set(pool + ['subnet-id', '1']) |
| 874 | + self.cli_set(pool + ['option', 'domain-name', domain_name]) |
| 875 | + self.cli_set(pool + ['range', '0', 'start', subnet_range_start]) |
| 876 | + self.cli_set(pool + ['range', '0', 'stop', subnet_range_stop]) |
| 877 | + |
| 878 | + # commit changes |
| 879 | + self.cli_commit() |
| 880 | + |
| 881 | + config = read_file(KEA4_CONF) |
| 882 | + obj = loads(config) |
| 883 | + |
| 884 | + self.verify_config_value(obj, ['Dhcp4', 'shared-networks'], 'name', shared_net_name) |
| 885 | + self.verify_config_value(obj, ['Dhcp4', 'shared-networks', 0, 'subnet4'], 'subnet', subnet) |
| 886 | + self.verify_config_value(obj, ['Dhcp4', 'shared-networks', 0, 'subnet4'], 'id', 1) |
| 887 | + |
| 888 | + # Verify options |
| 889 | + self.verify_config_object( |
| 890 | + obj, |
| 891 | + ['Dhcp4', 'shared-networks', 0, 'subnet4', 0, 'option-data'], |
| 892 | + {'name': 'domain-name', 'data': domain_name}) |
| 893 | + self.verify_config_object( |
| 894 | + obj, |
| 895 | + ['Dhcp4', 'shared-networks', 0, 'subnet4', 0, 'pools'], |
| 896 | + {'pool': f'{subnet_range_start} - {subnet_range_stop}'}) |
| 897 | + |
| 898 | + # Check for running process |
| 899 | + self.assertTrue(process_named_running(PROCESS_NAME)) |
| 900 | + |
| 901 | + # All up and running, now test vyos-hostsd-client |
| 902 | + |
| 903 | + # 1. Inject leases into kea |
| 904 | + for seq in client_range: |
| 905 | + client = f'client{seq}' |
| 906 | + mac = f'00:50:00:00:00:{seq:02}' |
| 907 | + ip = inc_ip(subnet, seq) |
| 908 | + kea_add_lease(4, ip, host_name=client, mac_address=mac) |
| 909 | + |
| 910 | + # 2. Verify that leases do not exist in hostsd state |
| 911 | + for seq in client_range: |
| 912 | + tag = f'dhcp-server-{inc_ip(subnet, seq)}' |
| 913 | + print(f'Verifying tag: {tag}') |
| 914 | + host_json = hc.get_hosts(tag) |
| 915 | + self.assertFalse(host_json) |
| 916 | + |
| 917 | + # 3. Restart the service to trigger vyos-hostsd-dhcp4-lease-sync.service |
| 918 | + print('Restarting service in 30s') |
| 919 | + sleep(30) |
| 920 | + self.op_mode(['restart', 'dhcp', 'server']) |
| 921 | + |
| 922 | + # 4. Wait a while and verify that leases are now in hostsd state |
| 923 | + print('Waiting to verify in 30s') |
| 924 | + sleep(30) |
| 925 | + |
| 926 | + for seq in client_range: |
| 927 | + tag = f'dhcp-server-{inc_ip(subnet, seq)}' |
| 928 | + host_json = hc.get_hosts(tag) |
| 929 | + self.assertTrue(host_json) |
| 930 | + |
| 931 | + print('All done') |
845 | 932 |
|
846 | 933 | if __name__ == '__main__':
|
847 | 934 | unittest.main(verbosity=2)
|
0 commit comments