Remove deprecated network_device_mtu option

The right way to configure Neutron to work with infrastructure MTU is by
using plugin agnostic global_physnet_mtu and ml2 specific
path_mtu/physical_network_mtus options. The deprecated option is error
prone and does not allow to use different MTUs per network.

Closes-Bug: #1603493
Related-Bug: #1549470
Related-Bug: #1542108
Related-Bug: #1542475

DocImpact Remove all references to network_device_mtu option from
          Neutron documentation. Note that Nova has a deprecated option
          with the same name that will need a separate patch to be removed.

Depends-On: I8e6cc99fe70d0c41a705431fb3160e8fccacff10
Depends-On: I337b284076a794027fbd63796119d56bd1923cf2
Change-Id: I7287db9df25a78a59b2dfa28acfde7fe69d17f40
This commit is contained in:
Ihar Hrachyshka 2016-07-15 18:14:12 +02:00
parent fcb1ccf823
commit a9133b7255
6 changed files with 39 additions and 92 deletions

View File

@ -266,8 +266,7 @@ class FipNamespace(namespaces.Namespace):
rtr_2_fip_dev, fip_2_rtr_dev = ip_wrapper.add_veth(rtr_2_fip_name,
fip_2_rtr_name,
fip_ns_name)
mtu = (self.agent_conf.network_device_mtu or
ri.get_ex_gw_port().get('mtu'))
mtu = ri.get_ex_gw_port().get('mtu')
if mtu:
rtr_2_fip_dev.link.set_mtu(mtu)
fip_2_rtr_dev.link.set_mtu(mtu)

View File

@ -26,9 +26,7 @@ from neutron._i18n import _, _LE, _LI, _LW
from neutron.agent.common import ovs_lib
from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils
from neutron.common import constants as n_const
from neutron.common import exceptions
from neutron.common import ipv6_utils
LOG = logging.getLogger(__name__)
@ -43,12 +41,6 @@ OPTS = [
'Support kernels with limited namespace support '
'(e.g. RHEL 6.5) so long as ovs_use_veth is set to '
'True.')),
cfg.IntOpt('network_device_mtu',
deprecated_for_removal=True,
help=_('MTU setting for device. This option will be removed in '
'Newton. Please use the system-wide segment_mtu setting '
'which the agents will take into account when wiring '
'VIFs.')),
]
@ -61,17 +53,6 @@ class LinuxInterfaceDriver(object):
def __init__(self, conf):
self.conf = conf
if self.conf.network_device_mtu:
self._validate_network_device_mtu()
def _validate_network_device_mtu(self):
if (ipv6_utils.is_enabled() and
self.conf.network_device_mtu < n_const.IPV6_MIN_MTU):
LOG.error(_LE("IPv6 protocol requires a minimum MTU of "
"%(min_mtu)s, while the configured value is "
"%(current_mtu)s"), {'min_mtu': n_const.IPV6_MIN_MTU,
'current_mtu': self.conf.network_device_mtu})
raise SystemExit(1)
@property
def use_gateway_ips(self):
@ -352,7 +333,6 @@ class OVSInterfaceDriver(LinuxInterfaceDriver):
# the device is moved into a namespace, otherwise OVS bridge does not
# allow to set MTU that is higher than the least of all device MTUs on
# the bridge
mtu = self.conf.network_device_mtu or mtu
if mtu:
ns_dev.link.set_mtu(mtu)
if self.conf.ovs_use_veth:
@ -416,7 +396,6 @@ class IVSInterfaceDriver(LinuxInterfaceDriver):
ns_dev = ip.device(device_name)
ns_dev.link.set_address(mac_address)
mtu = self.conf.network_device_mtu or mtu
if mtu:
ns_dev.link.set_mtu(mtu)
root_dev.link.set_mtu(mtu)
@ -463,7 +442,6 @@ class BridgeInterfaceDriver(LinuxInterfaceDriver):
root_veth.disable_ipv6()
ns_veth.link.set_address(mac_address)
mtu = self.conf.network_device_mtu or mtu
if mtu:
root_veth.link.set_mtu(mtu)
ns_veth.link.set_mtu(mtu)

View File

