Merge lp:~blake-rouse/maas/fix-1508056 into lp:~maas-committers/maas/trunk

Proposed by Blake Rouse
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
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.

To post a comment you must log in.
Revision history for this message
Andres Rodriguez (andreserl) wrote :

lgtm!

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Download full text (1019.6 KiB)

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://security.ubuntu.com trusty-security InRelease [64.4 kB]
Ign http://nova.clouds.archive.ubuntu.com trusty InRelease
Get:2 http://nova.clouds.archive.ubuntu.com trusty-updates InRelease [64.4 kB]
Hit http://nova.clouds.archive.ubuntu.com trusty Release.gpg
Hit http://nova.clouds.archive.ubuntu.com trusty Release
Get:3 http://security.ubuntu.com trusty-security/main Sources [98.0 kB]
Get:4 http://nova.clouds.archive.ubuntu.com trusty-updates/main Sources [242 kB]
Get:5 http://security.ubuntu.com trusty-security/universe Sources [30.9 kB]
Get:6 http://security.ubuntu.com trusty-security/main amd64 Packages [362 kB]
Get:7 http://nova.clouds.archive.ubuntu.com trusty-updates/universe Sources [143 kB]
Get:8 http://security.ubuntu.com trusty-security/universe amd64 Packages [117 kB]
Get:9 http://nova.clouds.archive.ubuntu.com trusty-updates/main amd64 Packages [644 kB]
Hit http://security.ubuntu.com trusty-security/main Translation-en
Hit http://security.ubuntu.com trusty-security/universe Translation-en
Get:10 http://nova.clouds.archive.ubuntu.com trusty-updates/universe amd64 Packages [326 kB]
Hit http://nova.clouds.archive.ubuntu.com trusty-updates/main Translation-en
Hit http://nova.clouds.archive.ubuntu.com trusty-updates/universe Translation-en
Hit http://nova.clouds.archive.ubuntu.com trusty/main Sources
Hit http://nova.clouds.archive.ubuntu.com trusty/universe Sources
Hit http://nova.clouds.archive.ubuntu.com trusty/main amd64 Packages
Hit http://nova.clouds.archive.ubuntu.com trusty/universe amd64 Packages
Hit http://nova.clouds.archive.ubuntu.com trusty/main Translation-en
Hit http://nova.clouds.archive.ubuntu.com trusty/universe Translation-en
Ign http://nova.clouds.archive.ubuntu.com trusty/main Translation-en_US
Ign http://nova.clouds.archive.ubuntu.com trusty/universe Translation-en_US
Fetched 2,092 kB in 4s (495 kB/s)
Reading package lists...
sudo DEBIAN_FRONTEND=noninteractive apt-get -y \
     --no-install-recommends install apache2 authbind bind9 bind9utils build-essential bzr-builddeb chromium-browser chromium-chromedriver curl daemontools debhelper dh-apport dh-systemd distro-info dnsutils firefox freeipmi-tools git gjs ipython isc-dhcp-common libjs-angularjs libjs-jquery libjs-jquery-hotkeys libjs-yui3-full libjs-yui3-min libpq-dev make nodejs-legacy npm pep8 phantomjs postgresql pyflakes python-apt python-bson python-bzrlib python-convoy python-coverage python-crochet python-cssselect python-curtin python-dev python-distro-info python-django python-django-piston python-django-south python-djorm-ext-pgarray python-docutils python-extras python-fixtures python-flake8 python-formencode python-hivex python-httplib2 python-jinja2 python-jsonschema python-lxml python-mock python-netaddr python-netifaces python-nose python-oauth python-openssl python-paramiko python-pexpect python-pip python-pocket-lint python-psycopg2 python-pyinotify python-pyparsing python-seamicroclient python-simplejson python-simplestreams python-sphinx python-subunit python-tempita python-testresources python-testscenarios python-te...

Revision history for this message
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.)

review: Approve
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Thanks for the review. I have added the upper limit.

