Merge lp:~ltrager/maas/fix_xenial_net_detect-1.9 into lp:maas/1.9

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: no longer in the source branch.
Merged at revision: 4514
Proposed branch: lp:~ltrager/maas/fix_xenial_net_detect-1.9
Merge into: lp:maas/1.9
Diff against target: 121 lines (+28/-14)
3 files modified
src/provisioningserver/network.py (+1/-0)
src/provisioningserver/utils/ipaddr.py (+2/-5)
src/provisioningserver/utils/tests/test_ipaddr.py (+25/-9)
To merge this branch: bzr merge lp:~ltrager/maas/fix_xenial_net_detect-1.9
Reviewer Review Type Date Requested Status
Lee Trager (community) Approve
Review via email: mp+278664@code.launchpad.net

Commit message

Backport from trunk: Fix cluster controller networking auto detection

* Don't require that a valid NIC has a kernel module loaded
* When falling back to scanning ip addr for devices look for network devices which follow the preedictable network interface names standard.

To post a comment you must log in.
Revision history for this message
Lee Trager (ltrager) wrote :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/provisioningserver/network.py'
2--- src/provisioningserver/network.py 2015-10-23 21:26:12 +0000
3+++ src/provisioningserver/network.py 2015-11-26 01:38:29 +0000
4@@ -163,6 +163,7 @@
5 for network in networks
6 if 'interface' in network and
7 (network['interface'].startswith('eth') or
8+ network['interface'].startswith('en') or
9 network['interface'].startswith('em') or
10 network['interface'].startswith('vlan') or
11 network['interface'].startswith('bond'))
12
13=== modified file 'src/provisioningserver/utils/ipaddr.py'
14--- src/provisioningserver/utils/ipaddr.py 2015-10-23 10:28:17 +0000
15+++ src/provisioningserver/utils/ipaddr.py 2015-11-26 01:38:29 +0000
16@@ -281,11 +281,8 @@
17 return 'ethernet.bond'
18 if os.path.isfile('%s/%s' % (proc_net_vlan, ifname)):
19 return 'ethernet.vlan'
20- module_name_link = os.path.join(sys_path, 'device', 'driver', 'module')
21- if not os.path.islink(module_name_link):
22- return 'ethernet'
23- module_name = os.readlink(module_name_link).split('/')[-1]
24- if module_name:
25+ device_path = os.path.join(sys_path, 'device')
26+ if os.path.islink(device_path):
27 device_80211 = os.path.join(sys_path, 'device', 'ieee80211')
28 if os.path.isdir(device_80211):
29 return 'ethernet.wireless'
30
31=== modified file 'src/provisioningserver/utils/tests/test_ipaddr.py'
32--- src/provisioningserver/utils/tests/test_ipaddr.py 2015-10-23 10:28:17 +0000
33+++ src/provisioningserver/utils/tests/test_ipaddr.py 2015-11-26 01:38:29 +0000
34@@ -349,13 +349,9 @@
35 f.write(b"%s\n" % ' '.join(bonded_interfaces).encode('utf-8'))
36 f.close()
37 if is_physical or is_wireless:
38- os.mkdir(os.path.join(ifdir, 'device'))
39- os.mkdir(os.path.join(ifdir, 'device', 'driver'))
40- # Note: the symlink here doesn't actually need to resolve
41- # to a real file.
42- os.symlink(
43- os.path.join('..', 'driver_module_name'),
44- os.path.join(ifdir, 'device', 'driver', 'module'))
45+ device_real = os.path.join(ifdir, 'device.real')
46+ os.mkdir(device_real)
47+ os.symlink(device_real, os.path.join(ifdir, 'device'))
48 if is_wireless:
49 os.mkdir(os.path.join(ifdir, 'device', 'ieee80211'))
50
51@@ -480,6 +476,10 @@
52
53 def test__filters_based_on_name_by_default(self):
54 input_networks = [
55+ {"interface": "eno1"},
56+ {"interface": "ens3"},
57+ {"interface": "enp0s25"},
58+ {"interface": "enx78e7d1ea46da"},
59 {"interface": "em0"},
60 {"interface": "eth0"},
61 {"interface": "vlan0"},
62@@ -490,6 +490,10 @@
63 ]
64 actual_networks = filter_and_annotate_networks(input_networks)
65 expected_networks = [
66+ {"interface": "eno1"},
67+ {"interface": "ens3"},
68+ {"interface": "enp0s25"},
69+ {"interface": "enx78e7d1ea46da"},
70 {"interface": "em0"},
71 {"interface": "eth0"},
72 {"interface": "vlan0"},
73@@ -499,6 +503,10 @@
74
75 def test__filters_and_annotates_based_on_json_data_if_available(self):
76 input_networks = [
77+ {"interface": "eno1"},
78+ {"interface": "ens3"},
79+ {"interface": "enp0s25"},
80+ {"interface": "enx78e7d1ea46da"},
81 {"interface": "em0"},
82 {"interface": "eth0"},
83 {"interface": "vlan0"},
84@@ -521,7 +529,7 @@
85 "bridged_interfaces": ["avian0"]},
86 "br3": {"type": "ethernet.bridge"},
87 "wlan0": {"type": "ethernet.bond",
88- "bonded_interfaces": ["em0", "eth0"]}
89+ "bonded_interfaces": ["eno1", "eth0"]}
90 }
91 actual_networks = filter_and_annotate_networks(
92 input_networks, json.dumps(input_json))
93@@ -533,12 +541,16 @@
94 "bridged_interfaces": "avian0"},
95 {"interface": "br3", 'type': "ethernet.bridge"},
96 {"interface": "wlan0", 'type': "ethernet.bond",
97- "bonded_interfaces": "em0 eth0"},
98+ "bonded_interfaces": "eno1 eth0"},
99 ]
100 self.assertThat(actual_networks, Equals(expected_networks))
101
102 def test__falls_back_to_names_if_no_interfaces_found(self):
103 input_networks = [
104+ {"interface": "eno1"},
105+ {"interface": "ens3"},
106+ {"interface": "enp0s25"},
107+ {"interface": "enx78e7d1ea46da"},
108 {"interface": "em0"},
109 {"interface": "eth0"},
110 {"interface": "vlan0"},
111@@ -552,6 +564,10 @@
112 actual_networks = filter_and_annotate_networks(
113 input_networks, json.dumps(input_json))
114 expected_networks = [
115+ {"interface": "eno1"},
116+ {"interface": "ens3"},
117+ {"interface": "enp0s25"},
118+ {"interface": "enx78e7d1ea46da"},
119 {"interface": "em0"},
120 {"interface": "eth0"},
121 {"interface": "vlan0"},

Subscribers

People subscribed via source and target branches