From 7c62df1f49bf539aa69fbbedd15656c01d47c17c Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Fri, 17 Oct 2025 18:41:36 +0200 Subject: configdict: T7927: refactor check_dhcp() with local VRF argument MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While debugging and resolving the underlying VRF assignment issue in T7929, this code path was refactored for clarity. Previously, the check_dhcp() helper function relied on the parent scope’s vrf variable. Although this worked correctly, it was not clean or explicit. The function now takes and uses its own vrf argument, improving readability and maintainability. --- python/vyos/configdict.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) (limited to 'python') diff --git a/python/vyos/configdict.py b/python/vyos/configdict.py index d91d88d88..ea244247c 100644 --- a/python/vyos/configdict.py +++ b/python/vyos/configdict.py @@ -355,47 +355,48 @@ def is_source_interface(conf, interface, intftype=None): def get_dhcp_interfaces(conf, vrf=None): """ Common helper functions to retrieve all interfaces from current CLI - sessions that have DHCP configured. """ + sessions that have DHCP configured. Only DHCP interfaces in the defined VRF + will be returned. If vrf is None - the default VRF interfaces will be + returned """ + dhcp_interfaces = {} - dict = conf.get_config_dict(['interfaces'], get_first_key=True) - if not dict: + interface_dict = conf.get_config_dict(['interfaces'], get_first_key=True) + if not interface_dict: return dhcp_interfaces - def check_dhcp(config): - ifname = config['ifname'] + def check_dhcp(if_config: dict, vrf=None) -> dict: + ifname = if_config['ifname'] tmp = {} - if 'address' in config and 'dhcp' in config['address']: + if 'address' in if_config and 'dhcp' in if_config['address']: options = {} - if dict_search('dhcp_options.default_route_distance', config) != None: - options.update({'dhcp_options' : config['dhcp_options']}) - if 'vrf' in config: - if vrf == config['vrf']: tmp.update({ifname : options}) + if dict_search('dhcp_options.default_route_distance', if_config) != None: + options.update({'dhcp_options' : if_config['dhcp_options']}) + if 'vrf' in if_config: + if vrf == if_config['vrf']: tmp.update({ifname : options}) else: if vrf is None: tmp.update({ifname : options}) return tmp - for section, interface in dict.items(): + for section, interface in interface_dict.items(): for ifname in interface: - # always reset config level, as get_interface_dict() will alter it - conf.set_level([]) # we already have a dict representation of the config from get_config_dict(), # but with the extended information from get_interface_dict() we also # get the DHCP client default-route-distance default option if not specified. _, ifconfig = get_interface_dict(conf, ['interfaces', section], ifname) - tmp = check_dhcp(ifconfig) + tmp = check_dhcp(ifconfig, vrf=vrf) dhcp_interfaces.update(tmp) # check per VLAN interfaces for vif, vif_config in ifconfig.get('vif', {}).items(): - tmp = check_dhcp(vif_config) + tmp = check_dhcp(vif_config, vrf=vrf) dhcp_interfaces.update(tmp) # check QinQ VLAN interfaces for vif_s, vif_s_config in ifconfig.get('vif_s', {}).items(): - tmp = check_dhcp(vif_s_config) + tmp = check_dhcp(vif_s_config, vrf=vrf) dhcp_interfaces.update(tmp) for vif_c, vif_c_config in vif_s_config.get('vif_c', {}).items(): - tmp = check_dhcp(vif_c_config) + tmp = check_dhcp(vif_c_config, vrf=vrf) dhcp_interfaces.update(tmp) return dhcp_interfaces @@ -404,7 +405,7 @@ def get_pppoe_interfaces(conf, vrf=None): """ Common helper functions to retrieve all interfaces from current CLI sessions that have DHCP configured. """ pppoe_interfaces = {} - conf.set_level([]) + conf.set_level([]) # required for list_nodes() for ifname in conf.list_nodes(['interfaces', 'pppoe']): # always reset config level, as get_interface_dict() will alter it conf.set_level([]) -- cgit v1.2.3