diff options
| author | Nataliia Solomko <natalirs1985@gmail.com> | 2026-03-03 18:25:26 +0200 |
|---|---|---|
| committer | Nataliia Solomko <natalirs1985@gmail.com> | 2026-03-04 15:28:08 +0200 |
| commit | 32a5763872420ba8af53e3371c5c68e7369b5e62 (patch) | |
| tree | cee1d7ecbc94cce4929398047ac6491b1d2cba49 /python | |
| parent | 3030e33b26c1a895179747f2444a0cd79d59f891 (diff) | |
| download | vyos-1x-32a5763872420ba8af53e3371c5c68e7369b5e62.tar.gz vyos-1x-32a5763872420ba8af53e3371c5c68e7369b5e62.zip | |
vpp: T8328: Migrate xconnect interface to 'interfaces vpp xconnect'
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/ifconfig/vpp/__init__.py | 2 | ||||
| -rw-r--r-- | python/vyos/ifconfig/vpp/xconnect.py | 98 | ||||
| -rw-r--r-- | python/vyos/vpp/config_deps.py | 4 | ||||
| -rw-r--r-- | python/vyos/vpp/config_verify.py | 4 | ||||
| -rw-r--r-- | python/vyos/vpp/interface/__init__.py | 2 | ||||
| -rw-r--r-- | python/vyos/vpp/interface/xconnect.py | 95 |
6 files changed, 104 insertions, 101 deletions
diff --git a/python/vyos/ifconfig/vpp/__init__.py b/python/vyos/ifconfig/vpp/__init__.py index 38f72e42f..a0a1f6930 100644 --- a/python/vyos/ifconfig/vpp/__init__.py +++ b/python/vyos/ifconfig/vpp/__init__.py @@ -22,6 +22,7 @@ from .interface import VPPInterface from .ipip import VPPIPIPInterface from .loopback import VPPLoopbackInterface from .vxlan import VPPVXLANInterface +from .xconnect import VPPXconnectInterface __all__ = [ 'VPPBondInterface', @@ -31,4 +32,5 @@ __all__ = [ 'VPPIPIPInterface', 'VPPLoopbackInterface', 'VPPVXLANInterface', + 'VPPXconnectInterface', ] diff --git a/python/vyos/ifconfig/vpp/xconnect.py b/python/vyos/ifconfig/vpp/xconnect.py new file mode 100644 index 000000000..a5d7d15fd --- /dev/null +++ b/python/vyos/ifconfig/vpp/xconnect.py @@ -0,0 +1,98 @@ +# +# Copyright (C) VyOS Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from vyos.ifconfig.vpp.interface import VPPInterface +from vyos.vpp.utils import iftunnel_transform + + +def _transform_members(members): + """ + Transform interface names to VPP names for xconnect operations. + + Args: + members (list of str): List of two interface names. + + Returns: + tuple: Transformed first and second interface names. + """ + interface_transform_filter = ('vxlan',) + first_member = members[0].removeprefix('vpp') + second_member = members[1].removeprefix('vpp') + + # Check if member in required filter to transform 'vxlanX' => 'vxlan_tunnelX' + if first_member.startswith(interface_transform_filter): + first_member = iftunnel_transform(first_member) + if second_member.startswith(interface_transform_filter): + second_member = iftunnel_transform(second_member) + + return first_member, second_member + + +class VPPXconnectInterface(VPPInterface): + def __init__(self, ifname): + self.vpp_ifname = ifname + + super().__init__(self.vpp_ifname) + + def add_l2_xconnect(self, first, second): + """Add l2 cross connect + Example: + from vyos.ifconfig.vpp import VPPXconnectInterface + a = VPPXconnectInterface(ifname='vppxcon0') + a.add_l2_xconnect(first, second) + """ + member_first_if_index = self.vpp.get_sw_if_index(first) + member_second_if_index = self.vpp.get_sw_if_index(second) + self.vpp.api.sw_interface_set_l2_xconnect( + rx_sw_if_index=member_first_if_index, + tx_sw_if_index=member_second_if_index, + enable=True, + ) + self.vpp.api.sw_interface_set_l2_xconnect( + rx_sw_if_index=member_second_if_index, + tx_sw_if_index=member_first_if_index, + enable=True, + ) + + def del_l2_xconnect(self, first, second): + """Move l2 cross connect member to mode l3 (delete xconnect) + Example: + from vyos.ifconfig.vpp import VPPXconnectInterface + a = VPPXconnectInterface(ifname='vppxcon0') + a.del_l2_xconnect(first, second) + """ + member_first_if_index = self.vpp.get_sw_if_index(first) + member_second_if_index = self.vpp.get_sw_if_index(second) + self.vpp.api.sw_interface_set_l2_xconnect( + rx_sw_if_index=member_first_if_index, + tx_sw_if_index=member_second_if_index, + enable=False, + ) + self.vpp.api.sw_interface_set_l2_xconnect( + rx_sw_if_index=member_second_if_index, + tx_sw_if_index=member_first_if_index, + enable=False, + ) + + def remove(self, members): + first, second = _transform_members(members) + self.del_l2_xconnect(first, second) + + def update(self, config): + members = config['member']['interface'] + first, second = _transform_members(members) + self.add_l2_xconnect(first, second) diff --git a/python/vyos/vpp/config_deps.py b/python/vyos/vpp/config_deps.py index 4aab90a4a..43cf6036f 100644 --- a/python/vyos/vpp/config_deps.py +++ b/python/vyos/vpp/config_deps.py @@ -31,7 +31,7 @@ def deps_xconnect_dict(conf) -> dict[str, list[str]]: """ xconn_members_dict: dict[str, list[str]] = {} config = conf.get_config_dict( - ['vpp', 'interfaces', 'xconnect'], + ['interfaces', 'vpp', 'xconnect'], key_mangling=('-', '_'), get_first_key=True, no_tag_node_value_mangle=True, @@ -39,7 +39,7 @@ def deps_xconnect_dict(conf) -> dict[str, list[str]]: for xconn_name, xconn_config in config.items(): for member_name in xconn_config.get('member', {}).get('interface', []): - xconn_ifaces_list = xconn_members_dict.get(xconn_name, []) + xconn_ifaces_list = xconn_members_dict.get(member_name, []) xconn_ifaces_list.append(xconn_name) xconn_members_dict.update({member_name: xconn_ifaces_list}) diff --git a/python/vyos/vpp/config_verify.py b/python/vyos/vpp/config_verify.py index dab22cf8f..d5bb70899 100644 --- a/python/vyos/vpp/config_verify.py +++ b/python/vyos/vpp/config_verify.py @@ -103,8 +103,8 @@ def verify_vpp_remove_xconnect_interface(config: dict): for xconn_member, xconn_iface in config.get('xconn_members').items(): if xconn_member == config.get('ifname'): raise ConfigError( - f'interface "{xconn_member}" is still in use within "vpp interfaces xconnect". ' - f'Please remove it from "vpp interface xconnect {xconn_iface}" before proceeding.' + f'interface "{xconn_member}" is still in use within "interfaces vpp xconnect". ' + f'Please remove it from "interface vpp xconnect {xconn_iface}" before proceeding.' ) diff --git a/python/vyos/vpp/interface/__init__.py b/python/vyos/vpp/interface/__init__.py index 0a3176199..3f8ae7954 100644 --- a/python/vyos/vpp/interface/__init__.py +++ b/python/vyos/vpp/interface/__init__.py @@ -19,12 +19,10 @@ from .ethernet import EthernetInterface from .geneve import GeneveInterface from .interface import Interface from .wireguard import WireguardInterface -from .xconnect import XconnectInterface __all__ = [ 'EthernetInterface', 'GeneveInterface', 'Interface', 'WireguardInterface', - 'XconnectInterface', ] diff --git a/python/vyos/vpp/interface/xconnect.py b/python/vyos/vpp/interface/xconnect.py deleted file mode 100644 index dd61d7146..000000000 --- a/python/vyos/vpp/interface/xconnect.py +++ /dev/null @@ -1,95 +0,0 @@ -# VyOS implementation of VPP bridge interface -# -# Copyright (C) VyOS Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from vyos.vpp import VPPControl -from vyos.vpp.utils import iftunnel_transform - - -class XconnectInterface: - def __init__( - self, - ifname: str, - members: list = [], - state: str = 'up', - ): - self.ifname = ifname - self.members = members - self.vpp = VPPControl() - self.initial_state = state - - def add_l2_xconnect(self): - """Add l2 cross connect - Args: - members (list): The list of the xconnect members - Example: - from vyos.vpp.interface import XconnectInterface - a = XconnectInterface(ifname='xcon0', members=['eth0', 'vxlan0']) - a.add_l2_xconnect() - """ - interface_transform_filter = ('vxlan', 'geneve') - first_member = self.members[0].removeprefix('vpp') - second_member = self.members[1].removeprefix('vpp') - # Check if member in required filter to transform 'vxlanX' => 'vxlan_tunnelX' - if first_member.startswith(interface_transform_filter): - first_member = iftunnel_transform(first_member) - if second_member.startswith(interface_transform_filter): - second_member = iftunnel_transform(second_member) - - member_first_if_index = self.vpp.get_sw_if_index(first_member) - member_second_if_index = self.vpp.get_sw_if_index(second_member) - self.vpp.api.sw_interface_set_l2_xconnect( - rx_sw_if_index=member_first_if_index, - tx_sw_if_index=member_second_if_index, - enable=True, - ) - self.vpp.api.sw_interface_set_l2_xconnect( - rx_sw_if_index=member_second_if_index, - tx_sw_if_index=member_first_if_index, - enable=True, - ) - - def del_l2_xconnect(self): - """Move l2 cross connect member to mode l3 (delte xconnect) - Args: - members (list): The list of the xconnect members - Example: - from vyos.vpp.interface import XconnectInterface - a = XconnectInterface(ifname='xcon0', members=['eth0', 'vxlan0']) - a.del_l2_xconnect() - """ - interface_transform_filter = ('vxlan', 'geneve') - first_member = self.members[0].removeprefix('vpp') - second_member = self.members[1].removeprefix('vpp') - # Check if member in required filter to transform 'vxlanX' => 'vxlan_tunnelX' - if first_member.startswith(interface_transform_filter): - first_member = iftunnel_transform(first_member) - if second_member.startswith(interface_transform_filter): - second_member = iftunnel_transform(second_member) - - member_first_if_index = self.vpp.get_sw_if_index(first_member) - member_second_if_index = self.vpp.get_sw_if_index(second_member) - self.vpp.api.sw_interface_set_l2_xconnect( - rx_sw_if_index=member_first_if_index, - tx_sw_if_index=member_second_if_index, - enable=False, - ) - self.vpp.api.sw_interface_set_l2_xconnect( - rx_sw_if_index=member_second_if_index, - tx_sw_if_index=member_first_if_index, - enable=False, - ) |
