Skip to content

Commit 6537663

Browse files
committed
bond: T7191: fix error message when member interface is used multiple times
Sharing the same physical interface among multiple bond interfaces causes information to be lost within the error message set interfaces bonding bond10 member interface eth1 set interfaces bonding bond10 member interface eth2 set interfaces bonding bond20 member interface eth1 set interfaces bonding bond20 member interface eth2 commit Results in: [ interfaces bonding bond10 ] Can not add interface "eth1" to bond, it is already a member of bond "b"! [[interfaces bonding bond10]] failed [ interfaces bonding bond20 ] Can not add interface "eth1" to bond, it is already a member of bond "b"! It should infact output the full name of the bond interface.
1 parent 5d9d232 commit 6537663

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

smoketest/scripts/cli/test_interfaces_bonding.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,17 @@ def test_bonding_mii_monitoring_interval(self):
167167

168168
def test_bonding_multi_use_member(self):
169169
# Define available bonding hash policies
170-
for interface in ['bond10', 'bond20']:
170+
bonds = ['bond10', 'bond20', 'bond30']
171+
for interface in bonds:
171172
for member in self._members:
172173
self.cli_set(self._base_path + [interface, 'member', 'interface', member])
173174

174175
# check validate() - can not use the same member interfaces multiple times
175176
with self.assertRaises(ConfigSessionError):
176177
self.cli_commit()
177-
178-
self.cli_delete(self._base_path + ['bond20'])
178+
# only keep the first bond interface configuration
179+
for interface in bonds[1:]:
180+
self.cli_delete(self._base_path + [interface])
179181

180182
self.cli_commit()
181183

src/conf_mode/interfaces_bonding.py

+14-14
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,8 @@ def get_config(config=None):
126126
# Restore existing config level
127127
conf.set_level(old_level)
128128

129-
if dict_search('member.interface', bond):
130-
for interface, interface_config in bond['member']['interface'].items():
131-
129+
if dict_search('member.interface', bond) is not None:
130+
for interface in bond['member']['interface']:
132131
interface_ethernet_config = conf.get_config_dict(
133132
['interfaces', 'ethernet', interface],
134133
key_mangling=('-', '_'),
@@ -137,44 +136,45 @@ def get_config(config=None):
137136
with_defaults=False,
138137
with_recursive_defaults=False)
139138

140-
interface_config['config_paths'] = dict_to_paths_values(interface_ethernet_config)
139+
bond['member']['interface'][interface].update({'config_paths' :
140+
dict_to_paths_values(interface_ethernet_config)})
141141

142142
# Check if member interface is a new member
143143
if not conf.exists_effective(base + [ifname, 'member', 'interface', interface]):
144144
bond['shutdown_required'] = {}
145-
interface_config['new_added'] = {}
145+
bond['member']['interface'][interface].update({'new_added' : {}})
146146

147147
# Check if member interface is disabled
148148
conf.set_level(['interfaces'])
149149

150150
section = Section.section(interface) # this will be 'ethernet' for 'eth0'
151151
if conf.exists([section, interface, 'disable']):
152-
interface_config['disable'] = ''
152+
if tmp: bond['member']['interface'][interface].update({'disable': ''})
153153

154154
conf.set_level(old_level)
155155

156156
# Check if member interface is already member of another bridge
157157
tmp = is_member(conf, interface, 'bridge')
158-
if tmp: interface_config['is_bridge_member'] = tmp
158+
if tmp: bond['member']['interface'][interface].update({'is_bridge_member' : tmp})
159159

160160
# Check if member interface is already member of a bond
161161
tmp = is_member(conf, interface, 'bonding')
162-
for tmp in is_member(conf, interface, 'bonding'):
163-
if bond['ifname'] == tmp:
164-
continue
165-
interface_config['is_bond_member'] = tmp
162+
if ifname in tmp:
163+
del tmp[ifname]
164+
if tmp: bond['member']['interface'][interface].update({'is_bond_member' : tmp})
166165

167166
# Check if member interface is used as source-interface on another interface
168167
tmp = is_source_interface(conf, interface)
169-
if tmp: interface_config['is_source_interface'] = tmp
168+
if tmp: bond['member']['interface'][interface].update({'is_source_interface' : tmp})
170169

171170
# bond members must not have an assigned address
172171
tmp = has_address_configured(conf, interface)
173-
if tmp: interface_config['has_address'] = {}
172+
if tmp: bond['member']['interface'][interface].update({'has_address' : ''})
174173

175174
# bond members must not have a VRF attached
176175
tmp = has_vrf_configured(conf, interface)
177-
if tmp: interface_config['has_vrf'] = {}
176+
if tmp: bond['member']['interface'][interface].update({'has_vrf' : ''})
177+
178178
return bond
179179

180180

0 commit comments

Comments
 (0)