Merge ~ack/maas:1848043-websocket-storage-vol-numa into maas:master
- Git
- lp:~ack/maas
- 1848043-websocket-storage-vol-numa
- Merge into master
Proposed by
Alberto Donato
Status: | Merged |
---|---|
Approved by: | Alberto Donato |
Approved revision: | e216dc92901f7a0cb768ba0c96c0a99e9d20a041 |
Merge reported by: | MAAS Lander |
Merged at revision: | not available |
Proposed branch: | ~ack/maas:1848043-websocket-storage-vol-numa |
Merge into: | maas:master |
Diff against target: |
449 lines (+277/-6) 9 files modified
src/maasserver/models/cacheset.py (+23/-0) src/maasserver/models/filesystem.py (+16/-0) src/maasserver/models/filesystemgroup.py (+17/-0) src/maasserver/models/tests/test_cacheset.py (+34/-0) src/maasserver/models/tests/test_filesystem.py (+41/-1) src/maasserver/models/tests/test_filesystemgroup.py (+85/-0) src/maasserver/models/virtualblockdevice.py (+4/-5) src/maasserver/websockets/handlers/node.py (+2/-0) src/maasserver/websockets/handlers/tests/test_machine.py (+55/-0) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Newell Jensen (community) | Approve | ||
MAAS Lander | Approve | ||
Review via email:
|
Commit message
LP: #1848043 - Add numa node indexes to websocket dehydration of CacheSets and FilesystemGroups
Description of the change
To post a comment you must log in.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b 1848043-
STATUS: FAILED
LOG: http://
COMMIT: 4a507375d22fcb9
review:
Needs Fixing
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b 1848043-
STATUS: SUCCESS
COMMIT: e216dc92901f7a0
review:
Approve
There was an error fetching revisions from git servers. Please try again in a few minutes. If the problem persists, contact Launchpad support.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/src/maasserver/models/cacheset.py b/src/maasserver/models/cacheset.py | |||
2 | index 97996e2..5246454 100644 | |||
3 | --- a/src/maasserver/models/cacheset.py | |||
4 | +++ b/src/maasserver/models/cacheset.py | |||
5 | @@ -5,6 +5,7 @@ | |||
6 | 5 | 5 | ||
7 | 6 | __all__ = ["CacheSet"] | 6 | __all__ = ["CacheSet"] |
8 | 7 | 7 | ||
9 | 8 | from itertools import chain | ||
10 | 8 | 9 | ||
11 | 9 | from django.core.exceptions import PermissionDenied | 10 | from django.core.exceptions import PermissionDenied |
12 | 10 | from django.db.models import Manager, Q | 11 | from django.db.models import Manager, Q |
13 | @@ -13,6 +14,7 @@ from django.http import Http404 | |||
14 | 13 | from maasserver import DefaultMeta | 14 | from maasserver import DefaultMeta |
15 | 14 | from maasserver.enum import FILESYSTEM_TYPE | 15 | from maasserver.enum import FILESYSTEM_TYPE |
16 | 15 | from maasserver.models.cleansave import CleanSave | 16 | from maasserver.models.cleansave import CleanSave |
17 | 17 | from maasserver.models.numa import NUMANode | ||
18 | 16 | from maasserver.models.timestampedmodel import TimestampedModel | 18 | from maasserver.models.timestampedmodel import TimestampedModel |
19 | 17 | 19 | ||
20 | 18 | 20 | ||
21 | @@ -188,3 +190,24 @@ class CacheSet(CleanSave, TimestampedModel): | |||
22 | 188 | return None | 190 | return None |
23 | 189 | else: | 191 | else: |
24 | 190 | return filesystem.get_parent() | 192 | return filesystem.get_parent() |
25 | 193 | |||
26 | 194 | def get_numa_node_indexes(self): | ||
27 | 195 | """Return NUMA node indexes for physical devices making up the cacheset.""" | ||
28 | 196 | numa_node_indexes = set( | ||
29 | 197 | chain( | ||
30 | 198 | *( | ||
31 | 199 | fsgroup.get_numa_node_indexes() | ||
32 | 200 | for fsgroup in self.filesystemgroup_set.all() | ||
33 | 201 | ) | ||
34 | 202 | ) | ||
35 | 203 | ) | ||
36 | 204 | filesystem = self.get_filesystem() | ||
37 | 205 | if filesystem: | ||
38 | 206 | block_devices = filesystem.get_physical_block_devices() | ||
39 | 207 | numa_ids = set(device.numa_node_id for device in block_devices) | ||
40 | 208 | numa_node_indexes.update( | ||
41 | 209 | NUMANode.objects.filter(id__in=numa_ids) | ||
42 | 210 | .values_list("index", flat=True) | ||
43 | 211 | .order_by("index") | ||
44 | 212 | ) | ||
45 | 213 | return sorted(numa_node_indexes) | ||
46 | diff --git a/src/maasserver/models/filesystem.py b/src/maasserver/models/filesystem.py | |||
47 | index cc591c9..a34f4d7 100644 | |||
48 | --- a/src/maasserver/models/filesystem.py | |||
49 | +++ b/src/maasserver/models/filesystem.py | |||
50 | @@ -29,6 +29,7 @@ from maasserver.models.cacheset import CacheSet | |||
51 | 29 | from maasserver.models.cleansave import CleanSave | 29 | from maasserver.models.cleansave import CleanSave |
52 | 30 | from maasserver.models.filesystemgroup import FilesystemGroup | 30 | from maasserver.models.filesystemgroup import FilesystemGroup |
53 | 31 | from maasserver.models.partition import Partition | 31 | from maasserver.models.partition import Partition |
54 | 32 | from maasserver.models.physicalblockdevice import PhysicalBlockDevice | ||
55 | 32 | from maasserver.models.timestampedmodel import TimestampedModel | 33 | from maasserver.models.timestampedmodel import TimestampedModel |
56 | 33 | 34 | ||
57 | 34 | 35 | ||
58 | @@ -170,6 +171,21 @@ class Filesystem(CleanSave, TimestampedModel): | |||
59 | 170 | # XXX: Explode instead? | 171 | # XXX: Explode instead? |
60 | 171 | return None | 172 | return None |
61 | 172 | 173 | ||
62 | 174 | def get_physical_block_devices(self): | ||
63 | 175 | """Return PhysicalBlockDevices backing the filesystem.""" | ||
64 | 176 | from maasserver.models.virtualblockdevice import VirtualBlockDevice | ||
65 | 177 | |||
66 | 178 | devices = [] | ||
67 | 179 | parent = self.get_parent() | ||
68 | 180 | if isinstance(parent, PhysicalBlockDevice): | ||
69 | 181 | devices.append(parent) | ||
70 | 182 | elif isinstance(parent, VirtualBlockDevice): | ||
71 | 183 | for grandparent in parent.get_parents(): | ||
72 | 184 | device = grandparent.actual_instance | ||
73 | 185 | if isinstance(device, PhysicalBlockDevice): | ||
74 | 186 | devices.append(device) | ||
75 | 187 | return devices | ||
76 | 188 | |||
77 | 173 | def get_size(self): | 189 | def get_size(self): |
78 | 174 | """Size of filesystem.""" | 190 | """Size of filesystem.""" |
79 | 175 | if self.partition is not None: | 191 | if self.partition is not None: |
80 | diff --git a/src/maasserver/models/filesystemgroup.py b/src/maasserver/models/filesystemgroup.py | |||
81 | index 319e3a0..c3b9bb3 100644 | |||
82 | --- a/src/maasserver/models/filesystemgroup.py | |||
83 | +++ b/src/maasserver/models/filesystemgroup.py | |||
84 | @@ -6,6 +6,7 @@ a virtual block device. E.g. LVM Volume Group.""" | |||
85 | 6 | 6 | ||
86 | 7 | __all__ = ["Bcache", "FilesystemGroup", "RAID", "VMFS", "VolumeGroup"] | 7 | __all__ = ["Bcache", "FilesystemGroup", "RAID", "VMFS", "VolumeGroup"] |
87 | 8 | 8 | ||
88 | 9 | from itertools import chain | ||
89 | 9 | from uuid import uuid4 | 10 | from uuid import uuid4 |
90 | 10 | 11 | ||
91 | 11 | from django.core.exceptions import PermissionDenied, ValidationError | 12 | from django.core.exceptions import PermissionDenied, ValidationError |
92 | @@ -24,6 +25,7 @@ from maasserver.enum import ( | |||
93 | 24 | ) | 25 | ) |
94 | 25 | from maasserver.models.cacheset import CacheSet | 26 | from maasserver.models.cacheset import CacheSet |
95 | 26 | from maasserver.models.cleansave import CleanSave | 27 | from maasserver.models.cleansave import CleanSave |
96 | 28 | from maasserver.models.numa import NUMANode | ||
97 | 27 | from maasserver.models.timestampedmodel import TimestampedModel | 29 | from maasserver.models.timestampedmodel import TimestampedModel |
98 | 28 | from maasserver.utils.orm import get_one | 30 | from maasserver.utils.orm import get_one |
99 | 29 | 31 | ||
100 | @@ -392,6 +394,21 @@ class FilesystemGroup(CleanSave, TimestampedModel): | |||
101 | 392 | # that cache will be used. | 394 | # that cache will be used. |
102 | 393 | return get_one(self.virtual_devices.all()) | 395 | return get_one(self.virtual_devices.all()) |
103 | 394 | 396 | ||
104 | 397 | def get_numa_node_indexes(self): | ||
105 | 398 | """Return NUMA node indexes for physical devices making the volume group.""" | ||
106 | 399 | block_devices = chain( | ||
107 | 400 | *( | ||
108 | 401 | filesystem.get_physical_block_devices() | ||
109 | 402 | for filesystem in self.filesystems.all() | ||
110 | 403 | ) | ||
111 | 404 | ) | ||
112 | 405 | numa_ids = set(device.numa_node_id for device in block_devices) | ||
113 | 406 | return list( | ||
114 | 407 | NUMANode.objects.filter(id__in=numa_ids) | ||
115 | 408 | .values_list("index", flat=True) | ||
116 | 409 | .order_by("index") | ||
117 | 410 | ) | ||
118 | 411 | |||
119 | 395 | def get_node(self): | 412 | def get_node(self): |
120 | 396 | """`Node` this filesystem group belongs to.""" | 413 | """`Node` this filesystem group belongs to.""" |
121 | 397 | if self.filesystems.count() == 0: | 414 | if self.filesystems.count() == 0: |
122 | diff --git a/src/maasserver/models/tests/test_cacheset.py b/src/maasserver/models/tests/test_cacheset.py | |||
123 | index 6009a11..6341ea5 100644 | |||
124 | --- a/src/maasserver/models/tests/test_cacheset.py | |||
125 | +++ b/src/maasserver/models/tests/test_cacheset.py | |||
126 | @@ -10,6 +10,7 @@ import random | |||
127 | 10 | from django.core.exceptions import PermissionDenied | 10 | from django.core.exceptions import PermissionDenied |
128 | 11 | from django.http import Http404 | 11 | from django.http import Http404 |
129 | 12 | 12 | ||
130 | 13 | from maasserver.enum import FILESYSTEM_GROUP_TYPE, FILESYSTEM_TYPE | ||
131 | 13 | from maasserver.models import CacheSet | 14 | from maasserver.models import CacheSet |
132 | 14 | from maasserver.permissions import NodePermission | 15 | from maasserver.permissions import NodePermission |
133 | 15 | from maasserver.testing.factory import factory | 16 | from maasserver.testing.factory import factory |
134 | @@ -283,3 +284,36 @@ class TestCacheSet(MAASServerTestCase): | |||
135 | 283 | block_device = factory.make_PhysicalBlockDevice() | 284 | block_device = factory.make_PhysicalBlockDevice() |
136 | 284 | cache_set = factory.make_CacheSet(block_device=block_device) | 285 | cache_set = factory.make_CacheSet(block_device=block_device) |
137 | 285 | self.assertEqual(block_device, cache_set.get_device()) | 286 | self.assertEqual(block_device, cache_set.get_device()) |
138 | 287 | |||
139 | 288 | def test_get_numa_nodes_indexes_only_own_device(self): | ||
140 | 289 | block_device = factory.make_PhysicalBlockDevice() | ||
141 | 290 | cache_set = factory.make_CacheSet(block_device=block_device) | ||
142 | 291 | self.assertEqual(cache_set.get_numa_node_indexes(), [0]) | ||
143 | 292 | |||
144 | 293 | def test_get_numa_nodes_indexes_many_devices(self): | ||
145 | 294 | node = factory.make_Node() | ||
146 | 295 | numa_nodes = [ | ||
147 | 296 | node.default_numanode, | ||
148 | 297 | factory.make_NUMANode(node=node), | ||
149 | 298 | factory.make_NUMANode(node=node), | ||
150 | 299 | ] | ||
151 | 300 | block_devices = [ | ||
152 | 301 | factory.make_PhysicalBlockDevice(numa_node=numa_node) | ||
153 | 302 | for numa_node in numa_nodes | ||
154 | 303 | ] | ||
155 | 304 | filesystems = [ | ||
156 | 305 | factory.make_Filesystem( | ||
157 | 306 | fstype=FILESYSTEM_TYPE.LVM_PV, block_device=block_device | ||
158 | 307 | ) | ||
159 | 308 | for block_device in block_devices | ||
160 | 309 | ] | ||
161 | 310 | fsgroup = factory.make_FilesystemGroup( | ||
162 | 311 | node=node, | ||
163 | 312 | filesystems=filesystems, | ||
164 | 313 | group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, | ||
165 | 314 | ) | ||
166 | 315 | virtual_block_device = factory.make_VirtualBlockDevice( | ||
167 | 316 | filesystem_group=fsgroup | ||
168 | 317 | ) | ||
169 | 318 | cache_set = factory.make_CacheSet(block_device=virtual_block_device) | ||
170 | 319 | self.assertEqual(cache_set.get_numa_node_indexes(), [0, 1, 2]) | ||
171 | diff --git a/src/maasserver/models/tests/test_filesystem.py b/src/maasserver/models/tests/test_filesystem.py | |||
172 | index e97865b..b2da0b5 100644 | |||
173 | --- a/src/maasserver/models/tests/test_filesystem.py | |||
174 | +++ b/src/maasserver/models/tests/test_filesystem.py | |||
175 | @@ -15,7 +15,11 @@ from testscenarios import multiply_scenarios | |||
176 | 15 | from testtools import ExpectedException | 15 | from testtools import ExpectedException |
177 | 16 | from testtools.matchers import Equals, Is, IsInstance, MatchesStructure | 16 | from testtools.matchers import Equals, Is, IsInstance, MatchesStructure |
178 | 17 | 17 | ||
180 | 18 | from maasserver.enum import FILESYSTEM_FORMAT_TYPE_CHOICES_DICT | 18 | from maasserver.enum import ( |
181 | 19 | FILESYSTEM_FORMAT_TYPE_CHOICES_DICT, | ||
182 | 20 | FILESYSTEM_GROUP_TYPE, | ||
183 | 21 | FILESYSTEM_TYPE, | ||
184 | 22 | ) | ||
185 | 19 | from maasserver.models.filesystem import Filesystem | 23 | from maasserver.models.filesystem import Filesystem |
186 | 20 | from maasserver.testing.factory import factory | 24 | from maasserver.testing.factory import factory |
187 | 21 | from maasserver.testing.testcase import MAASServerTestCase | 25 | from maasserver.testing.testcase import MAASServerTestCase |
188 | @@ -71,6 +75,42 @@ class TestFilesystem(MAASServerTestCase): | |||
189 | 71 | fs = Filesystem() | 75 | fs = Filesystem() |
190 | 72 | self.assertIsNone(fs.get_node()) | 76 | self.assertIsNone(fs.get_node()) |
191 | 73 | 77 | ||
192 | 78 | def test_get_physical_block_devices_single(self): | ||
193 | 79 | node = factory.make_Node() | ||
194 | 80 | block_device = factory.make_PhysicalBlockDevice(node=node) | ||
195 | 81 | filesystem = factory.make_Filesystem( | ||
196 | 82 | fstype=FILESYSTEM_TYPE.LVM_PV, block_device=block_device | ||
197 | 83 | ) | ||
198 | 84 | self.assertEqual( | ||
199 | 85 | filesystem.get_physical_block_devices(), [block_device] | ||
200 | 86 | ) | ||
201 | 87 | |||
202 | 88 | def test_get_physical_block_devices_multiple(self): | ||
203 | 89 | node = factory.make_Node() | ||
204 | 90 | block_devices = [ | ||
205 | 91 | factory.make_PhysicalBlockDevice(node=node) for _ in range(3) | ||
206 | 92 | ] | ||
207 | 93 | filesystems = [ | ||
208 | 94 | factory.make_Filesystem( | ||
209 | 95 | fstype=FILESYSTEM_TYPE.LVM_PV, block_device=block_device | ||
210 | 96 | ) | ||
211 | 97 | for block_device in block_devices | ||
212 | 98 | ] | ||
213 | 99 | fsgroup = factory.make_FilesystemGroup( | ||
214 | 100 | node=node, | ||
215 | 101 | filesystems=filesystems, | ||
216 | 102 | group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, | ||
217 | 103 | ) | ||
218 | 104 | virtual_block_device = factory.make_VirtualBlockDevice( | ||
219 | 105 | filesystem_group=fsgroup | ||
220 | 106 | ) | ||
221 | 107 | filesystem = factory.make_Filesystem( | ||
222 | 108 | fstype=FILESYSTEM_TYPE.LVM_PV, block_device=virtual_block_device | ||
223 | 109 | ) | ||
224 | 110 | self.assertEqual( | ||
225 | 111 | filesystem.get_physical_block_devices(), block_devices | ||
226 | 112 | ) | ||
227 | 113 | |||
228 | 74 | def test_get_size_returns_partition_size(self): | 114 | def test_get_size_returns_partition_size(self): |
229 | 75 | partition = factory.make_Partition() | 115 | partition = factory.make_Partition() |
230 | 76 | fs = factory.make_Filesystem(partition=partition) | 116 | fs = factory.make_Filesystem(partition=partition) |
231 | diff --git a/src/maasserver/models/tests/test_filesystemgroup.py b/src/maasserver/models/tests/test_filesystemgroup.py | |||
232 | index 4fe263a..a84f46b 100644 | |||
233 | --- a/src/maasserver/models/tests/test_filesystemgroup.py | |||
234 | +++ b/src/maasserver/models/tests/test_filesystemgroup.py | |||
235 | @@ -684,6 +684,91 @@ class TestFilesystemGroup(MAASServerTestCase): | |||
236 | 684 | fsgroup.virtual_device, | 684 | fsgroup.virtual_device, |
237 | 685 | ) | 685 | ) |
238 | 686 | 686 | ||
239 | 687 | def test_get_numa_node_indexes_all_same(self): | ||
240 | 688 | fsgroup = factory.make_FilesystemGroup( | ||
241 | 689 | group_type=factory.pick_enum( | ||
242 | 690 | FILESYSTEM_GROUP_TYPE, but_not=FILESYSTEM_GROUP_TYPE.VMFS6 | ||
243 | 691 | ) | ||
244 | 692 | ) | ||
245 | 693 | self.assertEqual(fsgroup.get_numa_node_indexes(), [0]) | ||
246 | 694 | |||
247 | 695 | def test_get_numa_node_indexes_multiple(self): | ||
248 | 696 | node = factory.make_Node() | ||
249 | 697 | numa_nodes = [ | ||
250 | 698 | node.default_numanode, | ||
251 | 699 | factory.make_NUMANode(node=node), | ||
252 | 700 | factory.make_NUMANode(node=node), | ||
253 | 701 | ] | ||
254 | 702 | block_devices = [ | ||
255 | 703 | factory.make_PhysicalBlockDevice(numa_node=numa_node) | ||
256 | 704 | for numa_node in numa_nodes | ||
257 | 705 | ] | ||
258 | 706 | filesystems = [ | ||
259 | 707 | factory.make_Filesystem( | ||
260 | 708 | fstype=FILESYSTEM_TYPE.LVM_PV, block_device=block_device | ||
261 | 709 | ) | ||
262 | 710 | for block_device in block_devices | ||
263 | 711 | ] | ||
264 | 712 | fsgroup = factory.make_FilesystemGroup( | ||
265 | 713 | node=node, | ||
266 | 714 | filesystems=filesystems, | ||
267 | 715 | group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, | ||
268 | 716 | ) | ||
269 | 717 | self.assertEqual(fsgroup.get_numa_node_indexes(), [0, 1, 2]) | ||
270 | 718 | |||
271 | 719 | def test_get_numa_node_indexes_nested(self): | ||
272 | 720 | node = factory.make_Node() | ||
273 | 721 | numa_nodes = [ | ||
274 | 722 | node.default_numanode, | ||
275 | 723 | factory.make_NUMANode(node=node), | ||
276 | 724 | factory.make_NUMANode(node=node), | ||
277 | 725 | factory.make_NUMANode(node=node), | ||
278 | 726 | factory.make_NUMANode(node=node), | ||
279 | 727 | ] | ||
280 | 728 | # 2 physical disks have filesystems on them directly | ||
281 | 729 | filesystems = [ | ||
282 | 730 | factory.make_Filesystem( | ||
283 | 731 | fstype=FILESYSTEM_TYPE.LVM_PV, | ||
284 | 732 | block_device=factory.make_PhysicalBlockDevice( | ||
285 | 733 | numa_node=numa_node | ||
286 | 734 | ), | ||
287 | 735 | ) | ||
288 | 736 | for numa_node in numa_nodes[:2] | ||
289 | 737 | ] | ||
290 | 738 | |||
291 | 739 | # the 3 remaining disks are part of another filesystem group which gets | ||
292 | 740 | # added to the first | ||
293 | 741 | nested_filesystems = [ | ||
294 | 742 | factory.make_Filesystem( | ||
295 | 743 | fstype=FILESYSTEM_TYPE.LVM_PV, | ||
296 | 744 | block_device=factory.make_PhysicalBlockDevice( | ||
297 | 745 | numa_node=numa_node | ||
298 | 746 | ), | ||
299 | 747 | ) | ||
300 | 748 | for numa_node in numa_nodes[2:] | ||
301 | 749 | ] | ||
302 | 750 | nested_group = factory.make_FilesystemGroup( | ||
303 | 751 | node=node, | ||
304 | 752 | filesystems=nested_filesystems, | ||
305 | 753 | group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, | ||
306 | 754 | ) | ||
307 | 755 | virtual_block_device = factory.make_VirtualBlockDevice( | ||
308 | 756 | filesystem_group=nested_group | ||
309 | 757 | ) | ||
310 | 758 | filesystems.append( | ||
311 | 759 | factory.make_Filesystem( | ||
312 | 760 | fstype=FILESYSTEM_TYPE.LVM_PV, | ||
313 | 761 | block_device=virtual_block_device, | ||
314 | 762 | ) | ||
315 | 763 | ) | ||
316 | 764 | |||
317 | 765 | fsgroup = factory.make_FilesystemGroup( | ||
318 | 766 | node=node, | ||
319 | 767 | filesystems=filesystems, | ||
320 | 768 | group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, | ||
321 | 769 | ) | ||
322 | 770 | self.assertEqual(fsgroup.get_numa_node_indexes(), [0, 1, 2, 3, 4]) | ||
323 | 771 | |||
324 | 687 | def test_get_node_returns_first_filesystem_node(self): | 772 | def test_get_node_returns_first_filesystem_node(self): |
325 | 688 | fsgroup = factory.make_FilesystemGroup() | 773 | fsgroup = factory.make_FilesystemGroup() |
326 | 689 | self.assertEqual( | 774 | self.assertEqual( |
327 | diff --git a/src/maasserver/models/virtualblockdevice.py b/src/maasserver/models/virtualblockdevice.py | |||
328 | index 9b9bb65..b59be68 100644 | |||
329 | --- a/src/maasserver/models/virtualblockdevice.py | |||
330 | +++ b/src/maasserver/models/virtualblockdevice.py | |||
331 | @@ -153,13 +153,12 @@ class VirtualBlockDevice(BlockDevice): | |||
332 | 153 | return False | 153 | return False |
333 | 154 | else: | 154 | else: |
334 | 155 | return False | 155 | return False |
339 | 156 | for virtual_device in fs_group.virtual_devices.all(): | 156 | |
340 | 157 | if virtual_device.id == self.id: | 157 | # whether the device is part of the filesystem group |
341 | 158 | return True | 158 | return fs_group.virtual_devices.filter(id=self.id).exists() |
338 | 159 | return False | ||
342 | 160 | 159 | ||
343 | 161 | parents = [] | 160 | parents = [] |
345 | 162 | # We need to check all of the nodes block devices incase | 161 | # We need to check all of the nodes block devices in case |
346 | 163 | # we have nested virtual block devices. | 162 | # we have nested virtual block devices. |
347 | 164 | for block_device in self.node.blockdevice_set.all(): | 163 | for block_device in self.node.blockdevice_set.all(): |
348 | 165 | if block_device.id == self.id: | 164 | if block_device.id == self.id: |
349 | diff --git a/src/maasserver/websockets/handlers/node.py b/src/maasserver/websockets/handlers/node.py | |||
350 | index 7b47bca..e214716 100644 | |||
351 | --- a/src/maasserver/websockets/handlers/node.py | |||
352 | +++ b/src/maasserver/websockets/handlers/node.py | |||
353 | @@ -553,6 +553,7 @@ class NodeHandler(TimestampedModelHandler): | |||
354 | 553 | "used_for": "volume group", | 553 | "used_for": "volume group", |
355 | 554 | "filesystem": None, | 554 | "filesystem": None, |
356 | 555 | "partitions": None, | 555 | "partitions": None, |
357 | 556 | "numa_nodes": volume_group.get_numa_node_indexes(), | ||
358 | 556 | } | 557 | } |
359 | 557 | 558 | ||
360 | 558 | def dehydrate_cache_set(self, cache_set): | 559 | def dehydrate_cache_set(self, cache_set): |
361 | @@ -582,6 +583,7 @@ class NodeHandler(TimestampedModelHandler): | |||
362 | 582 | "used_for": ", ".join(bcache_devices), | 583 | "used_for": ", ".join(bcache_devices), |
363 | 583 | "filesystem": None, | 584 | "filesystem": None, |
364 | 584 | "partitions": None, | 585 | "partitions": None, |
365 | 586 | "numa_nodes": cache_set.get_numa_node_indexes(), | ||
366 | 585 | } | 587 | } |
367 | 586 | 588 | ||
368 | 587 | def dehydrate_partitions(self, partition_table): | 589 | def dehydrate_partitions(self, partition_table): |
369 | diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py | |||
370 | index 7144d1e..010e8bc 100644 | |||
371 | --- a/src/maasserver/websockets/handlers/tests/test_machine.py | |||
372 | +++ b/src/maasserver/websockets/handlers/tests/test_machine.py | |||
373 | @@ -989,10 +989,40 @@ class TestMachineHandler(MAASServerTestCase): | |||
374 | 989 | "used_for": "volume group", | 989 | "used_for": "volume group", |
375 | 990 | "filesystem": None, | 990 | "filesystem": None, |
376 | 991 | "partitions": None, | 991 | "partitions": None, |
377 | 992 | "numa_nodes": [0], | ||
378 | 992 | }, | 993 | }, |
379 | 993 | handler.dehydrate_volume_group(volume_group), | 994 | handler.dehydrate_volume_group(volume_group), |
380 | 994 | ) | 995 | ) |
381 | 995 | 996 | ||
382 | 997 | def test_dehydrate_volume_group_multiple_numa_nodes(self): | ||
383 | 998 | owner = factory.make_User() | ||
384 | 999 | node = factory.make_Node(owner=owner) | ||
385 | 1000 | numa_nodes = [ | ||
386 | 1001 | node.default_numanode, | ||
387 | 1002 | factory.make_NUMANode(node=node), | ||
388 | 1003 | factory.make_NUMANode(node=node), | ||
389 | 1004 | ] | ||
390 | 1005 | block_devices = [ | ||
391 | 1006 | factory.make_PhysicalBlockDevice(numa_node=numa_node) | ||
392 | 1007 | for numa_node in numa_nodes | ||
393 | 1008 | ] | ||
394 | 1009 | filesystems = [ | ||
395 | 1010 | factory.make_Filesystem( | ||
396 | 1011 | fstype=FILESYSTEM_TYPE.LVM_PV, block_device=block_device | ||
397 | 1012 | ) | ||
398 | 1013 | for block_device in block_devices | ||
399 | 1014 | ] | ||
400 | 1015 | volume_group = factory.make_FilesystemGroup( | ||
401 | 1016 | node=node, | ||
402 | 1017 | filesystems=filesystems, | ||
403 | 1018 | group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, | ||
404 | 1019 | ) | ||
405 | 1020 | handler = MachineHandler(owner, {}, None) | ||
406 | 1021 | self.assertEqual( | ||
407 | 1022 | handler.dehydrate_volume_group(volume_group)["numa_nodes"], | ||
408 | 1023 | [0, 1, 2], | ||
409 | 1024 | ) | ||
410 | 1025 | |||
411 | 996 | def test_dehydrate_cache_set(self): | 1026 | def test_dehydrate_cache_set(self): |
412 | 997 | owner = factory.make_User() | 1027 | owner = factory.make_User() |
413 | 998 | node = factory.make_Node(owner=owner) | 1028 | node = factory.make_Node(owner=owner) |
414 | @@ -1041,10 +1071,35 @@ class TestMachineHandler(MAASServerTestCase): | |||
415 | 1041 | ), | 1071 | ), |
416 | 1042 | "filesystem": None, | 1072 | "filesystem": None, |
417 | 1043 | "partitions": None, | 1073 | "partitions": None, |
418 | 1074 | "numa_nodes": [0], | ||
419 | 1044 | }, | 1075 | }, |
420 | 1045 | handler.dehydrate_cache_set(cache_set), | 1076 | handler.dehydrate_cache_set(cache_set), |
421 | 1046 | ) | 1077 | ) |
422 | 1047 | 1078 | ||
423 | 1079 | def test_dehydrate_cache_set_multiple_numa_nodes(self): | ||
424 | 1080 | owner = factory.make_User() | ||
425 | 1081 | node = factory.make_Node(owner=owner) | ||
426 | 1082 | numa_nodes = [ | ||
427 | 1083 | node.default_numanode, | ||
428 | 1084 | factory.make_NUMANode(node=node), | ||
429 | 1085 | factory.make_NUMANode(node=node), | ||
430 | 1086 | ] | ||
431 | 1087 | cache_set = factory.make_CacheSet(node=node) | ||
432 | 1088 | for numa_node in numa_nodes: | ||
433 | 1089 | backing = factory.make_PhysicalBlockDevice(numa_node=numa_node) | ||
434 | 1090 | fs = factory.make_Filesystem( | ||
435 | 1091 | block_device=backing, fstype=FILESYSTEM_TYPE.BCACHE_BACKING | ||
436 | 1092 | ) | ||
437 | 1093 | factory.make_FilesystemGroup( | ||
438 | 1094 | group_type=FILESYSTEM_GROUP_TYPE.BCACHE, | ||
439 | 1095 | filesystems=[fs], | ||
440 | 1096 | cache_set=cache_set, | ||
441 | 1097 | ) | ||
442 | 1098 | handler = MachineHandler(owner, {}, None) | ||
443 | 1099 | self.assertEqual( | ||
444 | 1100 | handler.dehydrate_cache_set(cache_set)["numa_nodes"], [0, 1, 2] | ||
445 | 1101 | ) | ||
446 | 1102 | |||
447 | 1048 | def test_dehydrate_partitions_returns_None(self): | 1103 | def test_dehydrate_partitions_returns_None(self): |
448 | 1049 | owner = factory.make_User() | 1104 | owner = factory.make_User() |
449 | 1050 | handler = MachineHandler(owner, {}, None) | 1105 | handler = MachineHandler(owner, {}, None) |
UNIT TESTS websocket- storage- vol-numa lp:~ack/maas/+git/maas into -b master lp:~maas-committers/maas
-b 1848043-
STATUS: FAILED maas-ci- jenkins. internal: 8080/job/ maas/job/ branch- tester/ 6832/console fd2bd18c9ea26c1 32b9e7858c
LOG: http://
COMMIT: 81d12ff2826704b