Merge lp:~andreserl/maas/add_node_distro_series into lp:maas/trunk

Proposed by Andres Rodriguez on 2012-09-18
Status: Merged
Approved by: Andres Rodriguez on 2012-09-18
Approved revision: 1015
Merged at revision: 1016
Proposed branch: lp:~andreserl/maas/add_node_distro_series
Merge into: lp:maas/trunk
Diff against target: 244 lines (+203/-0)
3 files modified
src/maasserver/enum.py (+18/-0)
src/maasserver/migrations/0026_add_node_distro_series.py (+179/-0)
src/maasserver/models/node.py (+6/-0)
To merge this branch: bzr merge lp:~andreserl/maas/add_node_distro_series
Reviewer Review Type Date Requested Status
Raphaël Badin (community) 2012-09-18 Approve on 2012-09-18
Review via email: mp+125010@code.launchpad.net

Commit Message

Add distro_series parameter and its migration for src/maasserver/models/node.py

To post a comment you must log in.
Raphaël Badin (rvb) wrote :

Looks good. Thanks for the change!

[0]

17 +class DISTRO_SERIES:
18 + """List of supported ubuntu releases."""
19 + #:
20 + default = ''
21 + #:
22 + precise = 'precise'
23 + #:
24 + quantal = 'quantal'

Please add a comment here to say that this hardcoded for now but that is only temporary.

[1]

240 + blank=True, default='')

default should probably be DISTRO_SERIES.default (that's the same as '' but it's conceptually more accurate)

[3]

$ make lint
src/maasserver/models/node.py:38: 'DISTRO_SERIES' imported but unused

[4]

8 + 'DISTRO_SERIES',
9 + 'DISTRO_SERIES_CHOICES',

That's really a detail but we try to keep the elements ordered alphabetically in __all__ :).

