Merge ~jocave/plainbox-provider-resource:net-if-mgmt-master-mode into plainbox-provider-resource:master

Proposed by Jonathan Cave
Status: Merged
Approved by: Jonathan Cave
Approved revision: c92db09904ab1b9cd0f047602390ae13aa779508
Merged at revision: b5faa49df57d7bbdf6b913d16003a4cd998aa36a
Proposed branch: ~jocave/plainbox-provider-resource:net-if-mgmt-master-mode
Merge into: plainbox-provider-resource:master
Diff against target: 210 lines (+80/-23)
2 files modified
bin/net_if_management.py (+58/-12)
tests/test_net_if_management.py (+22/-11)
Reviewer Review Type Date Requested Status
Kristin Chuang (community) Approve
Review via email: mp+400444@code.launchpad.net

Description of the change

Extend the features of the net_if_management resource job to indicate what snap should be used to test the master mode function of wifi interfaces.

This will allow the NetworkManager master mode tests to be added to the existing master mode nested test plans.

To post a comment you must log in.
Revision history for this message
Kristin Chuang (kristinchuang) wrote :

+1
Along with https://code.launchpad.net/~jocave/plainbox-provider-checkbox/+git/plainbox-provider-checkbox/+merge/400446, the current logic works in the following trial runs:

* UC16 enablement project, wifi-AP & network-manager pre-installed
[Expected] wifi-ap jobs run (its pass/fail status unrelated to this MR), nmcli jobs skipped
[Actual] OK, see https://pastebin.canonical.com/p/GHVhyYxQJC/

