Merge ~mpontillo/maas:support-pci-and-usb-filtering-of-moodaliases into maas:master

Proposed by Mike Pontillo
Status: Merged
Approved by: Mike Pontillo
Approved revision: 0070c73959103fe05e9e77be5c791a2740c98946
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~mpontillo/maas:support-pci-and-usb-filtering-of-moodaliases
Merge into: maas:master
Diff against target: 245 lines (+158/-12)
2 files modified
src/metadataserver/builtin_scripts/hooks.py (+55/-6)
src/metadataserver/builtin_scripts/tests/test_hooks.py (+103/-6)
Reviewer Review Type Date Requested Status
Lee Trager (community) Approve
MAAS Lander Approve
Review via email: mp+335056@code.launchpad.net

Commit message

Allow filter_modaliases() to be passed sequences of PCI IDs and/or USB IDs.

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b support-pci-and-usb-filtering-of-moodaliases lp:~mpontillo/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 0070c73959103fe05e9e77be5c791a2740c98946

review: Approve
Revision history for this message
Lee Trager (ltrager) wrote :

LGTM!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/metadataserver/builtin_scripts/hooks.py b/src/metadataserver/builtin_scripts/hooks.py
2index 9427e96..388352a 100644
3--- a/src/metadataserver/builtin_scripts/hooks.py
4+++ b/src/metadataserver/builtin_scripts/hooks.py
5@@ -596,19 +596,68 @@ def get_dmi_data(modaliases):
6 return frozenset()
7
8
9-def filter_modaliases(modaliases_discovered, candidates):
10+def filter_modaliases(
11+ modaliases_discovered, modaliases=None, pci=None, usb=None):
12 """Determines which candidate modaliases match what was discovered.
13
14 :param modaliases_discovered: The list of modaliases found on the node.
15- :param candidates: The candidate modaliases to match against. This
16+ :param modaliases: The candidate modaliases to match against. This
17 parameter must be iterable. Wildcards are accepted.
18+ :param pci: A list of strings in the format <vendor>:<device>. May include
19+ wildcards.
20+ :param usb: A list of strings in the format <vendor>:<product>. May include
21+ wildcards.
22 :return: The list of modaliases on the node matching the candidate(s).
23 """
24+ patterns = []
25+ if modaliases is not None:
26+ patterns.extend(modaliases)
27+ if pci is not None:
28+ for pattern in pci:
29+ try:
30+ vendor, device = pattern.split(':')
31+ except ValueError:
32+ # Ignore malformed patterns.
33+ continue
34+ vendor = vendor.upper()
35+ device = device.upper()
36+ # v: vendor
37+ # d: device
38+ # sv: subvendor
39+ # sd: subdevice
40+ # bc: bus class
41+ # sc: bus subclass
42+ # i: interface
43+ patterns.append(
44+ "pci:v0000{vendor}d0000{device}sv*sd*bc*sc*i*".format(
45+ vendor=vendor, device=device))
46+ if usb is not None:
47+ for pattern in usb:
48+ try:
49+ vendor, product = pattern.split(':')
50+ except ValueError:
51+ # Ignore malformed patterns.
52+ continue
53+ vendor = vendor.upper()
54+ product = product.upper()
55+ # v: vendor
56+ # p: product
57+ # d: bcdDevice (device release number)
58+ # dc: device class
59+ # dsc: device subclass
60+ # dp: device protocol
61+ # ic: interface class
62+ # isc: interface subclass
63+ # ip: interface protocol
64+ patterns.append(
65+ "usb:v{vendor}p{product}d*dc*dsc*dp*ic*isc*ip*".format(
66+ vendor=vendor, product=product))
67 matches = []
68- for candidate in candidates:
69- new_matches = fnmatch.filter(
70- modaliases_discovered, candidate)
71- matches.extend(new_matches)
72+ for pattern in patterns:
73+ new_matches = fnmatch.filter(modaliases_discovered, pattern)
74+ for match in new_matches:
75+ if match not in matches:
76+ matches.append(match)
77 return matches
78
79
80diff --git a/src/metadataserver/builtin_scripts/tests/test_hooks.py b/src/metadataserver/builtin_scripts/tests/test_hooks.py
81index 9302a55..c56fbd2 100644
82--- a/src/metadataserver/builtin_scripts/tests/test_hooks.py
83+++ b/src/metadataserver/builtin_scripts/tests/test_hooks.py
84@@ -27,6 +27,7 @@ from maasserver.models.vlan import VLAN
85 from maasserver.testing.factory import factory
86 from maasserver.testing.testcase import MAASServerTestCase
87 from maasserver.utils.orm import reload_object
88+from maastesting.testcase import MAASTestCase
89 from metadataserver.builtin_scripts.hooks import (
90 add_switch,
91 add_switch_vendor_model_tags,
92@@ -215,10 +216,36 @@ class TestDetectSwitchVendorModel(MAASServerTestCase):
93 self.assertThat(detected, Equals((None, None)))
94
95
96-class TestFilterModaliases(MAASServerTestCase):
97+TEST_MODALIASES = [
98+ 'pci:v00001A03d00001150sv000015D9sd00000888bc06sc04i00',
99+ 'pci:v00001A03d00002000sv000015D9sd00000888bc03sc00i00',
100+ 'pci:v00008086d00001533sv000015D9sd00001533bc02sc00i00',
101+ 'pci:v00008086d000015B7sv000015D9sd000015B7bc02sc00i00',
102+ 'pci:v00008086d00001918sv000015D9sd00000888bc06sc00i00',
103+ 'pci:v00008086d0000A102sv000015D9sd00000888bc01sc06i01',
104+ 'pci:v00008086d0000A118sv000015D9sd00000888bc06sc04i00',
105+ 'pci:v00008086d0000A119sv000015D9sd00000888bc06sc04i00',
106+ 'pci:v00008086d0000A11Asv000015D9sd00000888bc06sc04i00',
107+ 'pci:v00008086d0000A121sv000015D9sd00000888bc05sc80i00',
108+ 'pci:v00008086d0000A123sv000015D9sd00000888bc0Csc05i00',
109+ 'pci:v00008086d0000A12Fsv000015D9sd00000888bc0Csc03i30',
110+ 'pci:v00008086d0000A131sv000015D9sd00000888bc11sc80i00',
111+ 'pci:v00008086d0000A13Dsv000015D9sd00000888bc07sc00i02',
112+ 'pci:v00008086d0000A149sv000015D9sd00000888bc06sc01i00',
113+ 'pci:v00008086d0000A170sv000015D9sd00000888bc04sc03i00',
114+ 'usb:v0557p2419d0100dc00dsc00dp00ic03isc01ip01in00',
115+ 'usb:v0557p2419d0100dc00dsc00dp00ic03isc01ip02in01',
116+ 'usb:v0557p7000d0000dc09dsc00dp01ic09isc00ip00in00',
117+ 'usb:v174Cp07D1d1000dc00dsc00dp00ic08isc06ip50in00',
118+ 'usb:v1D6Bp0002d0410dc09dsc00dp01ic09isc00ip00in00',
119+ 'usb:v1D6Bp0003d0410dc09dsc00dp03ic09isc00ip00in00',
120+]
121+
122+
123+class TestFilterModaliases(MAASTestCase):
124
125 scenarios = (
126- ('wildcard_multiple_match', {
127+ ('modalias_wildcard_multiple_match', {
128 'modaliases': [
129 "os:vendorCanonical:productUbuntu:version14.04",
130 "beverage:typeCoffee:variantEspresso",
131@@ -228,12 +255,14 @@ class TestFilterModaliases(MAASServerTestCase):
132 'candidates': [
133 'beverage:typeCoffee:*',
134 ],
135+ 'pci': None,
136+ 'usb': None,
137 'result': [
138 "beverage:typeCoffee:variantEspresso",
139 "beverage:typeCoffee:variantCappuccino",
140 ]
141 }),
142- ('multiple_wildcard_match', {
143+ ('modalias_multiple_wildcard_match', {
144 'modaliases': [
145 "os:vendorCanonical:productUbuntu:version14.04",
146 "beverage:typeCoffee:variantEspresso",
147@@ -245,13 +274,14 @@ class TestFilterModaliases(MAASServerTestCase):
148 'os:*:productUbuntu:*',
149 'beverage:*ProperBritish'
150 ],
151+ 'pci': None,
152+ 'usb': None,
153 'result': [
154 "os:vendorCanonical:productUbuntu:version14.04",
155- "os:vendorCanonical:productUbuntu:version14.04",
156 "beverage:typeTea:variantProperBritish",
157 ]
158 }),
159- ('exact_match', {
160+ ('modalias_exact_match', {
161 'modaliases': [
162 "os:vendorCanonical:productUbuntu:version14.04",
163 "beverage:typeCoffee:variantEspresso",
164@@ -261,15 +291,82 @@ class TestFilterModaliases(MAASServerTestCase):
165 'candidates': [
166 'os:vendorCanonical:productUbuntu:version14.04',
167 ],
168+ 'pci': None,
169+ 'usb': None,
170 'result': [
171 "os:vendorCanonical:productUbuntu:version14.04",
172 ]
173 }),
174+ ('pci_malformed_string', {
175+ 'modaliases': TEST_MODALIASES,
176+ 'candidates': None,
177+ 'pci': [
178+ "8086"
179+ ],
180+ 'usb': None,
181+ 'result': []
182+ }),
183+ ('pci_exact_match', {
184+ 'modaliases': TEST_MODALIASES,
185+ 'candidates': None,
186+ 'pci': [
187+ "8086:1918"
188+ ],
189+ 'usb': None,
190+ 'result': [
191+ "pci:v00008086d00001918sv000015D9sd00000888bc06sc00i00",
192+ ]
193+ }),
194+ ('pci_wildcard_match', {
195+ 'modaliases': TEST_MODALIASES,
196+ 'candidates': None,
197+ 'pci': [
198+ "1a03:*"
199+ ],
200+ 'usb': None,
201+ 'result': [
202+ 'pci:v00001A03d00001150sv000015D9sd00000888bc06sc04i00',
203+ 'pci:v00001A03d00002000sv000015D9sd00000888bc03sc00i00',
204+ ]
205+ }),
206+ ('usb_malformed_string', {
207+ 'modaliases': TEST_MODALIASES,
208+ 'candidates': None,
209+ 'pci': None,
210+ 'usb': [
211+ "174c"
212+ ],
213+ 'result': []
214+ }),
215+ ('usb_exact_match', {
216+ 'modaliases': TEST_MODALIASES,
217+ 'candidates': None,
218+ 'pci': None,
219+ 'usb': [
220+ "174c:07d1"
221+ ],
222+ 'result': [
223+ 'usb:v174Cp07D1d1000dc00dsc00dp00ic08isc06ip50in00',
224+ ]
225+ }),
226+ ('usb_wildcard_match', {
227+ 'modaliases': TEST_MODALIASES,
228+ 'candidates': None,
229+ 'pci': None,
230+ 'usb': [
231+ "0557:*"
232+ ],
233+ 'result': [
234+ 'usb:v0557p2419d0100dc00dsc00dp00ic03isc01ip01in00',
235+ 'usb:v0557p2419d0100dc00dsc00dp00ic03isc01ip02in01',
236+ 'usb:v0557p7000d0000dc09dsc00dp01ic09isc00ip00in00'
237+ ]
238+ }),
239 )
240
241 def test__filter_modaliases(self):
242 matches = filter_modaliases(
243- self.modaliases, self.candidates)
244+ self.modaliases, self.candidates, pci=self.pci, usb=self.usb)
245 self.assertThat(matches, Equals(self.result))
246
247

Subscribers

People subscribed via source and target branches