diff options
| author | Nataliia Solomko <natalirs1985@gmail.com> | 2026-02-27 21:22:15 +0200 |
|---|---|---|
| committer | Nataliia Solomko <natalirs1985@gmail.com> | 2026-03-03 17:52:40 +0200 |
| commit | c90512f68dbabe6f005c259f6e787abe527fe975 (patch) | |
| tree | 86166dcd8b9ddf17611a0b6f2142d1130604e981 /src/conf_mode/vpp_interfaces_bridge.py | |
| parent | d47be4a8e2119e2be0be5fe9d7c29d7d8eaf24d9 (diff) | |
| download | vyos-1x-c90512f68dbabe6f005c259f6e787abe527fe975.tar.gz vyos-1x-c90512f68dbabe6f005c259f6e787abe527fe975.zip | |
vpp: T8327: Migrate bridge interface to 'interfaces vpp bridge'
Diffstat (limited to 'src/conf_mode/vpp_interfaces_bridge.py')
| -rw-r--r-- | src/conf_mode/vpp_interfaces_bridge.py | 129 |
1 files changed, 40 insertions, 89 deletions
diff --git a/src/conf_mode/vpp_interfaces_bridge.py b/src/conf_mode/vpp_interfaces_bridge.py index edf3f2dd2..37cec7b94 100644 --- a/src/conf_mode/vpp_interfaces_bridge.py +++ b/src/conf_mode/vpp_interfaces_bridge.py @@ -16,13 +16,12 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -import os - from vyos.config import Config -from vyos.configdict import node_changed +from vyos.configdict import get_interface_dict from vyos import ConfigError -from vyos.vpp.interface import BridgeInterface -from vyos.vpp.utils import iftunnel_transform +from vyos.utils.process import is_systemd_service_active + +from vyos.ifconfig.vpp import VPPBridgeInterface def get_config(config=None) -> dict: @@ -38,65 +37,46 @@ def get_config(config=None) -> dict: else: conf = Config() - base = ['vpp', 'interfaces', 'bridge'] - vpp_interfaces = ['vpp', 'settings', 'interface'] - - ifname = os.environ['VYOS_TAGNODE_VALUE'] + base = ['interfaces', 'vpp', 'bridge'] - # Get config_dict with default values - config = conf.get_config_dict( - base + [ifname], - key_mangling=('-', '_'), - get_first_key=True, - no_tag_node_value_mangle=True, - with_defaults=True, - with_recursive_defaults=True, - ) + ifname, config = get_interface_dict(conf, base) - if not conf.exists(['vpp']): + if not conf.exists(['vpp']) and not conf.exists(base): config['remove_vpp'] = True return config - # Get effective config as we need full dicitonary per interface delete - effective_config = conf.get_config_dict( - base + [ifname], + # Get global vpp interfaces for verify + config['vpp_interfaces'] = conf.get_config_dict( + ['vpp', 'settings', 'interface'], key_mangling=('-', '_'), - effective=True, get_first_key=True, no_tag_node_value_mangle=True, ) - if effective_config: - config.update({'effective': effective_config}) - - if not conf.exists(base + [ifname]): - config['remove'] = True - - # Get global vpp interfaces for verify - config['vpp_interfaces'] = conf.get_config_dict( - vpp_interfaces, + # Get all gre interfaces config + config['gre_interfaces'] = conf.get_config_dict( + ['interfaces', 'vpp', 'gre'], key_mangling=('-', '_'), get_first_key=True, no_tag_node_value_mangle=True, + with_defaults=True, + with_recursive_defaults=True, ) - # determine which members have been removed - interfaces_removed = node_changed(conf, base + [ifname, 'member', 'interface']) - if interfaces_removed: - config['members_removed'] = interfaces_removed - - config['ifname'] = ifname - return config def verify(config): - if 'remove' in config or 'remove_vpp' in config: + if 'deleted' in config or 'remove_vpp' in config: return None - # Check if interface exists in vpp before adding to bridge-domain + if not is_systemd_service_active('vpp.service'): + raise ConfigError( + 'Cannot configure VPP bridge interface: vpp.service is not running' + ) - allowed_prefixes = ('vppbond', 'vppgre', 'geneve', 'vpplo', 'vppvxlan') + # Check if interface exists in vpp before adding to bridge-domain + allowed_prefixes = ('vppbond', 'vppgre', 'vpplo', 'vppvxlan') if 'member' in config: bvi_exists = False @@ -120,6 +100,18 @@ def verify(config): raise ConfigError("BVI can only be defined on loopback interface") bvi_exists = True + # check GRE tunnels as part of the bridge, only tunnel-type "teb" is allowed + # set interfaces vpp bridge vppbr1 member interface vppgre1 + # set interfaces vpp gre vppgre1 tunnel-type teb + if member.startswith('vppgre'): + if member in config.get('gre_interfaces'): + gre_config = config.get('gre_interfaces').get(member) + if gre_config.get('tunnel_type') != 'teb': + raise ConfigError( + f'GRE interface "{member}" in bridge must have tunnel-type "teb". ' + f'Current tunnel-type is "{gre_config.get("tunnel_type")}".' + ) + def generate(config): pass @@ -130,54 +122,13 @@ def apply(config): return None ifname = config.get('ifname') - # vppvxlan10 in the vpp is vxlan_tunnel10 - interface_transform_filter = ('geneve', 'vppvxlan') - # update members - if 'members_removed' in config: - i = BridgeInterface(ifname) - for member in config.get('members_removed'): - if member.startswith(interface_transform_filter): - member = iftunnel_transform(member) - if member.startswith('vpplo'): - # interface name in VPP is loopX - member = member.replace('vpplo', 'loop') - elif member.startswith('vppbond'): - # interface name in VPP is BondEthernetX - member = member.replace('vppbond', 'BondEthernet') - i.detach_member(member=member) - - # Delete bridge domain - if 'effective' in config: - ifname = config.get('ifname') - i = BridgeInterface(ifname) - i.delete() - - if 'remove' in config: - return None + bridge = VPPBridgeInterface(ifname) + bridge.remove() + + if 'deleted' in config: + return - # Add bridge domain - members = config.get('member', {}).get('interface', '') - i = BridgeInterface(ifname) - i.add() - # Add members to bridge - if members: - br = BridgeInterface(ifname) - port_type = 0 - for member, member_config in members.items(): - if member.startswith(interface_transform_filter): - member = iftunnel_transform(member) - if member.startswith('vpplo'): - # interface name in VPP is loopX - member = member.replace('vpplo', 'loop') - if 'bvi' in member_config: - port_type = 1 - elif member.startswith('vppbond'): - # interface name in VPP is BondEthernetX - member = member.replace('vppbond', 'BondEthernet') - - br.add_member(member=member, port_type=port_type) - # set default port type 0 (not BVI) - port_type = 0 + bridge.update(config) return None |
