# Copyright 2021-2024 VyOS maintainers and contributors # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see . # - T2450: drop interface-route and interface-route6 from "protocols vrf" from vyos.configtree import ConfigTree base = ['protocols', 'vrf'] def migrate(config: ConfigTree) -> None: if not config.exists(base): # Nothing to do return for vrf in config.list_nodes(base): static_base = base + [vrf, 'static'] if not config.exists(static_base): continue # # Migrate interface-route into route # interface_route_path = static_base + ['interface-route'] if config.exists(interface_route_path): for route in config.list_nodes(interface_route_path): interface = config.list_nodes(interface_route_path + [route, 'next-hop-interface']) tmp = interface_route_path + [route, 'next-hop-interface'] for interface in config.list_nodes(tmp): new_base = static_base + ['route', route, 'interface'] config.set(new_base) config.set_tag(new_base) config.copy(tmp + [interface], new_base + [interface]) config.delete(interface_route_path) # # Migrate interface-route6 into route6 # interface_route_path = static_base + ['interface-route6'] if config.exists(interface_route_path): for route in config.list_nodes(interface_route_path): interface = config.list_nodes(interface_route_path + [route, 'next-hop-interface']) tmp = interface_route_path + [route, 'next-hop-interface'] for interface in config.list_nodes(tmp): new_base = static_base + ['route6', route, 'interface'] config.set(new_base) config.set_tag(new_base) config.copy(tmp + [interface], new_base + [interface]) config.delete(interface_route_path) # # Cleanup nodes inside route # route_path = static_base + ['route'] if config.exists(route_path): for route in config.list_nodes(route_path): next_hop = route_path + [route, 'next-hop'] if config.exists(next_hop): for gateway in config.list_nodes(next_hop): interface_path = next_hop + [gateway, 'next-hop-interface'] if config.exists(interface_path): config.rename(interface_path, 'interface') vrf_path = next_hop + [gateway, 'next-hop-vrf'] if config.exists(vrf_path): config.rename(vrf_path, 'vrf') next_hop = route_path + [route, 'interface'] if config.exists(next_hop): for interface in config.list_nodes(next_hop): interface_path = next_hop + [interface, 'next-hop-interface'] if config.exists(interface_path): config.rename(interface_path, 'interface') vrf_path = next_hop + [interface, 'next-hop-vrf'] if config.exists(vrf_path): config.rename(vrf_path, 'vrf') # # Cleanup nodes inside route6 # route_path = static_base + ['route6'] if config.exists(route_path): for route in config.list_nodes(route_path): next_hop = route_path + [route, 'next-hop'] if config.exists(next_hop): for gateway in config.list_nodes(next_hop): vrf_path = next_hop + [gateway, 'next-hop-vrf'] if config.exists(vrf_path): config.rename(vrf_path, 'vrf') next_hop = route_path + [route, 'interface'] if config.exists(next_hop): for interface in config.list_nodes(next_hop): interface_path = next_hop + [interface, 'next-hop-interface'] if config.exists(interface_path): config.rename(interface_path, 'interface') vrf_path = next_hop + [interface, 'next-hop-vrf'] if config.exists(vrf_path): config.rename(vrf_path, 'vrf')