Merge lp:~mpontillo/maas/bug-1508695 into lp:~maas-committers/maas/trunk

Proposed by Mike Pontillo
Status: Merged
Approved by: Mike Pontillo
Approved revision: no longer in the source branch.
Merged at revision: 4398
Proposed branch: lp:~mpontillo/maas/bug-1508695
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 93 lines (+33/-12)
2 files modified
src/provisioningserver/utils/ipaddr.py (+7/-6)
src/provisioningserver/utils/tests/test_ipaddr.py (+26/-6)
To merge this branch: bzr merge lp:~mpontillo/maas/bug-1508695
Reviewer Review Type Date Requested Status
Andres Rodriguez (community) Approve
Review via email: mp+275260@code.launchpad.net

Commit message

Simplify logic for handling key/value pairs when parsing 'ip addr'.

Remove assert and make the parser more robust, so that it won't crash if it encounters something unexpected.

Description of the change

This is a follow-on to LaMont's branch here:

https://code.launchpad.net/~lamont/maas/bug-1508695

It simplifies the parser due to some follow-on issues that were encountered.

To post a comment you must log in.
Revision history for this message
Andres Rodriguez (andreserl) wrote :

lgtm!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/provisioningserver/utils/ipaddr.py'
--- src/provisioningserver/utils/ipaddr.py 2015-10-21 18:38:54 +0000
+++ src/provisioningserver/utils/ipaddr.py 2015-10-22 00:52:03 +0000
@@ -81,11 +81,12 @@
81 :return: dict81 :return: dict
82 """82 """
83 settings = settings_line.strip().split()83 settings = settings_line.strip().split()
84 if len(settings) > 0 and settings[0] == "inet":84 # Some of the tokens on this line aren't key/value pairs, but we don't
85 # care about those, so strip them off if we see an odd number.
86 # This will avoid an index out of bounds error below.
87 num_tokens = len(settings)
88 if num_tokens % 2 != 0:
85 settings = settings[:-1]89 settings = settings[:-1]
86 num_tokens = len(settings)
87 assert num_tokens % 2 == 0, \
88 "Unexpected number of params in '%s'" % settings_line
89 return {90 return {
90 settings[2 * i]: settings[2 * i + 1] for i in range(num_tokens / 2)91 settings[2 * i]: settings[2 * i + 1] for i in range(num_tokens / 2)
91 }92 }
@@ -137,8 +138,8 @@
137 mac = settings.get('link/ether')138 mac = settings.get('link/ether')
138 if mac is not None:139 if mac is not None:
139 interface['mac'] = mac140 interface['mac'] = mac
140 cumul_settings = ['inet', 'inet6']141 address_types = ['inet', 'inet6']
141 for name in cumul_settings:142 for name in address_types:
142 value = settings.get(name)143 value = settings.get(name)
143 if value is not None:144 if value is not None:
144 if not IPNetwork(value).is_link_local():145 if not IPNetwork(value).is_link_local():
145146
=== modified file 'src/provisioningserver/utils/tests/test_ipaddr.py'
--- src/provisioningserver/utils/tests/test_ipaddr.py 2015-10-21 18:38:54 +0000
+++ src/provisioningserver/utils/tests/test_ipaddr.py 2015-10-22 00:52:03 +0000
@@ -43,11 +43,10 @@
43 settings = _get_settings_dict("")43 settings = _get_settings_dict("")
44 self.assertEqual({}, settings)44 self.assertEqual({}, settings)
4545
46 def test_get_settings_dict_asserts_for_odd_number_of_tokens(self):46 def test_get_settings_dict_handles_odd_number_of_tokens(self):
47 with ExpectedException(AssertionError):47 self.assertThat(_get_settings_dict("mtu"), Equals({}))
48 _get_settings_dict("mtu")48 self.assertThat(
49 with ExpectedException(AssertionError):49 _get_settings_dict("mtu 1500 qdisc"), Equals({"mtu": "1500"}))
50 _get_settings_dict("mtu 1500 qdisc")
5150
52 def test_get_settings_dict_creates_correct_dictionary(self):51 def test_get_settings_dict_creates_correct_dictionary(self):
53 settings = _get_settings_dict("mtu 1073741824 state AWESOME")52 settings = _get_settings_dict("mtu 1073741824 state AWESOME")
@@ -260,6 +259,20 @@
260 ip_link = parse_ip_addr(testdata)259 ip_link = parse_ip_addr(testdata)
261 self.assertIsNone(ip_link['eth0'].get('inet6'))260 self.assertIsNone(ip_link['eth0'].get('inet6'))
262261
262 def test_handles_wlan_flags(self):
263 testdata = dedent("""
264 2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast \
265state UP mode DEFAULT group default qlen 1000
266 link/ether 80:fa:5c:0d:43:5e brd ff:ff:ff:ff:ff:ff
267 inet6 fe80::3e97:eff:fe0e:56dc/64 scope link
268 valid_lft forever preferred_lft forever
269 inet 192.168.2.112/24 brd 192.168.2.255 scope global dynamic wlan0
270 valid_lft forever preferred_lft forever
271 """)
272 ip_link = parse_ip_addr(testdata)
273 inet = ip_link['wlan0'].get('inet')
274 self.assertEqual(['192.168.2.112/24'], inet)
275
263 def test_parses_multiple_interfaces(self):276 def test_parses_multiple_interfaces(self):
264 testdata = dedent("""277 testdata = dedent("""
265 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast \278 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast \
@@ -276,6 +289,10 @@
276 valid_lft forever preferred_lft forever289 valid_lft forever preferred_lft forever
277 inet6 2001:db8:85a3:8d3:1319:8a2e:370:7348/64 scope link290 inet6 2001:db8:85a3:8d3:1319:8a2e:370:7348/64 scope link
278 valid_lft forever preferred_lft forever291 valid_lft forever preferred_lft forever
292 inet6 2001:db8:85a3:8d3:1319:8a2e:370:3645/64 scope global dynamic
293 valid_lft forever preferred_lft forever
294 inet6 2001:db8:85a3:8d3::1111/64 scope global tentative dynamic
295 valid_lft forever preferred_lft forever
279 inet6 2620:1:260::1/64 scope global296 inet6 2620:1:260::1/64 scope global
280 valid_lft forever preferred_lft forever297 valid_lft forever preferred_lft forever
281 """)298 """)
@@ -290,7 +307,10 @@
290 self.assertEquals('48:51:bb:7a:d5:e2', ip_link['eth1']['mac'])307 self.assertEquals('48:51:bb:7a:d5:e2', ip_link['eth1']['mac'])
291 self.assertEquals(['192.168.0.5/24'], ip_link['eth1']['inet'])308 self.assertEquals(['192.168.0.5/24'], ip_link['eth1']['inet'])
292 self.assertEquals(309 self.assertEquals(
293 ['2001:db8:85a3:8d3:1319:8a2e:370:7348/64', '2620:1:260::1/64'],310 ['2001:db8:85a3:8d3:1319:8a2e:370:7348/64',
311 '2001:db8:85a3:8d3:1319:8a2e:370:3645/64',
312 '2001:db8:85a3:8d3::1111/64',
313 '2620:1:260::1/64'],
294 ip_link['eth1']['inet6'])314 ip_link['eth1']['inet6'])
295315
296316