diff options
| -rwxr-xr-x | src/migration-scripts/interfaces/0-to-1 | 171 | 
1 files changed, 101 insertions, 70 deletions
| diff --git a/src/migration-scripts/interfaces/0-to-1 b/src/migration-scripts/interfaces/0-to-1 index 96e18b5d5..a67a4a325 100755 --- a/src/migration-scripts/interfaces/0-to-1 +++ b/src/migration-scripts/interfaces/0-to-1 @@ -6,78 +6,109 @@  # https://phabricator.vyos.net/T1556  import sys -  from vyos.configtree import ConfigTree -if (len(sys.argv) < 1): -    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) -base = ['interfaces', 'bridge'] - -if not config.exists(base): -    # Nothing to do -    sys.exit(0) -else: -    # -    # make stp and igmp-snooping nodes valueless -    # -    for br in config.list_nodes(base): -        # STP: check if enabled -        if config.exists(base + [br, 'stp']): -            stp_val = config.return_value(base + [br, 'stp']) -            # STP: delete node with old syntax -            config.delete(base + [br, 'stp']) -            # STP: set new node - if enabled -            if stp_val == "true": -                config.set(base + [br, 'stp'], value=None) - -        # igmp-snooping: check if enabled -        if config.exists(base + [br, 'igmp-snooping', 'querier']): -            igmp_val = config.return_value(base + [br, 'igmp-snooping', 'querier']) -            # igmp-snooping: delete node with old syntax -            config.delete(base + [br, 'igmp-snooping', 'querier']) -            # igmp-snooping: set new node - if enabled -            if igmp_val == "enable": -                config.set(base + [br, 'igmp', 'querier'], value=None) - -    # -    # move interface based bridge-group to actual bridge (de-nest) -    # -    bridge_types = ['bonding', 'ethernet', 'l2tpv3', 'openvpn', 'vxlan', 'wireless'] -    for type in bridge_types: -        if not config.exists(['interfaces', type]): -            continue - -        for intf in config.list_nodes(['interfaces', type]): -            # check if bridge-group exists -            if config.exists(['interfaces', type, intf, 'bridge-group']): -                bridge = config.return_value(['interfaces', type, intf, 'bridge-group', 'bridge']) - -                # create new bridge member interface -                config.set(base + [bridge, 'member', 'interface', intf]) -                # format as tag node to avoid loading problems -                config.set_tag(base + [bridge, 'member', 'interface']) - -                # cost: migrate if configured -                if config.exists(['interfaces', type, intf, 'bridge-group', 'cost']): -                    cost = config.return_value(['interfaces', type, intf, 'bridge-group', 'cost']) -                    # set new node -                    config.set(base + [bridge, 'member', 'interface', intf, 'cost'], value=cost) - -                if config.exists(['interfaces', type, intf, 'bridge-group', 'priority']): -                    priority = config.return_value(['interfaces', type, intf, 'bridge-group', 'priority']) -                    # set new node -                    config.set(base + [bridge, 'member', 'interface', intf, 'priority'], value=priority) - -                # Delete the old bridge-group assigned to an interface -                config.delete(['interfaces', type, intf, 'bridge-group']) +def migrate_bridge(config, tree, intf): +    # check if bridge-group exists +    tree_bridge = tree + ['bridge-group'] +    if config.exists(tree_bridge): +        bridge = config.return_value(tree_bridge + ['bridge']) +        # create new bridge member interface +        config.set(base + [bridge, 'member', 'interface', intf]) +        # format as tag node to avoid loading problems +        config.set_tag(base + [bridge, 'member', 'interface']) + +        # cost: migrate if configured +        tree_cost = tree + ['bridge-group', 'cost'] +        if config.exists(tree_cost): +            cost = config.return_value(tree_cost) +            # set new node +            config.set(base + [bridge, 'member', 'interface', intf, 'cost'], value=cost) + +        # priority: migrate if configured +        tree_priority = tree + ['bridge-group', 'priority'] +        if config.exists(tree_priority): +            priority = config.return_value(tree_priority) +            # set new node +            config.set(base + [bridge, 'member', 'interface', intf, 'priority'], value=priority) + +        # Delete the old bridge-group assigned to an interface +        config.delete(tree_bridge) + + +if __name__ == '__main__': +    if (len(sys.argv) < 1): +        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) +    base = ['interfaces', 'bridge'] + +    if not config.exists(['interfaces', 'bridge']): +        # Nothing to do +        sys.exit(0) +    else: +        # +        # make stp and igmp-snooping nodes valueless +        # +        for br in config.list_nodes(base): +            # STP: check if enabled +            if config.exists(base + [br, 'stp']): +                stp_val = config.return_value(base + [br, 'stp']) +                # STP: delete node with old syntax +                config.delete(base + [br, 'stp']) +                # STP: set new node - if enabled +                if stp_val == "true": +                    config.set(base + [br, 'stp'], value=None) + +            # igmp-snooping: check if enabled +            if config.exists(base + [br, 'igmp-snooping', 'querier']): +                igmp_val = config.return_value(base + [br, 'igmp-snooping', 'querier']) +                # igmp-snooping: delete node with old syntax +                config.delete(base + [br, 'igmp-snooping', 'querier']) +                # igmp-snooping: set new node - if enabled +                if igmp_val == "enable": +                    config.set(base + [br, 'igmp', 'querier'], value=None) + +        # +        # move interface based bridge-group to actual bridge (de-nest) +        # +        bridge_types = ['bonding', 'ethernet', 'l2tpv3', 'openvpn', 'vxlan', 'wireless'] +        for type in bridge_types: +            if not config.exists(['interfaces', type]): +                continue + +            for interface in config.list_nodes(['interfaces', type]): +                # check if bridge-group exists +                bridge_group = ['interfaces', type, interface] +                if config.exists(bridge_group + ['bridge-group']): +                    migrate_bridge(config, bridge_group, interface) + +                # We also need to migrate VLAN interfaces +                vlan_base = ['interfaces', type, interface, 'vif'] +                if config.exists(vlan_base): +                    for vlan in config.list_nodes(vlan_base): +                        intf = "{}.{}".format(interface, vlan) +                        migrate_bridge(config, vlan_base + [vlan], intf) + +                # And then we have service VLANs (vif-s) interfaces +                vlan_base = ['interfaces', type, interface, 'vif-s'] +                if config.exists(vlan_base): +                    for vif_s in config.list_nodes(vlan_base): +                        intf = "{}.{}".format(interface, vif_s) +                        migrate_bridge(config, vlan_base + [vif_s], intf) + +                        # Every service VLAN can have multiple customer VLANs (vif-c) +                        vlan_c = ['interfaces', type, interface, 'vif-s', vif_s, 'vif-c'] +                        if config.exists(vlan_c): +                            for vif_c in config.list_nodes(vlan_c): +                                intf = "{}.{}.{}".format(interface, vif_s, vif_c) +                                migrate_bridge(config, vlan_c + [vif_c], intf)          try:              with open(file_name, 'w') as f: | 