review: Approve

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 2012-09-18 16:00:45 +0000
3+++ src/maasserver/enum.py 2012-09-18 18:14:38 +0000
4@@ -24,6 +24,8 @@
5 'NODE_STATUS_CHOICES',
6 'NODE_STATUS_CHOICES_DICT',
7 'PRESEED_TYPE',
8+ 'DISTRO_SERIES',
9+ 'DISTRO_SERIES_CHOICES',
10 ]
11
12 from collections import OrderedDict
13@@ -119,6 +121,22 @@
14 )
15
16
17+class DISTRO_SERIES:
18+ """List of supported ubuntu releases."""
19+ #:
20+ default = ''
21+ #:
22+ precise = 'precise'
23+ #:
24+ quantal = 'quantal'
25+
26+DISTRO_SERIES_CHOICES = (
27+ (DISTRO_SERIES.default, 'Default Ubuntu Release'),
28+ (DISTRO_SERIES.precise, 'Ubuntu 12.04 LTS "Precise Pangolin"'),
29+ (DISTRO_SERIES.quantal, 'Ubuntu 12.10 "Quantal Quetzal"'),
30+)
31+
32+
33 class NODE_PERMISSION:
34 """Permissions relating to nodes."""
35 VIEW = 'view_node'
36
37=== added file 'src/maasserver/migrations/0026_add_node_distro_series.py'
38--- src/maasserver/migrations/0026_add_node_distro_series.py 1970-01-01 00:00:00 +0000
39+++ src/maasserver/migrations/0026_add_node_distro_series.py 2012-09-18 18:14:38 +0000
40@@ -0,0 +1,179 @@
41+# -*- coding: utf-8 -*-
42+import datetime
43+from south.db import db
44+from south.v2 import SchemaMigration
45+from django.db import models
46+
47+
48+class Migration(SchemaMigration):
49+
50+ def forwards(self, orm):
51+ # Adding field 'Node.distro_series'
52+ db.add_column(u'maasserver_node', 'distro_series',
53+ self.gf('django.db.models.fields.CharField')(default=u'', max_length=10, null=True, blank=True),
54+ keep_default=False)
55+
56+
57+ def backwards(self, orm):
58+ # Deleting field 'Node.distro_series'
59+ db.delete_column(u'maasserver_node', 'distro_series')
60+
61+
62+ models = {
63+ 'auth.group': {
64+ 'Meta': {'object_name': 'Group'},
65+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
66+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
67+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
68+ },
69+ 'auth.permission': {
70+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
71+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
72+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
73+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
74+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
75+ },
76+ 'auth.user': {
77+ 'Meta': {'object_name': 'User'},
78+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
79+ 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
80+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
81+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
82+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
83+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
84+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
85+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
86+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
87+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
88+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
89+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
90+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
91+ },
92+ 'contenttypes.contenttype': {
93+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
94+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
95+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
96+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
97+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
98+ },
99+ u'maasserver.bootimage': {
100+ 'Meta': {'unique_together': "((u'architecture', u'subarchitecture', u'release', u'purpose'),)", 'object_name': 'BootImage'},
101+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
102+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
103+ 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
104+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
105+ 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'})
106+ },
107+ u'maasserver.config': {
108+ 'Meta': {'object_name': 'Config'},
109+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
110+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
111+ 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
112+ },
113+ u'maasserver.dhcplease': {
114+ 'Meta': {'object_name': 'DHCPLease'},
115+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
116+ 'ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'}),
117+ 'mac': ('maasserver.fields.MACAddressField', [], {}),
118+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
119+ },
120+ u'maasserver.filestorage': {
121+ 'Meta': {'object_name': 'FileStorage'},
122+ 'data': ('django.db.models.fields.files.FileField', [], {'max_length': '255'}),
123+ 'filename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
124+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
125+ },
126+ u'maasserver.macaddress': {
127+ 'Meta': {'object_name': 'MACAddress'},
128+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
129+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
130+ 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
131+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
132+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
133+ },
134+ u'maasserver.node': {
135+ 'Meta': {'object_name': 'Node'},
136+ 'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
137+ 'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386'", 'max_length': '10'}),
138+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
139+ 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'null': 'True', 'blank': 'True'}),
140+ 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
141+ 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
142+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
143+ 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
144+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
145+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
146+ 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
147+ 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
148+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
149+ 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-75e2f85e-01b6-11e2-a13d-58946bf1d72c'", 'unique': 'True', 'max_length': '41'}),
150+ 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'null': 'True'}),
151+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
152+ },
153+ u'maasserver.nodegroup': {
154+ 'Meta': {'object_name': 'NodeGroup'},
155+ 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
156+ 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'unique': 'True'}),
157+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
158+ 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
159+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
160+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
161+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
162+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
163+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
164+ },
165+ u'maasserver.nodegroupinterface': {
166+ 'Meta': {'unique_together': "((u'nodegroup', u'interface'),)", 'object_name': 'NodeGroupInterface'},
167+ 'broadcast_ip': ('django.db.models.fields.IPAddressField', [], {'default': 'None', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
168+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
169+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
170+ 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
171+ 'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
172+ 'ip_range_high': ('django.db.models.fields.IPAddressField', [], {'default': 'None', 'max_length': '15', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
173+ 'ip_range_low': ('django.db.models.fields.IPAddressField', [], {'default': 'None', 'max_length': '15', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
174+ 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
175+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
176+ 'router_ip': ('django.db.models.fields.IPAddressField', [], {'default': 'None', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
177+ 'subnet_mask': ('django.db.models.fields.IPAddressField', [], {'default': 'None', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
178+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
179+ },
180+ u'maasserver.sshkey': {
181+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
182+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
183+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
184+ 'key': ('django.db.models.fields.TextField', [], {}),
185+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
186+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
187+ },
188+ u'maasserver.userprofile': {
189+ 'Meta': {'object_name': 'UserProfile'},
190+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
191+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
192+ },
193+ 'piston.consumer': {
194+ 'Meta': {'object_name': 'Consumer'},
195+ 'description': ('django.db.models.fields.TextField', [], {}),
196+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
197+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
198+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
199+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
200+ 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
201+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': "orm['auth.User']"})
202+ },
203+ 'piston.token': {
204+ 'Meta': {'object_name': 'Token'},
205+ 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
206+ 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
207+ 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Consumer']"}),
208+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
209+ 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
210+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
211+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
212+ 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1347989394L'}),
213+ 'token_type': ('django.db.models.fields.IntegerField', [], {}),
214+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': "orm['auth.User']"}),
215+ 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
216+ }
217+ }
218+
219+ complete_apps = ['maasserver']
220\ No newline at end of file
221
222=== modified file 'src/maasserver/models/node.py'
223--- src/maasserver/models/node.py 2012-09-17 18:27:32 +0000
224+++ src/maasserver/models/node.py 2012-09-18 18:14:38 +0000
225@@ -38,6 +38,8 @@
226 from maasserver.enum import (
227 ARCHITECTURE,
228 ARCHITECTURE_CHOICES,
229+ DISTRO_SERIES,
230+ DISTRO_SERIES_CHOICES,
231 NODE_AFTER_COMMISSIONING_ACTION,
232 NODE_AFTER_COMMISSIONING_ACTION_CHOICES,
233 NODE_PERMISSION,
234@@ -353,6 +355,10 @@
235 choices=NODE_AFTER_COMMISSIONING_ACTION_CHOICES,
236 default=NODE_AFTER_COMMISSIONING_ACTION.DEFAULT)
237
238+ distro_series = CharField(
239+ max_length=10, choices=DISTRO_SERIES_CHOICES, null=True,
240+ blank=True, default='')
241+
242 architecture = CharField(
243 max_length=10, choices=ARCHITECTURE_CHOICES, blank=False,
244 default=ARCHITECTURE.i386)