From b6aa1e7f3fb40cea11813dad53b50aeeb28fc74e Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 16 Feb 2020 10:15:36 +0100 Subject: bond: T2030: fix incorrect delta calculation on member interfaces THe delta check/calculation always returned False on system startup leading to a non functioning bond interface after a reboot as no physical interface actually enslaved. This was fixed by not calculating the current enslaved interfaces from the existing config but rather retrieving the interfaces from sysfs. --- python/vyos/ifconfig.py | 12 +++++++++--- src/conf_mode/interfaces-bonding.py | 9 +++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/python/vyos/ifconfig.py b/python/vyos/ifconfig.py index b1f512785..b3683dc57 100644 --- a/python/vyos/ifconfig.py +++ b/python/vyos/ifconfig.py @@ -1538,9 +1538,15 @@ class BondIf(VLANIf): >>> BondIf('bond0').get_slaves() ['eth1', 'eth2'] """ - slaves = self._read_sysfs('/sys/class/net/{}/bonding/slaves' - .format(self._ifname)) - return list(map(str, slaves.split())) + enslaved_ifs = [] + # retrieve real enslaved interfaces from OS kernel + sysfs_bond = '/sys/class/net/{}'.format(self._ifname) + if os.path.isdir(sysfs_bond): + for directory in os.listdir(): + if 'lower_' in directory: + enslaved_ifs.append(directory.replace('lower_','')) + + return enslaved_ifs def set_primary(self, interface): diff --git a/src/conf_mode/interfaces-bonding.py b/src/conf_mode/interfaces-bonding.py index 81574515f..6cdfb764c 100755 --- a/src/conf_mode/interfaces-bonding.py +++ b/src/conf_mode/interfaces-bonding.py @@ -208,8 +208,13 @@ def get_config(): # determine bond member interfaces (currently configured) if conf.exists('member interface'): bond['member'] = conf.return_values('member interface') - eff_member = conf.return_effective_values('member interface') - if not (bond['member'] == eff_member): + + # We can not call conf.return_effective_values() as it would not work + # on reboots. Reboots/First boot will return that running config and + # saved config is the same, thus on a reboot the bond members will + # not be added all (https://phabricator.vyos.net/T2030) + live_members = BondIf(bond['intf']).get_slaves() + if not (bond['member'] == live_members): bond['shutdown_required'] = True # Primary device interface -- cgit v1.2.3