Set mtu for VXLAN interface in linuxbridge
Change-Id: I169613ecf936b4484447d1ca0ed81e4cb5369ce2 Closes-Bug: #1744101
This commit is contained in:
parent
03b1cca794
commit
2a44b3fa3d
|
@ -251,9 +251,9 @@ class LinuxBridgeManager(amb.CommonAgentManagerBase):
|
||||||
if self.ensure_bridge(bridge_name, interface):
|
if self.ensure_bridge(bridge_name, interface):
|
||||||
return interface
|
return interface
|
||||||
|
|
||||||
def ensure_vxlan_bridge(self, network_id, segmentation_id):
|
def ensure_vxlan_bridge(self, network_id, segmentation_id, mtu):
|
||||||
"""Create a vxlan and bridge unless they already exist."""
|
"""Create a vxlan and bridge unless they already exist."""
|
||||||
interface = self.ensure_vxlan(segmentation_id)
|
interface = self.ensure_vxlan(segmentation_id, mtu)
|
||||||
if not interface:
|
if not interface:
|
||||||
LOG.error("Failed creating vxlan interface for "
|
LOG.error("Failed creating vxlan interface for "
|
||||||
"%(segmentation_id)s",
|
"%(segmentation_id)s",
|
||||||
|
@ -316,7 +316,7 @@ class LinuxBridgeManager(amb.CommonAgentManagerBase):
|
||||||
LOG.debug("Done creating subinterface %s", interface)
|
LOG.debug("Done creating subinterface %s", interface)
|
||||||
return interface
|
return interface
|
||||||
|
|
||||||
def ensure_vxlan(self, segmentation_id):
|
def ensure_vxlan(self, segmentation_id, mtu=None):
|
||||||
"""Create a vxlan unless it already exists."""
|
"""Create a vxlan unless it already exists."""
|
||||||
interface = self.get_vxlan_device_name(segmentation_id)
|
interface = self.get_vxlan_device_name(segmentation_id)
|
||||||
if not ip_lib.device_exists(interface):
|
if not ip_lib.device_exists(interface):
|
||||||
|
@ -348,6 +348,8 @@ class LinuxBridgeManager(amb.CommonAgentManagerBase):
|
||||||
try:
|
try:
|
||||||
int_vxlan = self.ip.add_vxlan(interface, segmentation_id,
|
int_vxlan = self.ip.add_vxlan(interface, segmentation_id,
|
||||||
**args)
|
**args)
|
||||||
|
if mtu:
|
||||||
|
int_vxlan.link.set_mtu(mtu)
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
with excutils.save_and_reraise_exception() as ctxt:
|
with excutils.save_and_reraise_exception() as ctxt:
|
||||||
# perform this check after an attempt rather than before
|
# perform this check after an attempt rather than before
|
||||||
|
@ -469,13 +471,14 @@ class LinuxBridgeManager(amb.CommonAgentManagerBase):
|
||||||
def ensure_physical_in_bridge(self, network_id,
|
def ensure_physical_in_bridge(self, network_id,
|
||||||
network_type,
|
network_type,
|
||||||
physical_network,
|
physical_network,
|
||||||
segmentation_id):
|
segmentation_id,
|
||||||
|
mtu):
|
||||||
if network_type == constants.TYPE_VXLAN:
|
if network_type == constants.TYPE_VXLAN:
|
||||||
if self.vxlan_mode == lconst.VXLAN_NONE:
|
if self.vxlan_mode == lconst.VXLAN_NONE:
|
||||||
LOG.error("Unable to add vxlan interface for network %s",
|
LOG.error("Unable to add vxlan interface for network %s",
|
||||||
network_id)
|
network_id)
|
||||||
return
|
return
|
||||||
return self.ensure_vxlan_bridge(network_id, segmentation_id)
|
return self.ensure_vxlan_bridge(network_id, segmentation_id, mtu)
|
||||||
|
|
||||||
# NOTE(nick-ma-z): Obtain mappings of physical bridge and interfaces
|
# NOTE(nick-ma-z): Obtain mappings of physical bridge and interfaces
|
||||||
physical_bridge = self.bridge_mappings.get(physical_network)
|
physical_bridge = self.bridge_mappings.get(physical_network)
|
||||||
|
@ -534,7 +537,8 @@ class LinuxBridgeManager(amb.CommonAgentManagerBase):
|
||||||
elif not self.ensure_physical_in_bridge(network_id,
|
elif not self.ensure_physical_in_bridge(network_id,
|
||||||
network_type,
|
network_type,
|
||||||
physical_network,
|
physical_network,
|
||||||
segmentation_id):
|
segmentation_id,
|
||||||
|
mtu):
|
||||||
return False
|
return False
|
||||||
if mtu: # <-None with device_details from older neutron servers.
|
if mtu: # <-None with device_details from older neutron servers.
|
||||||
# we ensure the MTU here because libvirt does not set the
|
# we ensure the MTU here because libvirt does not set the
|
||||||
|
|
|
@ -51,6 +51,9 @@ class FakeIpLinkCommand(object):
|
||||||
def set_up(self):
|
def set_up(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def set_mtu(self, mtu):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class FakeIpDevice(object):
|
class FakeIpDevice(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -80,21 +83,21 @@ class TestLinuxBridge(base.BaseTestCase):
|
||||||
|
|
||||||
def test_ensure_physical_in_bridge_invalid(self):
|
def test_ensure_physical_in_bridge_invalid(self):
|
||||||
result = self.linux_bridge.ensure_physical_in_bridge(
|
result = self.linux_bridge.ensure_physical_in_bridge(
|
||||||
'network_id', constants.TYPE_VLAN, 'physnetx', 7)
|
'network_id', constants.TYPE_VLAN, 'physnetx', 7, 1450)
|
||||||
self.assertFalse(result)
|
self.assertFalse(result)
|
||||||
|
|
||||||
def test_ensure_physical_in_bridge_flat(self):
|
def test_ensure_physical_in_bridge_flat(self):
|
||||||
with mock.patch.object(self.linux_bridge,
|
with mock.patch.object(self.linux_bridge,
|
||||||
'ensure_flat_bridge') as flat_bridge_func:
|
'ensure_flat_bridge') as flat_bridge_func:
|
||||||
self.linux_bridge.ensure_physical_in_bridge(
|
self.linux_bridge.ensure_physical_in_bridge(
|
||||||
'network_id', constants.TYPE_FLAT, 'physnet1', None)
|
'network_id', constants.TYPE_FLAT, 'physnet1', None, 1450)
|
||||||
self.assertTrue(flat_bridge_func.called)
|
self.assertTrue(flat_bridge_func.called)
|
||||||
|
|
||||||
def test_ensure_physical_in_bridge_vlan(self):
|
def test_ensure_physical_in_bridge_vlan(self):
|
||||||
with mock.patch.object(self.linux_bridge,
|
with mock.patch.object(self.linux_bridge,
|
||||||
'ensure_vlan_bridge') as vlan_bridge_func:
|
'ensure_vlan_bridge') as vlan_bridge_func:
|
||||||
self.linux_bridge.ensure_physical_in_bridge(
|
self.linux_bridge.ensure_physical_in_bridge(
|
||||||
'network_id', constants.TYPE_VLAN, 'physnet1', 7)
|
'network_id', constants.TYPE_VLAN, 'physnet1', 7, 1450)
|
||||||
self.assertTrue(vlan_bridge_func.called)
|
self.assertTrue(vlan_bridge_func.called)
|
||||||
|
|
||||||
def test_ensure_physical_in_bridge_vxlan(self):
|
def test_ensure_physical_in_bridge_vxlan(self):
|
||||||
|
@ -102,7 +105,7 @@ class TestLinuxBridge(base.BaseTestCase):
|
||||||
with mock.patch.object(self.linux_bridge,
|
with mock.patch.object(self.linux_bridge,
|
||||||
'ensure_vxlan_bridge') as vxlan_bridge_func:
|
'ensure_vxlan_bridge') as vxlan_bridge_func:
|
||||||
self.linux_bridge.ensure_physical_in_bridge(
|
self.linux_bridge.ensure_physical_in_bridge(
|
||||||
'network_id', 'vxlan', 'physnet1', 7)
|
'network_id', 'vxlan', 'physnet1', 7, 1450)
|
||||||
self.assertTrue(vxlan_bridge_func.called)
|
self.assertTrue(vxlan_bridge_func.called)
|
||||||
|
|
||||||
|
|
||||||
|
@ -383,9 +386,10 @@ class TestLinuxBridgeManager(base.BaseTestCase):
|
||||||
de_fn.return_value = False
|
de_fn.return_value = False
|
||||||
vxlan_dev = FakeIpDevice()
|
vxlan_dev = FakeIpDevice()
|
||||||
with mock.patch.object(vxlan_dev, 'disable_ipv6') as dv6_fn,\
|
with mock.patch.object(vxlan_dev, 'disable_ipv6') as dv6_fn,\
|
||||||
|
mock.patch.object(vxlan_dev.link, 'set_mtu') as set_mtu_fn,\
|
||||||
mock.patch.object(self.lbm.ip, 'add_vxlan',
|
mock.patch.object(self.lbm.ip, 'add_vxlan',
|
||||||
return_value=vxlan_dev) as add_vxlan_fn:
|
return_value=vxlan_dev) as add_vxlan_fn:
|
||||||
retval = self.lbm.ensure_vxlan(seg_id)
|
retval = self.lbm.ensure_vxlan(seg_id, mtu=1450)
|
||||||
self.assertEqual("vxlan-" + seg_id, retval)
|
self.assertEqual("vxlan-" + seg_id, retval)
|
||||||
add_vxlan_fn.assert_called_with("vxlan-" + seg_id, seg_id,
|
add_vxlan_fn.assert_called_with("vxlan-" + seg_id, seg_id,
|
||||||
group="224.0.0.1",
|
group="224.0.0.1",
|
||||||
|
@ -394,6 +398,7 @@ class TestLinuxBridgeManager(base.BaseTestCase):
|
||||||
ttl=None,
|
ttl=None,
|
||||||
dev=self.lbm.local_int)
|
dev=self.lbm.local_int)
|
||||||
dv6_fn.assert_called_once_with()
|
dv6_fn.assert_called_once_with()
|
||||||
|
set_mtu_fn.assert_called_once_with(1450)
|
||||||
cfg.CONF.set_override('l2_population', 'True', 'VXLAN')
|
cfg.CONF.set_override('l2_population', 'True', 'VXLAN')
|
||||||
self.assertEqual("vxlan-" + seg_id,
|
self.assertEqual("vxlan-" + seg_id,
|
||||||
self.lbm.ensure_vxlan(seg_id))
|
self.lbm.ensure_vxlan(seg_id))
|
||||||
|
@ -517,18 +522,18 @@ class TestLinuxBridgeManager(base.BaseTestCase):
|
||||||
def test_ensure_physical_in_bridge(self):
|
def test_ensure_physical_in_bridge(self):
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_VLAN,
|
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_VLAN,
|
||||||
"phys", "1")
|
"phys", "1", 1450)
|
||||||
)
|
)
|
||||||
with mock.patch.object(self.lbm, "ensure_flat_bridge") as flbr_fn:
|
with mock.patch.object(self.lbm, "ensure_flat_bridge") as flbr_fn:
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_FLAT,
|
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_FLAT,
|
||||||
"physnet1", None)
|
"physnet1", None, 1450)
|
||||||
)
|
)
|
||||||
self.assertTrue(flbr_fn.called)
|
self.assertTrue(flbr_fn.called)
|
||||||
with mock.patch.object(self.lbm, "ensure_vlan_bridge") as vlbr_fn:
|
with mock.patch.object(self.lbm, "ensure_vlan_bridge") as vlbr_fn:
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_VLAN,
|
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_VLAN,
|
||||||
"physnet1", "1")
|
"physnet1", "1", 1450)
|
||||||
)
|
)
|
||||||
self.assertTrue(vlbr_fn.called)
|
self.assertTrue(vlbr_fn.called)
|
||||||
|
|
||||||
|
@ -536,14 +541,14 @@ class TestLinuxBridgeManager(base.BaseTestCase):
|
||||||
self.lbm.vxlan_mode = lconst.VXLAN_MCAST
|
self.lbm.vxlan_mode = lconst.VXLAN_MCAST
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_VXLAN,
|
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_VXLAN,
|
||||||
"physnet1", "1")
|
"physnet1", "1", 1450)
|
||||||
)
|
)
|
||||||
self.assertTrue(vlbr_fn.called)
|
self.assertTrue(vlbr_fn.called)
|
||||||
|
|
||||||
def test_ensure_physical_in_bridge_with_existed_brq(self):
|
def test_ensure_physical_in_bridge_with_existed_brq(self):
|
||||||
with mock.patch.object(linuxbridge_neutron_agent.LOG, 'error') as log:
|
with mock.patch.object(linuxbridge_neutron_agent.LOG, 'error') as log:
|
||||||
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_FLAT,
|
self.lbm.ensure_physical_in_bridge("123", constants.TYPE_FLAT,
|
||||||
"physnet9", "1")
|
"physnet9", "1", 1450)
|
||||||
self.assertEqual(1, log.call_count)
|
self.assertEqual(1, log.call_count)
|
||||||
|
|
||||||
@mock.patch.object(ip_lib, "device_exists", return_value=False)
|
@mock.patch.object(ip_lib, "device_exists", return_value=False)
|
||||||
|
|
Loading…
Reference in New Issue