Merge lp:~rvb/maas/rework-new-lifecycle-migration 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: 2989
Proposed branch: lp:~rvb/maas/rework-new-lifecycle-migration
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 434 lines (+407/-5)
2 files modified
src/maasserver/enum.py (+5/-5)
src/maasserver/migrations/0110_deployed_state_compat.py (+402/-0)
To merge this branch: bzr merge lp:~rvb/maas/rework-new-lifecycle-migration
Reviewer Review Type Date Requested Status
Jeroen T. Vermeulen (community) Approve
Review via email: mp+234490@code.launchpad.net

Commit message

Make sure the final state of a node's deployment (indicative of when it can be used by a user) is status #6.

Description of the change

The recent change in the node lifecycle is backward-incompatible but we can at least avoid breaking the applications that expect the "final" state of a node to be #6.

To post a comment you must log in.
Revision history for this message
Jeroen T. Vermeulen (jtv) wrote :

Well documented. It's not your fault, but it seems to me that the description for the DEPLOYED state could be better. How about: The node has booted into the operating system of its owner's choice and is ready for use.

(Also, the imports formatter made a bit of a mess of the top of the migration module.)

review: Approve
Revision history for this message
Raphaël Badin (rvb) wrote :

> Well documented. It's not your fault, but it seems to me that the description
> for the DEPLOYED state could be better. How about: The node has booted into
> the operating system of its owner's choice and is ready for use.

Well spotted, that description was a bit outdated indeed.

> (Also, the imports formatter made a bit of a mess of the top of the migration
> module.)

Right, I moved "# -*- coding: utf-8 -*-" back up.

Revision history for this message
Jeroen T. Vermeulen (jtv) wrote :

> Right, I moved "# -*- coding: utf-8 -*-" back up.

The next "make format" will just move it down again. Just leave it out.

Revision history for this message
MAAS Lander (maas-lander) wrote :

