Merge lp:~rvb/maas/agent-bug-1239488 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: 1708
Proposed branch: lp:~rvb/maas/agent-bug-1239488
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 238 lines (+222/-0)
2 files modified
src/maasserver/migrations/0058_add_agent_name_to_node.py (+220/-0)
src/maasserver/models/node.py (+2/-0)
To merge this branch: bzr merge lp:~rvb/maas/agent-bug-1239488
Reviewer Review Type Date Requested Status
Gavin Panella (community) Approve
Review via email: mp+191140@code.launchpad.net

Commit message

Add an agent_name char field of size 255 with a default value of ''.

Description of the change

The empty string is the default value for this field so that upgrading will set agent_name to '' for all the existing nodes.

To post a comment you must log in.
Revision history for this message
Gavin Panella (allenap) wrote :

I can see, by running `make syncdb`, that agent_name cannot be null, but can you make that explicit in the code with a null=False?

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

> I can see, by running `make syncdb`, that agent_name cannot be null, but can
> you make that explicit in the code with a null=False?

All right, done.

Thanks for the review!

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
=== added file 'src/maasserver/migrations/0058_add_agent_name_to_node.py'
--- src/maasserver/migrations/0058_add_agent_name_to_node.py 1970-01-01 00:00:00 +0000
+++ src/maasserver/migrations/0058_add_agent_name_to_node.py 2013-10-15 11:42:28 +0000
@@ -0,0 +1,220 @@
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 # Adding field 'Node.agent_name'
13 db.add_column(u'maasserver_node', 'agent_name',
14 self.gf('django.db.models.fields.CharField')(default=u'', max_length=255, null=True, blank=True),
15 keep_default=False)
16
17
18 def backwards(self, orm):
19 # Deleting field 'Node.agent_name'
20 db.delete_column(u'maasserver_node', 'agent_name')
21
22
23 models = {
24 u'auth.group': {
25 'Meta': {'object_name': 'Group'},
26 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
27 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
28 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
29 },
30 u'auth.permission': {
31 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
32 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
33 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
34 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
35 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
36 },
37 u'auth.user': {
38 'Meta': {'object_name': 'User'},
39 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
40 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
41 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
42 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
43 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
44 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
45 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
46 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
47 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
48 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
49 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
50 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
51 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
52 },
53 u'contenttypes.contenttype': {
54 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
55 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
56 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
57 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
58 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
59 },
60 u'maasserver.bootimage': {
61 'Meta': {'unique_together': "((u'nodegroup', u'architecture', u'subarchitecture', u'release', u'purpose'),)", 'object_name': 'BootImage'},
62 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
63 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
64 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
65 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
66 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
67 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'})
68 },
69 u'maasserver.componenterror': {
70 'Meta': {'object_name': 'ComponentError'},
71 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
72 'created': ('django.db.models.fields.DateTimeField', [], {}),
73 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
74 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
75 'updated': ('django.db.models.fields.DateTimeField', [], {})
76 },
77 u'maasserver.config': {
78 'Meta': {'object_name': 'Config'},
79 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
80 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
81 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
82 },
83 u'maasserver.dhcplease': {
84 'Meta': {'object_name': 'DHCPLease'},
85 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
86 'ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'}),
87 'mac': ('maasserver.fields.MACAddressField', [], {}),
88 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
89 },
90 u'maasserver.downloadprogress': {
91 'Meta': {'object_name': 'DownloadProgress'},
92 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
93 'created': ('django.db.models.fields.DateTimeField', [], {}),
94 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}),
95 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
96 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
97 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
98 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
99 'updated': ('django.db.models.fields.DateTimeField', [], {})
100 },
101 u'maasserver.filestorage': {
102 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'},
103 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}),
104 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
105 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
106 'key': ('django.db.models.fields.CharField', [], {'default': "u'b361ce96-358e-11e3-a890-9c4e363b1c94'", 'unique': 'True', 'max_length': '36'}),
107 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
108 },
109 u'maasserver.macaddress': {
110 'Meta': {'object_name': 'MACAddress'},
111 'created': ('django.db.models.fields.DateTimeField', [], {}),
112 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
113 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
114 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
115 'updated': ('django.db.models.fields.DateTimeField', [], {})
116 },
117 u'maasserver.node': {
118 'Meta': {'object_name': 'Node'},
119 'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
120 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
121 'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386/generic'", 'max_length': '31'}),
122 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
123 'created': ('django.db.models.fields.DateTimeField', [], {}),
124 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
125 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
126 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}),
127 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
128 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
129 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
130 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
131 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
132 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
133 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
134 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}),
135 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
136 'storage': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
137 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-b3601538-358e-11e3-a890-9c4e363b1c94'", 'unique': 'True', 'max_length': '41'}),
138 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
139 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}),
140 'updated': ('django.db.models.fields.DateTimeField', [], {})
141 },
142 u'maasserver.nodegroup': {
143 'Meta': {'object_name': 'NodeGroup'},
144 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
145 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}),
146 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
147 'created': ('django.db.models.fields.DateTimeField', [], {}),
148 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
149 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
150 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
151 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
152 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
153 'updated': ('django.db.models.fields.DateTimeField', [], {}),
154 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
155 },
156 u'maasserver.nodegroupinterface': {
157 'Meta': {'unique_together': "((u'nodegroup', u'interface'),)", 'object_name': 'NodeGroupInterface'},
158 'broadcast_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
159 'created': ('django.db.models.fields.DateTimeField', [], {}),
160 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
161 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
162 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
163 'ip_range_high': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
164 'ip_range_low': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
165 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
166 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
167 'router_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
168 'subnet_mask': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
169 'updated': ('django.db.models.fields.DateTimeField', [], {})
170 },
171 u'maasserver.sshkey': {
172 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
173 'created': ('django.db.models.fields.DateTimeField', [], {}),
174 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
175 'key': ('django.db.models.fields.TextField', [], {}),
176 'updated': ('django.db.models.fields.DateTimeField', [], {}),
177 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
178 },
179 u'maasserver.tag': {
180 'Meta': {'object_name': 'Tag'},
181 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
182 'created': ('django.db.models.fields.DateTimeField', [], {}),
183 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
184 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
185 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
186 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
187 'updated': ('django.db.models.fields.DateTimeField', [], {})
188 },
189 u'maasserver.userprofile': {
190 'Meta': {'object_name': 'UserProfile'},
191 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
192 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
193 },
194 u'piston.consumer': {
195 'Meta': {'object_name': 'Consumer'},
196 'description': ('django.db.models.fields.TextField', [], {}),
197 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
198 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
199 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
200 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
201 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
202 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"})
203 },
204 u'piston.token': {
205 'Meta': {'object_name': 'Token'},
206 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
207 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
208 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}),
209 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
210 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
211 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
212 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
213 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1381837275L'}),
214 'token_type': ('django.db.models.fields.IntegerField', [], {}),
215 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}),
216 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
217 }
218 }
219
220 complete_apps = ['maasserver']
0\ No newline at end of file221\ No newline at end of file
1222
=== modified file 'src/maasserver/models/node.py'
--- src/maasserver/models/node.py 2013-10-15 07:40:29 +0000
+++ src/maasserver/models/node.py 2013-10-15 11:42:28 +0000
@@ -435,6 +435,8 @@
435435
436 routers = djorm_pgarray.fields.ArrayField(dbtype="macaddr")436 routers = djorm_pgarray.fields.ArrayField(dbtype="macaddr")
437437
438 agent_name = CharField(max_length=255, default='', blank=True, null=True)
439
438 # Juju expects the following standard constraints, which are stored here440 # Juju expects the following standard constraints, which are stored here
439 # as a basic optimisation over querying the lshw output.441 # as a basic optimisation over querying the lshw output.
440 cpu_count = IntegerField(default=0)442 cpu_count = IntegerField(default=0)