Merge lp:~rvb/maas/add-network-node-rel2 into lp:~maas-committers/maas/trunk

Proposed by Raphaël Badin
Status: Merged
Approved by: Raphaël Badin
Approved revision: no longer in the source branch.
Merged at revision: 1885
Proposed branch: lp:~rvb/maas/add-network-node-rel2
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 574 lines (+282/-255)
4 files modified
src/maasserver/migrations/0066_rename_vlan_add_link_node_network.py (+268/-0)
src/maasserver/migrations/0066_replace_vlan_with_network.py (+0/-255)
src/maasserver/models/node.py (+3/-0)
src/maasserver/models/tests/test_node.py (+11/-0)
To merge this branch: bzr merge lp:~rvb/maas/add-network-node-rel2
Reviewer Review Type Date Requested Status
Raphaël Badin (community) Approve
Review via email: mp+204617@code.launchpad.net

Commit message

Add a relation between nodes and networks.

Description of the change

(Fold 2 migrations into one.)

To post a comment you must log in.
Revision history for this message
Raphaël Badin (rvb) wrote :

Self-approving because this change has been approved by Julian in https://code.launchpad.net/~rvb/maas/add-network-node-rel/+merge/204506.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'src/maasserver/migrations/0066_rename_vlan_add_link_node_network.py'
--- src/maasserver/migrations/0066_rename_vlan_add_link_node_network.py 1970-01-01 00:00:00 +0000
+++ src/maasserver/migrations/0066_rename_vlan_add_link_node_network.py 2014-02-04 09:09:30 +0000
@@ -0,0 +1,268 @@
1# -*- coding: utf-8 -*-
2import datetime
3
4from django.db import models
5from south.db import db
6from south.v2 import SchemaMigration
7
8
9class Migration(SchemaMigration):
10
11 def forwards(self, orm):
12 # Deleting model 'Vlan'
13 db.delete_table(u'maasserver_vlan')
14
15 # Adding model 'Network'
16 db.create_table(u'maasserver_network', (
17 (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
18 ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
19 ('ip', self.gf('django.db.models.fields.GenericIPAddressField')(unique=True, max_length=39)),
20 ('netmask', self.gf('django.db.models.fields.GenericIPAddressField')(max_length=39)),
21 ('vlan_tag', self.gf('django.db.models.fields.PositiveSmallIntegerField')(unique=True)),
22 ('description', self.gf('django.db.models.fields.CharField')(default=u'', max_length=255, blank=True)),
23 ))
24 db.send_create_signal(u'maasserver', ['Network'])
25
26 # Adding M2M table for field networks on 'Node'
27 db.create_table(u'maasserver_node_networks', (
28 ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
29 ('node', models.ForeignKey(orm[u'maasserver.node'], null=False)),
30 ('network', models.ForeignKey(orm[u'maasserver.network'], null=False))
31 ))
32 db.create_unique(u'maasserver_node_networks', ['node_id', 'network_id'])
33
34
35 def backwards(self, orm):
36 # Adding model 'Vlan'
37 db.create_table(u'maasserver_vlan', (
38 ('tag', self.gf('django.db.models.fields.PositiveSmallIntegerField')(unique=True)),
39 ('description', self.gf('django.db.models.fields.CharField')(default=u'', max_length=255, blank=True)),
40 (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
41 ))
42 db.send_create_signal(u'maasserver', ['Vlan'])
43
44 # Deleting model 'Network'
45 db.delete_table(u'maasserver_network')
46
47 # Removing M2M table for field networks on 'Node'
48 db.delete_table('maasserver_node_networks')
49
50
51 models = {
52 u'auth.group': {
53 'Meta': {'object_name': 'Group'},
54 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
55 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
56 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
57 },
58 u'auth.permission': {
59 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
60 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
61 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
62 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
63 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
64 },
65 u'auth.user': {
66 'Meta': {'object_name': 'User'},
67 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
68 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
69 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
70 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
71 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
72 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
73 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
74 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
75 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
76 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
77 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
78 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
79 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
80 },
81 u'contenttypes.contenttype': {
82 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
83 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
84 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
85 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
86 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
87 },
88 u'maasserver.bootimage': {
89 'Meta': {'unique_together': "((u'nodegroup', u'architecture', u'subarchitecture', u'release', u'purpose'),)", 'object_name': 'BootImage'},
90 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
91 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
92 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
93 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
94 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
95 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'})
96 },
97 u'maasserver.componenterror': {
98 'Meta': {'object_name': 'ComponentError'},
99 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
100 'created': ('django.db.models.fields.DateTimeField', [], {}),
101 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
102 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
103 'updated': ('django.db.models.fields.DateTimeField', [], {})
104 },
105 u'maasserver.config': {
106 'Meta': {'object_name': 'Config'},
107 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
108 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
109 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
110 },
111 u'maasserver.dhcplease': {
112 'Meta': {'object_name': 'DHCPLease'},
113 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
114 'ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'}),
115 'mac': ('maasserver.fields.MACAddressField', [], {}),
116 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
117 },
118 u'maasserver.downloadprogress': {
119 'Meta': {'object_name': 'DownloadProgress'},
120 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
121 'created': ('django.db.models.fields.DateTimeField', [], {}),
122 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}),
123 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
124 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
125 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
126 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
127 'updated': ('django.db.models.fields.DateTimeField', [], {})
128 },
129 u'maasserver.filestorage': {
130 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'},
131 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}),
132 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
133 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
134 'key': ('django.db.models.fields.CharField', [], {'default': "u'c9791474-8d7b-11e3-8453-9c4e363b1c94'", 'unique': 'True', 'max_length': '36'}),
135 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
136 },
137 u'maasserver.macaddress': {
138 'Meta': {'object_name': 'MACAddress'},
139 'created': ('django.db.models.fields.DateTimeField', [], {}),
140 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
141 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
142 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
143 'updated': ('django.db.models.fields.DateTimeField', [], {})
144 },
145 u'maasserver.network': {
146 'Meta': {'object_name': 'Network'},
147 'description': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
148 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
149 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
150 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
151 'netmask': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
152 'vlan_tag': ('django.db.models.fields.PositiveSmallIntegerField', [], {'unique': 'True'})
153 },
154 u'maasserver.node': {
155 'Meta': {'object_name': 'Node'},
156 'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
157 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
158 'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386/generic'", 'max_length': '31'}),
159 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
160 'created': ('django.db.models.fields.DateTimeField', [], {}),
161 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
162 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
163 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}),
164 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
165 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
166 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
167 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Network']", 'symmetrical': 'False', 'blank': 'True'}),
168 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
169 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
170 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
171 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
172 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}),
173 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
174 'storage': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
175 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-c97b5392-8d7b-11e3-8453-9c4e363b1c94'", 'unique': 'True', 'max_length': '41'}),
176 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
177 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}),
178 'updated': ('django.db.models.fields.DateTimeField', [], {}),
179 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Zone']", 'on_delete': 'models.SET_DEFAULT'})
180 },
181 u'maasserver.nodegroup': {
182 'Meta': {'object_name': 'NodeGroup'},
183 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
184 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}),
185 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
186 'created': ('django.db.models.fields.DateTimeField', [], {}),
187 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
188 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
189 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
190 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
191 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
192 'updated': ('django.db.models.fields.DateTimeField', [], {}),
193 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
194 },
195 u'maasserver.nodegroupinterface': {
196 'Meta': {'unique_together': "((u'nodegroup', u'interface'),)", 'object_name': 'NodeGroupInterface'},
197 'broadcast_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
198 'created': ('django.db.models.fields.DateTimeField', [], {}),
199 'foreign_dhcp_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
200 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
201 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
202 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
203 'ip_range_high': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
204 'ip_range_low': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
205 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
206 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
207 'router_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
208 'subnet_mask': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
209 'updated': ('django.db.models.fields.DateTimeField', [], {})
210 },
211 u'maasserver.sshkey': {
212 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
213 'created': ('django.db.models.fields.DateTimeField', [], {}),
214 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
215 'key': ('django.db.models.fields.TextField', [], {}),
216 'updated': ('django.db.models.fields.DateTimeField', [], {}),
217 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
218 },
219 u'maasserver.tag': {
220 'Meta': {'object_name': 'Tag'},
221 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
222 'created': ('django.db.models.fields.DateTimeField', [], {}),
223 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
224 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
225 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
226 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
227 'updated': ('django.db.models.fields.DateTimeField', [], {})
228 },
229 u'maasserver.userprofile': {
230 'Meta': {'object_name': 'UserProfile'},
231 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
232 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
233 },
234 u'maasserver.zone': {
235 'Meta': {'ordering': "[u'name']", 'object_name': 'Zone'},
236 'created': ('django.db.models.fields.DateTimeField', [], {}),
237 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
238 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
239 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
240 'updated': ('django.db.models.fields.DateTimeField', [], {})
241 },
242 u'piston.consumer': {
243 'Meta': {'object_name': 'Consumer'},
244 'description': ('django.db.models.fields.TextField', [], {}),
245 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
246 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
247 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
248 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
249 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
250 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"})
251 },
252 u'piston.token': {
253 'Meta': {'object_name': 'Token'},
254 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
255 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
256 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}),
257 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
258 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
259 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
260 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
261 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1391504854L'}),
262 'token_type': ('django.db.models.fields.IntegerField', [], {}),
263 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}),
264 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
265 }
266 }
267
268 complete_apps = ['maasserver']
0\ No newline at end of file269\ No newline at end of file
1270
=== removed file 'src/maasserver/migrations/0066_replace_vlan_with_network.py'
--- src/maasserver/migrations/0066_replace_vlan_with_network.py 2014-02-04 02:53:33 +0000
+++ src/maasserver/migrations/0066_replace_vlan_with_network.py 1970-01-01 00:00:00 +0000
@@ -1,255 +0,0 @@
1# -*- coding: utf-8 -*-
2from south.utils import datetime_utils as datetime
3from south.db import db
4from south.v2 import SchemaMigration
5from django.db import models
6
7
8class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11 # Deleting model 'Vlan'
12 db.delete_table(u'maasserver_vlan')
13
14 # Adding model 'Network'
15 db.create_table(u'maasserver_network', (
16 (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
17 ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
18 ('ip', self.gf('django.db.models.fields.GenericIPAddressField')(unique=True, max_length=39)),
19 ('netmask', self.gf('django.db.models.fields.GenericIPAddressField')(max_length=39)),
20 ('vlan_tag', self.gf('django.db.models.fields.PositiveSmallIntegerField')(unique=True)),
21 ('description', self.gf('django.db.models.fields.CharField')(default=u'', max_length=255, blank=True)),
22 ))
23 db.send_create_signal(u'maasserver', ['Network'])
24
25
26 def backwards(self, orm):
27 # Adding model 'Vlan'
28 db.create_table(u'maasserver_vlan', (
29 ('tag', self.gf('django.db.models.fields.PositiveSmallIntegerField')(unique=True)),
30 ('description', self.gf('django.db.models.fields.CharField')(default=u'', max_length=255, blank=True)),
31 (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
32 ))
33 db.send_create_signal(u'maasserver', ['Vlan'])
34
35 # Deleting model 'Network'
36 db.delete_table(u'maasserver_network')
37
38
39 models = {
40 u'auth.group': {
41 'Meta': {'object_name': 'Group'},
42 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
43 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
44 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
45 },
46 u'auth.permission': {
47 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
48 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
49 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
50 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
51 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
52 },
53 u'auth.user': {
54 'Meta': {'object_name': 'User'},
55 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
56 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
57 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
58 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
59 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
60 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
61 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
62 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
63 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
64 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
65 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
66 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
67 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
68 },
69 u'contenttypes.contenttype': {
70 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
71 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
72 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
73 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
74 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
75 },
76 u'maasserver.bootimage': {
77 'Meta': {'unique_together': "((u'nodegroup', u'architecture', u'subarchitecture', u'release', u'purpose'),)", 'object_name': 'BootImage'},
78 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
79 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
80 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
81 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
82 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
83 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'})
84 },
85 u'maasserver.componenterror': {
86 'Meta': {'object_name': 'ComponentError'},
87 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
88 'created': ('django.db.models.fields.DateTimeField', [], {}),
89 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
90 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
91 'updated': ('django.db.models.fields.DateTimeField', [], {})
92 },
93 u'maasserver.config': {
94 'Meta': {'object_name': 'Config'},
95 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
96 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
97 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
98 },
99 u'maasserver.dhcplease': {
100 'Meta': {'object_name': 'DHCPLease'},
101 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
102 'ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'}),
103 'mac': ('maasserver.fields.MACAddressField', [], {}),
104 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
105 },
106 u'maasserver.downloadprogress': {
107 'Meta': {'object_name': 'DownloadProgress'},
108 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
109 'created': ('django.db.models.fields.DateTimeField', [], {}),
110 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}),
111 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
112 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
113 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
114 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
115 'updated': ('django.db.models.fields.DateTimeField', [], {})
116 },
117 u'maasserver.filestorage': {
118 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'},
119 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}),
120 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
121 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
122 'key': ('django.db.models.fields.CharField', [], {'default': "u'707616c6-8d47-11e3-b9fc-94de80b61466'", 'unique': 'True', 'max_length': '36'}),
123 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
124 },
125 u'maasserver.macaddress': {
126 'Meta': {'object_name': 'MACAddress'},
127 'created': ('django.db.models.fields.DateTimeField', [], {}),
128 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
129 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
130 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
131 'updated': ('django.db.models.fields.DateTimeField', [], {})
132 },
133 u'maasserver.network': {
134 'Meta': {'object_name': 'Network'},
135 'description': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
136 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
137 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
138 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
139 'netmask': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
140 'vlan_tag': ('django.db.models.fields.PositiveSmallIntegerField', [], {'unique': 'True'})
141 },
142 u'maasserver.node': {
143 'Meta': {'object_name': 'Node'},
144 'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
145 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
146 'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386/generic'", 'max_length': '31'}),
147 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
148 'created': ('django.db.models.fields.DateTimeField', [], {}),
149 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
150 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
151 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}),
152 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
153 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
154 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
155 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
156 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
157 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
158 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
159 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}),
160 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
161 'storage': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
162 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-7074e24c-8d47-11e3-b9fc-94de80b61466'", 'unique': 'True', 'max_length': '41'}),
163 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
164 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}),
165 'updated': ('django.db.models.fields.DateTimeField', [], {}),
166 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Zone']", 'on_delete': 'models.SET_DEFAULT'})
167 },
168 u'maasserver.nodegroup': {
169 'Meta': {'object_name': 'NodeGroup'},
170 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
171 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}),
172 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
173 'created': ('django.db.models.fields.DateTimeField', [], {}),
174 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
175 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
176 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
177 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
178 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
179 'updated': ('django.db.models.fields.DateTimeField', [], {}),
180 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
181 },
182 u'maasserver.nodegroupinterface': {
183 'Meta': {'unique_together': "((u'nodegroup', u'interface'),)", 'object_name': 'NodeGroupInterface'},
184 'broadcast_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
185 'created': ('django.db.models.fields.DateTimeField', [], {}),
186 'foreign_dhcp_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
187 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
188 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
189 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
190 'ip_range_high': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
191 'ip_range_low': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
192 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
193 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
194 'router_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
195 'subnet_mask': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
196 'updated': ('django.db.models.fields.DateTimeField', [], {})
197 },
198 u'maasserver.sshkey': {
199 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
200 'created': ('django.db.models.fields.DateTimeField', [], {}),
201 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
202 'key': ('django.db.models.fields.TextField', [], {}),
203 'updated': ('django.db.models.fields.DateTimeField', [], {}),
204 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
205 },
206 u'maasserver.tag': {
207 'Meta': {'object_name': 'Tag'},
208 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
209 'created': ('django.db.models.fields.DateTimeField', [], {}),
210 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
211 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
212 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
213 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
214 'updated': ('django.db.models.fields.DateTimeField', [], {})
215 },
216 u'maasserver.userprofile': {
217 'Meta': {'object_name': 'UserProfile'},
218 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
219 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
220 },
221 u'maasserver.zone': {
222 'Meta': {'ordering': "[u'name']", 'object_name': 'Zone'},
223 'created': ('django.db.models.fields.DateTimeField', [], {}),
224 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
225 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
226 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
227 'updated': ('django.db.models.fields.DateTimeField', [], {})
228 },
229 u'piston.consumer': {
230 'Meta': {'object_name': 'Consumer'},
231 'description': ('django.db.models.fields.TextField', [], {}),
232 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
233 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
234 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
235 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
236 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
237 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"})
238 },
239 u'piston.token': {
240 'Meta': {'object_name': 'Token'},
241 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
242 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
243 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}),
244 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
245 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
246 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
247 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
248 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1391482371L'}),
249 'token_type': ('django.db.models.fields.IntegerField', [], {}),
250 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}),
251 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
252 }
253 }
254
255 complete_apps = ['maasserver']
256\ No newline at end of file0\ No newline at end of file
2571
=== modified file 'src/maasserver/models/node.py'
--- src/maasserver/models/node.py 2014-01-31 15:12:20 +0000
+++ src/maasserver/models/node.py 2014-02-04 09:09:30 +0000
@@ -64,6 +64,7 @@
64 JSONObjectField,64 JSONObjectField,
65 MAC,65 MAC,
66 )66 )
67from maasserver.models import Network
67from maasserver.models.cleansave import CleanSave68from maasserver.models.cleansave import CleanSave
68from maasserver.models.config import Config69from maasserver.models.config import Config
69from maasserver.models.dhcplease import DHCPLease70from maasserver.models.dhcplease import DHCPLease
@@ -488,6 +489,8 @@
488489
489 netboot = BooleanField(default=True)490 netboot = BooleanField(default=True)
490491
492 networks = ManyToManyField(Network, blank=True)
493
491 # This field can't be null, but we can't enforce that in the494 # This field can't be null, but we can't enforce that in the
492 # database schema because we can only create the default value from495 # database schema because we can only create the default value from
493 # a complete schema, after schema migration. We can't use custom496 # a complete schema, after schema migration. We can't use custom
494497
=== modified file 'src/maasserver/models/tests/test_node.py'
--- src/maasserver/models/tests/test_node.py 2014-02-01 05:54:22 +0000
+++ src/maasserver/models/tests/test_node.py 2014-02-04 09:09:30 +0000
@@ -1166,3 +1166,14 @@
1166 node = factory.make_node(netboot=True)1166 node = factory.make_node(netboot=True)
1167 node.set_netboot(False)1167 node.set_netboot(False)
1168 self.assertFalse(node.netboot)1168 self.assertFalse(node.netboot)
1169
1170 def test_node_not_in_any_network_by_default(self):
1171 node = factory.make_node()
1172 self.assertItemsEqual([], node.networks.all())
1173
1174 def test_node_can_be_multiple_networks(self):
1175 node = factory.make_node()
1176 networks = [
1177 factory.make_network() for i in range(3)]
1178 node.networks.add(*networks)
1179 self.assertItemsEqual(networks, reload_object(node).networks.all())