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
1=== modified file 'src/provisioningserver/utils/ipaddr.py'
2--- src/provisioningserver/utils/ipaddr.py 2015-10-21 18:38:54 +0000
3+++ src/provisioningserver/utils/ipaddr.py 2015-10-22 00:52:03 +0000
4@@ -81,11 +81,12 @@
5 :return: dict
6 """
7 settings = settings_line.strip().split()
8- if len(settings) > 0 and settings[0] == "inet":
9+ # Some of the tokens on this line aren't key/value pairs, but we don't
10+ # care about those, so strip them off if we see an odd number.
11+ # This will avoid an index out of bounds error below.
12+ num_tokens = len(settings)
13+ if num_tokens % 2 != 0:
14 settings = settings[:-1]
15- num_tokens = len(settings)
16- assert num_tokens % 2 == 0, \
17- "Unexpected number of params in '%s'" % settings_line
18 return {
19 settings[2 * i]: settings[2 * i + 1] for i in range(num_tokens / 2)
20 }
21@@ -137,8 +138,8 @@
22 mac = settings.get('link/ether')
23 if mac is not None:
24 interface['mac'] = mac
25- cumul_settings = ['inet', 'inet6']
26- for name in cumul_settings:
27+ address_types = ['inet', 'inet6']
28+ for name in address_types:
29 value = settings.get(name)
30 if value is not None:
31 if not IPNetwork(value).is_link_local():
32
33=== modified file 'src/provisioningserver/utils/tests/test_ipaddr.py'
34--- src/provisioningserver/utils/tests/test_ipaddr.py 2015-10-21 18:38:54 +0000
35+++ src/provisioningserver/utils/tests/test_ipaddr.py 2015-10-22 00:52:03 +0000
36@@ -43,11 +43,10 @@
37 settings = _get_settings_dict("")
38 self.assertEqual({}, settings)
39
40- def test_get_settings_dict_asserts_for_odd_number_of_tokens(self):
41- with ExpectedException(AssertionError):
42- _get_settings_dict("mtu")
43- with ExpectedException(AssertionError):
44- _get_settings_dict("mtu 1500 qdisc")
45+ def test_get_settings_dict_handles_odd_number_of_tokens(self):
46+ self.assertThat(_get_settings_dict("mtu"), Equals({}))
47+ self.assertThat(
48+ _get_settings_dict("mtu 1500 qdisc"), Equals({"mtu": "1500"}))
49
50 def test_get_settings_dict_creates_correct_dictionary(self):
51 settings = _get_settings_dict("mtu 1073741824 state AWESOME")
52@@ -260,6 +259,20 @@
53 ip_link = parse_ip_addr(testdata)
54 self.assertIsNone(ip_link['eth0'].get('inet6'))
55
56+ def test_handles_wlan_flags(self):
57+ testdata = dedent("""
58+ 2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast \
59+state UP mode DEFAULT group default qlen 1000
60+ link/ether 80:fa:5c:0d:43:5e brd ff:ff:ff:ff:ff:ff
61+ inet6 fe80::3e97:eff:fe0e:56dc/64 scope link
62+ valid_lft forever preferred_lft forever
63+ inet 192.168.2.112/24 brd 192.168.2.255 scope global dynamic wlan0
64+ valid_lft forever preferred_lft forever
65+ """)
66+ ip_link = parse_ip_addr(testdata)
67+ inet = ip_link['wlan0'].get('inet')
68+ self.assertEqual(['192.168.2.112/24'], inet)
69+
70 def test_parses_multiple_interfaces(self):
71 testdata = dedent("""
72 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast \
73@@ -276,6 +289,10 @@
74 valid_lft forever preferred_lft forever
75 inet6 2001:db8:85a3:8d3:1319:8a2e:370:7348/64 scope link
76 valid_lft forever preferred_lft forever
77+ inet6 2001:db8:85a3:8d3:1319:8a2e:370:3645/64 scope global dynamic
78+ valid_lft forever preferred_lft forever
79+ inet6 2001:db8:85a3:8d3::1111/64 scope global tentative dynamic
80+ valid_lft forever preferred_lft forever
81 inet6 2620:1:260::1/64 scope global
82 valid_lft forever preferred_lft forever
83 """)
84@@ -290,7 +307,10 @@
85 self.assertEquals('48:51:bb:7a:d5:e2', ip_link['eth1']['mac'])
86 self.assertEquals(['192.168.0.5/24'], ip_link['eth1']['inet'])
87 self.assertEquals(
88- ['2001:db8:85a3:8d3:1319:8a2e:370:7348/64', '2620:1:260::1/64'],
89+ ['2001:db8:85a3:8d3:1319:8a2e:370:7348/64',
90+ '2001:db8:85a3:8d3:1319:8a2e:370:3645/64',
91+ '2001:db8:85a3:8d3::1111/64',
92+ '2620:1:260::1/64'],
93 ip_link['eth1']['inet6'])
94
95