diff options
| author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2026-04-03 17:39:35 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-03 17:39:35 +0300 |
| commit | b476308dc3f64cb1b250b101568f49ab870b6bd1 (patch) | |
| tree | 489c7236b67f6cef48e975f2262d53a2853c5ed3 /src/conf_mode/interfaces_ethernet.py | |
| parent | bd250bb24432d362373b0d6a109344ad532daaf7 (diff) | |
| parent | 3139ba759c21800386bc1aa127dd95bc63229362 (diff) | |
| download | vyos-1x-b476308dc3f64cb1b250b101568f49ab870b6bd1.tar.gz vyos-1x-b476308dc3f64cb1b250b101568f49ab870b6bd1.zip | |
Merge pull request #5101 from natali-rs1985/T8438
vpp: T8438: Add bidirectional interface-in-use validation
Diffstat (limited to 'src/conf_mode/interfaces_ethernet.py')
| -rwxr-xr-x | src/conf_mode/interfaces_ethernet.py | 57 |
1 files changed, 16 insertions, 41 deletions
diff --git a/src/conf_mode/interfaces_ethernet.py b/src/conf_mode/interfaces_ethernet.py index 2eb36a231..886f9b7b7 100755 --- a/src/conf_mode/interfaces_ethernet.py +++ b/src/conf_mode/interfaces_ethernet.py @@ -15,7 +15,6 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import os -import re from sys import exit @@ -47,6 +46,7 @@ from vyos.utils.dict import dict_to_paths_values from vyos.utils.dict import dict_set from vyos.utils.dict import dict_delete from vyos.utils.process import is_systemd_service_running +from vyos.vpp.config_verify import verify_vpp_remove_interface from vyos.vpp.control_vpp import VPPControl from vyos import ConfigError from vyos import airbag @@ -176,12 +176,20 @@ def get_config(config=None): ethernet['flowtable_interfaces'] = get_flowtable_interfaces(conf) - ethernet['vpp'] = conf.get_config_dict( + vpp_config = conf.get_config_dict( ['vpp'], key_mangling=('-', '_'), get_first_key=True, no_tag_node_value_mangle=True, ) + if vpp_config: + ethernet['vpp'] = vpp_config + ethernet['vpp']['interfaces_vpp'] = conf.get_config_dict( + ['interfaces', 'vpp'], + key_mangling=('-', '_'), + get_first_key=True, + no_tag_node_value_mangle=True, + ) # Protocols static arp dependency if 'static_arp' in ethernet: @@ -353,23 +361,11 @@ def verify_flowtable(ethernet: dict): def verify_vpp_remove_vif(ethernet: dict): """Ensure that VIF interfaces being removed are not used by VPP features""" - vpp_paths_pattern = re.compile( - # Known paths that already use VLAN interfaces - r'(nat\.cgnat\.interface\.inside)|' - r'(nat\.cgnat\.interface\.outside)|' - r'(nat\.nat44\.interface\.inside)|' - r'(nat\.nat44\.interface\.outside)|' - # Potential paths for VLAN interfaces - r'(nat\.nat44\.address_pool\.translation\.interface)|' - r'(nat\.nat44\.address_pool\.twice_nat\.interface)|' - r'(nat\.nat44\.exclude\.rule\.(\d)+\.external_interface)|' - r'(interfaces\.bonding\.bond(\d)+\.member\.interface)|' - r'(interfaces\.bridge\.br(\d)+\.member\.interface)|' - r'(interfaces\.xconnect\.xcon(\d)+\.member\.interface)|' - r'(acl\.ip\.interface)|' - r'(acl\.mac\.interface)' - ) ifname = ethernet['ifname'] + vpp_config = ethernet.get('vpp') + + if not vpp_config: + return vlan_names = [ f'{ifname}.{vif_id}' @@ -377,29 +373,8 @@ def verify_vpp_remove_vif(ethernet: dict): for vif_id in ethernet.get(vif_group, []) ] - if not vlan_names: - return - - vpp_flat = dict_to_paths_values(ethernet.get('vpp', {})) - - candidate_keys = [] - for key, value in vpp_flat.items(): - # Normalize values to list for consistent processing - values = value if isinstance(value, list) else [value] - if any(vlan in values for vlan in vlan_names): - candidate_keys.append((key, values)) - - if not candidate_keys: - return - - for key, values in candidate_keys: - if vpp_paths_pattern.fullmatch(key): - used_vlans = [v for v in vlan_names if v in values] - if used_vlans: - raise ConfigError( - f'Cannot delete interface "{used_vlans[0]}", ' - f'it is still in use by "vpp {key.replace(".", " ")}"' - ) + for vlan in vlan_names: + verify_vpp_remove_interface(vlan, vpp_config) def verify(ethernet): verify_flowtable(ethernet) |
