Merge lp:~blake-rouse/maas/fix-1508056 into lp:~maas-committers/maas/trunk
- fix-1508056
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Blake Rouse |
Approved revision: | no longer in the source branch. |
Merged at revision: | 4481 |
Proposed branch: | lp:~blake-rouse/maas/fix-1508056 |
Merge into: | lp:~maas-committers/maas/trunk |
Diff against target: |
846 lines (+636/-15) 13 files modified
src/maasserver/api/interfaces.py (+5/-0) src/maasserver/api/nodes.py (+1/-0) src/maasserver/api/tests/test_interfaces.py (+1/-0) src/maasserver/forms_vlan.py (+5/-0) src/maasserver/migrations/0190_add_mtu_to_vlan_model.py (+547/-0) src/maasserver/models/interface.py (+9/-0) src/maasserver/models/tests/test_filesystemgroup.py (+3/-2) src/maasserver/models/tests/test_interface.py (+16/-0) src/maasserver/models/vlan.py (+11/-0) src/maasserver/preseed_network.py (+2/-1) src/maasserver/tests/test_forms_vlan.py (+33/-11) src/maasserver/tests/test_preseed_network.py (+2/-1) src/maasserver/websockets/handlers/tests/test_vlan.py (+1/-0) |
To merge this branch: | bzr merge lp:~blake-rouse/maas/fix-1508056 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Mike Pontillo (community) | Approve | ||
Andres Rodriguez (community) | Approve | ||
Review via email: mp+277050@code.launchpad.net |
Commit message
Add MTU field to VLAN. Add the effective MTU for an interface in the API output and the network preseed generation.
Description of the change
MAAS Lander (maas-lander) wrote : | # |
The attempt to merge lp:~blake-rouse/maas/fix-1508056 into lp:maas failed. Below is the output from the failed tests.
Get:1 http://
Ign http://
Get:2 http://
Hit http://
Hit http://
Get:3 http://
Get:4 http://
Get:5 http://
Get:6 http://
Get:7 http://
Get:8 http://
Get:9 http://
Hit http://
Hit http://
Get:10 http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Ign http://
Ign http://
Fetched 2,092 kB in 4s (495 kB/s)
Reading package lists...
sudo DEBIAN_
--
Mike Pontillo (mpontillo) wrote : | # |
Looks good; you may want to enforce an upper limit though. (I suggest 65535 since that's the max packet size for both IPv4 and IPv6.)
Blake Rouse (blake-rouse) wrote : | # |
Thanks for the review. I have added the upper limit.
MAAS Lander (maas-lander) wrote : | # |
The attempt to merge lp:~blake-rouse/maas/fix-1508056 into lp:maas failed. Below is the output from the failed tests.
Get:1 http://
Ign http://
Get:2 http://
Hit http://
Hit http://
Get:3 http://
Get:4 http://
Get:5 http://
Get:6 http://
Get:7 http://
Get:8 http://
Get:9 http://
Hit http://
Hit http://
Get:10 http://
Get:11 http://
Get:12 http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Ign http://
Ign http://
Fetched 2,607 kB in 4s (529 kB/s)
Reading package lists...
sudo DEBIAN_
--
Preview Diff
1 | === modified file 'src/maasserver/api/interfaces.py' | |||
2 | --- src/maasserver/api/interfaces.py 2015-10-30 20:53:53 +0000 | |||
3 | +++ src/maasserver/api/interfaces.py 2015-11-10 16:55:31 +0000 | |||
4 | @@ -64,6 +64,7 @@ | |||
5 | 64 | 'links', | 64 | 'links', |
6 | 65 | 'params', | 65 | 'params', |
7 | 66 | 'discovered', | 66 | 'discovered', |
8 | 67 | 'effective_mtu', | ||
9 | 67 | ) | 68 | ) |
10 | 68 | 69 | ||
11 | 69 | 70 | ||
12 | @@ -284,6 +285,10 @@ | |||
13 | 284 | def discovered(cls, interface): | 285 | def discovered(cls, interface): |
14 | 285 | return interface.get_discovered() | 286 | return interface.get_discovered() |
15 | 286 | 287 | ||
16 | 288 | @classmethod | ||
17 | 289 | def effective_mtu(cls, interface): | ||
18 | 290 | return interface.get_effective_mtu() | ||
19 | 291 | |||
20 | 287 | def read(self, request, system_id, interface_id): | 292 | def read(self, request, system_id, interface_id): |
21 | 288 | """Read interface on node. | 293 | """Read interface on node. |
22 | 289 | 294 | ||
23 | 290 | 295 | ||
24 | === modified file 'src/maasserver/api/nodes.py' | |||
25 | --- src/maasserver/api/nodes.py 2015-11-09 22:27:59 +0000 | |||
26 | +++ src/maasserver/api/nodes.py 2015-11-10 16:55:31 +0000 | |||
27 | @@ -136,6 +136,7 @@ | |||
28 | 136 | 'links', | 136 | 'links', |
29 | 137 | 'params', | 137 | 'params', |
30 | 138 | 'discovered', | 138 | 'discovered', |
31 | 139 | 'effective_mtu', | ||
32 | 139 | )), | 140 | )), |
33 | 140 | 'routers', | 141 | 'routers', |
34 | 141 | 'zone', | 142 | 'zone', |
35 | 142 | 143 | ||
36 | === modified file 'src/maasserver/api/tests/test_interfaces.py' | |||
37 | --- src/maasserver/api/tests/test_interfaces.py 2015-10-30 20:53:53 +0000 | |||
38 | +++ src/maasserver/api/tests/test_interfaces.py 2015-11-10 16:55:31 +0000 | |||
39 | @@ -512,6 +512,7 @@ | |||
40 | 512 | "tags": Equals(bond.tags), | 512 | "tags": Equals(bond.tags), |
41 | 513 | "resource_uri": Equals(get_node_interface_uri(bond)), | 513 | "resource_uri": Equals(get_node_interface_uri(bond)), |
42 | 514 | "params": Equals(bond.params), | 514 | "params": Equals(bond.params), |
43 | 515 | "effective_mtu": Equals(bond.get_effective_mtu()), | ||
44 | 515 | })) | 516 | })) |
45 | 516 | self.assertEquals(sorted( | 517 | self.assertEquals(sorted( |
46 | 517 | nic.name | 518 | nic.name |
47 | 518 | 519 | ||
48 | === modified file 'src/maasserver/forms_vlan.py' | |||
49 | --- src/maasserver/forms_vlan.py 2015-10-09 06:06:47 +0000 | |||
50 | +++ src/maasserver/forms_vlan.py 2015-11-10 16:55:31 +0000 | |||
51 | @@ -16,6 +16,7 @@ | |||
52 | 16 | "VLANForm", | 16 | "VLANForm", |
53 | 17 | ] | 17 | ] |
54 | 18 | 18 | ||
55 | 19 | from django import forms | ||
56 | 19 | from django.core.exceptions import ValidationError | 20 | from django.core.exceptions import ValidationError |
57 | 20 | from maasserver.forms import MAASModelForm | 21 | from maasserver.forms import MAASModelForm |
58 | 21 | from maasserver.models.vlan import VLAN | 22 | from maasserver.models.vlan import VLAN |
59 | @@ -24,11 +25,15 @@ | |||
60 | 24 | class VLANForm(MAASModelForm): | 25 | class VLANForm(MAASModelForm): |
61 | 25 | """VLAN creation/edition form.""" | 26 | """VLAN creation/edition form.""" |
62 | 26 | 27 | ||
63 | 28 | # Linux doesn't allow lower than 552 for the MTU. | ||
64 | 29 | mtu = forms.IntegerField(min_value=552, required=False) | ||
65 | 30 | |||
66 | 27 | class Meta: | 31 | class Meta: |
67 | 28 | model = VLAN | 32 | model = VLAN |
68 | 29 | fields = ( | 33 | fields = ( |
69 | 30 | 'name', | 34 | 'name', |
70 | 31 | 'vid', | 35 | 'vid', |
71 | 36 | 'mtu', | ||
72 | 32 | ) | 37 | ) |
73 | 33 | 38 | ||
74 | 34 | def __init__(self, *args, **kwargs): | 39 | def __init__(self, *args, **kwargs): |
75 | 35 | 40 | ||
76 | === added file 'src/maasserver/migrations/0190_add_mtu_to_vlan_model.py' | |||
77 | --- src/maasserver/migrations/0190_add_mtu_to_vlan_model.py 1970-01-01 00:00:00 +0000 | |||
78 | +++ src/maasserver/migrations/0190_add_mtu_to_vlan_model.py 2015-11-10 16:55:31 +0000 | |||
79 | @@ -0,0 +1,547 @@ | |||
80 | 1 | from django.db import models | ||
81 | 2 | from south.db import db | ||
82 | 3 | # -*- coding: utf-8 -*- | ||
83 | 4 | from south.utils import datetime_utils as datetime | ||
84 | 5 | from south.v2 import SchemaMigration | ||
85 | 6 | |||
86 | 7 | |||
87 | 8 | class Migration(SchemaMigration): | ||
88 | 9 | |||
89 | 10 | def forwards(self, orm): | ||
90 | 11 | # Adding field 'VLAN.mtu' | ||
91 | 12 | db.add_column(u'maasserver_vlan', 'mtu', | ||
92 | 13 | self.gf('django.db.models.fields.IntegerField')(default=1500), | ||
93 | 14 | keep_default=False) | ||
94 | 15 | |||
95 | 16 | |||
96 | 17 | # Changing field 'BootSourceSelection.labels' | ||
97 | 18 | db.alter_column(u'maasserver_bootsourceselection', 'labels', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=True)) | ||
98 | 19 | |||
99 | 20 | # Changing field 'BootSourceSelection.arches' | ||
100 | 21 | db.alter_column(u'maasserver_bootsourceselection', 'arches', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=True)) | ||
101 | 22 | |||
102 | 23 | # Changing field 'BootSourceSelection.subarches' | ||
103 | 24 | db.alter_column(u'maasserver_bootsourceselection', 'subarches', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=True)) | ||
104 | 25 | |||
105 | 26 | # Changing field 'Node.routers' | ||
106 | 27 | db.alter_column(u'maasserver_node', 'routers', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'macaddr', null=True)) | ||
107 | 28 | |||
108 | 29 | # Changing field 'Subnet.dns_servers' | ||
109 | 30 | db.alter_column(u'maasserver_subnet', 'dns_servers', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=True)) | ||
110 | 31 | |||
111 | 32 | # Changing field 'BlockDevice.tags' | ||
112 | 33 | db.alter_column(u'maasserver_blockdevice', 'tags', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text')) | ||
113 | 34 | |||
114 | 35 | # Changing field 'Interface.tags' | ||
115 | 36 | db.alter_column(u'maasserver_interface', 'tags', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text')) | ||
116 | 37 | |||
117 | 38 | def backwards(self, orm): | ||
118 | 39 | # Deleting field 'VLAN.mtu' | ||
119 | 40 | db.delete_column(u'maasserver_vlan', 'mtu') | ||
120 | 41 | |||
121 | 42 | |||
122 | 43 | # Changing field 'BootSourceSelection.labels' | ||
123 | 44 | db.alter_column(u'maasserver_bootsourceselection', 'labels', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text')) | ||
124 | 45 | |||
125 | 46 | # Changing field 'BootSourceSelection.arches' | ||
126 | 47 | db.alter_column(u'maasserver_bootsourceselection', 'arches', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text')) | ||
127 | 48 | |||
128 | 49 | # Changing field 'BootSourceSelection.subarches' | ||
129 | 50 | db.alter_column(u'maasserver_bootsourceselection', 'subarches', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text')) | ||
130 | 51 | |||
131 | 52 | # Changing field 'Node.routers' | ||
132 | 53 | db.alter_column(u'maasserver_node', 'routers', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'macaddr')) | ||
133 | 54 | |||
134 | 55 | # Changing field 'Subnet.dns_servers' | ||
135 | 56 | db.alter_column(u'maasserver_subnet', 'dns_servers', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text')) | ||
136 | 57 | |||
137 | 58 | # Changing field 'BlockDevice.tags' | ||
138 | 59 | db.alter_column(u'maasserver_blockdevice', 'tags', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=False)) | ||
139 | 60 | |||
140 | 61 | # Changing field 'Interface.tags' | ||
141 | 62 | db.alter_column(u'maasserver_interface', 'tags', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=False)) | ||
142 | 63 | |||
143 | 64 | models = { | ||
144 | 65 | u'auth.group': { | ||
145 | 66 | 'Meta': {'object_name': 'Group'}, | ||
146 | 67 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
147 | 68 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), | ||
148 | 69 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) | ||
149 | 70 | }, | ||
150 | 71 | u'auth.permission': { | ||
151 | 72 | 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, | ||
152 | 73 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
153 | 74 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), | ||
154 | 75 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
155 | 76 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) | ||
156 | 77 | }, | ||
157 | 78 | u'auth.user': { | ||
158 | 79 | 'Meta': {'object_name': 'User'}, | ||
159 | 80 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
160 | 81 | 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}), | ||
161 | 82 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
162 | 83 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), | ||
163 | 84 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
164 | 85 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
165 | 86 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
166 | 87 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
167 | 88 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
168 | 89 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
169 | 90 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
170 | 91 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), | ||
171 | 92 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) | ||
172 | 93 | }, | ||
173 | 94 | u'contenttypes.contenttype': { | ||
174 | 95 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, | ||
175 | 96 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
176 | 97 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
177 | 98 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
178 | 99 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
179 | 100 | }, | ||
180 | 101 | u'maasserver.blockdevice': { | ||
181 | 102 | 'Meta': {'ordering': "[u'id']", 'unique_together': "((u'node', u'name'),)", 'object_name': 'BlockDevice'}, | ||
182 | 103 | 'block_size': ('django.db.models.fields.IntegerField', [], {}), | ||
183 | 104 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
184 | 105 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
185 | 106 | 'id_path': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), | ||
186 | 107 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
187 | 108 | 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}), | ||
188 | 109 | 'size': ('django.db.models.fields.BigIntegerField', [], {}), | ||
189 | 110 | 'tags': ('djorm_pgarray.fields.ArrayField', [], {'default': '[]', 'dbtype': "u'text'", 'blank': 'True'}), | ||
190 | 111 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
191 | 112 | }, | ||
192 | 113 | u'maasserver.bootresource': { | ||
193 | 114 | 'Meta': {'unique_together': "((u'name', u'architecture'),)", 'object_name': 'BootResource'}, | ||
194 | 115 | 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
195 | 116 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
196 | 117 | 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
197 | 118 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
198 | 119 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
199 | 120 | 'rtype': ('django.db.models.fields.IntegerField', [], {'max_length': '10'}), | ||
200 | 121 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
201 | 122 | }, | ||
202 | 123 | u'maasserver.bootresourcefile': { | ||
203 | 124 | 'Meta': {'unique_together': "((u'resource_set', u'filetype'),)", 'object_name': 'BootResourceFile'}, | ||
204 | 125 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
205 | 126 | 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
206 | 127 | 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
207 | 128 | 'filetype': ('django.db.models.fields.CharField', [], {'default': "u'root-tgz'", 'max_length': '20'}), | ||
208 | 129 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
209 | 130 | 'largefile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.LargeFile']"}), | ||
210 | 131 | 'resource_set': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'files'", 'to': u"orm['maasserver.BootResourceSet']"}), | ||
211 | 132 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
212 | 133 | }, | ||
213 | 134 | u'maasserver.bootresourceset': { | ||
214 | 135 | 'Meta': {'unique_together': "((u'resource', u'version'),)", 'object_name': 'BootResourceSet'}, | ||
215 | 136 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
216 | 137 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
217 | 138 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
218 | 139 | 'resource': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'sets'", 'to': u"orm['maasserver.BootResource']"}), | ||
219 | 140 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
220 | 141 | 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) | ||
221 | 142 | }, | ||
222 | 143 | u'maasserver.bootsource': { | ||
223 | 144 | 'Meta': {'object_name': 'BootSource'}, | ||
224 | 145 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
225 | 146 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
226 | 147 | 'keyring_data': ('maasserver.fields.EditableBinaryField', [], {'blank': 'True'}), | ||
227 | 148 | 'keyring_filename': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}), | ||
228 | 149 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
229 | 150 | 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'}) | ||
230 | 151 | }, | ||
231 | 152 | u'maasserver.bootsourcecache': { | ||
232 | 153 | 'Meta': {'object_name': 'BootSourceCache'}, | ||
233 | 154 | 'arch': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
234 | 155 | 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}), | ||
235 | 156 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
236 | 157 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
237 | 158 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
238 | 159 | 'os': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
239 | 160 | 'release': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
240 | 161 | 'subarch': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
241 | 162 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
242 | 163 | }, | ||
243 | 164 | u'maasserver.bootsourceselection': { | ||
244 | 165 | 'Meta': {'unique_together': "((u'boot_source', u'os', u'release'),)", 'object_name': 'BootSourceSelection'}, | ||
245 | 166 | 'arches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
246 | 167 | 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}), | ||
247 | 168 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
248 | 169 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
249 | 170 | 'labels': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
250 | 171 | 'os': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
251 | 172 | 'release': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
252 | 173 | 'subarches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
253 | 174 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
254 | 175 | }, | ||
255 | 176 | u'maasserver.cacheset': { | ||
256 | 177 | 'Meta': {'object_name': 'CacheSet'}, | ||
257 | 178 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
258 | 179 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
259 | 180 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
260 | 181 | }, | ||
261 | 182 | u'maasserver.candidatename': { | ||
262 | 183 | 'Meta': {'unique_together': "((u'name', u'position'),)", 'object_name': 'CandidateName'}, | ||
263 | 184 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
264 | 185 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), | ||
265 | 186 | 'position': ('django.db.models.fields.IntegerField', [], {}) | ||
266 | 187 | }, | ||
267 | 188 | u'maasserver.componenterror': { | ||
268 | 189 | 'Meta': {'object_name': 'ComponentError'}, | ||
269 | 190 | 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), | ||
270 | 191 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
271 | 192 | 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}), | ||
272 | 193 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
273 | 194 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
274 | 195 | }, | ||
275 | 196 | u'maasserver.config': { | ||
276 | 197 | 'Meta': {'object_name': 'Config'}, | ||
277 | 198 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
278 | 199 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
279 | 200 | 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'}) | ||
280 | 201 | }, | ||
281 | 202 | u'maasserver.downloadprogress': { | ||
282 | 203 | 'Meta': {'object_name': 'DownloadProgress'}, | ||
283 | 204 | 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
284 | 205 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
285 | 206 | 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}), | ||
286 | 207 | 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
287 | 208 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
288 | 209 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}), | ||
289 | 210 | 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
290 | 211 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
291 | 212 | }, | ||
292 | 213 | u'maasserver.event': { | ||
293 | 214 | 'Meta': {'object_name': 'Event'}, | ||
294 | 215 | 'action': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}), | ||
295 | 216 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
296 | 217 | 'description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}), | ||
297 | 218 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
298 | 219 | 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}), | ||
299 | 220 | 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.EventType']"}), | ||
300 | 221 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
301 | 222 | }, | ||
302 | 223 | u'maasserver.eventtype': { | ||
303 | 224 | 'Meta': {'object_name': 'EventType'}, | ||
304 | 225 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
305 | 226 | 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
306 | 227 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
307 | 228 | 'level': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), | ||
308 | 229 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
309 | 230 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
310 | 231 | }, | ||
311 | 232 | u'maasserver.fabric': { | ||
312 | 233 | 'Meta': {'object_name': 'Fabric'}, | ||
313 | 234 | 'class_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}), | ||
314 | 235 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
315 | 236 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
316 | 237 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}), | ||
317 | 238 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
318 | 239 | }, | ||
319 | 240 | u'maasserver.fannetwork': { | ||
320 | 241 | 'Meta': {'object_name': 'FanNetwork'}, | ||
321 | 242 | 'bridge': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
322 | 243 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
323 | 244 | 'dhcp': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), | ||
324 | 245 | 'host_reserve': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'null': 'True', 'blank': 'True'}), | ||
325 | 246 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
326 | 247 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}), | ||
327 | 248 | 'off': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}), | ||
328 | 249 | 'overlay': ('maasserver.fields.IPv4CIDRField', [], {'unique': 'True'}), | ||
329 | 250 | 'underlay': ('maasserver.fields.IPv4CIDRField', [], {'unique': 'True'}), | ||
330 | 251 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
331 | 252 | }, | ||
332 | 253 | u'maasserver.filestorage': { | ||
333 | 254 | 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'}, | ||
334 | 255 | 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}), | ||
335 | 256 | 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
336 | 257 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
337 | 258 | 'key': ('django.db.models.fields.CharField', [], {'default': "u'53797bc2-87b8-11e5-a272-bcee7b78dc5b'", 'unique': 'True', 'max_length': '36'}), | ||
338 | 259 | 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}) | ||
339 | 260 | }, | ||
340 | 261 | u'maasserver.filesystem': { | ||
341 | 262 | 'Meta': {'unique_together': "((u'partition', u'acquired'), (u'block_device', u'acquired'))", 'object_name': 'Filesystem'}, | ||
342 | 263 | 'acquired': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
343 | 264 | 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']", 'null': 'True', 'blank': 'True'}), | ||
344 | 265 | 'cache_set': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filesystems'", 'null': 'True', 'to': u"orm['maasserver.CacheSet']"}), | ||
345 | 266 | 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
346 | 267 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
347 | 268 | 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filesystems'", 'null': 'True', 'to': u"orm['maasserver.FilesystemGroup']"}), | ||
348 | 269 | 'fstype': ('django.db.models.fields.CharField', [], {'default': "u'ext4'", 'max_length': '20'}), | ||
349 | 270 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
350 | 271 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
351 | 272 | 'mount_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
352 | 273 | 'mount_point': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
353 | 274 | 'partition': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Partition']", 'null': 'True', 'blank': 'True'}), | ||
354 | 275 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
355 | 276 | 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '36'}) | ||
356 | 277 | }, | ||
357 | 278 | u'maasserver.filesystemgroup': { | ||
358 | 279 | 'Meta': {'object_name': 'FilesystemGroup'}, | ||
359 | 280 | 'cache_mode': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), | ||
360 | 281 | 'cache_set': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.CacheSet']", 'null': 'True', 'blank': 'True'}), | ||
361 | 282 | 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
362 | 283 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
363 | 284 | 'group_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
364 | 285 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
365 | 286 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
366 | 287 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
367 | 288 | 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}) | ||
368 | 289 | }, | ||
369 | 290 | u'maasserver.interface': { | ||
370 | 291 | 'Meta': {'ordering': "(u'created',)", 'object_name': 'Interface'}, | ||
371 | 292 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
372 | 293 | 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
373 | 294 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
374 | 295 | 'ip_addresses': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['maasserver.StaticIPAddress']", 'null': 'True', 'blank': 'True'}), | ||
375 | 296 | 'ipv4_params': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
376 | 297 | 'ipv6_params': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
377 | 298 | 'mac_address': ('maasserver.fields.MACAddressField', [], {'null': 'True', 'blank': 'True'}), | ||
378 | 299 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
379 | 300 | 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']", 'null': 'True', 'blank': 'True'}), | ||
380 | 301 | 'params': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
381 | 302 | 'parents': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['maasserver.Interface']", 'null': 'True', 'through': u"orm['maasserver.InterfaceRelationship']", 'blank': 'True'}), | ||
382 | 303 | 'tags': ('djorm_pgarray.fields.ArrayField', [], {'default': '[]', 'dbtype': "u'text'", 'blank': 'True'}), | ||
383 | 304 | 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
384 | 305 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
385 | 306 | 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.VLAN']", 'on_delete': 'models.PROTECT'}) | ||
386 | 307 | }, | ||
387 | 308 | u'maasserver.interfacerelationship': { | ||
388 | 309 | 'Meta': {'object_name': 'InterfaceRelationship'}, | ||
389 | 310 | 'child': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'parent_relationships'", 'to': u"orm['maasserver.Interface']"}), | ||
390 | 311 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
391 | 312 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
392 | 313 | 'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'children_relationships'", 'to': u"orm['maasserver.Interface']"}), | ||
393 | 314 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
394 | 315 | }, | ||
395 | 316 | u'maasserver.largefile': { | ||
396 | 317 | 'Meta': {'object_name': 'LargeFile'}, | ||
397 | 318 | 'content': ('maasserver.fields.LargeObjectField', [], {}), | ||
398 | 319 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
399 | 320 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
400 | 321 | 'sha256': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}), | ||
401 | 322 | 'total_size': ('django.db.models.fields.BigIntegerField', [], {}), | ||
402 | 323 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
403 | 324 | }, | ||
404 | 325 | u'maasserver.licensekey': { | ||
405 | 326 | 'Meta': {'unique_together': "((u'osystem', u'distro_series'),)", 'object_name': 'LicenseKey'}, | ||
406 | 327 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
407 | 328 | 'distro_series': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
408 | 329 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
409 | 330 | 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
410 | 331 | 'osystem': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
411 | 332 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
412 | 333 | }, | ||
413 | 334 | u'maasserver.node': { | ||
414 | 335 | 'Meta': {'object_name': 'Node'}, | ||
415 | 336 | 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
416 | 337 | 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}), | ||
417 | 338 | 'bios_boot_method': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}), | ||
418 | 339 | 'boot_cluster_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
419 | 340 | 'boot_disk': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': u"orm['maasserver.PhysicalBlockDevice']", 'blank': 'True', 'null': 'True'}), | ||
420 | 341 | 'boot_interface': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': u"orm['maasserver.Interface']", 'blank': 'True', 'null': 'True'}), | ||
421 | 342 | 'boot_type': ('django.db.models.fields.CharField', [], {'default': "u'fastpath'", 'max_length': '20'}), | ||
422 | 343 | 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
423 | 344 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
424 | 345 | 'disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
425 | 346 | 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
426 | 347 | 'enable_ssh': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
427 | 348 | 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
428 | 349 | 'error_description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}), | ||
429 | 350 | 'gateway_link_ipv4': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': u"orm['maasserver.StaticIPAddress']", 'blank': 'True', 'null': 'True'}), | ||
430 | 351 | 'gateway_link_ipv6': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': u"orm['maasserver.StaticIPAddress']", 'blank': 'True', 'null': 'True'}), | ||
431 | 352 | 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}), | ||
432 | 353 | 'hwe_kernel': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}), | ||
433 | 354 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
434 | 355 | 'installable': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), | ||
435 | 356 | 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), | ||
436 | 357 | 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
437 | 358 | 'min_hwe_kernel': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}), | ||
438 | 359 | 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
439 | 360 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}), | ||
440 | 361 | 'osystem': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
441 | 362 | 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), | ||
442 | 363 | 'parent': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "u'children'", 'null': 'True', 'blank': 'True', 'to': u"orm['maasserver.Node']"}), | ||
443 | 364 | 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'max_length': '32768', 'blank': 'True'}), | ||
444 | 365 | 'power_state': ('django.db.models.fields.CharField', [], {'default': "u'unknown'", 'max_length': '10'}), | ||
445 | 366 | 'power_state_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), | ||
446 | 367 | 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}), | ||
447 | 368 | 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}), | ||
448 | 369 | 'skip_networking': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
449 | 370 | 'skip_storage': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
450 | 371 | 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}), | ||
451 | 372 | 'swap_size': ('django.db.models.fields.BigIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), | ||
452 | 373 | 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-537a4b56-87b8-11e5-a272-bcee7b78dc5b'", 'unique': 'True', 'max_length': '41'}), | ||
453 | 374 | 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}), | ||
454 | 375 | 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}), | ||
455 | 376 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
456 | 377 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Zone']", 'on_delete': 'models.SET_DEFAULT'}) | ||
457 | 378 | }, | ||
458 | 379 | u'maasserver.nodegroup': { | ||
459 | 380 | 'Meta': {'object_name': 'NodeGroup'}, | ||
460 | 381 | 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}), | ||
461 | 382 | 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}), | ||
462 | 383 | 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}), | ||
463 | 384 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
464 | 385 | 'default_disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
465 | 386 | 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
466 | 387 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
467 | 388 | 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
468 | 389 | 'name': ('maasserver.models.nodegroup.DomainNameField', [], {'max_length': '80', 'blank': 'True'}), | ||
469 | 390 | 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), | ||
470 | 391 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
471 | 392 | 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}) | ||
472 | 393 | }, | ||
473 | 394 | u'maasserver.nodegroupinterface': { | ||
474 | 395 | 'Meta': {'unique_together': "((u'nodegroup', u'name'),)", 'object_name': 'NodeGroupInterface'}, | ||
475 | 396 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
476 | 397 | 'foreign_dhcp_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
477 | 398 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
478 | 399 | 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
479 | 400 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}), | ||
480 | 401 | 'ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
481 | 402 | 'ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
482 | 403 | 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
483 | 404 | 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
484 | 405 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}), | ||
485 | 406 | 'static_ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
486 | 407 | 'static_ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
487 | 408 | 'subnet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Subnet']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), | ||
488 | 409 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
489 | 410 | 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.VLAN']", 'on_delete': 'models.PROTECT'}) | ||
490 | 411 | }, | ||
491 | 412 | u'maasserver.partition': { | ||
492 | 413 | 'Meta': {'object_name': 'Partition'}, | ||
493 | 414 | 'bootable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
494 | 415 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
495 | 416 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
496 | 417 | 'partition_table': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'partitions'", 'to': u"orm['maasserver.PartitionTable']"}), | ||
497 | 418 | 'size': ('django.db.models.fields.BigIntegerField', [], {}), | ||
498 | 419 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
499 | 420 | 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '36', 'unique': 'True', 'null': 'True', 'blank': 'True'}) | ||
500 | 421 | }, | ||
501 | 422 | u'maasserver.partitiontable': { | ||
502 | 423 | 'Meta': {'object_name': 'PartitionTable'}, | ||
503 | 424 | 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']"}), | ||
504 | 425 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
505 | 426 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
506 | 427 | 'table_type': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '20'}), | ||
507 | 428 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
508 | 429 | }, | ||
509 | 430 | u'maasserver.physicalblockdevice': { | ||
510 | 431 | 'Meta': {'ordering': "[u'id']", 'object_name': 'PhysicalBlockDevice', '_ormbases': [u'maasserver.BlockDevice']}, | ||
511 | 432 | u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}), | ||
512 | 433 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
513 | 434 | 'serial': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) | ||
514 | 435 | }, | ||
515 | 436 | u'maasserver.space': { | ||
516 | 437 | 'Meta': {'object_name': 'Space'}, | ||
517 | 438 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
518 | 439 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
519 | 440 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}), | ||
520 | 441 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
521 | 442 | }, | ||
522 | 443 | u'maasserver.sshkey': { | ||
523 | 444 | 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'}, | ||
524 | 445 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
525 | 446 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
526 | 447 | 'key': ('django.db.models.fields.TextField', [], {}), | ||
527 | 448 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
528 | 449 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) | ||
529 | 450 | }, | ||
530 | 451 | u'maasserver.sslkey': { | ||
531 | 452 | 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSLKey'}, | ||
532 | 453 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
533 | 454 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
534 | 455 | 'key': ('django.db.models.fields.TextField', [], {}), | ||
535 | 456 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
536 | 457 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) | ||
537 | 458 | }, | ||
538 | 459 | u'maasserver.staticipaddress': { | ||
539 | 460 | 'Meta': {'object_name': 'StaticIPAddress'}, | ||
540 | 461 | 'alloc_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
541 | 462 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
542 | 463 | 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
543 | 464 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
544 | 465 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'unique': 'True', 'null': 'True', 'blank': 'True'}), | ||
545 | 466 | 'subnet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Subnet']", 'null': 'True', 'blank': 'True'}), | ||
546 | 467 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
547 | 468 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}) | ||
548 | 469 | }, | ||
549 | 470 | u'maasserver.subnet': { | ||
550 | 471 | 'Meta': {'unique_together': "((u'name', u'space'),)", 'object_name': 'Subnet'}, | ||
551 | 472 | 'cidr': ('maasserver.fields.CIDRField', [], {'unique': 'True'}), | ||
552 | 473 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
553 | 474 | 'dns_servers': ('djorm_pgarray.fields.ArrayField', [], {'default': '[]', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
554 | 475 | 'gateway_ip': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
555 | 476 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
556 | 477 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
557 | 478 | 'space': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Space']", 'on_delete': 'models.PROTECT'}), | ||
558 | 479 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
559 | 480 | 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.VLAN']", 'on_delete': 'models.PROTECT'}) | ||
560 | 481 | }, | ||
561 | 482 | u'maasserver.tag': { | ||
562 | 483 | 'Meta': {'object_name': 'Tag'}, | ||
563 | 484 | 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
564 | 485 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
565 | 486 | 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
566 | 487 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
567 | 488 | 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), | ||
568 | 489 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}), | ||
569 | 490 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
570 | 491 | }, | ||
571 | 492 | u'maasserver.userprofile': { | ||
572 | 493 | 'Meta': {'object_name': 'UserProfile'}, | ||
573 | 494 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
574 | 495 | 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) | ||
575 | 496 | }, | ||
576 | 497 | u'maasserver.virtualblockdevice': { | ||
577 | 498 | 'Meta': {'ordering': "[u'id']", 'object_name': 'VirtualBlockDevice', '_ormbases': [u'maasserver.BlockDevice']}, | ||
578 | 499 | u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}), | ||
579 | 500 | 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'virtual_devices'", 'to': u"orm['maasserver.FilesystemGroup']"}), | ||
580 | 501 | 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}) | ||
581 | 502 | }, | ||
582 | 503 | u'maasserver.vlan': { | ||
583 | 504 | 'Meta': {'unique_together': "((u'vid', u'fabric'),)", 'object_name': 'VLAN'}, | ||
584 | 505 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
585 | 506 | 'fabric': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Fabric']"}), | ||
586 | 507 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
587 | 508 | 'mtu': ('django.db.models.fields.IntegerField', [], {'default': '1500'}), | ||
588 | 509 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}), | ||
589 | 510 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
590 | 511 | 'vid': ('django.db.models.fields.IntegerField', [], {}) | ||
591 | 512 | }, | ||
592 | 513 | u'maasserver.zone': { | ||
593 | 514 | 'Meta': {'ordering': "[u'name']", 'object_name': 'Zone'}, | ||
594 | 515 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
595 | 516 | 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
596 | 517 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
597 | 518 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}), | ||
598 | 519 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
599 | 520 | }, | ||
600 | 521 | u'piston.consumer': { | ||
601 | 522 | 'Meta': {'object_name': 'Consumer'}, | ||
602 | 523 | 'description': ('django.db.models.fields.TextField', [], {}), | ||
603 | 524 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
604 | 525 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}), | ||
605 | 526 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
606 | 527 | 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}), | ||
607 | 528 | 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}), | ||
608 | 529 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"}) | ||
609 | 530 | }, | ||
610 | 531 | u'piston.token': { | ||
611 | 532 | 'Meta': {'object_name': 'Token'}, | ||
612 | 533 | 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
613 | 534 | 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
614 | 535 | 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}), | ||
615 | 536 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
616 | 537 | 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
617 | 538 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}), | ||
618 | 539 | 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}), | ||
619 | 540 | 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1447166144L'}), | ||
620 | 541 | 'token_type': ('django.db.models.fields.IntegerField', [], {}), | ||
621 | 542 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}), | ||
622 | 543 | 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'}) | ||
623 | 544 | } | ||
624 | 545 | } | ||
625 | 546 | |||
626 | 547 | complete_apps = ['maasserver'] | ||
627 | 0 | \ No newline at end of file | 548 | \ No newline at end of file |
628 | 1 | 549 | ||
629 | === modified file 'src/maasserver/models/interface.py' | |||
630 | --- src/maasserver/models/interface.py 2015-11-06 16:57:58 +0000 | |||
631 | +++ src/maasserver/models/interface.py 2015-11-10 16:55:31 +0000 | |||
632 | @@ -336,6 +336,15 @@ | |||
633 | 336 | def is_enabled(self): | 336 | def is_enabled(self): |
634 | 337 | return self.enabled | 337 | return self.enabled |
635 | 338 | 338 | ||
636 | 339 | def get_effective_mtu(self): | ||
637 | 340 | """Return the effective MTU value for this interface.""" | ||
638 | 341 | mtu = None | ||
639 | 342 | if self.params: | ||
640 | 343 | mtu = self.params.get('mtu', None) | ||
641 | 344 | if mtu is None: | ||
642 | 345 | mtu = self.vlan.mtu | ||
643 | 346 | return mtu | ||
644 | 347 | |||
645 | 339 | def get_links(self): | 348 | def get_links(self): |
646 | 340 | """Return the definition of links connected to this interface. | 349 | """Return the definition of links connected to this interface. |
647 | 341 | 350 | ||
648 | 342 | 351 | ||
649 | === modified file 'src/maasserver/models/tests/test_filesystemgroup.py' | |||
650 | --- src/maasserver/models/tests/test_filesystemgroup.py 2015-10-28 17:32:43 +0000 | |||
651 | +++ src/maasserver/models/tests/test_filesystemgroup.py 2015-11-10 16:55:31 +0000 | |||
652 | @@ -213,10 +213,11 @@ | |||
653 | 213 | [filesystem_group.id], result_filesystem_group_ids) | 213 | [filesystem_group.id], result_filesystem_group_ids) |
654 | 214 | 214 | ||
655 | 215 | def test__volume_group_on_partition(self): | 215 | def test__volume_group_on_partition(self): |
657 | 216 | block_device = factory.make_PhysicalBlockDevice() | 216 | block_device = factory.make_PhysicalBlockDevice(size=10 * 1024 ** 3) |
658 | 217 | partition_table = factory.make_PartitionTable( | 217 | partition_table = factory.make_PartitionTable( |
659 | 218 | block_device=block_device) | 218 | block_device=block_device) |
661 | 219 | partition = factory.make_Partition(partition_table=partition_table) | 219 | partition = factory.make_Partition( |
662 | 220 | size=5 * 1024 ** 3, partition_table=partition_table) | ||
663 | 220 | filesystem = factory.make_Filesystem( | 221 | filesystem = factory.make_Filesystem( |
664 | 221 | fstype=FILESYSTEM_TYPE.LVM_PV, partition=partition) | 222 | fstype=FILESYSTEM_TYPE.LVM_PV, partition=partition) |
665 | 222 | filesystem_group = factory.make_FilesystemGroup( | 223 | filesystem_group = factory.make_FilesystemGroup( |
666 | 223 | 224 | ||
667 | === modified file 'src/maasserver/models/tests/test_interface.py' | |||
668 | --- src/maasserver/models/tests/test_interface.py 2015-11-06 16:57:58 +0000 | |||
669 | +++ src/maasserver/models/tests/test_interface.py 2015-11-10 16:55:31 +0000 | |||
670 | @@ -436,6 +436,22 @@ | |||
671 | 436 | self.assertIsNone(reload_object(bond), "Bond was not deleted.") | 436 | self.assertIsNone(reload_object(bond), "Bond was not deleted.") |
672 | 437 | self.assertIsNone(reload_object(vlan), "VLAN was not deleted.") | 437 | self.assertIsNone(reload_object(vlan), "VLAN was not deleted.") |
673 | 438 | 438 | ||
674 | 439 | def test_get_effective_mtu_returns_interface_mtu(self): | ||
675 | 440 | nic1 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | ||
676 | 441 | nic_mtu = random.randint(552, 4096) | ||
677 | 442 | nic1.params = { | ||
678 | 443 | "mtu": nic_mtu | ||
679 | 444 | } | ||
680 | 445 | nic1.save() | ||
681 | 446 | self.assertEquals(nic_mtu, nic1.get_effective_mtu()) | ||
682 | 447 | |||
683 | 448 | def test_get_effective_mtu_returns_vlan_mtu(self): | ||
684 | 449 | nic1 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | ||
685 | 450 | vlan_mtu = random.randint(552, 4096) | ||
686 | 451 | nic1.vlan.mtu = vlan_mtu | ||
687 | 452 | nic1.vlan.save() | ||
688 | 453 | self.assertEquals(vlan_mtu, nic1.get_effective_mtu()) | ||
689 | 454 | |||
690 | 439 | def test_get_links_returns_links_for_each_type(self): | 455 | def test_get_links_returns_links_for_each_type(self): |
691 | 440 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | 456 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) |
692 | 441 | links = [] | 457 | links = [] |
693 | 442 | 458 | ||
694 | === modified file 'src/maasserver/models/vlan.py' | |||
695 | --- src/maasserver/models/vlan.py 2015-10-23 10:28:17 +0000 | |||
696 | +++ src/maasserver/models/vlan.py 2015-11-10 16:55:31 +0000 | |||
697 | @@ -38,6 +38,7 @@ | |||
698 | 38 | 38 | ||
699 | 39 | DEFAULT_VLAN_NAME = 'Default VLAN' | 39 | DEFAULT_VLAN_NAME = 'Default VLAN' |
700 | 40 | DEFAULT_VID = 0 | 40 | DEFAULT_VID = 0 |
701 | 41 | DEFAULT_MTU = 1500 | ||
702 | 41 | 42 | ||
703 | 42 | 43 | ||
704 | 43 | class VLANManager(Manager): | 44 | class VLANManager(Manager): |
705 | @@ -84,6 +85,8 @@ | |||
706 | 84 | 85 | ||
707 | 85 | fabric = ForeignKey('Fabric', blank=False, editable=True) | 86 | fabric = ForeignKey('Fabric', blank=False, editable=True) |
708 | 86 | 87 | ||
709 | 88 | mtu = IntegerField(default=DEFAULT_MTU) | ||
710 | 89 | |||
711 | 87 | def __unicode__(self): | 90 | def __unicode__(self): |
712 | 88 | return "%s.%s" % (self.fabric.get_name(), self.get_name()) | 91 | return "%s.%s" % (self.fabric.get_name(), self.get_name()) |
713 | 89 | 92 | ||
714 | @@ -93,8 +96,16 @@ | |||
715 | 93 | {'vid': | 96 | {'vid': |
716 | 94 | ["Vid must be between 0 and 4095."]}) | 97 | ["Vid must be between 0 and 4095."]}) |
717 | 95 | 98 | ||
718 | 99 | def clean_mtu(self): | ||
719 | 100 | # Linux doesn't allow lower than 552 for the MTU. | ||
720 | 101 | if self.mtu < 552 and self.mtu <= 65535: | ||
721 | 102 | raise ValidationError( | ||
722 | 103 | {'mtu': | ||
723 | 104 | ["MTU must be between 552 and 65535."]}) | ||
724 | 105 | |||
725 | 96 | def clean(self): | 106 | def clean(self): |
726 | 97 | self.clean_vid() | 107 | self.clean_vid() |
727 | 108 | self.clean_mtu() | ||
728 | 98 | 109 | ||
729 | 99 | def is_fabric_default(self): | 110 | def is_fabric_default(self): |
730 | 100 | """Is this the default VLAN in the fabric?""" | 111 | """Is this the default VLAN in the fabric?""" |
731 | 101 | 112 | ||
732 | === modified file 'src/maasserver/preseed_network.py' | |||
733 | --- src/maasserver/preseed_network.py 2015-10-15 01:32:03 +0000 | |||
734 | +++ src/maasserver/preseed_network.py 2015-11-10 16:55:31 +0000 | |||
735 | @@ -116,8 +116,9 @@ | |||
736 | 116 | if interface.params: | 116 | if interface.params: |
737 | 117 | for key, value in interface.params.items(): | 117 | for key, value in interface.params.items(): |
738 | 118 | # Don't include bond parameters. | 118 | # Don't include bond parameters. |
740 | 119 | if not key.startswith("bond_"): | 119 | if not key.startswith("bond_") and key != 'mtu': |
741 | 120 | params[key] = self._get_param_value(value) | 120 | params[key] = self._get_param_value(value) |
742 | 121 | params['mtu'] = interface.get_effective_mtu() | ||
743 | 121 | return params | 122 | return params |
744 | 122 | 123 | ||
745 | 123 | def _get_bond_params(self, interface): | 124 | def _get_bond_params(self, interface): |
746 | 124 | 125 | ||
747 | === modified file 'src/maasserver/tests/test_forms_vlan.py' | |||
748 | --- src/maasserver/tests/test_forms_vlan.py 2015-10-09 06:06:47 +0000 | |||
749 | +++ src/maasserver/tests/test_forms_vlan.py 2015-11-10 16:55:31 +0000 | |||
750 | @@ -17,6 +17,7 @@ | |||
751 | 17 | import random | 17 | import random |
752 | 18 | 18 | ||
753 | 19 | from maasserver.forms_vlan import VLANForm | 19 | from maasserver.forms_vlan import VLANForm |
754 | 20 | from maasserver.models.vlan import DEFAULT_MTU | ||
755 | 20 | from maasserver.testing.factory import factory | 21 | from maasserver.testing.factory import factory |
756 | 21 | from maasserver.testing.orm import reload_object | 22 | from maasserver.testing.orm import reload_object |
757 | 22 | from maasserver.testing.testcase import MAASServerTestCase | 23 | from maasserver.testing.testcase import MAASServerTestCase |
758 | @@ -39,17 +40,35 @@ | |||
759 | 39 | fabric = factory.make_Fabric() | 40 | fabric = factory.make_Fabric() |
760 | 40 | vlan_name = factory.make_name("vlan") | 41 | vlan_name = factory.make_name("vlan") |
761 | 41 | vid = random.randint(1, 1000) | 42 | vid = random.randint(1, 1000) |
773 | 42 | form = VLANForm(fabric=fabric, data={ | 43 | mtu = random.randint(552, 4096) |
774 | 43 | "name": vlan_name, | 44 | form = VLANForm(fabric=fabric, data={ |
775 | 44 | "vid": vid, | 45 | "name": vlan_name, |
776 | 45 | }) | 46 | "vid": vid, |
777 | 46 | self.assertTrue(form.is_valid(), form.errors) | 47 | "mtu": mtu, |
778 | 47 | vlan = form.save() | 48 | }) |
779 | 48 | self.assertEquals(vlan_name, vlan.name) | 49 | self.assertTrue(form.is_valid(), form.errors) |
780 | 49 | self.assertEquals(vid, vlan.vid) | 50 | vlan = form.save() |
781 | 50 | self.assertEquals(fabric, vlan.fabric) | 51 | self.assertEquals(vlan_name, vlan.name) |
782 | 51 | 52 | self.assertEquals(vid, vlan.vid) | |
783 | 52 | def test__doest_require_name_or_vid_on_update(self): | 53 | self.assertEquals(fabric, vlan.fabric) |
784 | 54 | self.assertEquals(mtu, vlan.mtu) | ||
785 | 55 | |||
786 | 56 | def test__creates_vlan_with_default_mtu(self): | ||
787 | 57 | fabric = factory.make_Fabric() | ||
788 | 58 | vlan_name = factory.make_name("vlan") | ||
789 | 59 | vid = random.randint(1, 1000) | ||
790 | 60 | form = VLANForm(fabric=fabric, data={ | ||
791 | 61 | "name": vlan_name, | ||
792 | 62 | "vid": vid, | ||
793 | 63 | }) | ||
794 | 64 | self.assertTrue(form.is_valid(), form.errors) | ||
795 | 65 | vlan = form.save() | ||
796 | 66 | self.assertEquals(vlan_name, vlan.name) | ||
797 | 67 | self.assertEquals(vid, vlan.vid) | ||
798 | 68 | self.assertEquals(fabric, vlan.fabric) | ||
799 | 69 | self.assertEquals(DEFAULT_MTU, vlan.mtu) | ||
800 | 70 | |||
801 | 71 | def test__doest_require_name_vid_or_mtu_on_update(self): | ||
802 | 53 | vlan = factory.make_VLAN() | 72 | vlan = factory.make_VLAN() |
803 | 54 | form = VLANForm(instance=vlan, data={}) | 73 | form = VLANForm(instance=vlan, data={}) |
804 | 55 | self.assertTrue(form.is_valid(), form.errors) | 74 | self.assertTrue(form.is_valid(), form.errors) |
805 | @@ -68,11 +87,14 @@ | |||
806 | 68 | vlan = factory.make_VLAN() | 87 | vlan = factory.make_VLAN() |
807 | 69 | new_name = factory.make_name("vlan") | 88 | new_name = factory.make_name("vlan") |
808 | 70 | new_vid = random.randint(1, 1000) | 89 | new_vid = random.randint(1, 1000) |
809 | 90 | new_mtu = random.randint(552, 4096) | ||
810 | 71 | form = VLANForm(instance=vlan, data={ | 91 | form = VLANForm(instance=vlan, data={ |
811 | 72 | "name": new_name, | 92 | "name": new_name, |
812 | 73 | "vid": new_vid, | 93 | "vid": new_vid, |
813 | 94 | "mtu": new_mtu, | ||
814 | 74 | }) | 95 | }) |
815 | 75 | self.assertTrue(form.is_valid(), form.errors) | 96 | self.assertTrue(form.is_valid(), form.errors) |
816 | 76 | form.save() | 97 | form.save() |
817 | 77 | self.assertEquals(new_name, reload_object(vlan).name) | 98 | self.assertEquals(new_name, reload_object(vlan).name) |
818 | 78 | self.assertEquals(new_vid, reload_object(vlan).vid) | 99 | self.assertEquals(new_vid, reload_object(vlan).vid) |
819 | 100 | self.assertEquals(new_mtu, reload_object(vlan).mtu) | ||
820 | 79 | 101 | ||
821 | === modified file 'src/maasserver/tests/test_preseed_network.py' | |||
822 | --- src/maasserver/tests/test_preseed_network.py 2015-10-15 01:34:16 +0000 | |||
823 | +++ src/maasserver/tests/test_preseed_network.py 2015-11-10 16:55:31 +0000 | |||
824 | @@ -128,8 +128,9 @@ | |||
825 | 128 | def set_interface_params(iface, ret): | 128 | def set_interface_params(iface, ret): |
826 | 129 | if iface.params: | 129 | if iface.params: |
827 | 130 | for key, value in iface.params.items(): | 130 | for key, value in iface.params.items(): |
829 | 131 | if not key.startswith("bond_"): | 131 | if not key.startswith("bond_") and key != 'mtu': |
830 | 132 | ret += " %s: %s\n" % (key, get_param_value(value)) | 132 | ret += " %s: %s\n" % (key, get_param_value(value)) |
831 | 133 | ret += " mtu: %s\n" % iface.get_effective_mtu() | ||
832 | 133 | return ret | 134 | return ret |
833 | 134 | 135 | ||
834 | 135 | def is_link_up(addresses): | 136 | def is_link_up(addresses): |
835 | 136 | 137 | ||
836 | === modified file 'src/maasserver/websockets/handlers/tests/test_vlan.py' | |||
837 | --- src/maasserver/websockets/handlers/tests/test_vlan.py 2015-10-09 21:26:04 +0000 | |||
838 | +++ src/maasserver/websockets/handlers/tests/test_vlan.py 2015-11-10 16:55:31 +0000 | |||
839 | @@ -28,6 +28,7 @@ | |||
840 | 28 | "id": vlan.id, | 28 | "id": vlan.id, |
841 | 29 | "name": vlan.get_name(), | 29 | "name": vlan.get_name(), |
842 | 30 | "vid": vlan.vid, | 30 | "vid": vlan.vid, |
843 | 31 | "mtu": vlan.mtu, | ||
844 | 31 | "fabric": vlan.fabric_id, | 32 | "fabric": vlan.fabric_id, |
845 | 32 | "updated": dehydrate_datetime(vlan.updated), | 33 | "updated": dehydrate_datetime(vlan.updated), |
846 | 33 | "created": dehydrate_datetime(vlan.created), | 34 | "created": dehydrate_datetime(vlan.created), |
lgtm!