#!/usr/bin/env python3 # Copyright 2023-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 . # T5254: Fixed changing ethernet when it is a bond member import json from vyos.configtree import ConfigTree from vyos.ifconfig import EthernetIf from vyos.ifconfig import BondIf from vyos.utils.dict import dict_to_paths_values base = ['interfaces', 'bonding'] def migrate(config: ConfigTree) -> None: if not config.exists(base): # Nothing to do return for bond in config.list_nodes(base): member_base = base + [bond, 'member', 'interface'] if config.exists(member_base): for interface in config.return_values(member_base): if_base = ['interfaces', 'ethernet', interface] if config.exists(if_base): config_ethernet = json.loads(config.get_subtree(if_base).to_json()) eth_dict_paths = dict_to_paths_values(config_ethernet) for option_path, option_value in eth_dict_paths.items(): # If option is allowed for changing then continue converted_path = option_path.replace('-','_') if converted_path in EthernetIf.get_bond_member_allowed_options(): continue # if option is inherited from bond then continue if converted_path in BondIf.get_inherit_bond_options(): continue option_path_list = option_path.split('.') config.delete(if_base + option_path_list) del option_path_list[-1] # delete empty node from config while len(option_path_list) > 0: if config.list_nodes(if_base + option_path_list): break config.delete(if_base + option_path_list) del option_path_list[-1]