summaryrefslogtreecommitdiff
path: root/src/conf_mode/interfaces_ethernet.py
diff options
context:
space:
mode:
authorViacheslav Hletenko <v.gletenko@vyos.io>2026-04-03 17:39:35 +0300
committerGitHub <noreply@github.com>2026-04-03 17:39:35 +0300
commitb476308dc3f64cb1b250b101568f49ab870b6bd1 (patch)
tree489c7236b67f6cef48e975f2262d53a2853c5ed3 /src/conf_mode/interfaces_ethernet.py
parentbd250bb24432d362373b0d6a109344ad532daaf7 (diff)
parent3139ba759c21800386bc1aa127dd95bc63229362 (diff)
downloadvyos-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-xsrc/conf_mode/interfaces_ethernet.py57
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)