diff options
| author | Nataliia Solomko <natalirs1985@gmail.com> | 2026-02-26 17:20:28 +0200 |
|---|---|---|
| committer | Nataliia Solomko <natalirs1985@gmail.com> | 2026-03-02 11:43:23 +0200 |
| commit | 5e4a09815db5f4c43e20c54d8961034739b28dee (patch) | |
| tree | 848b21ed016a97b632736ec49e52ea9d82fbc38c /src | |
| parent | 3e448bd51685688bdae6ec698a3923cfdeb83689 (diff) | |
| download | vyos-1x-5e4a09815db5f4c43e20c54d8961034739b28dee.tar.gz vyos-1x-5e4a09815db5f4c43e20c54d8961034739b28dee.zip | |
vpp: T8314: Migrate ipip interface to 'interfaces vpp ipip'
Diffstat (limited to 'src')
| -rw-r--r-- | src/conf_mode/vpp_interfaces_ipip.py | 124 | ||||
| -rw-r--r-- | src/migration-scripts/vpp/5-to-6 | 27 |
2 files changed, 52 insertions, 99 deletions
diff --git a/src/conf_mode/vpp_interfaces_ipip.py b/src/conf_mode/vpp_interfaces_ipip.py index eae51f5a2..d029f3619 100644 --- a/src/conf_mode/vpp_interfaces_ipip.py +++ b/src/conf_mode/vpp_interfaces_ipip.py @@ -16,24 +16,20 @@ # 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 import ConfigError from vyos.config import Config -from vyos.configdict import leaf_node_changed +from vyos.configdict import get_interface_dict from vyos.configdep import set_dependents, call_dependents +from vyos.utils.process import is_systemd_service_active -from vyos.vpp.interface import IPIPInterface +from vyos.ifconfig.vpp import VPPIPIPInterface from vyos.vpp.config_deps import deps_xconnect_dict from vyos.vpp.config_verify import ( - verify_vpp_remove_kernel_interface, - verify_vpp_change_kernel_interface, verify_vpp_remove_xconnect_interface, - verify_vpp_exists_kernel_interface, verify_vpp_tunnel_source_address, ) -from vyos.vpp.utils import cli_ifaces_lcp_kernel_list, cli_ethernet_with_vifs_ifaces +from vyos.vpp.utils import cli_ethernet_with_vifs_ifaces def get_config(config=None) -> dict: @@ -49,55 +45,14 @@ def get_config(config=None) -> dict: else: conf = Config() - base = ['vpp', 'interfaces', 'ipip'] - base_kernel_interfaces = ['vpp', 'kernel-interfaces'] + base = ['interfaces', 'vpp', 'ipip'] - ifname = os.environ['VYOS_TAGNODE_VALUE'] + ifname, config = get_interface_dict(conf, base) - # 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, - ) - - 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], - key_mangling=('-', '_'), - effective=True, - get_first_key=True, - no_tag_node_value_mangle=True, - ) - - if not config: - config['remove'] = True - - if effective_config: - config.update({'effective': effective_config}) - - # Get global 'vpp kernel-interfaces' for verify - config['vpp_kernel_interfaces'] = conf.get_config_dict( - base_kernel_interfaces, - key_mangling=('-', '_'), - get_first_key=True, - no_tag_node_value_mangle=True, - ) - - tmp = leaf_node_changed(conf, base + [ifname, 'kernel-interface']) - if tmp: - config['kernel_interface_removed'] = tmp - - # list of all kernel interfaces `vpp interface xxx kernel-interface xxx` - config['candidate_kernel_interfaces'] = cli_ifaces_lcp_kernel_list(conf) - # list of all Ethernet interfaces with vifs config['vpp_ether_vif_ifaces'] = cli_ethernet_with_vifs_ifaces(conf) @@ -107,23 +62,13 @@ def get_config(config=None) -> dict: for xconn_iface in config['xconn_members'][ifname]: set_dependents('vpp_interfaces_xconnect', conf, xconn_iface) - if config.get('effective', {}).get('kernel_interface'): - iface = config.get('kernel_interface') - if iface: - if iface in config.get('vpp_kernel_interfaces'): - set_dependents('vpp_kernel_interface', conf, iface) - - # NAT dependency - if conf.exists(['vpp', 'nat', 'nat44']): - set_dependents('vpp_nat_nat44', conf) - if conf.exists(['vpp', 'nat', 'cgnat']): - set_dependents('vpp_nat_cgnat', conf) - - # ACL dependency - if conf.exists(['vpp', 'acl']): - set_dependents('vpp_acl', conf) - - config['ifname'] = ifname + # Get 'vpp settings' config with default values + config['vpp_settings'] = conf.get_config_dict( + ['vpp', 'settings'], + key_mangling=('-', '_'), + get_first_key=True, + no_tag_node_value_mangle=True, + ) return config @@ -133,17 +78,17 @@ def verify(config): if 'remove_vpp' in config: return None - # Verify that removed kernel interface is not used in 'vpp kernel-interfaces'. - # vpp interfaces ipip ipipX kernel-interface vpp-tunX - # vpp kernel-interface vpp-tunX - verify_vpp_remove_kernel_interface(config) - verify_vpp_remove_xconnect_interface(config) # config removed - if 'remove' in config: + if 'deleted' in config: return None + if not is_systemd_service_active('vpp.service'): + raise ConfigError( + 'Cannot configure VPP ipip interface: vpp.service is not running' + ) + # source-address and remote are mandatory options required_keys = {'source_address', 'remote'} if not all(key in config for key in required_keys): @@ -157,12 +102,6 @@ def verify(config): if config.get('source_address') == config.get('remote'): raise ConfigError('Remote address must not be the same as source address') - # Change 'vpp interfaces ipip ipipX kernel-interface vpp-tunX' - # => 'vpp interfaces ipip ipipX kernel-interface vpp-tunY' - # check if we have kernel interface config 'vpp kernel-interface vpp-tunX' - verify_vpp_change_kernel_interface(config) - verify_vpp_exists_kernel_interface(config) - def generate(config): pass @@ -174,26 +113,13 @@ def apply(config): ifname = config.get('ifname') # Delete interface - if 'effective' in config: - remove_config = config.get('effective') - src_addr = remove_config.get('source_address') - dst_addr = remove_config.get('remote') - i = IPIPInterface(ifname, src_addr, dst_addr) - i.delete() - - if 'remove' in config: - return None + ipip = VPPIPIPInterface(ifname, config) + ipip.remove() - # Add interface - src_addr = config.get('source_address') - dst_addr = config.get('remote') - kernel_interface = config.get('kernel_interface', '') - state = 'up' if 'disable' not in config else 'down' - i = IPIPInterface(ifname, src_addr, dst_addr, kernel_interface, state) - i.add() + if 'deleted' in config: + return None - if 'kernel_interface' in config: - i.kernel_add() + ipip.update(config) call_dependents() diff --git a/src/migration-scripts/vpp/5-to-6 b/src/migration-scripts/vpp/5-to-6 index 25529cf36..18f0f70d2 100644 --- a/src/migration-scripts/vpp/5-to-6 +++ b/src/migration-scripts/vpp/5-to-6 @@ -41,6 +41,8 @@ # # Move vxlan interface from vpp section to 'interfaces vpp vxlan' (T8296) # +# Move ipip interface from vpp section to 'interfaces vpp ipip' (T8314) +# from vyos.configtree import ConfigTree @@ -411,6 +413,30 @@ def _migrate_vpp_vxlan_interface(config: ConfigTree) -> None: config.delete(['vpp', 'interfaces']) +def _migrate_vpp_ipip_interface(config: ConfigTree) -> None: + base = ['vpp', 'interfaces', 'ipip'] + new_base = ['interfaces', 'vpp', 'ipip'] + kernel_interface_base = ['vpp', 'kernel-interfaces'] + + if not config.exists(base): + return + + config.set(new_base) + + for ifname in config.list_nodes(base): + _migrate_interface(config, 'ipip', ifname) + + _migrate_members_xconnect(config, ifname) + + config.delete(base) + + if config.exists(kernel_interface_base) and len(config.list_nodes(kernel_interface_base)) == 0: + config.delete(['vpp', 'kernel-interfaces']) + + if len(config.list_nodes(['vpp', 'interfaces'])) == 0: + config.delete(['vpp', 'interfaces']) + + def migrate(config: ConfigTree) -> None: if not config.exists(['vpp']): # Nothing to do @@ -428,3 +454,4 @@ def migrate(config: ConfigTree) -> None: _migrate_vpp_resources(config) _migrate_vpp_bonding_interface(config) _migrate_vpp_vxlan_interface(config) + _migrate_vpp_ipip_interface(config) |
