diff options
Diffstat (limited to 'src/migration-scripts')
| -rwxr-xr-x | src/migration-scripts/https/3-to-4 | 53 | ||||
| -rwxr-xr-x | src/migration-scripts/isis/1-to-2 | 46 | ||||
| -rwxr-xr-x | src/migration-scripts/policy/3-to-4 | 162 | ||||
| -rwxr-xr-x | src/migration-scripts/policy/4-to-5 | 92 | 
4 files changed, 353 insertions, 0 deletions
diff --git a/src/migration-scripts/https/3-to-4 b/src/migration-scripts/https/3-to-4 new file mode 100755 index 000000000..5ee528b31 --- /dev/null +++ b/src/migration-scripts/https/3-to-4 @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2022 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/>. + +# T4768 rename node 'gql' to 'graphql'. + +import sys + +from vyos.configtree import ConfigTree + +if (len(sys.argv) < 2): +    print("Must specify file name!") +    sys.exit(1) + +file_name = sys.argv[1] + +with open(file_name, 'r') as f: +    config_file = f.read() + +config = ConfigTree(config_file) + +old_base = ['service', 'https', 'api', 'gql'] +if not config.exists(old_base): +    # Nothing to do +    sys.exit(0) + +new_base = ['service', 'https', 'api', 'graphql'] +config.set(new_base) + +nodes = config.list_nodes(old_base) +for node in nodes: +    config.copy(old_base + [node], new_base + [node]) + +config.delete(old_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)) +    sys.exit(1) diff --git a/src/migration-scripts/isis/1-to-2 b/src/migration-scripts/isis/1-to-2 new file mode 100755 index 000000000..f914ea995 --- /dev/null +++ b/src/migration-scripts/isis/1-to-2 @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2022 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/>. + +# T4739 refactor, and remove "on" from segment routing from the configuration + +from sys import argv +from sys import exit + +from vyos.configtree import ConfigTree + +if (len(argv) < 1): +    print("Must specify file name!") +    exit(1) + +file_name = argv[1] + +with open(file_name, 'r') as f: +    config_file = f.read() + +config = ConfigTree(config_file) + +# Check if ISIS segment routing is configured. Then check if segment routing "on" exists, then delete the "on" as it is no longer needed. This is for global configuration. +if config.exists(['protocols', 'isis']): +    if config.exists(['protocols', 'isis', 'segment-routing']): +        if config.exists(['protocols', 'isis', 'segment-routing', 'enable']): +            config.delete(['protocols', 'isis', 'segment-routing', 'enable']) + +try: +    with open(file_name, 'w') as f: +        f.write(config.to_string()) +except OSError as e: +    print(f'Failed to save the modified config: {e}') +    exit(1) diff --git a/src/migration-scripts/policy/3-to-4 b/src/migration-scripts/policy/3-to-4 new file mode 100755 index 000000000..bae30cffc --- /dev/null +++ b/src/migration-scripts/policy/3-to-4 @@ -0,0 +1,162 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2022 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/>. + +# T4660: change cli +#     from: set policy route-map FOO rule 10 set community 'TEXT' +#     Multiple value +#     to: set policy route-map FOO rule 10 set community replace <community> +#     Multiple value +#     to: set policy route-map FOO rule 10 set community add <community> +#     to: set policy route-map FOO rule 10 set community none +# +#     from: set policy route-map FOO rule 10 set large-community 'TEXT' +#     Multiple value +#     to: set policy route-map FOO rule 10 set large-community replace <community> +#     Multiple value +#     to: set policy route-map FOO rule 10 set large-community add <community> +#     to: set policy route-map FOO rule 10 set large-community none +# +#     from: set policy route-map FOO rule 10 set extecommunity [rt|soo] 'TEXT' +#     Multiple value +#     to: set policy route-map FOO rule 10 set extcommunity [rt|soo] <community> + +from sys import argv +from sys import exit + +from vyos.configtree import ConfigTree + + +# Migration function for large and regular communities +def community_migrate(config: ConfigTree, rule: list[str]) -> bool: +    """ + +    :param config: configuration object +    :type config: ConfigTree +    :param rule: Path to variable +    :type rule: list[str] +    :return: True if additive presents in community string +    :rtype: bool +    """ +    community_list = list((config.return_value(rule)).split(" ")) +    config.delete(rule) +    if 'none' in community_list: +        config.set(rule + ['none']) +        return False +    else: +        community_action: str = 'replace' +        if 'additive' in community_list: +            community_action = 'add' +            community_list.remove('additive') +        for community in community_list: +            config.set(rule + [community_action], value=community, +                       replace=False) +        if community_action == 'replace': +            return False +        else: +            return True + + +# Migration function for extcommunities +def extcommunity_migrate(config: ConfigTree, rule: list[str]) -> None: +    """ + +    :param config: configuration object +    :type config: ConfigTree +    :param rule: Path to variable +    :type rule: list[str] +    """ +    # if config.exists(rule + ['bandwidth']): +    #     bandwidth: str = config.return_value(rule + ['bandwidth']) +    #     config.delete(rule + ['bandwidth']) +    #     config.set(rule + ['bandwidth'], value=bandwidth) + +    if config.exists(rule + ['rt']): +        community_list = list((config.return_value(rule + ['rt'])).split(" ")) +        config.delete(rule + ['rt']) +        for community in community_list: +            config.set(rule + ['rt'], value=community, replace=False) + +    if config.exists(rule + ['soo']): +        community_list = list((config.return_value(rule + ['soo'])).split(" ")) +        config.delete(rule + ['soo']) +        for community in community_list: +            config.set(rule + ['soo'], value=community, replace=False) + + +if (len(argv) < 1): +    print("Must specify file name!") +    exit(1) + +file_name: str = argv[1] + +with open(file_name, 'r') as f: +    config_file = f.read() + +base: list[str] = ['policy', 'route-map'] +config = ConfigTree(config_file) + +if not config.exists(base): +    # Nothing to do +    exit(0) + +for route_map in config.list_nodes(base): +    if not config.exists(base + [route_map, 'rule']): +        continue +    for rule in config.list_nodes(base + [route_map, 'rule']): +        base_rule: list[str] = base + [route_map, 'rule', rule, 'set'] + +        # IF additive presents in coummunity then comm-list is redundant +        isAdditive: bool = True +        #### Change Set community ######## +        if config.exists(base_rule + ['community']): +            isAdditive = community_migrate(config, +                                           base_rule + ['community']) + +        #### Change Set community-list delete migrate ######## +        if config.exists(base_rule + ['comm-list', 'comm-list']): +            if isAdditive: +                tmp = config.return_value( +                    base_rule + ['comm-list', 'comm-list']) +                config.delete(base_rule + ['comm-list']) +                config.set(base_rule + ['community', 'delete'], value=tmp) +            else: +                config.delete(base_rule + ['comm-list']) + +        isAdditive = False +        #### Change Set large-community ######## +        if config.exists(base_rule + ['large-community']): +            isAdditive = community_migrate(config, +                                           base_rule + ['large-community']) + +        #### Change Set large-community delete by List ######## +        if config.exists(base_rule + ['large-comm-list-delete']): +            if isAdditive: +                tmp = config.return_value( +                    base_rule + ['large-comm-list-delete']) +                config.delete(base_rule + ['large-comm-list-delete']) +                config.set(base_rule + ['large-community', 'delete'], +                           value=tmp) +            else: +                config.delete(base_rule + ['large-comm-list-delete']) + +        #### Change Set extcommunity ######## +        extcommunity_migrate(config, base_rule + ['extcommunity']) +try: +    with open(file_name, 'w') as f: +        f.write(config.to_string()) +except OSError as e: +    print(f'Failed to save the modified config: {e}') +    exit(1) diff --git a/src/migration-scripts/policy/4-to-5 b/src/migration-scripts/policy/4-to-5 new file mode 100755 index 000000000..33c9e6ade --- /dev/null +++ b/src/migration-scripts/policy/4-to-5 @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2022 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/>. + +# T2199: Migrate interface policy nodes to policy route <name> interface <ifname> + +import re + +from sys import argv +from sys import exit + +from vyos.configtree import ConfigTree +from vyos.ifconfig import Section + +if (len(argv) < 1): +    print("Must specify file name!") +    exit(1) + +file_name = argv[1] + +with open(file_name, 'r') as f: +    config_file = f.read() + +base4 = ['policy', 'route'] +base6 = ['policy', 'route6'] +config = ConfigTree(config_file) + +if not config.exists(base4) and not config.exists(base6): +    # Nothing to do +    exit(0) + +def migrate_interface(config, iftype, ifname, vif=None, vifs=None, vifc=None): +    if_path = ['interfaces', iftype, ifname] +    ifname_full = ifname + +    if vif: +        if_path += ['vif', vif] +        ifname_full = f'{ifname}.{vif}' +    elif vifs: +        if_path += ['vif-s', vifs] +        ifname_full = f'{ifname}.{vifs}' +        if vifc: +            if_path += ['vif-c', vifc] +            ifname_full = f'{ifname}.{vifs}.{vifc}' + +    if not config.exists(if_path + ['policy']): +        return + +    if config.exists(if_path + ['policy', 'route']): +        route_name = config.return_value(if_path + ['policy', 'route']) +        config.set(base4 + [route_name, 'interface'], value=ifname_full, replace=False) + +    if config.exists(if_path + ['policy', 'route6']): +        route_name = config.return_value(if_path + ['policy', 'route6']) +        config.set(base6 + [route_name, 'interface'], value=ifname_full, replace=False) + +    config.delete(if_path + ['policy']) + +for iftype in config.list_nodes(['interfaces']): +    for ifname in config.list_nodes(['interfaces', iftype]): +        migrate_interface(config, iftype, ifname) + +        if config.exists(['interfaces', iftype, ifname, 'vif']): +            for vif in config.list_nodes(['interfaces', iftype, ifname, 'vif']): +                migrate_interface(config, iftype, ifname, vif=vif) + +        if config.exists(['interfaces', iftype, ifname, 'vif-s']): +            for vifs in config.list_nodes(['interfaces', iftype, ifname, 'vif-s']): +                migrate_interface(config, iftype, ifname, vifs=vifs) + +                if config.exists(['interfaces', iftype, ifname, 'vif-s', vifs, 'vif-c']): +                    for vifc in config.list_nodes(['interfaces', iftype, ifname, 'vif-s', vifs, 'vif-c']): +                        migrate_interface(config, iftype, ifname, vifs=vifs, vifc=vifc) + +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)  | 
