From e34a085f7a524747dd93e9645c6e0e69631075d4 Mon Sep 17 00:00:00 2001 From: Gary Kotton Date: Sun, 15 Dec 2013 01:11:08 -0800 Subject: [PATCH] Ensure MTU is set when the OVS vif driver is used Set the MTU on the relevant devices when the OVS vif driver is used: - veth devices - ovs vif device Change-Id: I217f43227c099f17ab9a225b1ef7377d3de28114 Closes-bug: 1260697 --- nova/network/linux_net.py | 11 +++- nova/tests/network/test_linux_net.py | 79 ++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index c577af5359fa..9f53edb099b6 100644 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -1275,6 +1275,10 @@ def _create_veth_pair(dev1_name, dev2_name): utils.execute('ip', 'link', 'set', dev, 'up', run_as_root=True) utils.execute('ip', 'link', 'set', dev, 'promisc', 'on', run_as_root=True) + if CONF.network_device_mtu: + utils.execute('ip', 'link', 'set', dev, 'mtu', + CONF.network_device_mtu, run_as_root=True, + check_exit_code=[0, 2, 254]) def _ovs_vsctl(args): @@ -1295,6 +1299,10 @@ def create_ovs_vif_port(bridge, dev, iface_id, mac, instance_id): 'external-ids:iface-status=active', 'external-ids:attached-mac=%s' % mac, 'external-ids:vm-uuid=%s' % instance_id]) + if CONF.network_device_mtu: + utils.execute('ip', 'link', 'set', dev, 'mtu', + CONF.network_device_mtu, run_as_root=True, + check_exit_code=[0, 2, 254]) def delete_ovs_vif_port(bridge, dev): @@ -1725,7 +1733,8 @@ class LinuxOVSInterfaceDriver(LinuxNetInterfaceDriver): run_as_root=True) if CONF.network_device_mtu: _execute('ip', 'link', 'set', dev, 'mtu', - CONF.network_device_mtu, run_as_root=True) + CONF.network_device_mtu, run_as_root=True, + check_exit_code=[0, 2, 254]) _execute('ip', 'link', 'set', dev, 'up', run_as_root=True) if not gateway: # If we weren't instructed to act as a gateway then add the diff --git a/nova/tests/network/test_linux_net.py b/nova/tests/network/test_linux_net.py index f95b7ef8c3a2..dab47a1ff868 100644 --- a/nova/tests/network/test_linux_net.py +++ b/nova/tests/network/test_linux_net.py @@ -986,3 +986,82 @@ class LinuxNetworkTestCase(test.NoDBTestCase): driver.ensure_bridge('bridge', 'eth0') device_exists.assert_has_calls(calls['device_exists']) _execute.assert_has_calls(calls['_execute']) + + def _ovs_vif_port(self, calls): + with mock.patch.object(utils, 'execute', return_value=('', '')) as ex: + linux_net.create_ovs_vif_port('fake-bridge', 'fake-dev', + 'fake-iface-id', 'fake-mac', + 'fake-instance-uuid') + ex.assert_has_calls(calls) + + def test_ovs_vif_port(self): + calls = [ + mock.call('ovs-vsctl', '--timeout=120', '--', '--may-exist', + 'add-port', 'fake-bridge', 'fake-dev', + '--', 'set', 'Interface', 'fake-dev', + 'external-ids:iface-id=fake-iface-id', + 'external-ids:iface-status=active', + 'external-ids:attached-mac=fake-mac', + 'external-ids:vm-uuid=fake-instance-uuid', + run_as_root=True) + ] + self._ovs_vif_port(calls) + + def test_ovs_vif_port_with_mtu(self): + self.flags(network_device_mtu=10000) + calls = [ + mock.call('ovs-vsctl', '--timeout=120', '--', '--may-exist', + 'add-port', 'fake-bridge', 'fake-dev', + '--', 'set', 'Interface', 'fake-dev', + 'external-ids:iface-id=fake-iface-id', + 'external-ids:iface-status=active', + 'external-ids:attached-mac=fake-mac', + 'external-ids:vm-uuid=fake-instance-uuid', + run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev', 'mtu', + 10000, run_as_root=True, + check_exit_code=[0, 2, 254]) + ] + self._ovs_vif_port(calls) + + def _create_veth_pair(self, calls): + with mock.patch.object(utils, 'execute', return_value=('', '')) as ex: + linux_net._create_veth_pair('fake-dev1', 'fake-dev2') + ex.assert_has_calls(calls) + + def test_create_veth_pair(self): + calls = [ + mock.call('ip', 'link', 'add', 'fake-dev1', 'type', 'veth', + 'peer', 'name', 'fake-dev2', run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev1', 'up', + run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev1', 'promisc', 'on', + run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev2', 'up', + run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev2', 'promisc', 'on', + run_as_root=True) + ] + self._create_veth_pair(calls) + + def test_create_veth_pair_with_mtu(self): + self.flags(network_device_mtu=10000) + calls = [ + mock.call('ip', 'link', 'add', 'fake-dev1', 'type', 'veth', + 'peer', 'name', 'fake-dev2', run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev1', 'up', + run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev1', 'promisc', 'on', + run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev1', 'mtu', + 10000, run_as_root=True, + check_exit_code=[0, 2, 254]), + mock.call('ip', 'link', 'set', 'fake-dev2', 'up', + run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev2', 'promisc', 'on', + run_as_root=True), + mock.call('ip', 'link', 'set', 'fake-dev2', 'mtu', + 10000, run_as_root=True, + check_exit_code=[0, 2, 254]) + ] + self._create_veth_pair(calls)