Merge ~ltrager/maas:vmfs_model into maas:master
- Git
- lp:~ltrager/maas
- vmfs_model
- Merge into master
Status: | Merged |
---|---|
Approved by: | Lee Trager |
Approved revision: | 3514853a452ea7453cbb54f504499508d7501728 |
Merge reported by: | MAAS Lander |
Merged at revision: | not available |
Proposed branch: | ~ltrager/maas:vmfs_model |
Merge into: | maas:master |
Diff against target: |
341 lines (+144/-4) 6 files modified
src/maasserver/enum.py (+9/-1) src/maasserver/migrations/builtin/maasserver/0185_vmfs6.py (+38/-0) src/maasserver/models/__init__.py (+3/-1) src/maasserver/models/filesystemgroup.py (+56/-1) src/maasserver/models/tests/test_filesystemgroup.py (+28/-1) src/maasserver/testing/factory.py (+10/-0) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
MAAS Lander | Approve | ||
Newell Jensen (community) | Approve | ||
Review via email: mp+363439@code.launchpad.net |
Commit message
Add VMFS Filesystemgroup
Description of the change
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b vmfs_model lp:~ltrager/maas/+git/maas into -b master lp:~maas-committers/maas
STATUS: SUCCESS
COMMIT: b354e2ba5d647f9
- 796e6a5... by Lee Trager
-
Merge branch 'master' into vmfs_model
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b vmfs_model lp:~ltrager/maas/+git/maas into -b master lp:~maas-committers/maas
STATUS: SUCCESS
COMMIT: 796e6a5d8c7e107
- 215a78c... by Lee Trager
-
Merge branch 'master' into vmfs_model
- f63af7c... by Lee Trager
-
Merge branch 'master' into vmfs_model
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b vmfs_model lp:~ltrager/maas/+git/maas into -b master lp:~maas-committers/maas
STATUS: FAILED
LOG: http://
COMMIT: f63af7c7ef8f3b9
- 07766ac... by Lee Trager
-
Merge branch 'master' into vmfs_model
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b vmfs_model lp:~ltrager/maas/+git/maas into -b master lp:~maas-committers/maas
STATUS: SUCCESS
COMMIT: 07766ac4c207213
- df46675... by Lee Trager
-
Merge branch 'master' into vmfs_model
- 2c2bfd2... by Lee Trager
-
Reorder migration
- 3514853... by Lee Trager
-
Add migration
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b vmfs_model lp:~ltrager/maas/+git/maas into -b master lp:~maas-committers/maas
STATUS: SUCCESS
COMMIT: 3514853a452ea74
Preview Diff
1 | diff --git a/src/maasserver/enum.py b/src/maasserver/enum.py |
2 | index b50e61c..ddd2948 100644 |
3 | --- a/src/maasserver/enum.py |
4 | +++ b/src/maasserver/enum.py |
5 | @@ -1,4 +1,4 @@ |
6 | -# Copyright 2012-2018 Canonical Ltd. This software is licensed under the |
7 | +# Copyright 2012-2019 Canonical Ltd. This software is licensed under the |
8 | # GNU Affero General Public License version 3 (see the file LICENSE). |
9 | |
10 | """Enumerations meaningful to the maasserver application.""" |
11 | @@ -511,6 +511,9 @@ class FILESYSTEM_TYPE: |
12 | #: ZFS |
13 | ZFSROOT = "zfsroot" |
14 | |
15 | + #: VMFS6 |
16 | + VMFS6 = "vmfs6" |
17 | + |
18 | |
19 | # Django choices for FILESYSTEM_TYPE: sequence of tuples (key, UI |
20 | # representation). |
21 | @@ -532,6 +535,7 @@ FILESYSTEM_TYPE_CHOICES = ( |
22 | (FILESYSTEM_TYPE.TMPFS, "tmpfs"), |
23 | (FILESYSTEM_TYPE.BTRFS, "btrfs"), |
24 | (FILESYSTEM_TYPE.ZFSROOT, "zfsroot"), |
25 | + (FILESYSTEM_TYPE.VMFS6, "vmfs6"), |
26 | ) |
27 | |
28 | |
29 | @@ -581,6 +585,9 @@ class FILESYSTEM_GROUP_TYPE: |
30 | #: Bcache |
31 | BCACHE = 'bcache' |
32 | |
33 | + #: VMFS6 |
34 | + VMFS6 = 'vmfs6' |
35 | + |
36 | |
37 | FILESYSTEM_GROUP_RAID_TYPES = [ |
38 | FILESYSTEM_GROUP_TYPE.RAID_0, |
39 | @@ -605,6 +612,7 @@ FILESYSTEM_GROUP_RAID_TYPE_CHOICES = ( |
40 | FILESYSTEM_GROUP_TYPE_CHOICES = FILESYSTEM_GROUP_RAID_TYPE_CHOICES + ( |
41 | (FILESYSTEM_GROUP_TYPE.LVM_VG, "LVM VG"), |
42 | (FILESYSTEM_GROUP_TYPE.BCACHE, "Bcache"), |
43 | + (FILESYSTEM_GROUP_TYPE.VMFS6, "VMFS6"), |
44 | ) |
45 | |
46 | |
47 | diff --git a/src/maasserver/migrations/builtin/maasserver/0185_vmfs6.py b/src/maasserver/migrations/builtin/maasserver/0185_vmfs6.py |
48 | new file mode 100644 |
49 | index 0000000..f10c145 |
50 | --- /dev/null |
51 | +++ b/src/maasserver/migrations/builtin/maasserver/0185_vmfs6.py |
52 | @@ -0,0 +1,38 @@ |
53 | +# -*- coding: utf-8 -*- |
54 | +# Generated by Django 1.11.11 on 2019-03-07 08:41 |
55 | +from __future__ import unicode_literals |
56 | + |
57 | +from django.db import ( |
58 | + migrations, |
59 | + models, |
60 | +) |
61 | + |
62 | + |
63 | +class Migration(migrations.Migration): |
64 | + |
65 | + dependencies = [ |
66 | + ('maasserver', '0184_add_ephemeral_deploy_setting_to_node'), |
67 | + ] |
68 | + |
69 | + operations = [ |
70 | + migrations.CreateModel( |
71 | + name='VMFS', |
72 | + fields=[ |
73 | + ], |
74 | + options={ |
75 | + 'proxy': True, |
76 | + 'indexes': [], |
77 | + }, |
78 | + bases=('maasserver.filesystemgroup',), |
79 | + ), |
80 | + migrations.AlterField( |
81 | + model_name='filesystem', |
82 | + name='fstype', |
83 | + field=models.CharField(choices=[('ext2', 'ext2'), ('ext4', 'ext4'), ('xfs', 'xfs'), ('fat32', 'fat32'), ('vfat', 'vfat'), ('lvm-pv', 'lvm'), ('raid', 'raid'), ('raid-spare', 'raid-spare'), ('bcache-cache', 'bcache-cache'), ('bcache-backing', 'bcache-backing'), ('swap', 'swap'), ('ramfs', 'ramfs'), ('tmpfs', 'tmpfs'), ('btrfs', 'btrfs'), ('zfsroot', 'zfsroot'), ('vmfs6', 'vmfs6')], default='ext4', max_length=20), |
84 | + ), |
85 | + migrations.AlterField( |
86 | + model_name='filesystemgroup', |
87 | + name='group_type', |
88 | + field=models.CharField(choices=[('raid-0', 'RAID 0'), ('raid-1', 'RAID 1'), ('raid-5', 'RAID 5'), ('raid-6', 'RAID 6'), ('raid-10', 'RAID 10'), ('lvm-vg', 'LVM VG'), ('bcache', 'Bcache'), ('vmfs6', 'VMFS6')], max_length=20), |
89 | + ), |
90 | + ] |
91 | diff --git a/src/maasserver/models/__init__.py b/src/maasserver/models/__init__.py |
92 | index 6abec61..b330257 100644 |
93 | --- a/src/maasserver/models/__init__.py |
94 | +++ b/src/maasserver/models/__init__.py |
95 | @@ -1,4 +1,4 @@ |
96 | -# Copyright 2012-2018 Canonical Ltd. This software is licensed under the |
97 | +# Copyright 2012-2019 Canonical Ltd. This software is licensed under the |
98 | # GNU Affero General Public License version 3 (see the file LICENSE). |
99 | |
100 | """Model export and helpers for maasserver.""" |
101 | @@ -87,6 +87,7 @@ __all__ = [ |
102 | 'VLAN', |
103 | 'VLANInterface', |
104 | 'VolumeGroup', |
105 | + 'VMFS', |
106 | 'Zone', |
107 | ] |
108 | |
109 | @@ -131,6 +132,7 @@ from maasserver.models.filesystemgroup import ( |
110 | Bcache, |
111 | FilesystemGroup, |
112 | RAID, |
113 | + VMFS, |
114 | VolumeGroup, |
115 | ) |
116 | from maasserver.models.globaldefault import GlobalDefault |
117 | diff --git a/src/maasserver/models/filesystemgroup.py b/src/maasserver/models/filesystemgroup.py |
118 | index 16b644e..38edce7 100644 |
119 | --- a/src/maasserver/models/filesystemgroup.py |
120 | +++ b/src/maasserver/models/filesystemgroup.py |
121 | @@ -1,11 +1,15 @@ |
122 | -# Copyright 2015-2016 Canonical Ltd. This software is licensed under the |
123 | +# Copyright 2015-2019 Canonical Ltd. This software is licensed under the |
124 | # GNU Affero General Public License version 3 (see the file LICENSE). |
125 | |
126 | """Model for a filesystem group. Contains a set of filesystems that create |
127 | a virtual block device. E.g. LVM Volume Group.""" |
128 | |
129 | __all__ = [ |
130 | + 'Bcache', |
131 | 'FilesystemGroup', |
132 | + 'RAID', |
133 | + 'VMFS', |
134 | + 'VolumeGroup', |
135 | ] |
136 | |
137 | from uuid import uuid4 |
138 | @@ -273,6 +277,24 @@ class BcacheManager(BaseFilesystemGroupManager): |
139 | return bcache_filesystem_group |
140 | |
141 | |
142 | +class VMFSManager(BaseFilesystemGroupManager): |
143 | + """VMFS filesystem group""" |
144 | + |
145 | + extra_filters = {'group_type': FILESYSTEM_GROUP_TYPE.VMFS6} |
146 | + |
147 | + def create_vmfs(self, name, partitions, uuid=None): |
148 | + """Create a `VMFS` with the list of block devices and partitions.""" |
149 | + # Avoid circular imports. |
150 | + from maasserver.models.filesystem import Filesystem |
151 | + vmfs = self.create(name=name, uuid=uuid) |
152 | + for partition in partitions: |
153 | + Filesystem.objects.create( |
154 | + fstype=FILESYSTEM_TYPE.VMFS6, partition=partition, |
155 | + filesystem_group=vmfs) |
156 | + vmfs.save(force_update=True) |
157 | + return vmfs |
158 | + |
159 | + |
160 | class FilesystemGroup(CleanSave, TimestampedModel): |
161 | """A filesystem group. Contains a set of filesystems that create |
162 | a virtual block device. E.g. LVM Volume Group. |
163 | @@ -350,6 +372,8 @@ class FilesystemGroup(CleanSave, TimestampedModel): |
164 | return self.get_raid_size() |
165 | elif self.is_bcache(): |
166 | return self.get_bcache_size() |
167 | + elif self.is_vmfs(): |
168 | + return self.get_total_size() |
169 | else: |
170 | return 0 |
171 | |
172 | @@ -384,6 +408,13 @@ class FilesystemGroup(CleanSave, TimestampedModel): |
173 | for filesystem in filesystems |
174 | ) |
175 | |
176 | + def get_total_size(self): |
177 | + """Return the size of all filesystems combined.""" |
178 | + total = 0 |
179 | + for fs in self.filesystems.all(): |
180 | + total += fs.get_size() |
181 | + return total |
182 | + |
183 | def get_raid_size(self): |
184 | """Size of this RAID. |
185 | |
186 | @@ -522,6 +553,10 @@ class FilesystemGroup(CleanSave, TimestampedModel): |
187 | """Return True if `group_type` is BCACHE type.""" |
188 | return self.group_type == FILESYSTEM_GROUP_TYPE.BCACHE |
189 | |
190 | + def is_vmfs(self): |
191 | + """Return True if `group_type` is VMFS.""" |
192 | + return self.group_type == FILESYSTEM_GROUP_TYPE.VMFS6 |
193 | + |
194 | def _get_all_fstypes(self, filesystems=None): |
195 | """Return list of all filesystem types attached.""" |
196 | # Grab all filesystems so that if the filesystems have been |
197 | @@ -702,6 +737,8 @@ class FilesystemGroup(CleanSave, TimestampedModel): |
198 | return "RAID" |
199 | elif self.is_bcache(): |
200 | return "Bcache" |
201 | + elif self.is_vmfs(): |
202 | + return "VMFS" |
203 | else: |
204 | raise ValueError("Unknown group_type.") |
205 | |
206 | @@ -714,6 +751,8 @@ class FilesystemGroup(CleanSave, TimestampedModel): |
207 | return "md" |
208 | elif self.is_bcache(): |
209 | return "bcache" |
210 | + elif self.is_vmfs(): |
211 | + return "vmfs" |
212 | else: |
213 | raise ValidationError("Unknown group_type.") |
214 | |
215 | @@ -729,6 +768,9 @@ class FilesystemGroup(CleanSave, TimestampedModel): |
216 | elif self.is_bcache(): |
217 | # Bcache uses the block_size of the backing device. |
218 | return self.get_bcache_backing_filesystem().get_block_size() |
219 | + elif self.is_vmfs(): |
220 | + # By default VMFS uses a 1MB block size. |
221 | + return 1024 |
222 | else: |
223 | raise ValidationError("Unknown group_type.") |
224 | |
225 | @@ -913,3 +955,16 @@ class Bcache(FilesystemGroup): |
226 | def __init__(self, *args, **kwargs): |
227 | super(Bcache, self).__init__( |
228 | group_type=FILESYSTEM_GROUP_TYPE.BCACHE, *args, **kwargs) |
229 | + |
230 | + |
231 | +class VMFS(FilesystemGroup): |
232 | + """A VMFS.""" |
233 | + |
234 | + objects = VMFSManager() |
235 | + |
236 | + class Meta(DefaultMeta): |
237 | + proxy = True |
238 | + |
239 | + def __init__(self, *args, **kwargs): |
240 | + super().__init__( |
241 | + group_type=FILESYSTEM_GROUP_TYPE.VMFS6, *args, **kwargs) |
242 | diff --git a/src/maasserver/models/tests/test_filesystemgroup.py b/src/maasserver/models/tests/test_filesystemgroup.py |
243 | index 9d2d0e3..c815abf 100644 |
244 | --- a/src/maasserver/models/tests/test_filesystemgroup.py |
245 | +++ b/src/maasserver/models/tests/test_filesystemgroup.py |
246 | @@ -1,4 +1,4 @@ |
247 | -# Copyright 2015-2016 Canonical Ltd. This software is licensed under the |
248 | +# Copyright 2015-2019 Canonical Ltd. This software is licensed under the |
249 | # GNU Affero General Public License version 3 (see the file LICENSE). |
250 | |
251 | """Tests for `FilesystemGroup`.""" |
252 | @@ -827,6 +827,17 @@ class TestFilesystemGroup(MAASServerTestCase): |
253 | filesystems=filesystems) |
254 | self.assertEqual(backing_size, fsgroup.get_size()) |
255 | |
256 | + def test_get_size_returns_total_size_with_vmfs(self): |
257 | + vmfs = factory.make_VMFS() |
258 | + self.assertEquals(vmfs.get_total_size(), vmfs.get_size()) |
259 | + |
260 | + def test_get_total_size(self): |
261 | + vmfs = factory.make_VMFS() |
262 | + size = 0 |
263 | + for fs in vmfs.filesystems.all(): |
264 | + size += fs.get_size() |
265 | + self.assertEquals(size, vmfs.get_total_size()) |
266 | + |
267 | def test_is_lvm_returns_true_when_LVM_VG(self): |
268 | fsgroup = FilesystemGroup(group_type=FILESYSTEM_GROUP_TYPE.LVM_VG) |
269 | self.assertTrue(fsgroup.is_lvm()) |
270 | @@ -863,6 +874,10 @@ class TestFilesystemGroup(MAASServerTestCase): |
271 | FILESYSTEM_GROUP_TYPE, but_not=FILESYSTEM_GROUP_TYPE.BCACHE)) |
272 | self.assertFalse(fsgroup.is_bcache()) |
273 | |
274 | + def test_is_vmfs(self): |
275 | + vmfs = factory.make_VMFS() |
276 | + self.assertTrue(vmfs.is_vmfs()) |
277 | + |
278 | def test_can_save_new_filesystem_group_without_filesystems(self): |
279 | fsgroup = FilesystemGroup( |
280 | group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, |
281 | @@ -1419,6 +1434,10 @@ class TestFilesystemGroupGetNiceName(MAASServerTestCase): |
282 | "group_type": FILESYSTEM_GROUP_TYPE.BCACHE, |
283 | "name": "Bcache", |
284 | }), |
285 | + (FILESYSTEM_GROUP_TYPE.VMFS6, { |
286 | + "group_type": FILESYSTEM_GROUP_TYPE.VMFS6, |
287 | + "name": "VMFS", |
288 | + }), |
289 | ] |
290 | |
291 | def test__returns_prefix(self): |
292 | @@ -1459,6 +1478,10 @@ class TestFilesystemGroupGetNamePrefix(MAASServerTestCase): |
293 | "group_type": FILESYSTEM_GROUP_TYPE.BCACHE, |
294 | "prefix": "bcache", |
295 | }), |
296 | + (FILESYSTEM_GROUP_TYPE.VMFS6, { |
297 | + "group_type": FILESYSTEM_GROUP_TYPE.VMFS6, |
298 | + "prefix": "vmfs", |
299 | + }), |
300 | ] |
301 | |
302 | def test__returns_prefix(self): |
303 | @@ -1495,6 +1518,10 @@ class TestFilesystemGroupGetVirtualBlockDeviceBlockSize(MAASServerTestCase): |
304 | "group_type": FILESYSTEM_GROUP_TYPE.RAID_10, |
305 | "block_size": 512, |
306 | }), |
307 | + (FILESYSTEM_GROUP_TYPE.VMFS6, { |
308 | + "group_type": FILESYSTEM_GROUP_TYPE.VMFS6, |
309 | + "block_size": 1024, |
310 | + }), |
311 | # For BCACHE see |
312 | # `test_get_virtual_block_device_block_size_returns_backing_for_bc` |
313 | # above. |
314 | diff --git a/src/maasserver/testing/factory.py b/src/maasserver/testing/factory.py |
315 | index cdc72ae..80427c5 100644 |
316 | --- a/src/maasserver/testing/factory.py |
317 | +++ b/src/maasserver/testing/factory.py |
318 | @@ -2206,6 +2206,12 @@ class Factory(maastesting.factory.Factory): |
319 | fstype=FILESYSTEM_TYPE.BCACHE_BACKING, |
320 | block_device=backing_block_device) |
321 | group.filesystems.add(backing_filesystem) |
322 | + elif group_type == FILESYSTEM_GROUP_TYPE.VMFS6: |
323 | + for _ in range(2): |
324 | + partition = self.make_Partition(node=node) |
325 | + self.make_Filesystem( |
326 | + fstype=FILESYSTEM_TYPE.VMFS6, partition=partition, |
327 | + filesystem_group=group) |
328 | else: |
329 | for filesystem in filesystems: |
330 | group.filesystems.add(filesystem) |
331 | @@ -2221,6 +2227,10 @@ class Factory(maastesting.factory.Factory): |
332 | filesystem_group = self.make_FilesystemGroup(*args, **kwargs) |
333 | return VolumeGroup.objects.get(id=filesystem_group.id) |
334 | |
335 | + def make_VMFS(self, *args, **kwargs): |
336 | + return self.make_FilesystemGroup( |
337 | + *args, group_type=FILESYSTEM_GROUP_TYPE.VMFS6, **kwargs) |
338 | + |
339 | def make_VirtualBlockDevice( |
340 | self, name=None, size=None, block_size=None, |
341 | tags=None, uuid=None, filesystem_group=None, node=None): |
Looks good. Simple and clean. Couple inline suggestions.