Skip to content

Commit 7aa8222

Browse files
authored
Merge pull request #4362 from c-po/bond-T7191
bond: T7191: fix error message when member interface is used multiple times
2 parents d50ce12 + dc6b7f4 commit 7aa8222

File tree

2 files changed

+24
-17
lines changed

2 files changed

+24
-17
lines changed

smoketest/scripts/cli/test_interfaces_bonding.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -167,18 +167,25 @@ 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

184+
bond = bonds[0]
185+
member_ifaces = read_file(f'/sys/class/net/{bond}/bonding/slaves').split()
186+
for member in self._members:
187+
self.assertIn(member, member_ifaces)
188+
182189
def test_bonding_source_interface(self):
183190
# Re-use member interface that is already a source-interface
184191
bond = 'bond99'

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)