Merge ~ltrager/maas:vmfs_model into maas:master

Proposed by Lee Trager
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)
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

To post a comment you must log in.
Revision history for this message
Newell Jensen (newell-jensen) wrote :

Looks good. Simple and clean. Couple inline suggestions.

review: Approve
Revision history for this message
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: b354e2ba5d647f95a4fd312baa2977c95fddb228

review: Approve
~ltrager/maas:vmfs_model updated
796e6a5... by Lee Trager

Merge branch 'master' into vmfs_model

Revision history for this message
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: 796e6a5d8c7e107f4b5460d4ea614854c3ae86bc

review: Approve
~ltrager/maas:vmfs_model updated
215a78c... by Lee Trager

Merge branch 'master' into vmfs_model

f63af7c... by Lee Trager

Merge branch 'master' into vmfs_model

Revision history for this message
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://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/5176/console
COMMIT: f63af7c7ef8f3b9a1642fd8066b1104375725453

review: Needs Fixing
~ltrager/maas:vmfs_model updated
07766ac... by Lee Trager

Merge branch 'master' into vmfs_model

Revision history for this message
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: 07766ac4c207213545b4805022bc4ba49d4d026b

review: Approve
~ltrager/maas:vmfs_model updated
df46675... by Lee Trager

Merge branch 'master' into vmfs_model

2c2bfd2... by Lee Trager

Reorder migration

3514853... by Lee Trager

Add migration

Revision history for this message
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: 3514853a452ea7453cbb54f504499508d7501728

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/enum.py b/src/maasserver/enum.py
2index 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
47diff --git a/src/maasserver/migrations/builtin/maasserver/0185_vmfs6.py b/src/maasserver/migrations/builtin/maasserver/0185_vmfs6.py
48new file mode 100644
49index 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+ ]
91diff --git a/src/maasserver/models/__init__.py b/src/maasserver/models/__init__.py
92index 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
117diff --git a/src/maasserver/models/filesystemgroup.py b/src/maasserver/models/filesystemgroup.py
118index 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)
242diff --git a/src/maasserver/models/tests/test_filesystemgroup.py b/src/maasserver/models/tests/test_filesystemgroup.py
243index 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.
314diff --git a/src/maasserver/testing/factory.py b/src/maasserver/testing/factory.py
315index 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):

Subscribers

People subscribed via source and target branches