Fix hierarchy for Linux Bonds and Linux Bridges

This change cleans up some of the Linux Bond and Linux Bridge logic
that processes member interfaces and VLANs.

One bug is fixed, where a VLAN might be assigned as a slave
interface on a bond.

Changes were made so that if VLANs are placed under a Linux Bond,
the PHYSDEV is set to the bond, so the device: does not need to
be specified in the config.

This change ensures that if a bridge has a bond and VLANs as members,
that the VLAN will be a member of the bridge and not the bond.

Change-Id: Id329737f0032e781b111741086ded83f378297a7
This commit is contained in:
Dan Sneddon 2016-03-08 16:35:33 -08:00
parent 63659fe4a6
commit b0b09a65b6
3 changed files with 21 additions and 1 deletions

View File

@ -89,6 +89,9 @@ class IfcfgNetConfig(os_net_config.NetConfig):
data += "VLAN=yes\n"
if base_opt.device:
data += "PHYSDEV=%s\n" % base_opt.device
else:
if base_opt.linux_bond_name:
data += "PHYSDEV=%s\n" % base_opt.linux_bond_name
elif isinstance(base_opt, objects.IvsInterface):
data += "TYPE=IVSIntPort\n"
elif re.match('\w+\.\d+$', base_opt.name):
@ -163,7 +166,8 @@ class IfcfgNetConfig(os_net_config.NetConfig):
members = [member.name for member in base_opt.members]
self.member_names[base_opt.name] = members
for member in members:
self.bond_slaves[member] = base_opt.name
if isinstance(member, objects.Interface):
self.bond_slaves[member] = base_opt.name
if base_opt.bonding_options:
data += "BONDING_OPTS=\"%s\"\n" % base_opt.bonding_options
else:

View File

@ -171,6 +171,7 @@ class _BaseOpts(object):
self.bridge_name = None # internal
self.linux_bridge_name = None # internal
self.ivs_bridge_name = None # internal
self.linux_bond_name = None # internal
self.ovs_port = False # internal
self.primary_interface_name = None # internal
@ -515,6 +516,7 @@ class LinuxBond(_BaseOpts):
self.members = members
self.bonding_options = bonding_options
for member in self.members:
member.linux_bond_name = name
if member.primary:
if self.primary_interface_name:
msg = 'Only one primary interface allowed per bond.'

View File

@ -165,6 +165,11 @@ OVS_OPTIONS="tag=5"
BOOTPROTO=none
"""
_VLAN_LINUX_BRIDGE = _BASE_VLAN_OVS + """VLAN=yes
BRIDGE=br-ctlplane
BOOTPROTO=none
"""
_OVS_BOND_DHCP = """# This file is autogenerated by os-net-config
DEVICE=bond0
@ -417,6 +422,15 @@ class TestIfcfgNetConfig(base.TestCase):
self.provider.add_bridge(bridge)
self.assertEqual(_VLAN_OVS_BRIDGE, self.get_interface_config('vlan5'))
def test_add_linux_bridge_with_vlan(self):
vlan = objects.Vlan(None, 5)
bridge = objects.LinuxBridge('br-ctlplane', use_dhcp=True,
members=[vlan])
self.provider.add_vlan(vlan)
self.provider.add_bridge(bridge)
self.assertEqual(_VLAN_LINUX_BRIDGE,
self.get_interface_config('vlan5'))
def test_ovs_bond(self):
interface1 = objects.Interface('em1')
interface2 = objects.Interface('em2')