Revision history for this message
MAAS Lander (maas-lander) wrote :
Download full text (1019.9 KiB)

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://security.ubuntu.com trusty-security InRelease [64.4 kB]
Ign http://nova.clouds.archive.ubuntu.com trusty InRelease
Get:2 http://nova.clouds.archive.ubuntu.com trusty-updates InRelease [64.4 kB]
Hit http://nova.clouds.archive.ubuntu.com trusty Release.gpg
Hit http://nova.clouds.archive.ubuntu.com trusty Release
Get:3 http://security.ubuntu.com trusty-security/main Sources [98.0 kB]
Get:4 http://nova.clouds.archive.ubuntu.com trusty-updates/main Sources [242 kB]
Get:5 http://nova.clouds.archive.ubuntu.com trusty-updates/universe Sources [144 kB]
Get:6 http://security.ubuntu.com trusty-security/universe Sources [32.5 kB]
Get:7 http://security.ubuntu.com trusty-security/main amd64 Packages [366 kB]
Get:8 http://nova.clouds.archive.ubuntu.com trusty-updates/main amd64 Packages [649 kB]
Get:9 http://security.ubuntu.com trusty-security/universe amd64 Packages [122 kB]
Hit http://security.ubuntu.com trusty-security/main Translation-en
Hit http://security.ubuntu.com trusty-security/universe Translation-en
Get:10 http://nova.clouds.archive.ubuntu.com trusty-updates/universe amd64 Packages [331 kB]
Get:11 http://nova.clouds.archive.ubuntu.com trusty-updates/main Translation-en [317 kB]
Get:12 http://nova.clouds.archive.ubuntu.com trusty-updates/universe Translation-en [177 kB]
Hit http://nova.clouds.archive.ubuntu.com trusty/main Sources
Hit http://nova.clouds.archive.ubuntu.com trusty/universe Sources
Hit http://nova.clouds.archive.ubuntu.com trusty/main amd64 Packages
Hit http://nova.clouds.archive.ubuntu.com trusty/universe amd64 Packages
Hit http://nova.clouds.archive.ubuntu.com trusty/main Translation-en
Hit http://nova.clouds.archive.ubuntu.com trusty/universe Translation-en
Ign http://nova.clouds.archive.ubuntu.com trusty/main Translation-en_US
Ign http://nova.clouds.archive.ubuntu.com trusty/universe Translation-en_US
Fetched 2,607 kB in 4s (529 kB/s)
Reading package lists...
sudo DEBIAN_FRONTEND=noninteractive apt-get -y \
     --no-install-recommends install apache2 authbind bind9 bind9utils build-essential bzr-builddeb chromium-browser chromium-chromedriver curl daemontools debhelper dh-apport dh-systemd distro-info dnsutils firefox freeipmi-tools git gjs ipython isc-dhcp-common libjs-angularjs libjs-jquery libjs-jquery-hotkeys libjs-yui3-full libjs-yui3-min libpq-dev make nodejs-legacy npm pep8 phantomjs postgresql pyflakes python-apt python-bson python-bzrlib python-convoy python-coverage python-crochet python-cssselect python-curtin python-dev python-distro-info python-django python-django-piston python-django-south python-djorm-ext-pgarray python-docutils python-extras python-fixtures python-flake8 python-formencode python-hivex python-httplib2 python-jinja2 python-jsonschema python-lxml python-mock python-netaddr python-netifaces python-nose python-oauth python-openssl python-paramiko python-pexpect python-pip python-pocket-lint python-psycopg2 python-pyinotify python-pyparsing python-seamicroclient python-simplejson python-simplestreams python-sphinx python-subunit python-tempita python-testresources python...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/api/interfaces.py'