@ -57,10 +57,6 @@ class TestDvrRouter(framework.L3AgentTestFramework):
self.agent.conf.agent_mode = 'dvr'
self._test_update_floatingip_statuses(self.generate_dvr_router_info())
def test_dvr_router_lifecycle_ha_with_snat_with_fips_nmtu(self):
self._dvr_router_lifecycle(enable_ha=True, enable_snat=True,
use_port_mtu=True)
def test_dvr_router_lifecycle_without_ha_without_snat_with_fips(self):
self._dvr_router_lifecycle(enable_ha=False, enable_snat=False)
@ -174,9 +170,7 @@ class TestDvrRouter(framework.L3AgentTestFramework):
self._validate_fips_for_external_network(router2, fip2_ns)
def _dvr_router_lifecycle(self, enable_ha=False, enable_snat=False,
custom_mtu=2000, use_port_mtu=False,
ip_version=4,
dual_stack=False):
custom_mtu=2000, ip_version=4, dual_stack=False):
'''Test dvr router lifecycle
:param enable_ha: sets the ha value for the router.
@ -192,15 +186,13 @@ class TestDvrRouter(framework.L3AgentTestFramework):
# We get the router info particular to a dvr router
router_info = self.generate_dvr_router_info(
enable_ha, enable_snat, extra_routes=True)
if use_port_mtu:
for key in ('_interfaces', '_snat_router_interfaces',
'_floatingip_agent_interfaces'):
for port in router_info[key]:
port['mtu'] = custom_mtu
router_info['gw_port']['mtu'] = custom_mtu
for key in ('_interfaces', '_snat_router_interfaces',
'_floatingip_agent_interfaces'):
for port in router_info[key]:
port['mtu'] = custom_mtu
router_info['gw_port']['mtu'] = custom_mtu
if enable_ha:
router_info['_ha_interface']['mtu'] = custom_mtu
else:
self.agent.conf.network_device_mtu = custom_mtu
# We need to mock the get_agent_gateway_port return value
# because the whole L3PluginApi is mocked and we need the port

View File

@ -224,6 +224,7 @@ class TestDvrFipNs(base.BaseTestCase):
ri.router_id = _uuid()
ri.rtr_fip_subnet = None
ri.ns_name = mock.sentinel.router_ns
ri.get_ex_gw_port.return_value = {'mtu': 2000}
rtr_2_fip_name = self.fip_ns.get_rtr_ext_device_name(ri.router_id)
fip_2_rtr_name = self.fip_ns.get_int_device_name(ri.router_id)
@ -234,7 +235,6 @@ class TestDvrFipNs(base.BaseTestCase):
allocator.allocate.return_value = pair
addr_pair = pair.get_pair()
ip_wrapper = IPWrapper()
self.conf.network_device_mtu = 2000
ip_wrapper.add_veth.return_value = (IPDevice(), IPDevice())
device = IPDevice()
device.exists.return_value = dev_exists

View File

@ -16,7 +16,6 @@
import mock
from neutron_lib import constants
from oslo_log import versionutils
import testtools
from neutron.agent.common import config
from neutron.agent.common import ovs_lib
@ -391,11 +390,9 @@ class TestOVSInterfaceDriver(TestBase):
'aa:bb:cc:dd:ee:ff',
internal=True)
def _test_plug(self, additional_expectation=None, bridge=None,
namespace=None):
def _test_plug(self, bridge=None, namespace=None):
with mock.patch('neutron.agent.ovsdb.native.connection.'
'Connection.start'):
additional_expectation = additional_expectation or []
if not bridge:
bridge = 'br-int'
@ -411,7 +408,8 @@ class TestOVSInterfaceDriver(TestBase):
'tap0',
'aa:bb:cc:dd:ee:ff',
bridge=bridge,
namespace=namespace)
namespace=namespace,
mtu=9000)
replace.assert_called_once_with(
'tap0',
('type', 'internal'),
@ -424,32 +422,18 @@ class TestOVSInterfaceDriver(TestBase):
mock.call(),
mock.call().device('tap0'),
mock.call().device().link.set_address('aa:bb:cc:dd:ee:ff')]
expected.extend(additional_expectation)
if namespace:
expected.extend(
[mock.call().ensure_namespace(namespace),
mock.call().ensure_namespace().add_device_to_namespace(
mock.ANY)])
expected.extend([mock.call().device().link.set_up()])
expected.extend([
mock.call().device().link.set_mtu(9000),
mock.call().device().link.set_up(),
])
self.ip.assert_has_calls(expected)
def test_mtu_int(self):
self.assertIsNone(self.conf.network_device_mtu)
self.conf.set_override('network_device_mtu', 9000)
self.assertEqual(self.conf.network_device_mtu, 9000)
def test_validate_min_ipv6_mtu(self):
self.conf.set_override('network_device_mtu', 1200)
with mock.patch('neutron.common.ipv6_utils.is_enabled') as ipv6_status:
with testtools.ExpectedException(SystemExit):
ipv6_status.return_value = True
BaseChild(self.conf)
def test_plug_mtu(self):
self.conf.set_override('network_device_mtu', 9000)
self._test_plug([mock.call().device().link.set_mtu(9000)])
def test_unplug(self, bridge=None):
if not bridge:
bridge = 'br-int'
@ -475,7 +459,7 @@ class TestOVSInterfaceDriverWithVeth(TestOVSInterfaceDriver):
self._test_plug(devname='qr-0', prefix='qr-')
def _test_plug(self, devname=None, bridge=None, namespace=None,
prefix=None, mtu=None):
prefix=None):
with mock.patch('neutron.agent.ovsdb.native.connection.'
'Connection.start'):
@ -505,7 +489,8 @@ class TestOVSInterfaceDriverWithVeth(TestOVSInterfaceDriver):
'aa:bb:cc:dd:ee:ff',
bridge=bridge,
namespace=namespace,
prefix=prefix)
prefix=prefix,
mtu=9000)
replace.assert_called_once_with(
'tap0',
('external_ids', {
@ -515,18 +500,13 @@ class TestOVSInterfaceDriverWithVeth(TestOVSInterfaceDriver):
ns_dev.assert_has_calls(
[mock.call.link.set_address('aa:bb:cc:dd:ee:ff')])
if mtu:
ns_dev.assert_has_calls([mock.call.link.set_mtu(mtu)])
root_dev.assert_has_calls([mock.call.link.set_mtu(mtu)])
ns_dev.assert_has_calls([mock.call.link.set_mtu(9000)])
root_dev.assert_has_calls([mock.call.link.set_mtu(9000)])
self.ip.assert_has_calls(expected)
root_dev.assert_has_calls([mock.call.link.set_up()])
ns_dev.assert_has_calls([mock.call.link.set_up()])
def test_plug_mtu(self):
self.conf.set_override('network_device_mtu', 9000)
self._test_plug(mtu=9000)
def test_unplug(self, bridge=None):
if not bridge:
bridge = 'br-int'
@ -551,7 +531,7 @@ class TestBridgeInterfaceDriver(TestBase):
def test_plug_with_ns(self):
self._test_plug(namespace='01234567-1234-1234-99')
def _test_plug(self, namespace=None, mtu=None):
def _test_plug(self, namespace=None):
def device_exists(device, namespace=None):
return device.startswith('brq')
@ -567,14 +547,14 @@ class TestBridgeInterfaceDriver(TestBase):
'port-1234',
'ns-0',
mac_address,
namespace=namespace)
namespace=namespace,
mtu=9000)
ip_calls = [mock.call(),
mock.call().add_veth('tap0', 'ns-0', namespace2=namespace)]
ns_veth.assert_has_calls([mock.call.link.set_address(mac_address)])
if mtu:
ns_veth.assert_has_calls([mock.call.link.set_mtu(mtu)])
root_veth.assert_has_calls([mock.call.link.set_mtu(mtu)])
ns_veth.assert_has_calls([mock.call.link.set_mtu(9000)])
root_veth.assert_has_calls([mock.call.link.set_mtu(9000)])
self.ip.assert_has_calls(ip_calls)
@ -592,11 +572,6 @@ class TestBridgeInterfaceDriver(TestBase):
self.assertFalse(self.ip_dev.called)
self.assertEqual(log.call_count, 1)
def test_plug_mtu(self):
self.device_exists.return_value = False
self.conf.set_override('network_device_mtu', 9000)
self._test_plug(mtu=9000)
def test_unplug_no_device(self):
self.device_exists.return_value = False
self.ip_dev().link.delete.side_effect = RuntimeError
@ -630,8 +605,7 @@ class TestIVSInterfaceDriver(TestBase):
def test_plug_with_prefix(self):
self._test_plug(devname='qr-0', prefix='qr-')
def _test_plug(self, devname=None, namespace=None,
prefix=None, mtu=None):
def _test_plug(self, devname=None, namespace=None, prefix=None):
if not devname:
devname = 'ns-0'
@ -658,14 +632,14 @@ class TestIVSInterfaceDriver(TestBase):
devname,
'aa:bb:cc:dd:ee:ff',
namespace=namespace,
prefix=prefix)
prefix=prefix,
mtu=9000)
execute.assert_called_once_with(ivsctl_cmd, run_as_root=True)
ns_dev.assert_has_calls(
[mock.call.link.set_address('aa:bb:cc:dd:ee:ff')])
if mtu:
ns_dev.assert_has_calls([mock.call.link.set_mtu(mtu)])
root_dev.assert_has_calls([mock.call.link.set_mtu(mtu)])
ns_dev.assert_has_calls([mock.call.link.set_mtu(9000)])
root_dev.assert_has_calls([mock.call.link.set_mtu(9000)])
if namespace:
expected.extend(
[mock.call().ensure_namespace(namespace),
@ -676,10 +650,6 @@ class TestIVSInterfaceDriver(TestBase):
root_dev.assert_has_calls([mock.call.link.set_up()])
ns_dev.assert_has_calls([mock.call.link.set_up()])
def test_plug_mtu(self):
self.conf.set_override('network_device_mtu', 9000)
self._test_plug(mtu=9000)
def test_plug_namespace(self):
self._test_plug(namespace='mynamespace')

View File

@ -0,0 +1,8 @@
---
upgrade:
- The network_device_mtu option is removed. Existing
users of the option are advised to adopt new
configuration options to accommodate for their
underlying physical infrastructure. The relevant
options are global_physnet_mtu for all plugins,
and also path_mtu and physical_network_mtus for ML2.