Skip to content

Commit d1a8438

Browse files
committed
T6948: Smoketest for DHCP server leases sync with hostd records
The test `test_dhcp_hostsd_lease_sync` validates DHCP server leases in sync with hostd records. Since the DHCP server running in smoketest environment might not have actual clients to lease IP addresses, we simulate the lease creation and deletion using kea helper functions (kea_add_lease and kea_delete_lease).
1 parent bc5d452 commit d1a8438

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

smoketest/scripts/cli/test_service_dhcp-server.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,18 @@
1515
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1616

1717
import os
18+
import re
1819
import unittest
1920

2021
from json import loads
2122

2223
from base_vyostest_shim import VyOSUnitTestSHIM
24+
from time import sleep
2325

2426
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 cmd
2530
from vyos.utils.process import process_named_running
2631
from vyos.utils.file import read_file
2732
from vyos.template import inc_ip
@@ -31,6 +36,7 @@
3136
CTRL_PROCESS_NAME = 'kea-ctrl-agent'
3237
KEA4_CONF = '/run/kea/kea-dhcp4.conf'
3338
KEA4_CTRL = '/run/kea/dhcp4-ctrl-socket'
39+
HOSTSD_CLIENT = '/usr/bin/vyos-hostsd-client'
3440
base_path = ['service', 'dhcp-server']
3541
interface = 'dum8765'
3642
subnet = '192.0.2.0/25'
@@ -842,6 +848,79 @@ def test_dhcp_on_interface_with_vrf(self):
842848
self.cli_delete(['vrf', 'name', 'SMOKE-DHCP'])
843849
self.cli_commit()
844850

851+
def test_dhcp_hostsd_lease_sync(self):
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 internal_cleanup():
860+
for seq in client_range:
861+
ip_addr = inc_ip(subnet, seq)
862+
kea_delete_lease(4, ip_addr)
863+
cmd(f'{HOSTSD_CLIENT} --delete-hosts --tag dhcp-server-{ip_addr} --apply')
864+
865+
self.addClassCleanup(internal_cleanup)
866+
867+
pool = base_path + ['shared-network-name', shared_net_name, 'subnet', subnet]
868+
self.cli_set(pool + ['subnet-id', '1'])
869+
self.cli_set(pool + ['option', 'domain-name', domain_name])
870+
self.cli_set(pool + ['range', '0', 'start', subnet_range_start])
871+
self.cli_set(pool + ['range', '0', 'stop', subnet_range_stop])
872+
873+
# commit changes
874+
self.cli_commit()
875+
876+
config = read_file(KEA4_CONF)
877+
obj = loads(config)
878+
879+
self.verify_config_value(obj, ['Dhcp4', 'shared-networks'], 'name', shared_net_name)
880+
self.verify_config_value(obj, ['Dhcp4', 'shared-networks', 0, 'subnet4'], 'subnet', subnet)
881+
self.verify_config_value(obj, ['Dhcp4', 'shared-networks', 0, 'subnet4'], 'id', 1)
882+
883+
# Verify options
884+
self.verify_config_object(
885+
obj,
886+
['Dhcp4', 'shared-networks', 0, 'subnet4', 0, 'option-data'],
887+
{'name': 'domain-name', 'data': domain_name})
888+
self.verify_config_object(
889+
obj,
890+
['Dhcp4', 'shared-networks', 0, 'subnet4', 0, 'pools'],
891+
{'pool': f'{subnet_range_start} - {subnet_range_stop}'})
892+
893+
# Check for running process
894+
self.assertTrue(process_named_running(PROCESS_NAME))
895+
896+
# All up and running, now test vyos-hostsd store
897+
898+
# 1. Inject leases into kea
899+
for seq in client_range:
900+
client = f'client{seq}'
901+
mac = f'00:50:00:00:00:{seq:02}'
902+
ip = inc_ip(subnet, seq)
903+
kea_add_lease(4, ip, host_name=client, mac_address=mac)
904+
905+
# 2. Verify that leases are not available in vyos-hostsd
906+
tag_regex = re.escape(f'dhcp-server-{subnet.rsplit(".", 1)[0]}')
907+
host_json = cmd(f'{HOSTSD_CLIENT} --get-hosts {tag_regex}')
908+
self.assertFalse(host_json.strip('{}'))
909+
910+
# 3. Restart the service to trigger vyos-hostsd sync and wait for it to start
911+
self.op_mode(['restart', 'dhcp', 'server'])
912+
count = 0
913+
while count < 30:
914+
is_running = process_named_running(PROCESS_NAME)
915+
if is_running:
916+
break
917+
count += 1
918+
sleep(1)
919+
920+
# 4. Verify that leases are synced and available in vyos-hostsd
921+
tag_regex = re.escape(f'dhcp-server-{subnet.rsplit(".", 1)[0]}')
922+
host_json = cmd(f'{HOSTSD_CLIENT} --get-hosts {tag_regex}')
923+
self.assertTrue(host_json)
845924

846925
if __name__ == '__main__':
847926
unittest.main(verbosity=2)

0 commit comments

Comments
 (0)