Merge lp:~ltrager/maas/lp1685361_2.1 into lp:maas/2.1
- lp1685361_2.1
- Merge into 2.1
Proposed by
Lee Trager
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Lee Trager | ||||
Approved revision: | no longer in the source branch. | ||||
Merged at revision: | 5601 | ||||
Proposed branch: | lp:~ltrager/maas/lp1685361_2.1 | ||||
Merge into: | lp:maas/2.1 | ||||
Diff against target: |
841 lines (+232/-387) 2 files modified
src/provisioningserver/refresh/node_info_scripts.py (+8/-1) src/provisioningserver/refresh/tests/test_node_info_scripts.py (+224/-386) |
||||
To merge this branch: | bzr merge lp:~ltrager/maas/lp1685361_2.1 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Lee Trager (community) | Approve | ||
Review via email: mp+323114@code.launchpad.net |
Commit message
Fix 00-maas-
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/provisioningserver/refresh/node_info_scripts.py' | |||
2 | --- src/provisioningserver/refresh/node_info_scripts.py 2017-03-22 21:46:10 +0000 | |||
3 | +++ src/provisioningserver/refresh/node_info_scripts.py 2017-04-25 09:25:16 +0000 | |||
4 | @@ -294,7 +294,7 @@ | |||
5 | 294 | blockdevs = [] | 294 | blockdevs = [] |
6 | 295 | block_list = check_output(( | 295 | block_list = check_output(( |
7 | 296 | "lsblk", "--exclude", "1,2,7", "-d", "-P", | 296 | "lsblk", "--exclude", "1,2,7", "-d", "-P", |
9 | 297 | "-o", "NAME,RO,RM,MODEL,ROTA,MAJ:MIN", "-x", "MAJ:MIN")) | 297 | "-o", "NAME,RO,RM,MODEL,ROTA,MAJ:MIN")) |
10 | 298 | block_list = block_list.decode("utf-8") | 298 | block_list = block_list.decode("utf-8") |
11 | 299 | for blockdev in block_list.splitlines(): | 299 | for blockdev in block_list.splitlines(): |
12 | 300 | tokens = shlex.split(blockdev) | 300 | tokens = shlex.split(blockdev) |
13 | @@ -304,6 +304,13 @@ | |||
14 | 304 | current_block[k] = v.strip() | 304 | current_block[k] = v.strip() |
15 | 305 | blockdevs.append(current_block) | 305 | blockdevs.append(current_block) |
16 | 306 | 306 | ||
17 | 307 | # Sort drives by MAJ:MIN so MAAS picks the correct boot drive. | ||
18 | 308 | # lsblk -x MAJ:MIN can't be used as the -x flag only appears in | ||
19 | 309 | # lsblk 2.71.1 or newer which is unavailable on Trusty. See LP:1673724 | ||
20 | 310 | blockdevs = sorted( | ||
21 | 311 | blockdevs, | ||
22 | 312 | key=lambda blockdev: [int(i) for i in blockdev['MAJ:MIN'].split(':')]) | ||
23 | 313 | |||
24 | 307 | # Grab the device path, serial number, and sata connection. | 314 | # Grab the device path, serial number, and sata connection. |
25 | 308 | UDEV_MAPPINGS = { | 315 | UDEV_MAPPINGS = { |
26 | 309 | "DEVNAME": "PATH", | 316 | "DEVNAME": "PATH", |
27 | 310 | 317 | ||
28 | === modified file 'src/provisioningserver/refresh/tests/test_node_info_scripts.py' | |||
29 | --- src/provisioningserver/refresh/tests/test_node_info_scripts.py 2017-03-22 21:46:10 +0000 | |||
30 | +++ src/provisioningserver/refresh/tests/test_node_info_scripts.py 2017-04-25 09:25:16 +0000 | |||
31 | @@ -5,7 +5,6 @@ | |||
32 | 5 | 5 | ||
33 | 6 | __all__ = [] | 6 | __all__ = [] |
34 | 7 | 7 | ||
35 | 8 | from functools import partial | ||
36 | 9 | from inspect import getsource | 8 | from inspect import getsource |
37 | 10 | from io import StringIO | 9 | from io import StringIO |
38 | 11 | import json | 10 | import json |
39 | @@ -18,6 +17,7 @@ | |||
40 | 18 | check_output, | 17 | check_output, |
41 | 19 | STDOUT, | 18 | STDOUT, |
42 | 20 | ) | 19 | ) |
43 | 20 | import sys | ||
44 | 21 | from textwrap import dedent | 21 | from textwrap import dedent |
45 | 22 | import time | 22 | import time |
46 | 23 | from unittest.mock import call | 23 | from unittest.mock import call |
47 | @@ -338,16 +338,19 @@ | |||
48 | 338 | @typed | 338 | @typed |
49 | 339 | def make_lsblk_output( | 339 | def make_lsblk_output( |
50 | 340 | self, name=None, read_only=False, removable=False, | 340 | self, name=None, read_only=False, removable=False, |
52 | 341 | model=None, rotary=True) -> bytes: | 341 | model=None, rotary=True, maj_min=None) -> bytes: |
53 | 342 | if name is None: | 342 | if name is None: |
54 | 343 | name = factory.make_name('name') | 343 | name = factory.make_name('name') |
55 | 344 | if model is None: | 344 | if model is None: |
56 | 345 | model = factory.make_name('model') | 345 | model = factory.make_name('model') |
57 | 346 | if maj_min is None: | ||
58 | 347 | maj_min = (random.randint(0, 255), random.randint(0, 255)) | ||
59 | 346 | read_only = "1" if read_only else "0" | 348 | read_only = "1" if read_only else "0" |
60 | 347 | removable = "1" if removable else "0" | 349 | removable = "1" if removable else "0" |
61 | 348 | rotary = "1" if rotary else "0" | 350 | rotary = "1" if rotary else "0" |
64 | 349 | output = 'NAME="%s" RO="%s" RM="%s" MODEL="%s" ROTA="%s"' % ( | 351 | output = ( |
65 | 350 | name, read_only, removable, model, rotary) | 352 | 'NAME="%s" RO="%s" RM="%s" MODEL="%s" ROTA="%s" MAJ:MIN="%s"' % ( |
66 | 353 | name, read_only, removable, model, rotary, '%s:%s' % maj_min)) | ||
67 | 351 | return output.encode("ascii") | 354 | return output.encode("ascii") |
68 | 352 | 355 | ||
69 | 353 | @typed | 356 | @typed |
70 | @@ -373,21 +376,54 @@ | |||
71 | 373 | return output.encode("ascii") | 376 | return output.encode("ascii") |
72 | 374 | 377 | ||
73 | 375 | def call_gather_physical_block_devices( | 378 | def call_gather_physical_block_devices( |
75 | 376 | self, dev_disk_byid='/dev/disk/by-id/'): | 379 | self, dev_disk_byid='/dev/disk/by-id/', file_path=None): |
76 | 377 | output = StringIO() | 380 | output = StringIO() |
78 | 378 | namespace = {"print": partial(print, file=output)} | 381 | |
79 | 382 | def neutered_print(*args, **kwargs): | ||
80 | 383 | file = kwargs.pop('file', None) | ||
81 | 384 | if file is not None and file == sys.stderr: | ||
82 | 385 | return | ||
83 | 386 | return print(*args, **kwargs, file=output) | ||
84 | 387 | |||
85 | 388 | namespace = {"print": neutered_print} | ||
86 | 389 | if file_path is not None: | ||
87 | 390 | namespace['__file__'] = file_path | ||
88 | 379 | gather_physical_block_devices = isolate_function( | 391 | gather_physical_block_devices = isolate_function( |
89 | 380 | node_info_module.gather_physical_block_devices, namespace) | 392 | node_info_module.gather_physical_block_devices, namespace) |
90 | 381 | gather_physical_block_devices(dev_disk_byid=dev_disk_byid) | 393 | gather_physical_block_devices(dev_disk_byid=dev_disk_byid) |
91 | 382 | return json.loads(output.getvalue()) | 394 | return json.loads(output.getvalue()) |
92 | 383 | 395 | ||
93 | 396 | def make_output( | ||
94 | 397 | self, name, maj_min, model, serial, size, block_size, | ||
95 | 398 | drive_path=None, device_id_path=None, rotary=True, | ||
96 | 399 | removable=False, read_only=False, sata=True): | ||
97 | 400 | if drive_path is None: | ||
98 | 401 | drive_path = '/dev/%s' % name | ||
99 | 402 | ret = { | ||
100 | 403 | 'NAME': name, | ||
101 | 404 | 'PATH': drive_path, | ||
102 | 405 | 'MAJ:MIN': '%s:%s' % maj_min, | ||
103 | 406 | 'RO': '1' if read_only else '0', | ||
104 | 407 | 'RM': '1' if removable else '0', | ||
105 | 408 | 'MODEL': model, | ||
106 | 409 | 'ROTA': '1' if rotary else '0', | ||
107 | 410 | 'SATA': '1' if sata else '0', | ||
108 | 411 | 'SERIAL': serial, | ||
109 | 412 | 'SIZE': str(size), | ||
110 | 413 | 'BLOCK_SIZE': str(block_size), | ||
111 | 414 | 'RPM': '5400', | ||
112 | 415 | } | ||
113 | 416 | if device_id_path is not None: | ||
114 | 417 | ret['ID_PATH'] = device_id_path | ||
115 | 418 | return ret | ||
116 | 419 | |||
117 | 384 | def test__calls_lsblk(self): | 420 | def test__calls_lsblk(self): |
118 | 385 | check_output = self.patch(subprocess, "check_output") | 421 | check_output = self.patch(subprocess, "check_output") |
119 | 386 | check_output.return_value = b"" | 422 | check_output.return_value = b"" |
120 | 387 | self.call_gather_physical_block_devices() | 423 | self.call_gather_physical_block_devices() |
121 | 388 | self.assertThat(check_output, MockCalledOnceWith(( | 424 | self.assertThat(check_output, MockCalledOnceWith(( |
122 | 389 | "lsblk", "--exclude", "1,2,7", "-d", "-P", | 425 | "lsblk", "--exclude", "1,2,7", "-d", "-P", |
124 | 390 | "-o", "NAME,RO,RM,MODEL,ROTA,MAJ:MIN", "-x", "MAJ:MIN"))) | 426 | "-o", "NAME,RO,RM,MODEL,ROTA,MAJ:MIN"))) |
125 | 391 | 427 | ||
126 | 392 | def test__returns_empty_list_when_no_disks(self): | 428 | def test__returns_empty_list_when_no_disks(self): |
127 | 393 | check_output = self.patch(subprocess, "check_output") | 429 | check_output = self.patch(subprocess, "check_output") |
128 | @@ -407,7 +443,7 @@ | |||
129 | 407 | self.assertThat(check_output, MockCallsMatch( | 443 | self.assertThat(check_output, MockCallsMatch( |
130 | 408 | call(( | 444 | call(( |
131 | 409 | "lsblk", "--exclude", "1,2,7", "-d", "-P", | 445 | "lsblk", "--exclude", "1,2,7", "-d", "-P", |
133 | 410 | "-o", "NAME,RO,RM,MODEL,ROTA,MAJ:MIN", "-x", "MAJ:MIN")), | 446 | "-o", "NAME,RO,RM,MODEL,ROTA,MAJ:MIN")), |
134 | 411 | call(("udevadm", "info", "-q", "all", "-n", name)))) | 447 | call(("udevadm", "info", "-q", "all", "-n", name)))) |
135 | 412 | 448 | ||
136 | 413 | def test__returns_empty_list_when_cdrom_only(self): | 449 | def test__returns_empty_list_when_cdrom_only(self): |
137 | @@ -439,128 +475,52 @@ | |||
138 | 439 | self.assertThat(check_output, MockCallsMatch( | 475 | self.assertThat(check_output, MockCallsMatch( |
139 | 440 | call(( | 476 | call(( |
140 | 441 | "lsblk", "--exclude", "1,2,7", "-d", "-P", | 477 | "lsblk", "--exclude", "1,2,7", "-d", "-P", |
142 | 442 | "-o", "NAME,RO,RM,MODEL,ROTA,MAJ:MIN", "-x", "MAJ:MIN")), | 478 | "-o", "NAME,RO,RM,MODEL,ROTA,MAJ:MIN")), |
143 | 443 | call(("udevadm", "info", "-q", "all", "-n", name)), | 479 | call(("udevadm", "info", "-q", "all", "-n", name)), |
144 | 444 | call(("sudo", "blockdev", "--getsize64", "/dev/%s" % name)), | 480 | call(("sudo", "blockdev", "--getsize64", "/dev/%s" % name)), |
145 | 445 | call(("sudo", "blockdev", "--getbsz", "/dev/%s" % name)))) | 481 | call(("sudo", "blockdev", "--getbsz", "/dev/%s" % name)))) |
146 | 446 | 482 | ||
264 | 447 | def test__returns_block_device(self): | 483 | def test__returns_sorted_block_devices(self): |
265 | 448 | name = factory.make_name('name') | 484 | output = [] |
266 | 449 | model = factory.make_name('model') | 485 | check_output_side_effects = [] |
267 | 450 | serial = factory.make_name('serial') | 486 | # Create simulated /dev tree |
268 | 451 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | 487 | devroot = self.make_dir() |
269 | 452 | block_size = random.choice([512, 1024, 4096]) | 488 | os.mkdir(os.path.join(devroot, 'disk')) |
270 | 453 | check_output = self.patch(subprocess, "check_output") | 489 | byidroot = os.path.join(devroot, 'disk', 'by_id') |
271 | 454 | 490 | os.mkdir(byidroot) | |
272 | 455 | # Create simulated /dev tree | 491 | for _ in range(3): |
273 | 456 | devroot = self.make_dir() | 492 | name = factory.make_name('name') |
274 | 457 | os.mkdir(os.path.join(devroot, 'disk')) | 493 | model = factory.make_name('model') |
275 | 458 | byidroot = os.path.join(devroot, 'disk', 'by_id') | 494 | serial = factory.make_name('serial') |
276 | 459 | os.mkdir(byidroot) | 495 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) |
277 | 460 | os.mknod(os.path.join(devroot, name)) | 496 | block_size = random.choice([512, 1024, 4096]) |
278 | 461 | os.symlink(os.path.join(devroot, name), | 497 | maj_min = (random.randint(0, 255), random.randint(0, 255)) |
279 | 462 | os.path.join(byidroot, 'deviceid')) | 498 | |
280 | 463 | 499 | # Create simulated /dev tree | |
281 | 464 | check_output.side_effect = [ | 500 | drive_path = os.path.join(devroot, name) |
282 | 465 | self.make_lsblk_output(name=name, model=model), | 501 | os.mknod(drive_path) |
283 | 466 | self.make_udevadm_output(name, serial=serial, dev=devroot), | 502 | device_id_path = os.path.join( |
284 | 467 | b'%d' % size, | 503 | byidroot, factory.make_name('deviceid')) |
285 | 468 | b'%d' % block_size, | 504 | os.symlink(drive_path, device_id_path) |
286 | 469 | ] | 505 | |
287 | 470 | self.assertEqual([{ | 506 | check_output_side_effects += [ |
288 | 471 | "NAME": name, | 507 | self.make_lsblk_output( |
289 | 472 | "PATH": os.path.join(devroot, name), | 508 | name=name, model=model, maj_min=maj_min), |
290 | 473 | "ID_PATH": os.path.join(byidroot, 'deviceid'), | 509 | self.make_udevadm_output(name, serial=serial, dev=devroot), |
291 | 474 | "RO": "0", | 510 | b'%d' % size, |
292 | 475 | "RM": "0", | 511 | b'%d' % block_size, |
293 | 476 | "MODEL": model, | 512 | ] |
294 | 477 | "ROTA": "1", | 513 | output.append( |
295 | 478 | "SATA": "1", | 514 | self.make_output( |
296 | 479 | "SERIAL": serial, | 515 | name, maj_min, model, serial, size, block_size, |
297 | 480 | "SIZE": "%s" % size, | 516 | drive_path, device_id_path)) |
298 | 481 | "BLOCK_SIZE": "%s" % block_size, | 517 | |
299 | 482 | "RPM": "5400", | 518 | check_output = self.patch(subprocess, "check_output") |
300 | 483 | }], self.call_gather_physical_block_devices(byidroot)) | 519 | check_output.side_effect = check_output_side_effects |
301 | 484 | 520 | ||
302 | 485 | def test__returns_block_device_with_shortest_byidpath_long_first(self): | 521 | for ref, out in zip( |
303 | 486 | name = factory.make_name('name') | 522 | output, self.call_gather_physical_block_devices(byidroot)): |
304 | 487 | model = factory.make_name('model') | 523 | self.assertDictEqual(ref, out) |
188 | 488 | serial = factory.make_name('serial') | ||
189 | 489 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | ||
190 | 490 | block_size = random.choice([512, 1024, 4096]) | ||
191 | 491 | check_output = self.patch(subprocess, "check_output") | ||
192 | 492 | |||
193 | 493 | # Create simulated /dev tree | ||
194 | 494 | devroot = self.make_dir() | ||
195 | 495 | os.mkdir(os.path.join(devroot, 'disk')) | ||
196 | 496 | byidroot = os.path.join(devroot, 'disk', 'by_id') | ||
197 | 497 | os.mkdir(byidroot) | ||
198 | 498 | os.mknod(os.path.join(devroot, name)) | ||
199 | 499 | os.symlink(os.path.join(devroot, name), | ||
200 | 500 | os.path.join(byidroot, 'deviceid-long')) | ||
201 | 501 | os.symlink(os.path.join(devroot, name), | ||
202 | 502 | os.path.join(byidroot, 'deviceid')) | ||
203 | 503 | |||
204 | 504 | check_output.side_effect = [ | ||
205 | 505 | self.make_lsblk_output(name=name, model=model), | ||
206 | 506 | self.make_udevadm_output(name, serial=serial, dev=devroot), | ||
207 | 507 | b'%d' % size, | ||
208 | 508 | b'%d' % block_size, | ||
209 | 509 | ] | ||
210 | 510 | self.assertEqual([{ | ||
211 | 511 | "NAME": name, | ||
212 | 512 | "PATH": os.path.join(devroot, name), | ||
213 | 513 | "ID_PATH": os.path.join(byidroot, 'deviceid'), | ||
214 | 514 | "RO": "0", | ||
215 | 515 | "RM": "0", | ||
216 | 516 | "MODEL": model, | ||
217 | 517 | "ROTA": "1", | ||
218 | 518 | "SATA": "1", | ||
219 | 519 | "SERIAL": serial, | ||
220 | 520 | "SIZE": "%s" % size, | ||
221 | 521 | "BLOCK_SIZE": "%s" % block_size, | ||
222 | 522 | "RPM": "5400", | ||
223 | 523 | }], self.call_gather_physical_block_devices(byidroot)) | ||
224 | 524 | |||
225 | 525 | def test__returns_block_device_with_first_byidpath_long_second(self): | ||
226 | 526 | name = factory.make_name('name') | ||
227 | 527 | model = factory.make_name('model') | ||
228 | 528 | serial = factory.make_name('serial') | ||
229 | 529 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | ||
230 | 530 | block_size = random.choice([512, 1024, 4096]) | ||
231 | 531 | check_output = self.patch(subprocess, "check_output") | ||
232 | 532 | |||
233 | 533 | # Create simulated /dev tree | ||
234 | 534 | devroot = self.make_dir() | ||
235 | 535 | os.mkdir(os.path.join(devroot, 'disk')) | ||
236 | 536 | byidroot = os.path.join(devroot, 'disk', 'by_id') | ||
237 | 537 | os.mkdir(byidroot) | ||
238 | 538 | os.mknod(os.path.join(devroot, name)) | ||
239 | 539 | os.symlink(os.path.join(devroot, name), | ||
240 | 540 | os.path.join(byidroot, 'deviceid')) | ||
241 | 541 | os.symlink(os.path.join(devroot, name), | ||
242 | 542 | os.path.join(byidroot, 'deviceid-longest')) | ||
243 | 543 | |||
244 | 544 | check_output.side_effect = [ | ||
245 | 545 | self.make_lsblk_output(name=name, model=model), | ||
246 | 546 | self.make_udevadm_output(name, serial=serial, dev=devroot), | ||
247 | 547 | b'%d' % size, | ||
248 | 548 | b'%d' % block_size, | ||
249 | 549 | ] | ||
250 | 550 | self.assertEqual([{ | ||
251 | 551 | "NAME": name, | ||
252 | 552 | "PATH": os.path.join(devroot, name), | ||
253 | 553 | "ID_PATH": os.path.join(byidroot, 'deviceid'), | ||
254 | 554 | "RO": "0", | ||
255 | 555 | "RM": "0", | ||
256 | 556 | "MODEL": model, | ||
257 | 557 | "ROTA": "1", | ||
258 | 558 | "SATA": "1", | ||
259 | 559 | "SERIAL": serial, | ||
260 | 560 | "SIZE": "%s" % size, | ||
261 | 561 | "BLOCK_SIZE": "%s" % block_size, | ||
262 | 562 | "RPM": "5400", | ||
263 | 563 | }], self.call_gather_physical_block_devices(byidroot)) | ||
305 | 564 | 524 | ||
306 | 565 | def test__removes_duplicate_block_device_same_serial_and_model(self): | 525 | def test__removes_duplicate_block_device_same_serial_and_model(self): |
307 | 566 | """Multipath disks get multiple IDs, but same serial/model is same | 526 | """Multipath disks get multiple IDs, but same serial/model is same |
308 | @@ -570,107 +530,51 @@ | |||
309 | 570 | serial = factory.make_name('serial') | 530 | serial = factory.make_name('serial') |
310 | 571 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | 531 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) |
311 | 572 | block_size = random.choice([512, 1024, 4096]) | 532 | block_size = random.choice([512, 1024, 4096]) |
408 | 573 | check_output = self.patch(subprocess, "check_output") | 533 | maj_min = (random.randint(0, 255), random.randint(0, 255)) |
409 | 574 | 534 | check_output = self.patch(subprocess, "check_output") | |
410 | 575 | name2 = factory.make_name('name') | 535 | |
411 | 576 | 536 | name2 = factory.make_name('name') | |
412 | 577 | # Create simulated /dev tree. | 537 | |
413 | 578 | devroot = self.make_dir() | 538 | # Create simulated /dev tree. |
414 | 579 | os.mkdir(os.path.join(devroot, 'disk')) | 539 | devroot = self.make_dir() |
415 | 580 | byidroot = os.path.join(devroot, 'disk', 'by_id') | 540 | os.mkdir(os.path.join(devroot, 'disk')) |
416 | 581 | os.mkdir(byidroot) | 541 | byidroot = os.path.join(devroot, 'disk', 'by_id') |
417 | 582 | 542 | os.mkdir(byidroot) | |
418 | 583 | os.mknod(os.path.join(devroot, name)) | 543 | |
419 | 584 | os.symlink(os.path.join(devroot, name), | 544 | drive_path = os.path.join(devroot, name) |
420 | 585 | os.path.join(byidroot, 'deviceid')) | 545 | os.mknod(drive_path) |
421 | 586 | 546 | device_id_path = os.path.join(byidroot, 'deviceid') | |
422 | 587 | os.mknod(os.path.join(devroot, name2)) | 547 | os.symlink(os.path.join(devroot, name), device_id_path) |
423 | 588 | os.symlink(os.path.join(devroot, name2), | 548 | |
424 | 589 | os.path.join(byidroot, 'deviceid2')) | 549 | os.mknod(os.path.join(devroot, name2)) |
425 | 590 | 550 | device_id_path2 = os.path.join(byidroot, 'deviceid2') | |
426 | 591 | check_output.side_effect = [ | 551 | os.symlink(os.path.join(devroot, name2), device_id_path2) |
427 | 592 | b"\n".join([ | 552 | |
428 | 593 | self.make_lsblk_output(name=name, model=model), | 553 | check_output.side_effect = [ |
429 | 594 | self.make_lsblk_output(name=name2, model=model)]), | 554 | b"\n".join([ |
430 | 595 | self.make_udevadm_output(name, serial=serial, dev=devroot), | 555 | self.make_lsblk_output( |
431 | 596 | self.make_udevadm_output(name2, serial=serial, dev=devroot), | 556 | name=name, model=model, maj_min=maj_min), |
432 | 597 | b'%d' % size, | 557 | self.make_lsblk_output( |
433 | 598 | b'%d' % block_size, | 558 | name=name2, model=model, maj_min=maj_min)]), |
434 | 599 | b'%d' % size, | 559 | self.make_udevadm_output(name, serial=serial, dev=devroot), |
435 | 600 | b'%d' % block_size, | 560 | self.make_udevadm_output(name2, serial=serial, dev=devroot), |
436 | 601 | ] | 561 | b'%d' % size, |
437 | 602 | 562 | b'%d' % block_size, | |
438 | 603 | self.assertEqual([{ | 563 | b'%d' % size, |
439 | 604 | "NAME": name, | 564 | b'%d' % block_size, |
440 | 605 | "PATH": os.path.join(devroot, name), | 565 | ] |
441 | 606 | "ID_PATH": os.path.join(byidroot, 'deviceid'), | 566 | |
442 | 607 | "RO": "0", | 567 | self.assertItemsEqual( |
443 | 608 | "RM": "0", | 568 | [self.make_output( |
444 | 609 | "MODEL": model, | 569 | name, maj_min, model, serial, size, block_size, drive_path, |
445 | 610 | "ROTA": "1", | 570 | device_id_path)], |
446 | 611 | "SATA": "1", | 571 | self.call_gather_physical_block_devices(byidroot)) |
351 | 612 | "SERIAL": serial, | ||
352 | 613 | "SIZE": "%s" % size, | ||
353 | 614 | "BLOCK_SIZE": "%s" % block_size, | ||
354 | 615 | "RPM": "5400", | ||
355 | 616 | }], self.call_gather_physical_block_devices(byidroot)) | ||
356 | 617 | |||
357 | 618 | def test__removes_duplicate_block_device_same_serial_blank_model(self): | ||
358 | 619 | """Multipath disks get multiple IDs, but same serial is same device.""" | ||
359 | 620 | name = factory.make_name('name') | ||
360 | 621 | model = "" | ||
361 | 622 | serial = factory.make_name('serial') | ||
362 | 623 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | ||
363 | 624 | block_size = random.choice([512, 1024, 4096]) | ||
364 | 625 | check_output = self.patch(subprocess, "check_output") | ||
365 | 626 | |||
366 | 627 | name2 = factory.make_name('name') | ||
367 | 628 | |||
368 | 629 | # Create simulated /dev tree. | ||
369 | 630 | devroot = self.make_dir() | ||
370 | 631 | os.mkdir(os.path.join(devroot, 'disk')) | ||
371 | 632 | byidroot = os.path.join(devroot, 'disk', 'by_id') | ||
372 | 633 | os.mkdir(byidroot) | ||
373 | 634 | |||
374 | 635 | os.mknod(os.path.join(devroot, name)) | ||
375 | 636 | os.symlink(os.path.join(devroot, name), | ||
376 | 637 | os.path.join(byidroot, 'deviceid')) | ||
377 | 638 | |||
378 | 639 | os.mknod(os.path.join(devroot, name2)) | ||
379 | 640 | os.symlink(os.path.join(devroot, name2), | ||
380 | 641 | os.path.join(byidroot, 'deviceid2')) | ||
381 | 642 | |||
382 | 643 | check_output.side_effect = [ | ||
383 | 644 | b"\n".join([ | ||
384 | 645 | self.make_lsblk_output(name=name, model=model), | ||
385 | 646 | self.make_lsblk_output(name=name2, model=model)]), | ||
386 | 647 | self.make_udevadm_output(name, serial=serial, dev=devroot), | ||
387 | 648 | self.make_udevadm_output(name2, serial=serial, dev=devroot), | ||
388 | 649 | b'%d' % size, | ||
389 | 650 | b'%d' % block_size, | ||
390 | 651 | b'%d' % size, | ||
391 | 652 | b'%d' % block_size, | ||
392 | 653 | ] | ||
393 | 654 | |||
394 | 655 | self.assertEqual([{ | ||
395 | 656 | "NAME": name, | ||
396 | 657 | "PATH": os.path.join(devroot, name), | ||
397 | 658 | "ID_PATH": os.path.join(byidroot, 'deviceid'), | ||
398 | 659 | "RO": "0", | ||
399 | 660 | "RM": "0", | ||
400 | 661 | "MODEL": model, | ||
401 | 662 | "ROTA": "1", | ||
402 | 663 | "SATA": "1", | ||
403 | 664 | "SERIAL": serial, | ||
404 | 665 | "SIZE": "%s" % size, | ||
405 | 666 | "BLOCK_SIZE": "%s" % block_size, | ||
406 | 667 | "RPM": "5400", | ||
407 | 668 | }], self.call_gather_physical_block_devices(byidroot)) | ||
447 | 669 | 572 | ||
448 | 670 | def test__keeps_block_device_same_serial_different_model(self): | 573 | def test__keeps_block_device_same_serial_different_model(self): |
449 | 671 | """Multipath disks get multiple IDs, but same serial is same device.""" | 574 | """Multipath disks get multiple IDs, but same serial is same device.""" |
450 | 672 | name = factory.make_name('name') | 575 | name = factory.make_name('name') |
451 | 673 | model = factory.make_name('model') | 576 | model = factory.make_name('model') |
452 | 577 | maj_min = (0, 0) | ||
453 | 674 | serial = factory.make_name('serial') | 578 | serial = factory.make_name('serial') |
454 | 675 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | 579 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) |
455 | 676 | block_size = random.choice([512, 1024, 4096]) | 580 | block_size = random.choice([512, 1024, 4096]) |
456 | @@ -678,6 +582,7 @@ | |||
457 | 678 | 582 | ||
458 | 679 | name2 = factory.make_name('name') | 583 | name2 = factory.make_name('name') |
459 | 680 | model2 = factory.make_name('model') | 584 | model2 = factory.make_name('model') |
460 | 585 | maj_min2 = (1, 1) | ||
461 | 681 | 586 | ||
462 | 682 | # Create simulated /dev tree. | 587 | # Create simulated /dev tree. |
463 | 683 | devroot = self.make_dir() | 588 | devroot = self.make_dir() |
464 | @@ -685,18 +590,23 @@ | |||
465 | 685 | byidroot = os.path.join(devroot, 'disk', 'by_id') | 590 | byidroot = os.path.join(devroot, 'disk', 'by_id') |
466 | 686 | os.mkdir(byidroot) | 591 | os.mkdir(byidroot) |
467 | 687 | 592 | ||
471 | 688 | os.mknod(os.path.join(devroot, name)) | 593 | drive_path = os.path.join(devroot, name) |
472 | 689 | os.symlink(os.path.join(devroot, name), | 594 | os.mknod(drive_path) |
473 | 690 | os.path.join(byidroot, 'deviceid')) | 595 | device_id_path = os.path.join(byidroot, 'deviceid') |
474 | 596 | os.symlink(os.path.join(devroot, name), device_id_path) | ||
475 | 691 | 597 | ||
479 | 692 | os.mknod(os.path.join(devroot, name2)) | 598 | drive_path2 = os.path.join(devroot, name2) |
480 | 693 | os.symlink(os.path.join(devroot, name2), | 599 | os.mknod(drive_path2) |
481 | 694 | os.path.join(byidroot, 'deviceid2')) | 600 | device_id_path2 = os.path.join(byidroot, 'deviceid2') |
482 | 601 | os.symlink(os.path.join(devroot, name2), device_id_path2) | ||
483 | 695 | 602 | ||
484 | 696 | check_output.side_effect = [ | 603 | check_output.side_effect = [ |
485 | 697 | b"\n".join([ | 604 | b"\n".join([ |
488 | 698 | self.make_lsblk_output(name=name, model=model), | 605 | self.make_lsblk_output( |
489 | 699 | self.make_lsblk_output(name=name2, model=model2)]), | 606 | name=name, model=model, maj_min=maj_min), |
490 | 607 | self.make_lsblk_output( | ||
491 | 608 | name=name2, model=model2, maj_min=maj_min2) | ||
492 | 609 | ]), | ||
493 | 700 | self.make_udevadm_output(name, serial=serial, dev=devroot), | 610 | self.make_udevadm_output(name, serial=serial, dev=devroot), |
494 | 701 | self.make_udevadm_output(name2, serial=serial, dev=devroot), | 611 | self.make_udevadm_output(name2, serial=serial, dev=devroot), |
495 | 702 | b'%d' % size, | 612 | b'%d' % size, |
496 | @@ -705,44 +615,29 @@ | |||
497 | 705 | b'%d' % block_size, | 615 | b'%d' % block_size, |
498 | 706 | ] | 616 | ] |
499 | 707 | 617 | ||
527 | 708 | self.assertEqual([{ | 618 | for ref, out in zip( |
528 | 709 | "NAME": name, | 619 | [ |
529 | 710 | "PATH": os.path.join(devroot, name), | 620 | self.make_output( |
530 | 711 | "ID_PATH": os.path.join(byidroot, 'deviceid'), | 621 | name, maj_min, model, serial, size, block_size, |
531 | 712 | "RO": "0", | 622 | drive_path, device_id_path), |
532 | 713 | "RM": "0", | 623 | self.make_output( |
533 | 714 | "MODEL": model, | 624 | name2, maj_min2, model2, serial, size, block_size, |
534 | 715 | "ROTA": "1", | 625 | drive_path2, device_id_path2), |
535 | 716 | "SATA": "1", | 626 | ], self.call_gather_physical_block_devices(byidroot)): |
536 | 717 | "SERIAL": serial, | 627 | self.assertDictEqual(ref, out) |
510 | 718 | "SIZE": "%s" % size, | ||
511 | 719 | "BLOCK_SIZE": "%s" % block_size, | ||
512 | 720 | "RPM": "5400", | ||
513 | 721 | }, { | ||
514 | 722 | "NAME": name2, | ||
515 | 723 | "PATH": os.path.join(devroot, name2), | ||
516 | 724 | "ID_PATH": os.path.join(byidroot, 'deviceid2'), | ||
517 | 725 | "RO": "0", | ||
518 | 726 | "RM": "0", | ||
519 | 727 | "MODEL": model2, | ||
520 | 728 | "ROTA": "1", | ||
521 | 729 | "SATA": "1", | ||
522 | 730 | "SERIAL": serial, | ||
523 | 731 | "SIZE": "%s" % size, | ||
524 | 732 | "BLOCK_SIZE": "%s" % block_size, | ||
525 | 733 | "RPM": "5400", | ||
526 | 734 | }], self.call_gather_physical_block_devices(byidroot)) | ||
537 | 735 | 628 | ||
538 | 736 | def test__keeps_block_device_blank_serial_same_model(self): | 629 | def test__keeps_block_device_blank_serial_same_model(self): |
539 | 737 | """Multipath disks get multiple IDs, but same serial is same device.""" | 630 | """Multipath disks get multiple IDs, but same serial is same device.""" |
540 | 738 | name = factory.make_name('name') | 631 | name = factory.make_name('name') |
541 | 739 | model = factory.make_name('model') | 632 | model = factory.make_name('model') |
542 | 633 | maj_min = (0, 0) | ||
543 | 740 | serial = '' | 634 | serial = '' |
544 | 741 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | 635 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) |
545 | 742 | block_size = random.choice([512, 1024, 4096]) | 636 | block_size = random.choice([512, 1024, 4096]) |
546 | 743 | check_output = self.patch(subprocess, "check_output") | 637 | check_output = self.patch(subprocess, "check_output") |
547 | 744 | 638 | ||
548 | 745 | name2 = factory.make_name('name') | 639 | name2 = factory.make_name('name') |
549 | 640 | maj_min2 = (1, 1) | ||
550 | 746 | 641 | ||
551 | 747 | # Create simulated /dev tree. | 642 | # Create simulated /dev tree. |
552 | 748 | devroot = self.make_dir() | 643 | devroot = self.make_dir() |
553 | @@ -750,18 +645,22 @@ | |||
554 | 750 | byidroot = os.path.join(devroot, 'disk', 'by_id') | 645 | byidroot = os.path.join(devroot, 'disk', 'by_id') |
555 | 751 | os.mkdir(byidroot) | 646 | os.mkdir(byidroot) |
556 | 752 | 647 | ||
560 | 753 | os.mknod(os.path.join(devroot, name)) | 648 | drive_path = os.path.join(devroot, name) |
561 | 754 | os.symlink(os.path.join(devroot, name), | 649 | os.mknod(drive_path) |
562 | 755 | os.path.join(byidroot, 'deviceid')) | 650 | device_id_path = os.path.join(byidroot, 'deviceid') |
563 | 651 | os.symlink(os.path.join(devroot, name), device_id_path) | ||
564 | 756 | 652 | ||
568 | 757 | os.mknod(os.path.join(devroot, name2)) | 653 | drive_path2 = os.path.join(devroot, name2) |
569 | 758 | os.symlink(os.path.join(devroot, name2), | 654 | os.mknod(drive_path2) |
570 | 759 | os.path.join(byidroot, 'deviceid2')) | 655 | device_id_path2 = os.path.join(byidroot, 'deviceid2') |
571 | 656 | os.symlink(os.path.join(devroot, name2), device_id_path2) | ||
572 | 760 | 657 | ||
573 | 761 | check_output.side_effect = [ | 658 | check_output.side_effect = [ |
574 | 762 | b"\n".join([ | 659 | b"\n".join([ |
577 | 763 | self.make_lsblk_output(name=name, model=model), | 660 | self.make_lsblk_output( |
578 | 764 | self.make_lsblk_output(name=name2, model=model)]), | 661 | name=name, model=model, maj_min=maj_min), |
579 | 662 | self.make_lsblk_output( | ||
580 | 663 | name=name2, model=model, maj_min=maj_min2)]), | ||
581 | 765 | self.make_udevadm_output(name, serial=serial, dev=devroot), | 664 | self.make_udevadm_output(name, serial=serial, dev=devroot), |
582 | 766 | self.make_udevadm_output(name2, serial=serial, dev=devroot), | 665 | self.make_udevadm_output(name2, serial=serial, dev=devroot), |
583 | 767 | b'%d' % size, | 666 | b'%d' % size, |
584 | @@ -770,38 +669,22 @@ | |||
585 | 770 | b'%d' % block_size, | 669 | b'%d' % block_size, |
586 | 771 | ] | 670 | ] |
587 | 772 | 671 | ||
615 | 773 | self.assertEqual([{ | 672 | for ref, out in zip( |
616 | 774 | "NAME": name, | 673 | [ |
617 | 775 | "PATH": os.path.join(devroot, name), | 674 | self.make_output( |
618 | 776 | "ID_PATH": os.path.join(byidroot, 'deviceid'), | 675 | name, maj_min, model, serial, size, block_size, |
619 | 777 | "RO": "0", | 676 | drive_path, device_id_path), |
620 | 778 | "RM": "0", | 677 | self.make_output( |
621 | 779 | "MODEL": model, | 678 | name2, maj_min2, model, serial, size, block_size, |
622 | 780 | "ROTA": "1", | 679 | drive_path2, device_id_path2), |
623 | 781 | "SATA": "1", | 680 | ], self.call_gather_physical_block_devices(byidroot)): |
624 | 782 | "SERIAL": serial, | 681 | self.assertDictEqual(ref, out) |
598 | 783 | "SIZE": "%s" % size, | ||
599 | 784 | "BLOCK_SIZE": "%s" % block_size, | ||
600 | 785 | "RPM": "5400", | ||
601 | 786 | }, { | ||
602 | 787 | "NAME": name2, | ||
603 | 788 | "PATH": os.path.join(devroot, name2), | ||
604 | 789 | "ID_PATH": os.path.join(byidroot, 'deviceid2'), | ||
605 | 790 | "RO": "0", | ||
606 | 791 | "RM": "0", | ||
607 | 792 | "MODEL": model, | ||
608 | 793 | "ROTA": "1", | ||
609 | 794 | "SATA": "1", | ||
610 | 795 | "SERIAL": serial, | ||
611 | 796 | "SIZE": "%s" % size, | ||
612 | 797 | "BLOCK_SIZE": "%s" % block_size, | ||
613 | 798 | "RPM": "5400", | ||
614 | 799 | }], self.call_gather_physical_block_devices(byidroot)) | ||
625 | 800 | 682 | ||
626 | 801 | def test__returns_block_device_without_id_path(self): | 683 | def test__returns_block_device_without_id_path(self): |
627 | 802 | """Block devices without by-id links should not have ID_PATH key""" | 684 | """Block devices without by-id links should not have ID_PATH key""" |
628 | 803 | name = factory.make_name('name') | 685 | name = factory.make_name('name') |
629 | 804 | model = factory.make_name('model') | 686 | model = factory.make_name('model') |
630 | 687 | maj_min = (random.randint(0, 255), random.randint(0, 255)) | ||
631 | 805 | serial = factory.make_name('serial') | 688 | serial = factory.make_name('serial') |
632 | 806 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | 689 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) |
633 | 807 | block_size = random.choice([512, 1024, 4096]) | 690 | block_size = random.choice([512, 1024, 4096]) |
634 | @@ -812,158 +695,113 @@ | |||
635 | 812 | os.mkdir(os.path.join(devroot, 'disk')) | 695 | os.mkdir(os.path.join(devroot, 'disk')) |
636 | 813 | byidroot = os.path.join(devroot, 'disk', 'by_id') | 696 | byidroot = os.path.join(devroot, 'disk', 'by_id') |
637 | 814 | os.mkdir(byidroot) | 697 | os.mkdir(byidroot) |
639 | 815 | os.mknod(os.path.join(devroot, name)) | 698 | drive_path = os.path.join(devroot, name) |
640 | 699 | os.mknod(drive_path) | ||
641 | 816 | 700 | ||
642 | 817 | check_output.side_effect = [ | 701 | check_output.side_effect = [ |
644 | 818 | self.make_lsblk_output(name=name, model=model), | 702 | self.make_lsblk_output(name=name, model=model, maj_min=maj_min), |
645 | 819 | self.make_udevadm_output(name, serial=serial, dev=devroot), | 703 | self.make_udevadm_output(name, serial=serial, dev=devroot), |
646 | 820 | b'%d' % size, | 704 | b'%d' % size, |
647 | 821 | b'%d' % block_size, | 705 | b'%d' % block_size, |
648 | 822 | ] | 706 | ] |
662 | 823 | self.assertEqual([{ | 707 | for ref, out in zip( |
663 | 824 | "NAME": name, | 708 | [ |
664 | 825 | "PATH": os.path.join(devroot, name), | 709 | self.make_output( |
665 | 826 | "RO": "0", | 710 | name, maj_min, model, serial, size, block_size, |
666 | 827 | "RM": "0", | 711 | drive_path), |
667 | 828 | "MODEL": model, | 712 | ], self.call_gather_physical_block_devices(byidroot)): |
668 | 829 | "ROTA": "1", | 713 | self.assertDictEqual(ref, out) |
656 | 830 | "SATA": "1", | ||
657 | 831 | "SERIAL": serial, | ||
658 | 832 | "SIZE": "%s" % size, | ||
659 | 833 | "BLOCK_SIZE": "%s" % block_size, | ||
660 | 834 | "RPM": "5400", | ||
661 | 835 | }], self.call_gather_physical_block_devices(byidroot)) | ||
669 | 836 | 714 | ||
670 | 837 | def test__returns_block_device_readonly(self): | 715 | def test__returns_block_device_readonly(self): |
671 | 838 | name = factory.make_name('name') | 716 | name = factory.make_name('name') |
672 | 839 | model = factory.make_name('model') | 717 | model = factory.make_name('model') |
673 | 718 | maj_min = (random.randint(0, 255), random.randint(0, 255)) | ||
674 | 840 | serial = factory.make_name('serial') | 719 | serial = factory.make_name('serial') |
675 | 841 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | 720 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) |
676 | 842 | block_size = random.choice([512, 1024, 4096]) | 721 | block_size = random.choice([512, 1024, 4096]) |
677 | 843 | check_output = self.patch(subprocess, "check_output") | 722 | check_output = self.patch(subprocess, "check_output") |
678 | 844 | check_output.side_effect = [ | 723 | check_output.side_effect = [ |
680 | 845 | self.make_lsblk_output(name=name, model=model, read_only=True), | 724 | self.make_lsblk_output( |
681 | 725 | name=name, model=model, read_only=True, maj_min=maj_min), | ||
682 | 846 | self.make_udevadm_output(name, serial=serial), | 726 | self.make_udevadm_output(name, serial=serial), |
683 | 847 | b'%d' % size, | 727 | b'%d' % size, |
684 | 848 | b'%d' % block_size, | 728 | b'%d' % block_size, |
685 | 849 | ] | 729 | ] |
699 | 850 | self.assertEqual([{ | 730 | for ref, out in zip( |
700 | 851 | "NAME": name, | 731 | [ |
701 | 852 | "PATH": "/dev/%s" % name, | 732 | self.make_output( |
702 | 853 | "RO": "1", | 733 | name, maj_min, model, serial, size, |
703 | 854 | "RM": "0", | 734 | block_size, read_only=True), |
704 | 855 | "MODEL": model, | 735 | ], self.call_gather_physical_block_devices()): |
705 | 856 | "ROTA": "1", | 736 | self.assertDictEqual(ref, out) |
693 | 857 | "SATA": "1", | ||
694 | 858 | "SERIAL": serial, | ||
695 | 859 | "SIZE": "%s" % size, | ||
696 | 860 | "BLOCK_SIZE": "%s" % block_size, | ||
697 | 861 | "RPM": "5400", | ||
698 | 862 | }], self.call_gather_physical_block_devices()) | ||
706 | 863 | 737 | ||
707 | 864 | def test__returns_block_device_ssd(self): | 738 | def test__returns_block_device_ssd(self): |
708 | 865 | name = factory.make_name('name') | 739 | name = factory.make_name('name') |
709 | 866 | model = factory.make_name('model') | 740 | model = factory.make_name('model') |
710 | 741 | maj_min = (random.randint(0, 255), random.randint(0, 255)) | ||
711 | 867 | serial = factory.make_name('serial') | 742 | serial = factory.make_name('serial') |
712 | 868 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | 743 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) |
713 | 869 | block_size = random.choice([512, 1024, 4096]) | 744 | block_size = random.choice([512, 1024, 4096]) |
714 | 870 | check_output = self.patch(subprocess, "check_output") | 745 | check_output = self.patch(subprocess, "check_output") |
715 | 871 | check_output.side_effect = [ | 746 | check_output.side_effect = [ |
717 | 872 | self.make_lsblk_output(name=name, model=model, rotary=False), | 747 | self.make_lsblk_output( |
718 | 748 | name=name, model=model, rotary=False, maj_min=maj_min), | ||
719 | 873 | self.make_udevadm_output(name, serial=serial), | 749 | self.make_udevadm_output(name, serial=serial), |
720 | 874 | b'%d' % size, | 750 | b'%d' % size, |
721 | 875 | b'%d' % block_size, | 751 | b'%d' % block_size, |
722 | 876 | ] | 752 | ] |
736 | 877 | self.assertEqual([{ | 753 | for ref, out in zip( |
737 | 878 | "NAME": name, | 754 | [ |
738 | 879 | "PATH": "/dev/%s" % name, | 755 | self.make_output( |
739 | 880 | "RO": "0", | 756 | name, maj_min, model, serial, size, block_size, |
740 | 881 | "RM": "0", | 757 | rotary=False), |
741 | 882 | "MODEL": model, | 758 | ], self.call_gather_physical_block_devices()): |
742 | 883 | "ROTA": "0", | 759 | self.assertDictEqual(ref, out) |
730 | 884 | "SATA": "1", | ||
731 | 885 | "SERIAL": serial, | ||
732 | 886 | "SIZE": "%s" % size, | ||
733 | 887 | "BLOCK_SIZE": "%s" % block_size, | ||
734 | 888 | "RPM": "5400", | ||
735 | 889 | }], self.call_gather_physical_block_devices()) | ||
743 | 890 | 760 | ||
744 | 891 | def test__returns_block_device_not_sata(self): | 761 | def test__returns_block_device_not_sata(self): |
745 | 892 | name = factory.make_name('name') | 762 | name = factory.make_name('name') |
746 | 893 | model = factory.make_name('model') | 763 | model = factory.make_name('model') |
747 | 764 | maj_min = (random.randint(0, 255), random.randint(0, 255)) | ||
748 | 894 | serial = factory.make_name('serial') | 765 | serial = factory.make_name('serial') |
749 | 895 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | 766 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) |
750 | 896 | block_size = random.choice([512, 1024, 4096]) | 767 | block_size = random.choice([512, 1024, 4096]) |
751 | 897 | check_output = self.patch(subprocess, "check_output") | 768 | check_output = self.patch(subprocess, "check_output") |
752 | 898 | check_output.side_effect = [ | 769 | check_output.side_effect = [ |
754 | 899 | self.make_lsblk_output(name=name, model=model), | 770 | self.make_lsblk_output(name=name, model=model, maj_min=maj_min), |
755 | 900 | self.make_udevadm_output(name, serial=serial, sata=False), | 771 | self.make_udevadm_output(name, serial=serial, sata=False), |
756 | 901 | b'%d' % size, | 772 | b'%d' % size, |
757 | 902 | b'%d' % block_size, | 773 | b'%d' % block_size, |
758 | 903 | ] | 774 | ] |
772 | 904 | self.assertEqual([{ | 775 | for ref, out in zip( |
773 | 905 | "NAME": name, | 776 | [ |
774 | 906 | "PATH": "/dev/%s" % name, | 777 | self.make_output( |
775 | 907 | "RO": "0", | 778 | name, maj_min, model, serial, size, block_size, |
776 | 908 | "RM": "0", | 779 | sata=False), |
777 | 909 | "MODEL": model, | 780 | ], self.call_gather_physical_block_devices()): |
778 | 910 | "ROTA": "1", | 781 | self.assertDictEqual(ref, out) |
766 | 911 | "SATA": "0", | ||
767 | 912 | "SERIAL": serial, | ||
768 | 913 | "SIZE": "%s" % size, | ||
769 | 914 | "BLOCK_SIZE": "%s" % block_size, | ||
770 | 915 | "RPM": "5400", | ||
771 | 916 | }], self.call_gather_physical_block_devices()) | ||
779 | 917 | 782 | ||
780 | 918 | def test__returns_block_device_removable(self): | 783 | def test__returns_block_device_removable(self): |
781 | 919 | name = factory.make_name('name') | 784 | name = factory.make_name('name') |
782 | 920 | model = factory.make_name('model') | 785 | model = factory.make_name('model') |
783 | 786 | maj_min = (random.randint(0, 255), random.randint(0, 255)) | ||
784 | 921 | serial = factory.make_name('serial') | 787 | serial = factory.make_name('serial') |
785 | 922 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) | 788 | size = random.randint(3000 * 1000, 1000 * 1000 * 1000) |
786 | 923 | block_size = random.choice([512, 1024, 4096]) | 789 | block_size = random.choice([512, 1024, 4096]) |
787 | 924 | check_output = self.patch(subprocess, "check_output") | 790 | check_output = self.patch(subprocess, "check_output") |
788 | 925 | check_output.side_effect = [ | 791 | check_output.side_effect = [ |
790 | 926 | self.make_lsblk_output(name=name, model=model, removable=True), | 792 | self.make_lsblk_output( |
791 | 793 | name=name, model=model, removable=True, maj_min=maj_min), | ||
792 | 927 | self.make_udevadm_output(name, serial=serial), | 794 | self.make_udevadm_output(name, serial=serial), |
793 | 928 | b'%d' % size, | 795 | b'%d' % size, |
794 | 929 | b'%d' % block_size, | 796 | b'%d' % block_size, |
795 | 930 | ] | 797 | ] |
832 | 931 | self.assertEqual([{ | 798 | for ref, out in zip( |
833 | 932 | "NAME": name, | 799 | [ |
834 | 933 | "PATH": "/dev/%s" % name, | 800 | self.make_output( |
835 | 934 | "RO": "0", | 801 | name, maj_min, model, serial, size, block_size, |
836 | 935 | "RM": "1", | 802 | removable=True), |
837 | 936 | "MODEL": model, | 803 | ], self.call_gather_physical_block_devices()): |
838 | 937 | "ROTA": "1", | 804 | self.assertDictEqual(ref, out) |
803 | 938 | "SATA": "1", | ||
804 | 939 | "SERIAL": serial, | ||
805 | 940 | "SIZE": "%s" % size, | ||
806 | 941 | "BLOCK_SIZE": "%s" % block_size, | ||
807 | 942 | "RPM": "5400", | ||
808 | 943 | }], self.call_gather_physical_block_devices()) | ||
809 | 944 | |||
810 | 945 | def test__returns_multiple_block_devices_in_order(self): | ||
811 | 946 | names = [factory.make_name('name') for _ in range(3)] | ||
812 | 947 | lsblk = [ | ||
813 | 948 | self.make_lsblk_output(name=name) | ||
814 | 949 | for name in names | ||
815 | 950 | ] | ||
816 | 951 | call_outputs = [] | ||
817 | 952 | call_outputs.append(b"\n".join(lsblk)) | ||
818 | 953 | for name in names: | ||
819 | 954 | call_outputs.append(self.make_udevadm_output(name)) | ||
820 | 955 | for name in names: | ||
821 | 956 | call_outputs.append( | ||
822 | 957 | b"%d" % random.randint(1000 * 1000, 1000 * 1000 * 1000)) | ||
823 | 958 | call_outputs.append( | ||
824 | 959 | b"%d" % random.choice([512, 1024, 4096])) | ||
825 | 960 | check_output = self.patch(subprocess, "check_output") | ||
826 | 961 | check_output.side_effect = call_outputs | ||
827 | 962 | device_names = [ | ||
828 | 963 | block_info['NAME'] | ||
829 | 964 | for block_info in self.call_gather_physical_block_devices() | ||
830 | 965 | ] | ||
831 | 966 | self.assertEqual(names, device_names) | ||
839 | 967 | 805 | ||
840 | 968 | 806 | ||
841 | 969 | class TestVirtualityScript(MAASTestCase): | 807 | class TestVirtualityScript(MAASTestCase): |
Approved in https:/ /code.launchpad .net/~ltrager/ maas/lp1685361/ +merge/ 322993