Skip to content

Commit 8adc4e8

Browse files
committed
Implement MTU discovery
1 parent 8575120 commit 8adc4e8

File tree

5 files changed

+38
-42
lines changed

5 files changed

+38
-42
lines changed

pynetlib/device.py

+12-13
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def __init__(self, id, name, flags=[], namespace=None):
1212
self.state = None
1313
self.inet = []
1414
self.inet6 = []
15+
self.mtu = None
1516

1617
def is_loopback(self):
1718
return 'LOOPBACK' in self.flags
@@ -54,32 +55,30 @@ def disable(self):
5455
self.refresh()
5556

5657
def refresh(self):
57-
output = execute_command('ip addr show %s' % self.name, namespace=self.namespace)
58-
device_infos = get_devices_info(output)
59-
if len(device_infos) != 1:
60-
raise Exception('Only one device can be named %s inside the same namespace' % self.name)
61-
id, name, flags, state, inet, inet6 = device_infos[0]
62-
self.id = id
63-
self.name = name
64-
self.flags = flags
65-
self.state = state
66-
self.inet = inet
67-
self.inet6 = inet6
58+
devices = Device.discover(namespace=self.namespace)
59+
if self not in devices:
60+
raise ObjectNotFoundException(self)
61+
found = devices[devices.index(self)]
62+
self.flags = found.flags
63+
self.inet = found.inet
64+
self.inet6 = found.inet6
65+
self.mtu = found.mtu
6866

6967
@staticmethod
7068
def discover(namespace=None):
7169
devices = []
7270
output = execute_command('ip addr list', namespace=namespace)
73-
for id, name, flags, state, inet, inet6 in get_devices_info(output):
71+
for id, name, flags, state, inet, inet6, mtu in get_devices_info(output):
7472
device = Device(id, name, flags=flags, namespace=namespace)
7573
device.state = state
7674
device.inet = inet
7775
device.inet6 = inet6
76+
device.mtu = mtu
7877
devices.append(device)
7978
return devices
8079

8180
def __eq__(self, other):
8281
return self.name == other.name and self.id == other.id
8382

8483
def __repr__(self):
85-
return '<' + ','.join([self.id, self.name, str(self.inet), str(self.inet6)]) + '>'
84+
return '<' + ','.join([self.id, self.name, str(self.inet), str(self.inet6), str(self.mtu)]) + '>'

pynetlib/tests/fixtures/ip_addr_show

-6
This file was deleted.

pynetlib/tests/test_device.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ class TestDevice(unittest.TestCase):
1313

1414
def setUp(self):
1515
self.ip_addr_list_output = read_file('ip_addr_list')
16-
self.ip_addr_show_output = read_file('ip_addr_show')
1716

1817
def test_init_device(self):
1918
id = '1'
@@ -25,6 +24,7 @@ def test_init_device(self):
2524
self.assertEqual(dev.inet, [])
2625
self.assertEqual(dev.inet6, [])
2726
self.assertIsNone(dev.state)
27+
self.assertIsNone(dev.mtu)
2828

2929
def test_init_loopback(self):
3030
id = '1'
@@ -206,17 +206,25 @@ def test_disable_down_device(self, execute_command):
206206

207207
@mock.patch('pynetlib.device.execute_command')
208208
def test_refresh_device(self, execute_command):
209-
execute_command.return_value = self.ip_addr_show_output
210-
device = Device('1', 'eth0', flags=[])
209+
execute_command.return_value = self.ip_addr_list_output
210+
device = Device('2', 'eth0', flags=[])
211211
device.refresh()
212-
execute_command.assert_called_once_with("ip addr show eth0", namespace=None)
212+
execute_command.assert_called_once_with("ip addr list", namespace=None)
213213
self.assertEqual(device.id, '2')
214214
self.assertEqual(device.name, "eth0")
215215
self.assertEqual(device.flags, ['BROADCAST', 'MULTICAST', 'UP', 'LOWER_UP'])
216-
self.assertEqual(device.inet, ['10.0.2.15/24'])
216+
self.assertEqual(device.inet, ['10.0.2.15/24', '10.0.2.16/24'])
217217
self.assertEqual(device.inet6, ['fe80::a00:27ff:feea:67cf/64'])
218+
self.assertEqual(device.mtu, '1500')
218219
self.assertIsNone(device.namespace)
219220

221+
@mock.patch('pynetlib.device.execute_command')
222+
def test_refresh_non_existing_device(self, execute_command):
223+
execute_command.return_value = self.ip_addr_list_output
224+
device = Device('id', 'device', flags=[])
225+
with self.assertRaises(ObjectNotFoundException):
226+
device.refresh()
227+
execute_command.assert_called_once_with("ip addr list", namespace=None)
220228

221229
if __name__ == '__main__':
222230
unittest.main()

pynetlib/tests/test_utils.py

+11-17
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import unittest
44
from pynetlib.utils import execute_command, find_values_or_default_value
55
from pynetlib.namespace import Namespace
6-
from pynetlib.exceptions import ValueNotFoundException
6+
from nose_parameterized import parameterized
77

88

99
class TestUtils(unittest.TestCase):
@@ -36,22 +36,16 @@ def test_find_values(self):
3636
value = find_values_or_default_value(values, 'key', single=True)
3737
self.assertEqual(value, 'value')
3838

39-
def test_find_values_non_existing_key(self):
40-
values = 'key value'
41-
value = find_values_or_default_value(values, 'test', single=True)
42-
self.assertIsNone(value)
43-
44-
def test_find_values_non_existing_value(self):
45-
values = 'key'
46-
value = find_values_or_default_value(values, 'key', single=True)
47-
self.assertIsNone(value)
48-
49-
def test_find_values_two_values(self):
50-
values = 'key value key other'
51-
values = find_values_or_default_value(values, 'key')
52-
self.assertEqual(len(values), 2)
53-
self.assertTrue('value' in values)
54-
self.assertTrue('other' in values)
39+
@parameterized.expand([
40+
('key value', 'key', True, None, 'value'),
41+
('', 'test', True, 'value', 'value'),
42+
('key', 'key', True, None, None),
43+
('key', 'key', True, 'test', 'test'),
44+
('key value1 key value2', 'key', False, None, ['value1', 'value2'])
45+
])
46+
def test_find_values_or_default_value(self, values, key, single, default, expected):
47+
value = find_values_or_default_value(values, key, single=single, default_value=default)
48+
self.assertEqual(value, expected)
5549

5650

5751
if __name__ == '__main__':

pynetlib/utils.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ def get_devices_info(output):
2323
state = find_values_or_default_value(block, 'state', single=True, default_value='UNKNOWN')
2424
inet = find_values_or_default_value(block, 'inet', default_value=[])
2525
inet6 = find_values_or_default_value(block, 'inet6', default_value=[])
26-
devices.append((id, name, flags, state, inet, inet6))
26+
mtu = find_values_or_default_value(block, 'mtu', default_value=None, single=True)
27+
devices.append((id, name, flags, state, inet, inet6, mtu))
2728
return devices
2829

2930

0 commit comments

Comments
 (0)