summaryrefslogtreecommitdiff
path: root/src/conf_mode/vpp_interfaces_bridge.py
diff options
context:
space:
mode:
authorNataliia Solomko <natalirs1985@gmail.com>2026-02-27 21:22:15 +0200
committerNataliia Solomko <natalirs1985@gmail.com>2026-03-03 17:52:40 +0200
commitc90512f68dbabe6f005c259f6e787abe527fe975 (patch)
tree86166dcd8b9ddf17611a0b6f2142d1130604e981 /src/conf_mode/vpp_interfaces_bridge.py
parentd47be4a8e2119e2be0be5fe9d7c29d7d8eaf24d9 (diff)
downloadvyos-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.py129
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