* rpi 2b, stock rpi armhf UC20, network-manager manually installed
[Expected] wifi-ap jobs skipped, nmcli jobs run (its pass/fail status unrelated to this MR)
[Actual] OK, see https://pastebin.canonical.com/p/jkTc6KQw8c/

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/bin/net_if_management.py b/bin/net_if_management.py
2index b7daa9b..48fc453 100755
3--- a/bin/net_if_management.py
4+++ b/bin/net_if_management.py
5@@ -59,6 +59,10 @@ def is_netplan_available():
6 return which('netplan') is not None
7
8
9+def is_wifiap_available():
10+ return which('wifi-ap.config') is not None
11+
12+
13 class NmInterfaceState():
14
15 def __init__(self):
16@@ -80,13 +84,40 @@ class States(Enum):
17 nm = 'NetworkManager'
18
19
20+class MasterMode(Enum):
21+ na = 'not-applicable'
22+ unspecified = 'unspecified'
23+ error = 'error'
24+ wifiap = 'wifi-ap'
25+ nm = 'NetworkManager'
26+
27+
28 def identify_managers(interfaces=None,
29 has_netplan=True, netplan_yaml=None,
30- has_nm=True, nm_device_state=None):
31+ has_nm=True, nm_device_state=None,
32+ has_wifiap=False):
33+ results = {}
34 if interfaces is None:
35- interfaces = UdevInterfaceLister(['NETWORK', 'WIRELESS']).names
36-
37- results = dict.fromkeys(interfaces, States.unspecified)
38+ # normal operation
39+ wired = UdevInterfaceLister(['NETWORK']).names
40+ results.update(dict.fromkeys(wired, {
41+ 'manager': States.unspecified,
42+ 'mastermode': MasterMode.na
43+ }))
44+ wireless = UdevInterfaceLister(['WIRELESS']).names
45+ results.update(dict.fromkeys(wireless, {
46+ 'manager': States.unspecified,
47+ 'mastermode': MasterMode.unspecified
48+ }))
49+ else:
50+ # testing
51+ for i in interfaces:
52+ if i.startswith('e'):
53+ results[i] = {'manager': States.unspecified,
54+ 'mastermode': MasterMode.na}
55+ elif i.startswith('w'):
56+ results[i] = {'manager': States.unspecified,
57+ 'mastermode': MasterMode.unspecified}
58
59 if has_nm:
60 nm_conf = NmInterfaceState()
61@@ -113,6 +144,10 @@ def identify_managers(interfaces=None,
62 category_scope_manager = netplan_conf.ethernets.get(
63 'renderer', States.unspecified.value)
64
65+ if results[n]['mastermode'] != MasterMode.na and has_wifiap:
66+ log('has wifi-ap')
67+ results[n]['mastermode'] = MasterMode.wifiap
68+
69 # Netplan config indcates NM
70 if (global_scope_manager == States.nm.value or
71 category_scope_manager == States.nm.value or
72@@ -122,35 +157,46 @@ def identify_managers(interfaces=None,
73 if not has_nm:
74 log('error: netplan defines NM or there is no netplan, '
75 'but NM unavailable')
76- results[n] = States.error
77+ results[n]['manager'] = States.error
78 continue
79 # NM does not know the interface
80 if nm_conf.devices.get(n) is None:
81 log('error: netplan defines NM or there is no netplan, '
82 'but interface unknown to NM')
83- results[n] = States.error
84+ results[n]['manager'] = States.error
85 continue
86 # NM thinks it doesnt manage the device despite netplan config
87 if nm_conf.devices.get(n) == 'unmanaged':
88 log('error: netplan defines NM or there is no netplan, '
89 'but NM reports unmanaged')
90- results[n] = States.unspecified
91+ results[n]['manager'] = States.unspecified
92 continue
93- results[n] = States.nm
94+
95+ results[n]['manager'] = States.nm
96+
97+ # if NM is managing the interface for wireless connections and
98+ # wifi-ap is not installed, NM should be considered for managing
99+ # master mode
100+ if results[n]['mastermode'] != MasterMode.na and not has_wifiap:
101+ # version check?
102+ results[n]['mastermode'] = MasterMode.nm
103+
104 continue
105
106 # has netplan but no renderer specified
107 if has_netplan:
108- results[n] = States.networkd
109+ results[n]['manager'] = States.networkd
110 return results
111
112
113 def main():
114 results = identify_managers(has_netplan=is_netplan_available(),
115- has_nm=is_nm_available())
116- for interface, state in results.items():
117+ has_nm=is_nm_available(),
118+ has_wifiap=is_wifiap_available())
119+ for interface, data in results.items():
120 print('device: {}'.format(interface))
121- print('managed_by: {}'.format(state.value))
122+ print('managed_by: {}'.format(data['manager'].value))
123+ print('master_mode_managed_by: {}'.format(data['mastermode'].value))
124 print()
125
126
127diff --git a/tests/test_net_if_management.py b/tests/test_net_if_management.py
128index 6aa07f1..fb74e31 100644
129--- a/tests/test_net_if_management.py
130+++ b/tests/test_net_if_management.py
131@@ -34,6 +34,7 @@ class NetIfMngrTest():
132
133 has_netplan = True
134 has_nm = True
135+ has_wifiap = False
136
137 @staticmethod
138 def get_text(filename):
139@@ -53,7 +54,8 @@ class NetIfMngrTest():
140 self.has_netplan,
141 self.netplan_yaml,
142 self.has_nm,
143- self.nm_device_state)
144+ self.nm_device_state,
145+ self.has_wifiap)
146
147
148 class Test_CARA_T(unittest.TestCase, NetIfMngrTest):
149@@ -68,10 +70,14 @@ class Test_CARA_T(unittest.TestCase, NetIfMngrTest):
150 nm_device_state = NetIfMngrTest.get_text('CARA_T_nmcli.txt')
151
152 def test(self):
153+ self.has_wifiap = True
154 res = self.get_results()
155- self.assertEqual(res['eth0'].value, 'NetworkManager')
156- self.assertEqual(res['eth1'].value, 'NetworkManager')
157- self.assertEqual(res['wlan0'].value, 'NetworkManager')
158+ self.assertEqual(res['eth0']['manager'].value, 'NetworkManager')
159+ self.assertEqual(res['eth0']['mastermode'].value, 'not-applicable')
160+ self.assertEqual(res['eth1']['manager'].value, 'NetworkManager')
161+ self.assertEqual(res['eth1']['mastermode'].value, 'not-applicable')
162+ self.assertEqual(res['wlan0']['manager'].value, 'NetworkManager')
163+ self.assertEqual(res['wlan0']['mastermode'].value, 'wifi-ap')
164
165
166 class Test_XENIAL_DESKTOP(unittest.TestCase, NetIfMngrTest):
167@@ -87,8 +93,10 @@ class Test_XENIAL_DESKTOP(unittest.TestCase, NetIfMngrTest):
168
169 def test(self):
170 res = self.get_results()
171- self.assertEqual(res['eth0'].value, 'NetworkManager')
172- self.assertEqual(res['wlan0'].value, 'NetworkManager')
173+ self.assertEqual(res['eth0']['manager'].value, 'NetworkManager')
174+ self.assertEqual(res['eth0']['mastermode'].value, 'not-applicable')
175+ self.assertEqual(res['wlan0']['manager'].value, 'NetworkManager')
176+ self.assertEqual(res['wlan0']['mastermode'].value, 'NetworkManager')
177
178
179 class Test_CASCADE_500(unittest.TestCase, NetIfMngrTest):
180@@ -104,8 +112,8 @@ class Test_CASCADE_500(unittest.TestCase, NetIfMngrTest):
181
182 def test(self):
183 res = self.get_results()
184- self.assertEqual(res['eth0'].value, 'NetworkManager')
185- self.assertEqual(res['wlan0'].value, 'NetworkManager')
186+ self.assertEqual(res['eth0']['manager'].value, 'NetworkManager')
187+ self.assertEqual(res['wlan0']['manager'].value, 'NetworkManager')
188
189
190 class Test_RPI2_UC16_CCONF(unittest.TestCase, NetIfMngrTest):
191@@ -121,7 +129,8 @@ class Test_RPI2_UC16_CCONF(unittest.TestCase, NetIfMngrTest):
192
193 def test(self):
194 res = self.get_results()
195- self.assertEqual(res['eth0'].value, 'networkd')
196+ self.assertEqual(res['eth0']['manager'].value, 'networkd')
197+ self.assertEqual(res['eth0']['mastermode'].value, 'not-applicable')
198
199
200 class Test_RPI3B_UC16_CLOUDINIT(unittest.TestCase, NetIfMngrTest):
201@@ -137,5 +146,7 @@ class Test_RPI3B_UC16_CLOUDINIT(unittest.TestCase, NetIfMngrTest):
202
203 def test(self):
204 res = self.get_results()
205- self.assertEqual(res['eth0'].value, 'networkd')
206- self.assertEqual(res['wlan0'].value, 'networkd')
207+ self.assertEqual(res['eth0']['manager'].value, 'networkd')
208+ self.assertEqual(res['eth0']['mastermode'].value, 'not-applicable')
209+ self.assertEqual(res['wlan0']['manager'].value, 'networkd')
210+ self.assertEqual(res['wlan0']['mastermode'].value, 'unspecified')

Subscribers

People subscribed via source and target branches