diff --git a/src/migration-scripts/quagga/7-to-8 b/src/migration-scripts/quagga/7-to-8 index 9c277a6f1..38507bd3d 100755 --- a/src/migration-scripts/quagga/7-to-8 +++ b/src/migration-scripts/quagga/7-to-8 @@ -1,122 +1,137 @@ #!/usr/bin/env python3 # # Copyright (C) 2021 VyOS maintainers and contributors # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or later as # published by the Free Software Foundation. # # 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, see <http://www.gnu.org/licenses/>. # - T2450: drop interface-route and interface-route6 from "protocols static" from sys import argv from sys import exit from vyos.configtree import ConfigTree def migrate_interface_route(config, base, path, route_route6): """ Generic migration function which can be called on every instance of interface-route, beeing it ipv4, ipv6 or nested under the "static table" nodes. What we do? - Drop 'interface-route' or 'interface-route6' and migrate the route unter the 'route' or 'route6' tag node. """ if config.exists(base + path): for route in config.list_nodes(base + path): interface = config.list_nodes(base + path + [route, 'next-hop-interface']) tmp = base + path + [route, 'next-hop-interface'] for interface in config.list_nodes(tmp): new_base = base + [route_route6, route, 'interface'] config.set(new_base) config.set_tag(base + [route_route6]) config.set_tag(new_base) config.copy(tmp + [interface], new_base + [interface]) config.delete(base + path) def migrate_route(config, base, path, route_route6): """ Generic migration function which can be called on every instance of route, beeing it ipv4, ipv6 or even nested under the static table nodes. What we do? - for consistency reasons rename next-hop-interface to interface - for consistency reasons rename next-hop-vrf to vrf """ if config.exists(base + path): for route in config.list_nodes(base + path): next_hop = base + path + [route, 'next-hop'] if config.exists(next_hop): for gateway in config.list_nodes(next_hop): # IPv4 routes calls it next-hop-interface, rename this to # interface instead so it's consitent with IPv6 interface_path = next_hop + [gateway, 'next-hop-interface'] if config.exists(interface_path): config.rename(interface_path, 'interface') # When VRFs got introduced, I (c-po) named it next-hop-vrf, # we can also call it vrf which is simply shorter. vrf_path = next_hop + [gateway, 'next-hop-vrf'] if config.exists(vrf_path): config.rename(vrf_path, 'vrf') + next_hop = base + path + [route, 'interface'] + if config.exists(next_hop): + for interface in config.list_nodes(next_hop): + # IPv4 routes calls it next-hop-interface, rename this to + # interface instead so it's consitent with IPv6 + interface_path = next_hop + [interface, 'next-hop-interface'] + if config.exists(interface_path): + config.rename(interface_path, 'interface') + + # When VRFs got introduced, I (c-po) named it next-hop-vrf, + # we can also call it vrf which is simply shorter. + vrf_path = next_hop + [interface, 'next-hop-vrf'] + if config.exists(vrf_path): + config.rename(vrf_path, 'vrf') + if (len(argv) < 2): print("Must specify file name!") exit(1) file_name = argv[1] with open(file_name, 'r') as f: config_file = f.read() base = ['protocols', 'static'] config = ConfigTree(config_file) if not config.exists(base): # Nothing to do exit(0) # Migrate interface-route into route migrate_interface_route(config, base, ['interface-route'], 'route') # Migrate interface-route6 into route6 migrate_interface_route(config, base, ['interface-route6'], 'route6') # Cleanup nodes inside route migrate_route(config, base, ['route'], 'route') # Cleanup nodes inside route6 migrate_route(config, base, ['route6'], 'route6') # # PBR table cleanup table_path = base + ['table'] if config.exists(table_path): for table in config.list_nodes(table_path): # Migrate interface-route into route migrate_interface_route(config, table_path + [table], ['interface-route'], 'route') # Migrate interface-route6 into route6 migrate_interface_route(config, table_path + [table], ['interface-route6'], 'route6') # Cleanup nodes inside route migrate_route(config, table_path + [table], ['route'], 'route') # Cleanup nodes inside route6 migrate_route(config, table_path + [table], ['route6'], 'route6') try: with open(file_name, 'w') as f: f.write(config.to_string()) except OSError as e: print("Failed to save the modified config: {}".format(e)) exit(1) diff --git a/src/migration-scripts/vrf/0-to-1 b/src/migration-scripts/vrf/0-to-1 index 29b2fab74..2b41ef3c7 100755 --- a/src/migration-scripts/vrf/0-to-1 +++ b/src/migration-scripts/vrf/0-to-1 @@ -1,112 +1,122 @@ #!/usr/bin/env python3 # # Copyright (C) 2021 VyOS maintainers and contributors # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or later as # published by the Free Software Foundation. # # 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, see <http://www.gnu.org/licenses/>. # - T2450: drop interface-route and interface-route6 from "protocols vrf" from sys import argv from sys import exit from vyos.configtree import ConfigTree if (len(argv) < 2): print("Must specify file name!") exit(1) file_name = argv[1] with open(file_name, 'r') as f: config_file = f.read() base = ['protocols', 'vrf'] config = ConfigTree(config_file) if not config.exists(base): # Nothing to do exit(0) 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') try: with open(file_name, 'w') as f: f.write(config.to_string()) except OSError as e: print("Failed to save the modified config: {}".format(e)) exit(1) diff --git a/src/migration-scripts/vrf/1-to-2 b/src/migration-scripts/vrf/1-to-2 index 20128e957..9bc704e02 100755 --- a/src/migration-scripts/vrf/1-to-2 +++ b/src/migration-scripts/vrf/1-to-2 @@ -1,61 +1,62 @@ #!/usr/bin/env python3 # # Copyright (C) 2021 VyOS maintainers and contributors # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or later as # published by the Free Software Foundation. # # 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, see <http://www.gnu.org/licenses/>. # - T3344: migrate routing options from "protocols vrf" to "vrf <name> protocols" from sys import argv from sys import exit from vyos.configtree import ConfigTree if (len(argv) < 2): print("Must specify file name!") exit(1) file_name = argv[1] with open(file_name, 'r') as f: config_file = f.read() base = ['protocols', 'vrf'] config = ConfigTree(config_file) if not config.exists(base): # Nothing to do exit(0) vrf_base = ['vrf', 'name'] config.set(vrf_base) config.set_tag(vrf_base) # Copy all existing static routes to the new base node under "vrf name <name> protocols static" for vrf in config.list_nodes(base): static_base = base + [vrf, 'static'] if not config.exists(static_base): continue new_static_base = vrf_base + [vrf, 'protocols'] config.set(new_static_base) config.copy(static_base, new_static_base + ['static']) + config.set_tag(new_static_base + ['static', 'route']) # Now delete the old configuration config.delete(base) try: with open(file_name, 'w') as f: f.write(config.to_string()) except OSError as e: print("Failed to save the modified config: {}".format(e)) exit(1)