--- src/maasserver/api/interfaces.py 2015-10-30 20:53:53 +0000
+++ src/maasserver/api/interfaces.py 2015-11-10 16:55:31 +0000
@@ -64,6 +64,7 @@
64 'links',64 'links',
65 'params',65 'params',
66 'discovered',66 'discovered',
67 'effective_mtu',
67)68)
6869
6970
@@ -284,6 +285,10 @@
284 def discovered(cls, interface):285 def discovered(cls, interface):
285 return interface.get_discovered()286 return interface.get_discovered()
286287
288 @classmethod
289 def effective_mtu(cls, interface):
290 return interface.get_effective_mtu()
291
287 def read(self, request, system_id, interface_id):292 def read(self, request, system_id, interface_id):
288 """Read interface on node.293 """Read interface on node.
289294
290295
=== modified file 'src/maasserver/api/nodes.py'
--- src/maasserver/api/nodes.py 2015-11-09 22:27:59 +0000
+++ src/maasserver/api/nodes.py 2015-11-10 16:55:31 +0000
@@ -136,6 +136,7 @@
136 'links',136 'links',
137 'params',137 'params',
138 'discovered',138 'discovered',
139 'effective_mtu',
139 )),140 )),
140 'routers',141 'routers',
141 'zone',142 'zone',
142143
=== modified file 'src/maasserver/api/tests/test_interfaces.py'
--- src/maasserver/api/tests/test_interfaces.py 2015-10-30 20:53:53 +0000
+++ src/maasserver/api/tests/test_interfaces.py 2015-11-10 16:55:31 +0000
@@ -512,6 +512,7 @@
512 "tags": Equals(bond.tags),512 "tags": Equals(bond.tags),
513 "resource_uri": Equals(get_node_interface_uri(bond)),513 "resource_uri": Equals(get_node_interface_uri(bond)),
514 "params": Equals(bond.params),514 "params": Equals(bond.params),
515 "effective_mtu": Equals(bond.get_effective_mtu()),
515 }))516 }))
516 self.assertEquals(sorted(517 self.assertEquals(sorted(
517 nic.name518 nic.name
518519
=== modified file 'src/maasserver/forms_vlan.py'
--- src/maasserver/forms_vlan.py 2015-10-09 06:06:47 +0000
+++ src/maasserver/forms_vlan.py 2015-11-10 16:55:31 +0000
@@ -16,6 +16,7 @@
16 "VLANForm",16 "VLANForm",
17]17]
1818
19from django import forms
19from django.core.exceptions import ValidationError20from django.core.exceptions import ValidationError
20from maasserver.forms import MAASModelForm21from maasserver.forms import MAASModelForm
21from maasserver.models.vlan import VLAN22from maasserver.models.vlan import VLAN
@@ -24,11 +25,15 @@
24class VLANForm(MAASModelForm):25class VLANForm(MAASModelForm):
25 """VLAN creation/edition form."""26 """VLAN creation/edition form."""
2627
28 # Linux doesn't allow lower than 552 for the MTU.
29 mtu = forms.IntegerField(min_value=552, required=False)
30
27 class Meta:31 class Meta:
28 model = VLAN32 model = VLAN
29 fields = (33 fields = (
30 'name',34 'name',
31 'vid',35 'vid',
36 'mtu',
32 )37 )
3338
34 def __init__(self, *args, **kwargs):39 def __init__(self, *args, **kwargs):
3540
=== added file 'src/maasserver/migrations/0190_add_mtu_to_vlan_model.py'
--- src/maasserver/migrations/0190_add_mtu_to_vlan_model.py 1970-01-01 00:00:00 +0000
+++ src/maasserver/migrations/0190_add_mtu_to_vlan_model.py 2015-11-10 16:55:31 +0000
@@ -0,0 +1,547 @@
1from django.db import models
2from south.db import db
3# -*- coding: utf-8 -*-
4from south.utils import datetime_utils as datetime
5from south.v2 import SchemaMigration
6
7
8class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11 # Adding field 'VLAN.mtu'
12 db.add_column(u'maasserver_vlan', 'mtu',
13 self.gf('django.db.models.fields.IntegerField')(default=1500),
14 keep_default=False)
15
16
17 # Changing field 'BootSourceSelection.labels'
18 db.alter_column(u'maasserver_bootsourceselection', 'labels', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=True))
19
20 # Changing field 'BootSourceSelection.arches'
21 db.alter_column(u'maasserver_bootsourceselection', 'arches', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=True))
22
23 # Changing field 'BootSourceSelection.subarches'
24 db.alter_column(u'maasserver_bootsourceselection', 'subarches', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=True))
25
26 # Changing field 'Node.routers'
27 db.alter_column(u'maasserver_node', 'routers', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'macaddr', null=True))
28
29 # Changing field 'Subnet.dns_servers'
30 db.alter_column(u'maasserver_subnet', 'dns_servers', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=True))
31
32 # Changing field 'BlockDevice.tags'
33 db.alter_column(u'maasserver_blockdevice', 'tags', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text'))
34
35 # Changing field 'Interface.tags'
36 db.alter_column(u'maasserver_interface', 'tags', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text'))
37
38 def backwards(self, orm):
39 # Deleting field 'VLAN.mtu'
40 db.delete_column(u'maasserver_vlan', 'mtu')
41
42
43 # Changing field 'BootSourceSelection.labels'
44 db.alter_column(u'maasserver_bootsourceselection', 'labels', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text'))
45
46 # Changing field 'BootSourceSelection.arches'
47 db.alter_column(u'maasserver_bootsourceselection', 'arches', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text'))
48
49 # Changing field 'BootSourceSelection.subarches'
50 db.alter_column(u'maasserver_bootsourceselection', 'subarches', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text'))
51
52 # Changing field 'Node.routers'
53 db.alter_column(u'maasserver_node', 'routers', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'macaddr'))
54
55 # Changing field 'Subnet.dns_servers'
56 db.alter_column(u'maasserver_subnet', 'dns_servers', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text'))
57
58 # Changing field 'BlockDevice.tags'
59 db.alter_column(u'maasserver_blockdevice', 'tags', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=False))
60
61 # Changing field 'Interface.tags'
62 db.alter_column(u'maasserver_interface', 'tags', self.gf('djorm_pgarray.fields.ArrayField')(dbtype=u'text', null=False))
63
64 models = {
65 u'auth.group': {
66 'Meta': {'object_name': 'Group'},
67 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
68 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
69 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
70 },
71 u'auth.permission': {
72 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
73 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
74 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
75 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
76 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
77 },
78 u'auth.user': {
79 'Meta': {'object_name': 'User'},
80 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
81 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
82 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
83 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
84 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
85 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
86 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
87 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
88 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
89 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
90 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
91 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
92 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
93 },
94 u'contenttypes.contenttype': {
95 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
96 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
97 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
98 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
99 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
100 },
101 u'maasserver.blockdevice': {
102 'Meta': {'ordering': "[u'id']", 'unique_together': "((u'node', u'name'),)", 'object_name': 'BlockDevice'},
103 'block_size': ('django.db.models.fields.IntegerField', [], {}),
104 'created': ('django.db.models.fields.DateTimeField', [], {}),
105 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
106 'id_path': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
107 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
108 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
109 'size': ('django.db.models.fields.BigIntegerField', [], {}),
110 'tags': ('djorm_pgarray.fields.ArrayField', [], {'default': '[]', 'dbtype': "u'text'", 'blank': 'True'}),
111 'updated': ('django.db.models.fields.DateTimeField', [], {})
112 },
113 u'maasserver.bootresource': {
114 'Meta': {'unique_together': "((u'name', u'architecture'),)", 'object_name': 'BootResource'},
115 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
116 'created': ('django.db.models.fields.DateTimeField', [], {}),
117 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
118 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
119 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
120 'rtype': ('django.db.models.fields.IntegerField', [], {'max_length': '10'}),
121 'updated': ('django.db.models.fields.DateTimeField', [], {})
122 },
123 u'maasserver.bootresourcefile': {
124 'Meta': {'unique_together': "((u'resource_set', u'filetype'),)", 'object_name': 'BootResourceFile'},
125 'created': ('django.db.models.fields.DateTimeField', [], {}),
126 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
127 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
128 'filetype': ('django.db.models.fields.CharField', [], {'default': "u'root-tgz'", 'max_length': '20'}),
129 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
130 'largefile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.LargeFile']"}),
131 'resource_set': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'files'", 'to': u"orm['maasserver.BootResourceSet']"}),
132 'updated': ('django.db.models.fields.DateTimeField', [], {})
133 },
134 u'maasserver.bootresourceset': {
135 'Meta': {'unique_together': "((u'resource', u'version'),)", 'object_name': 'BootResourceSet'},
136 'created': ('django.db.models.fields.DateTimeField', [], {}),
137 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
138 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
139 'resource': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'sets'", 'to': u"orm['maasserver.BootResource']"}),
140 'updated': ('django.db.models.fields.DateTimeField', [], {}),
141 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'})
142 },
143 u'maasserver.bootsource': {
144 'Meta': {'object_name': 'BootSource'},
145 'created': ('django.db.models.fields.DateTimeField', [], {}),
146 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
147 'keyring_data': ('maasserver.fields.EditableBinaryField', [], {'blank': 'True'}),
148 'keyring_filename': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}),
149 'updated': ('django.db.models.fields.DateTimeField', [], {}),
150 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
151 },
152 u'maasserver.bootsourcecache': {
153 'Meta': {'object_name': 'BootSourceCache'},
154 'arch': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
155 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}),
156 'created': ('django.db.models.fields.DateTimeField', [], {}),
157 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
158 'label': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
159 'os': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
160 'release': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
161 'subarch': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
162 'updated': ('django.db.models.fields.DateTimeField', [], {})
163 },
164 u'maasserver.bootsourceselection': {
165 'Meta': {'unique_together': "((u'boot_source', u'os', u'release'),)", 'object_name': 'BootSourceSelection'},
166 'arches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
167 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}),
168 'created': ('django.db.models.fields.DateTimeField', [], {}),
169 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
170 'labels': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
171 'os': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
172 'release': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
173 'subarches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
174 'updated': ('django.db.models.fields.DateTimeField', [], {})
175 },
176 u'maasserver.cacheset': {
177 'Meta': {'object_name': 'CacheSet'},
178 'created': ('django.db.models.fields.DateTimeField', [], {}),
179 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
180 'updated': ('django.db.models.fields.DateTimeField', [], {})
181 },
182 u'maasserver.candidatename': {
183 'Meta': {'unique_together': "((u'name', u'position'),)", 'object_name': 'CandidateName'},
184 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
185 'name': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
186 'position': ('django.db.models.fields.IntegerField', [], {})
187 },
188 u'maasserver.componenterror': {
189 'Meta': {'object_name': 'ComponentError'},
190 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
191 'created': ('django.db.models.fields.DateTimeField', [], {}),
192 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
193 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
194 'updated': ('django.db.models.fields.DateTimeField', [], {})
195 },
196 u'maasserver.config': {
197 'Meta': {'object_name': 'Config'},
198 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
199 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
200 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
201 },
202 u'maasserver.downloadprogress': {
203 'Meta': {'object_name': 'DownloadProgress'},
204 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
205 'created': ('django.db.models.fields.DateTimeField', [], {}),
206 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}),
207 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
208 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
209 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
210 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
211 'updated': ('django.db.models.fields.DateTimeField', [], {})
212 },
213 u'maasserver.event': {
214 'Meta': {'object_name': 'Event'},
215 'action': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}),
216 'created': ('django.db.models.fields.DateTimeField', [], {}),
217 'description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}),
218 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
219 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
220 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.EventType']"}),
221 'updated': ('django.db.models.fields.DateTimeField', [], {})
222 },
223 u'maasserver.eventtype': {
224 'Meta': {'object_name': 'EventType'},
225 'created': ('django.db.models.fields.DateTimeField', [], {}),
226 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
227 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
228 'level': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
229 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
230 'updated': ('django.db.models.fields.DateTimeField', [], {})
231 },
232 u'maasserver.fabric': {
233 'Meta': {'object_name': 'Fabric'},
234 'class_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}),
235 'created': ('django.db.models.fields.DateTimeField', [], {}),
236 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
237 'name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}),
238 'updated': ('django.db.models.fields.DateTimeField', [], {})
239 },
240 u'maasserver.fannetwork': {
241 'Meta': {'object_name': 'FanNetwork'},
242 'bridge': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
243 'created': ('django.db.models.fields.DateTimeField', [], {}),
244 'dhcp': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
245 'host_reserve': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'null': 'True', 'blank': 'True'}),
246 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
247 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
248 'off': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}),
249 'overlay': ('maasserver.fields.IPv4CIDRField', [], {'unique': 'True'}),
250 'underlay': ('maasserver.fields.IPv4CIDRField', [], {'unique': 'True'}),
251 'updated': ('django.db.models.fields.DateTimeField', [], {})
252 },
253 u'maasserver.filestorage': {
254 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'},
255 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}),
256 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
257 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
258 'key': ('django.db.models.fields.CharField', [], {'default': "u'53797bc2-87b8-11e5-a272-bcee7b78dc5b'", 'unique': 'True', 'max_length': '36'}),
259 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'})
260 },
261 u'maasserver.filesystem': {
262 'Meta': {'unique_together': "((u'partition', u'acquired'), (u'block_device', u'acquired'))", 'object_name': 'Filesystem'},
263 'acquired': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
264 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']", 'null': 'True', 'blank': 'True'}),
265 'cache_set': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filesystems'", 'null': 'True', 'to': u"orm['maasserver.CacheSet']"}),
266 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
267 'created': ('django.db.models.fields.DateTimeField', [], {}),
268 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filesystems'", 'null': 'True', 'to': u"orm['maasserver.FilesystemGroup']"}),
269 'fstype': ('django.db.models.fields.CharField', [], {'default': "u'ext4'", 'max_length': '20'}),
270 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
271 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
272 'mount_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
273 'mount_point': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
274 'partition': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Partition']", 'null': 'True', 'blank': 'True'}),
275 'updated': ('django.db.models.fields.DateTimeField', [], {}),
276 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '36'})
277 },
278 u'maasserver.filesystemgroup': {
279 'Meta': {'object_name': 'FilesystemGroup'},
280 'cache_mode': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
281 'cache_set': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.CacheSet']", 'null': 'True', 'blank': 'True'}),
282 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
283 'created': ('django.db.models.fields.DateTimeField', [], {}),
284 'group_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
285 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
286 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
287 'updated': ('django.db.models.fields.DateTimeField', [], {}),
288 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
289 },
290 u'maasserver.interface': {
291 'Meta': {'ordering': "(u'created',)", 'object_name': 'Interface'},
292 'created': ('django.db.models.fields.DateTimeField', [], {}),
293 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
294 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
295 'ip_addresses': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['maasserver.StaticIPAddress']", 'null': 'True', 'blank': 'True'}),
296 'ipv4_params': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
297 'ipv6_params': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
298 'mac_address': ('maasserver.fields.MACAddressField', [], {'null': 'True', 'blank': 'True'}),
299 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
300 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']", 'null': 'True', 'blank': 'True'}),
301 'params': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
302 'parents': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['maasserver.Interface']", 'null': 'True', 'through': u"orm['maasserver.InterfaceRelationship']", 'blank': 'True'}),
303 'tags': ('djorm_pgarray.fields.ArrayField', [], {'default': '[]', 'dbtype': "u'text'", 'blank': 'True'}),
304 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
305 'updated': ('django.db.models.fields.DateTimeField', [], {}),
306 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.VLAN']", 'on_delete': 'models.PROTECT'})
307 },
308 u'maasserver.interfacerelationship': {
309 'Meta': {'object_name': 'InterfaceRelationship'},
310 'child': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'parent_relationships'", 'to': u"orm['maasserver.Interface']"}),
311 'created': ('django.db.models.fields.DateTimeField', [], {}),
312 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
313 'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'children_relationships'", 'to': u"orm['maasserver.Interface']"}),
314 'updated': ('django.db.models.fields.DateTimeField', [], {})
315 },
316 u'maasserver.largefile': {
317 'Meta': {'object_name': 'LargeFile'},
318 'content': ('maasserver.fields.LargeObjectField', [], {}),
319 'created': ('django.db.models.fields.DateTimeField', [], {}),
320 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
321 'sha256': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}),
322 'total_size': ('django.db.models.fields.BigIntegerField', [], {}),
323 'updated': ('django.db.models.fields.DateTimeField', [], {})
324 },
325 u'maasserver.licensekey': {
326 'Meta': {'unique_together': "((u'osystem', u'distro_series'),)", 'object_name': 'LicenseKey'},
327 'created': ('django.db.models.fields.DateTimeField', [], {}),
328 'distro_series': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
329 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
330 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
331 'osystem': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
332 'updated': ('django.db.models.fields.DateTimeField', [], {})
333 },
334 u'maasserver.node': {
335 'Meta': {'object_name': 'Node'},
336 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
337 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}),
338 'bios_boot_method': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}),
339 'boot_cluster_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
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'}),
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'}),
342 'boot_type': ('django.db.models.fields.CharField', [], {'default': "u'fastpath'", 'max_length': '20'}),
343 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
344 'created': ('django.db.models.fields.DateTimeField', [], {}),
345 'disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
346 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
347 'enable_ssh': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
348 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
349 'error_description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}),
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'}),
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'}),
352 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}),
353 'hwe_kernel': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}),
354 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
355 'installable': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
356 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
357 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
358 'min_hwe_kernel': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}),
359 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
360 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
361 'osystem': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
362 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}),
363 'parent': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "u'children'", 'null': 'True', 'blank': 'True', 'to': u"orm['maasserver.Node']"}),
364 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'max_length': '32768', 'blank': 'True'}),
365 'power_state': ('django.db.models.fields.CharField', [], {'default': "u'unknown'", 'max_length': '10'}),
366 'power_state_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
367 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
368 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}),
369 'skip_networking': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
370 'skip_storage': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
371 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
372 'swap_size': ('django.db.models.fields.BigIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
373 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-537a4b56-87b8-11e5-a272-bcee7b78dc5b'", 'unique': 'True', 'max_length': '41'}),
374 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
375 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}),
376 'updated': ('django.db.models.fields.DateTimeField', [], {}),
377 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Zone']", 'on_delete': 'models.SET_DEFAULT'})
378 },
379 u'maasserver.nodegroup': {
380 'Meta': {'object_name': 'NodeGroup'},
381 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
382 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}),
383 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
384 'created': ('django.db.models.fields.DateTimeField', [], {}),
385 'default_disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
386 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
387 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
388 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
389 'name': ('maasserver.models.nodegroup.DomainNameField', [], {'max_length': '80', 'blank': 'True'}),
390 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
391 'updated': ('django.db.models.fields.DateTimeField', [], {}),
392 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
393 },
394 u'maasserver.nodegroupinterface': {
395 'Meta': {'unique_together': "((u'nodegroup', u'name'),)", 'object_name': 'NodeGroupInterface'},
396 'created': ('django.db.models.fields.DateTimeField', [], {}),
397 'foreign_dhcp_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
398 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
399 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
400 'ip': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}),
401 'ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
402 'ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
403 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
404 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
405 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
406 'static_ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
407 'static_ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
408 'subnet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Subnet']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}),
409 'updated': ('django.db.models.fields.DateTimeField', [], {}),
410 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.VLAN']", 'on_delete': 'models.PROTECT'})
411 },
412 u'maasserver.partition': {
413 'Meta': {'object_name': 'Partition'},
414 'bootable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
415 'created': ('django.db.models.fields.DateTimeField', [], {}),
416 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
417 'partition_table': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'partitions'", 'to': u"orm['maasserver.PartitionTable']"}),
418 'size': ('django.db.models.fields.BigIntegerField', [], {}),
419 'updated': ('django.db.models.fields.DateTimeField', [], {}),
420 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '36', 'unique': 'True', 'null': 'True', 'blank': 'True'})
421 },
422 u'maasserver.partitiontable': {
423 'Meta': {'object_name': 'PartitionTable'},
424 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']"}),
425 'created': ('django.db.models.fields.DateTimeField', [], {}),
426 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
427 'table_type': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '20'}),
428 'updated': ('django.db.models.fields.DateTimeField', [], {})
429 },
430 u'maasserver.physicalblockdevice': {
431 'Meta': {'ordering': "[u'id']", 'object_name': 'PhysicalBlockDevice', '_ormbases': [u'maasserver.BlockDevice']},
432 u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}),
433 'model': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
434 'serial': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
435 },
436 u'maasserver.space': {
437 'Meta': {'object_name': 'Space'},
438 'created': ('django.db.models.fields.DateTimeField', [], {}),
439 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
440 'name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}),
441 'updated': ('django.db.models.fields.DateTimeField', [], {})
442 },
443 u'maasserver.sshkey': {
444 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
445 'created': ('django.db.models.fields.DateTimeField', [], {}),
446 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
447 'key': ('django.db.models.fields.TextField', [], {}),
448 'updated': ('django.db.models.fields.DateTimeField', [], {}),
449 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
450 },
451 u'maasserver.sslkey': {
452 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSLKey'},
453 'created': ('django.db.models.fields.DateTimeField', [], {}),
454 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
455 'key': ('django.db.models.fields.TextField', [], {}),
456 'updated': ('django.db.models.fields.DateTimeField', [], {}),
457 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
458 },
459 u'maasserver.staticipaddress': {
460 'Meta': {'object_name': 'StaticIPAddress'},
461 'alloc_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
462 'created': ('django.db.models.fields.DateTimeField', [], {}),
463 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
464 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
465 'ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
466 'subnet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Subnet']", 'null': 'True', 'blank': 'True'}),
467 'updated': ('django.db.models.fields.DateTimeField', [], {}),
468 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'})
469 },
470 u'maasserver.subnet': {
471 'Meta': {'unique_together': "((u'name', u'space'),)", 'object_name': 'Subnet'},
472 'cidr': ('maasserver.fields.CIDRField', [], {'unique': 'True'}),
473 'created': ('django.db.models.fields.DateTimeField', [], {}),
474 'dns_servers': ('djorm_pgarray.fields.ArrayField', [], {'default': '[]', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
475 'gateway_ip': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
476 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
477 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
478 'space': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Space']", 'on_delete': 'models.PROTECT'}),
479 'updated': ('django.db.models.fields.DateTimeField', [], {}),
480 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.VLAN']", 'on_delete': 'models.PROTECT'})
481 },
482 u'maasserver.tag': {
483 'Meta': {'object_name': 'Tag'},
484 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
485 'created': ('django.db.models.fields.DateTimeField', [], {}),
486 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
487 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
488 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
489 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
490 'updated': ('django.db.models.fields.DateTimeField', [], {})
491 },
492 u'maasserver.userprofile': {
493 'Meta': {'object_name': 'UserProfile'},
494 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
495 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
496 },
497 u'maasserver.virtualblockdevice': {
498 'Meta': {'ordering': "[u'id']", 'object_name': 'VirtualBlockDevice', '_ormbases': [u'maasserver.BlockDevice']},
499 u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}),
500 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'virtual_devices'", 'to': u"orm['maasserver.FilesystemGroup']"}),
501 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
502 },
503 u'maasserver.vlan': {
504 'Meta': {'unique_together': "((u'vid', u'fabric'),)", 'object_name': 'VLAN'},
505 'created': ('django.db.models.fields.DateTimeField', [], {}),
506 'fabric': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Fabric']"}),
507 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
508 'mtu': ('django.db.models.fields.IntegerField', [], {'default': '1500'}),
509 'name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'}),
510 'updated': ('django.db.models.fields.DateTimeField', [], {}),
511 'vid': ('django.db.models.fields.IntegerField', [], {})
512 },
513 u'maasserver.zone': {
514 'Meta': {'ordering': "[u'name']", 'object_name': 'Zone'},
515 'created': ('django.db.models.fields.DateTimeField', [], {}),
516 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
517 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
518 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
519 'updated': ('django.db.models.fields.DateTimeField', [], {})
520 },
521 u'piston.consumer': {
522 'Meta': {'object_name': 'Consumer'},
523 'description': ('django.db.models.fields.TextField', [], {}),
524 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
525 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
526 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
527 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
528 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
529 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"})
530 },
531 u'piston.token': {
532 'Meta': {'object_name': 'Token'},
533 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
534 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
535 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}),
536 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
537 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
538 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
539 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
540 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1447166144L'}),
541 'token_type': ('django.db.models.fields.IntegerField', [], {}),
542 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}),
543 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
544 }
545 }
546
547 complete_apps = ['maasserver']
0\ No newline at end of file548\ No newline at end of file
1549
=== modified file 'src/maasserver/models/interface.py'
--- src/maasserver/models/interface.py 2015-11-06 16:57:58 +0000
+++ src/maasserver/models/interface.py 2015-11-10 16:55:31 +0000
@@ -336,6 +336,15 @@
336 def is_enabled(self):336 def is_enabled(self):
337 return self.enabled337 return self.enabled
338338
339 def get_effective_mtu(self):
340 """Return the effective MTU value for this interface."""
341 mtu = None
342 if self.params:
343 mtu = self.params.get('mtu', None)
344 if mtu is None:
345 mtu = self.vlan.mtu
346 return mtu
347
339 def get_links(self):348 def get_links(self):
340 """Return the definition of links connected to this interface.349 """Return the definition of links connected to this interface.
341350
342351
=== modified file 'src/maasserver/models/tests/test_filesystemgroup.py'
--- src/maasserver/models/tests/test_filesystemgroup.py 2015-10-28 17:32:43 +0000
+++ src/maasserver/models/tests/test_filesystemgroup.py 2015-11-10 16:55:31 +0000
@@ -213,10 +213,11 @@
213 [filesystem_group.id], result_filesystem_group_ids)213 [filesystem_group.id], result_filesystem_group_ids)
214214
215 def test__volume_group_on_partition(self):215 def test__volume_group_on_partition(self):
216 block_device = factory.make_PhysicalBlockDevice()216 block_device = factory.make_PhysicalBlockDevice(size=10 * 1024 ** 3)
217 partition_table = factory.make_PartitionTable(217 partition_table = factory.make_PartitionTable(
218 block_device=block_device)218 block_device=block_device)
219 partition = factory.make_Partition(partition_table=partition_table)219 partition = factory.make_Partition(
220 size=5 * 1024 ** 3, partition_table=partition_table)
220 filesystem = factory.make_Filesystem(221 filesystem = factory.make_Filesystem(
221 fstype=FILESYSTEM_TYPE.LVM_PV, partition=partition)222 fstype=FILESYSTEM_TYPE.LVM_PV, partition=partition)
222 filesystem_group = factory.make_FilesystemGroup(223 filesystem_group = factory.make_FilesystemGroup(
223224
=== modified file 'src/maasserver/models/tests/test_interface.py'
--- src/maasserver/models/tests/test_interface.py 2015-11-06 16:57:58 +0000
+++ src/maasserver/models/tests/test_interface.py 2015-11-10 16:55:31 +0000
@@ -436,6 +436,22 @@
436 self.assertIsNone(reload_object(bond), "Bond was not deleted.")436 self.assertIsNone(reload_object(bond), "Bond was not deleted.")
437 self.assertIsNone(reload_object(vlan), "VLAN was not deleted.")437 self.assertIsNone(reload_object(vlan), "VLAN was not deleted.")
438438
439 def test_get_effective_mtu_returns_interface_mtu(self):
440 nic1 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
441 nic_mtu = random.randint(552, 4096)
442 nic1.params = {
443 "mtu": nic_mtu
444 }
445 nic1.save()
446 self.assertEquals(nic_mtu, nic1.get_effective_mtu())
447
448 def test_get_effective_mtu_returns_vlan_mtu(self):
449 nic1 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
450 vlan_mtu = random.randint(552, 4096)
451 nic1.vlan.mtu = vlan_mtu
452 nic1.vlan.save()
453 self.assertEquals(vlan_mtu, nic1.get_effective_mtu())
454
439 def test_get_links_returns_links_for_each_type(self):455 def test_get_links_returns_links_for_each_type(self):
440 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)456 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
441 links = []457 links = []
442458
=== modified file 'src/maasserver/models/vlan.py'
--- src/maasserver/models/vlan.py 2015-10-23 10:28:17 +0000
+++ src/maasserver/models/vlan.py 2015-11-10 16:55:31 +0000
@@ -38,6 +38,7 @@
3838
39DEFAULT_VLAN_NAME = 'Default VLAN'39DEFAULT_VLAN_NAME = 'Default VLAN'
40DEFAULT_VID = 040DEFAULT_VID = 0
41DEFAULT_MTU = 1500
4142
4243
43class VLANManager(Manager):44class VLANManager(Manager):
@@ -84,6 +85,8 @@
8485
85 fabric = ForeignKey('Fabric', blank=False, editable=True)86 fabric = ForeignKey('Fabric', blank=False, editable=True)
8687
88 mtu = IntegerField(default=DEFAULT_MTU)
89
87 def __unicode__(self):90 def __unicode__(self):
88 return "%s.%s" % (self.fabric.get_name(), self.get_name())91 return "%s.%s" % (self.fabric.get_name(), self.get_name())
8992
@@ -93,8 +96,16 @@
93 {'vid':96 {'vid':
94 ["Vid must be between 0 and 4095."]})97 ["Vid must be between 0 and 4095."]})
9598
99 def clean_mtu(self):
100 # Linux doesn't allow lower than 552 for the MTU.
101 if self.mtu < 552 and self.mtu <= 65535:
102 raise ValidationError(
103 {'mtu':
104 ["MTU must be between 552 and 65535."]})
105
96 def clean(self):106 def clean(self):
97 self.clean_vid()107 self.clean_vid()
108 self.clean_mtu()
98109
99 def is_fabric_default(self):110 def is_fabric_default(self):
100 """Is this the default VLAN in the fabric?"""111 """Is this the default VLAN in the fabric?"""
101112
=== modified file 'src/maasserver/preseed_network.py'
--- src/maasserver/preseed_network.py 2015-10-15 01:32:03 +0000
+++ src/maasserver/preseed_network.py 2015-11-10 16:55:31 +0000
@@ -116,8 +116,9 @@
116 if interface.params:116 if interface.params:
117 for key, value in interface.params.items():117 for key, value in interface.params.items():
118 # Don't include bond parameters.118 # Don't include bond parameters.
119 if not key.startswith("bond_"):119 if not key.startswith("bond_") and key != 'mtu':
120 params[key] = self._get_param_value(value)120 params[key] = self._get_param_value(value)
121 params['mtu'] = interface.get_effective_mtu()
121 return params122 return params
122123
123 def _get_bond_params(self, interface):124 def _get_bond_params(self, interface):
124125
=== modified file 'src/maasserver/tests/test_forms_vlan.py'
--- src/maasserver/tests/test_forms_vlan.py 2015-10-09 06:06:47 +0000
+++ src/maasserver/tests/test_forms_vlan.py 2015-11-10 16:55:31 +0000
@@ -17,6 +17,7 @@
17import random17import random
1818
19from maasserver.forms_vlan import VLANForm19from maasserver.forms_vlan import VLANForm
20from maasserver.models.vlan import DEFAULT_MTU
20from maasserver.testing.factory import factory21from maasserver.testing.factory import factory
21from maasserver.testing.orm import reload_object22from maasserver.testing.orm import reload_object
22from maasserver.testing.testcase import MAASServerTestCase23from maasserver.testing.testcase import MAASServerTestCase
@@ -39,17 +40,35 @@
39 fabric = factory.make_Fabric()40 fabric = factory.make_Fabric()
40 vlan_name = factory.make_name("vlan")41 vlan_name = factory.make_name("vlan")
41 vid = random.randint(1, 1000)42 vid = random.randint(1, 1000)
42 form = VLANForm(fabric=fabric, data={43 mtu = random.randint(552, 4096)
43 "name": vlan_name,44 form = VLANForm(fabric=fabric, data={
44 "vid": vid,45 "name": vlan_name,
45 })46 "vid": vid,
46 self.assertTrue(form.is_valid(), form.errors)47 "mtu": mtu,
47 vlan = form.save()48 })
48 self.assertEquals(vlan_name, vlan.name)49 self.assertTrue(form.is_valid(), form.errors)
49 self.assertEquals(vid, vlan.vid)50 vlan = form.save()
50 self.assertEquals(fabric, vlan.fabric)51 self.assertEquals(vlan_name, vlan.name)
5152 self.assertEquals(vid, vlan.vid)
52 def test__doest_require_name_or_vid_on_update(self):53 self.assertEquals(fabric, vlan.fabric)
54 self.assertEquals(mtu, vlan.mtu)
55
56 def test__creates_vlan_with_default_mtu(self):
57 fabric = factory.make_Fabric()
58 vlan_name = factory.make_name("vlan")
59 vid = random.randint(1, 1000)
60 form = VLANForm(fabric=fabric, data={
61 "name": vlan_name,
62 "vid": vid,
63 })
64 self.assertTrue(form.is_valid(), form.errors)
65 vlan = form.save()
66 self.assertEquals(vlan_name, vlan.name)
67 self.assertEquals(vid, vlan.vid)
68 self.assertEquals(fabric, vlan.fabric)
69 self.assertEquals(DEFAULT_MTU, vlan.mtu)
70
71 def test__doest_require_name_vid_or_mtu_on_update(self):
53 vlan = factory.make_VLAN()72 vlan = factory.make_VLAN()
54 form = VLANForm(instance=vlan, data={})73 form = VLANForm(instance=vlan, data={})
55 self.assertTrue(form.is_valid(), form.errors)74 self.assertTrue(form.is_valid(), form.errors)
@@ -68,11 +87,14 @@
68 vlan = factory.make_VLAN()87 vlan = factory.make_VLAN()
69 new_name = factory.make_name("vlan")88 new_name = factory.make_name("vlan")
70 new_vid = random.randint(1, 1000)89 new_vid = random.randint(1, 1000)
90 new_mtu = random.randint(552, 4096)
71 form = VLANForm(instance=vlan, data={91 form = VLANForm(instance=vlan, data={
72 "name": new_name,92 "name": new_name,
73 "vid": new_vid,93 "vid": new_vid,
94 "mtu": new_mtu,
74 })95 })
75 self.assertTrue(form.is_valid(), form.errors)96 self.assertTrue(form.is_valid(), form.errors)
76 form.save()97 form.save()
77 self.assertEquals(new_name, reload_object(vlan).name)98 self.assertEquals(new_name, reload_object(vlan).name)
78 self.assertEquals(new_vid, reload_object(vlan).vid)99 self.assertEquals(new_vid, reload_object(vlan).vid)
100 self.assertEquals(new_mtu, reload_object(vlan).mtu)
79101
=== modified file 'src/maasserver/tests/test_preseed_network.py'
--- src/maasserver/tests/test_preseed_network.py 2015-10-15 01:34:16 +0000
+++ src/maasserver/tests/test_preseed_network.py 2015-11-10 16:55:31 +0000
@@ -128,8 +128,9 @@
128 def set_interface_params(iface, ret):128 def set_interface_params(iface, ret):
129 if iface.params:129 if iface.params:
130 for key, value in iface.params.items():130 for key, value in iface.params.items():
131 if not key.startswith("bond_"):131 if not key.startswith("bond_") and key != 'mtu':
132 ret += " %s: %s\n" % (key, get_param_value(value))132 ret += " %s: %s\n" % (key, get_param_value(value))
133 ret += " mtu: %s\n" % iface.get_effective_mtu()
133 return ret134 return ret
134135
135 def is_link_up(addresses):136 def is_link_up(addresses):
136137
=== modified file 'src/maasserver/websockets/handlers/tests/test_vlan.py'
--- src/maasserver/websockets/handlers/tests/test_vlan.py 2015-10-09 21:26:04 +0000
+++ src/maasserver/websockets/handlers/tests/test_vlan.py 2015-11-10 16:55:31 +0000
@@ -28,6 +28,7 @@
28 "id": vlan.id,28 "id": vlan.id,
29 "name": vlan.get_name(),29 "name": vlan.get_name(),
30 "vid": vlan.vid,30 "vid": vlan.vid,
31 "mtu": vlan.mtu,
31 "fabric": vlan.fabric_id,32 "fabric": vlan.fabric_id,
32 "updated": dehydrate_datetime(vlan.updated),33 "updated": dehydrate_datetime(vlan.updated),
33 "created": dehydrate_datetime(vlan.created),34 "created": dehydrate_datetime(vlan.created),