There are additional revisions which have not been approved in review. Please seek review and approval of these new revisions.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/enum.py'
2--- src/maasserver/enum.py 2014-09-02 13:41:28 +0000
3+++ src/maasserver/enum.py 2014-09-15 10:40:07 +0000
4@@ -59,8 +59,9 @@
5 READY = 4
6 #: The node is ready for named deployment.
7 RESERVED = 5
8- #: The node has been allocated to a user and is ready for deployment.
9- ALLOCATED = 6
10+ #: The node has booted into the operating system of its owner's choice
11+ #: and is ready for use.
12+ DEPLOYED = 6
13 #: The node has been removed from service manually until an admin
14 #: overrides the retirement.
15 RETIRED = 7
16@@ -69,9 +70,8 @@
17 BROKEN = 8
18 #: The node is being installed.
19 DEPLOYING = 9
20- #: The node is powering a service from a charm or is ready for use with
21- #: a fresh Ubuntu install.
22- DEPLOYED = 10
23+ #: The node has been allocated to a user and is ready for deployment.
24+ ALLOCATED = 10
25 #: The deployment of the node failed.
26 FAILED_DEPLOYMENT = 11
27
28
29=== added file 'src/maasserver/migrations/0110_deployed_state_compat.py'
30--- src/maasserver/migrations/0110_deployed_state_compat.py 1970-01-01 00:00:00 +0000
31+++ src/maasserver/migrations/0110_deployed_state_compat.py 2014-09-15 10:40:07 +0000
32@@ -0,0 +1,402 @@
33+# -*- coding: utf-8 -*-
34+from django.db import models
35+from south.db import db
36+from south.utils import datetime_utils as datetime
37+from south.v2 import DataMigration
38+
39+# Make sure the final state (indicative of when a node can be used by a
40+# user) of a node is status #6.
41+
42+# Hardcode the values of the statuses instead of using the enum
43+# module to avoid breakage if the meaning of the values changes
44+# later.
45+new_allocated_status = 10
46+new_deployed_status = 6
47+
48+intermediate_status = 1000
49+
50+old_allocated_status = 6
51+old_deployed_status = 10
52+
53+
54+class Migration(DataMigration):
55+
56+ def forwards(self, orm):
57+ deployed_nodes = orm['maasserver.Node'].objects.filter(status=old_deployed_status)
58+ deployed_nodes.update(status=intermediate_status)
59+
60+ allocated_nodes = orm['maasserver.Node'].objects.filter(status=old_allocated_status)
61+ allocated_nodes.update(status=new_allocated_status)
62+
63+ deployed_nodes = orm['maasserver.Node'].objects.filter(status=intermediate_status)
64+ deployed_nodes.update(status=new_deployed_status)
65+
66+
67+ def backwards(self, orm):
68+ deployed_nodes = orm['maasserver.Node'].objects.filter(status=new_deployed_status)
69+ deployed_nodes.update(status=intermediate_status)
70+
71+ allocated_nodes = orm['maasserver.Node'].objects.filter(status=new_allocated_status)
72+ allocated_nodes.update(status=old_allocated_status)
73+
74+ deployed_nodes = orm['maasserver.Node'].objects.filter(status=intermediate_status)
75+ deployed_nodes.update(status=old_deployed_status)
76+
77+
78+ models = {
79+ u'auth.group': {
80+ 'Meta': {'object_name': 'Group'},
81+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
82+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
83+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
84+ },
85+ u'auth.permission': {
86+ 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
87+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
88+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
89+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
90+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
91+ },
92+ u'auth.user': {
93+ 'Meta': {'object_name': 'User'},
94+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
95+ 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
96+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
97+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
98+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
99+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
100+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
101+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
102+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
103+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
104+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
105+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
106+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
107+ },
108+ u'contenttypes.contenttype': {
109+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
110+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
111+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
112+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
113+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
114+ },
115+ u'maasserver.bootimage': {
116+ 'Meta': {'unique_together': "((u'nodegroup', u'osystem', u'architecture', u'subarchitecture', u'release', u'purpose', u'label'),)", 'object_name': 'BootImage'},
117+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
118+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
119+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
120+ 'label': ('django.db.models.fields.CharField', [], {'default': "u'release'", 'max_length': '255'}),
121+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
122+ 'osystem': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
123+ 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
124+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
125+ 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
126+ 'supported_subarches': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
127+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
128+ 'xinstall_path': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
129+ 'xinstall_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '30', 'null': 'True', 'blank': 'True'})
130+ },
131+ u'maasserver.bootresource': {
132+ 'Meta': {'unique_together': "((u'name', u'architecture'),)", 'object_name': 'BootResource'},
133+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
134+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
135+ 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
136+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
137+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
138+ 'rtype': ('django.db.models.fields.IntegerField', [], {'max_length': '10'}),
139+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
140+ },
141+ u'maasserver.bootresourcefile': {
142+ 'Meta': {'unique_together': "((u'resource_set', u'filetype'),)", 'object_name': 'BootResourceFile'},
143+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
144+ 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
145+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
146+ 'filetype': ('django.db.models.fields.CharField', [], {'default': "u'root-tgz'", 'max_length': '20'}),
147+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
148+ 'largefile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.LargeFile']"}),
149+ 'resource_set': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'files'", 'to': u"orm['maasserver.BootResourceSet']"}),
150+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
151+ },
152+ u'maasserver.bootresourceset': {
153+ 'Meta': {'unique_together': "((u'resource', u'version'),)", 'object_name': 'BootResourceSet'},
154+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
155+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
156+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
157+ 'resource': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'sets'", 'to': u"orm['maasserver.BootResource']"}),
158+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
159+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'})
160+ },
161+ u'maasserver.bootsource': {
162+ 'Meta': {'object_name': 'BootSource'},
163+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
164+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
165+ 'keyring_data': ('maasserver.fields.EditableBinaryField', [], {'blank': 'True'}),
166+ 'keyring_filename': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}),
167+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
168+ 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
169+ },
170+ u'maasserver.bootsourceselection': {
171+ 'Meta': {'object_name': 'BootSourceSelection'},
172+ 'arches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
173+ 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}),
174+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
175+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
176+ 'labels': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
177+ 'os': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
178+ 'release': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
179+ 'subarches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': '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', [], {'max_length': '255'}),
200+ 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
201+ },
202+ u'maasserver.dhcplease': {
203+ 'Meta': {'object_name': 'DHCPLease'},
204+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
205+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
206+ 'mac': ('maasserver.fields.MACAddressField', [], {}),
207+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
208+ },
209+ u'maasserver.downloadprogress': {
210+ 'Meta': {'object_name': 'DownloadProgress'},
211+ 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
212+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
213+ 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}),
214+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
215+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
216+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
217+ 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
218+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
219+ },
220+ u'maasserver.event': {
221+ 'Meta': {'object_name': 'Event'},
222+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
223+ 'description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}),
224+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
225+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
226+ 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.EventType']"}),
227+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
228+ },
229+ u'maasserver.eventtype': {
230+ 'Meta': {'object_name': 'EventType'},
231+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
232+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
233+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
234+ 'level': ('django.db.models.fields.IntegerField', [], {}),
235+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
236+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
237+ },
238+ u'maasserver.filestorage': {
239+ 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'},
240+ 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}),
241+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
242+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
243+ 'key': ('django.db.models.fields.CharField', [], {'default': "u'120c95d0-3a83-11e4-941e-3c970e0e56dc'", 'unique': 'True', 'max_length': '36'}),
244+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
245+ },
246+ u'maasserver.largefile': {
247+ 'Meta': {'object_name': 'LargeFile'},
248+ 'content': ('maasserver.fields.LargeObjectField', [], {}),
249+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
250+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
251+ 'sha256': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}),
252+ 'total_size': ('django.db.models.fields.BigIntegerField', [], {}),
253+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
254+ },
255+ u'maasserver.licensekey': {
256+ 'Meta': {'unique_together': "((u'osystem', u'distro_series'),)", 'object_name': 'LicenseKey'},
257+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
258+ 'distro_series': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
259+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
260+ 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
261+ 'osystem': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
262+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
263+ },
264+ u'maasserver.macaddress': {
265+ 'Meta': {'ordering': "(u'created',)", 'object_name': 'MACAddress'},
266+ 'cluster_interface': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.NodeGroupInterface']", 'null': 'True', 'blank': 'True'}),
267+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
268+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
269+ 'ip_addresses': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.StaticIPAddress']", 'symmetrical': 'False', 'through': u"orm['maasserver.MACStaticIPAddressLink']", 'blank': 'True'}),
270+ 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
271+ 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Network']", 'symmetrical': 'False', 'blank': 'True'}),
272+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
273+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
274+ },
275+ u'maasserver.macstaticipaddresslink': {
276+ 'Meta': {'unique_together': "((u'ip_address', u'mac_address'),)", 'object_name': 'MACStaticIPAddressLink'},
277+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
278+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
279+ 'ip_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.StaticIPAddress']", 'unique': 'True'}),
280+ 'mac_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.MACAddress']"}),
281+ 'nic_alias': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
282+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
283+ },
284+ u'maasserver.network': {
285+ 'Meta': {'object_name': 'Network'},
286+ 'default_gateway': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
287+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
288+ 'dns_servers': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
289+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
290+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
291+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
292+ 'netmask': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}),
293+ 'vlan_tag': ('django.db.models.fields.PositiveSmallIntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'})
294+ },
295+ u'maasserver.node': {
296+ 'Meta': {'object_name': 'Node'},
297+ 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
298+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '31'}),
299+ 'boot_type': ('django.db.models.fields.CharField', [], {'default': "u'fastpath'", 'max_length': '20'}),
300+ 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
301+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
302+ 'disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
303+ 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
304+ 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
305+ 'error_description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}),
306+ 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}),
307+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
308+ 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
309+ 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
310+ 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
311+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
312+ 'osystem': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
313+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
314+ 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
315+ 'power_state': ('django.db.models.fields.CharField', [], {'default': "u'unknown'", 'max_length': '10'}),
316+ 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
317+ 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}),
318+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
319+ 'storage': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
320+ 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-1209873c-3a83-11e4-941e-3c970e0e56dc'", 'unique': 'True', 'max_length': '41'}),
321+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
322+ 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}),
323+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
324+ 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Zone']", 'on_delete': 'models.SET_DEFAULT'})
325+ },
326+ u'maasserver.nodegroup': {
327+ 'Meta': {'object_name': 'NodeGroup'},
328+ 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
329+ 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}),
330+ 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
331+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
332+ 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
333+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
334+ 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
335+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
336+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
337+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
338+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
339+ },
340+ u'maasserver.nodegroupinterface': {
341+ 'Meta': {'unique_together': "((u'nodegroup', u'name'),)", 'object_name': 'NodeGroupInterface'},
342+ 'broadcast_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
343+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
344+ 'foreign_dhcp_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
345+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
346+ 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
347+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}),
348+ 'ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
349+ 'ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
350+ 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
351+ 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
352+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
353+ 'router_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
354+ 'static_ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
355+ 'static_ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
356+ 'subnet_mask': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
357+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
358+ },
359+ u'maasserver.sshkey': {
360+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
361+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
362+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
363+ 'key': ('django.db.models.fields.TextField', [], {}),
364+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
365+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
366+ },
367+ u'maasserver.sslkey': {
368+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSLKey'},
369+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
370+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
371+ 'key': ('django.db.models.fields.TextField', [], {}),
372+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
373+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
374+ },
375+ u'maasserver.staticipaddress': {
376+ 'Meta': {'object_name': 'StaticIPAddress'},
377+ 'alloc_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
378+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
379+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
380+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
381+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
382+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
383+ },
384+ u'maasserver.tag': {
385+ 'Meta': {'object_name': 'Tag'},
386+ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
387+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
388+ 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
389+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
390+ 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
391+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
392+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
393+ },
394+ u'maasserver.userprofile': {
395+ 'Meta': {'object_name': 'UserProfile'},
396+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
397+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
398+ },
399+ u'maasserver.zone': {
400+ 'Meta': {'ordering': "[u'name']", 'object_name': 'Zone'},
401+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
402+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
403+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
404+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
405+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
406+ },
407+ u'piston.consumer': {
408+ 'Meta': {'object_name': 'Consumer'},
409+ 'description': ('django.db.models.fields.TextField', [], {}),
410+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
411+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
412+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
413+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
414+ 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
415+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"})
416+ },
417+ u'piston.token': {
418+ 'Meta': {'object_name': 'Token'},
419+ 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
420+ 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
421+ 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}),
422+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
423+ 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
424+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
425+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
426+ 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1410529534L'}),
427+ 'token_type': ('django.db.models.fields.IntegerField', [], {}),
428+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}),
429+ 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
430+ }
431+ }
432+
433+ complete_apps = ['maasserver']
434+ symmetrical = True