1
"""Migration for populating new Node fields related to constraints
3
A shared helper function is used that both the real Node model in maasserver
4
and the stubs used by south can work with. This saves writing the logic to
5
populate cpu_count and memory in two places. On migration it is likely that
8
If for whatever reason previously stored lshw output is not well formed XML,
9
the fields in Node are not populated.
11
from south.v2 import DataMigration
12
from django.core.exceptions import ValidationError
14
from maasserver.models.node import update_hardware_details
17
class Migration(DataMigration):
19
_lshw_name = "01-lshw.out"
21
def forwards(self, orm):
22
"""Move lshw text blob in metadataserver to xml field in Node"""
23
Tag = orm['maasserver.tag']
24
for commission_result in orm.NodeCommissionResult.objects.filter(
25
name=self._lshw_name):
26
node = commission_result.node
27
data = commission_result.data
29
update_hardware_details(node, data, Tag.objects)
30
except ValidationError:
35
def backwards(self, orm):
36
"""Move xml field in Node to lshw text blob in metadataserver"""
37
Node = orm['maasserver.Node']
38
for node in Node.objects.all():
39
lshw_output = node.hardware_details
41
orm.NodeCommissionResult.objects.store_data(
42
node, self._lshw_name, lshw_output)
46
'Meta': {'object_name': 'Group'},
47
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
48
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
49
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
52
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
53
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
54
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
55
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
56
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
59
'Meta': {'object_name': 'User'},
60
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
61
'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
62
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
63
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
64
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
65
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
66
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
67
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
68
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
69
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
70
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
71
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
72
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
74
'contenttypes.contenttype': {
75
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
76
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
77
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
78
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
79
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
82
'Meta': {'object_name': 'Node'},
83
'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
84
'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386/generic'", 'max_length': '31'}),
85
'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
86
'created': ('django.db.models.fields.DateTimeField', [], {}),
87
'distro_series': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '10', 'null': 'True', 'blank': 'True'}),
88
'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
89
'hardware_details': ('maasserver.fields.XMLField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
90
'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
91
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
92
'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
93
'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
94
'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
95
'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
96
'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
97
'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
98
'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
99
'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-dc867442-0ca0-11e2-9ff0-fa163e46ecd0'", 'unique': 'True', 'max_length': '41'}),
100
'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
101
'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'null': 'True'}),
102
'updated': ('django.db.models.fields.DateTimeField', [], {})
104
u'maasserver.nodegroup': {
105
'Meta': {'object_name': 'NodeGroup'},
106
'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
107
'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'unique': 'True'}),
108
'created': ('django.db.models.fields.DateTimeField', [], {}),
109
'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
110
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
111
'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
112
'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
113
'updated': ('django.db.models.fields.DateTimeField', [], {}),
114
'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
117
'Meta': {'object_name': 'Tag'},
118
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
119
'created': ('django.db.models.fields.DateTimeField', [], {}),
120
'definition': ('django.db.models.fields.TextField', [], {}),
121
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
122
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
123
'updated': ('django.db.models.fields.DateTimeField', [], {})
125
u'metadataserver.nodecommissionresult': {
126
'Meta': {'unique_together': "((u'node', u'name'),)", 'object_name': 'NodeCommissionResult'},
127
'data': ('django.db.models.fields.CharField', [], {'max_length': '1048576'}),
128
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
129
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
130
'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"})
132
u'metadataserver.nodekey': {
133
'Meta': {'object_name': 'NodeKey'},
134
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
135
'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
136
'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']", 'unique': 'True'}),
137
'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'unique': 'True'})
139
u'metadataserver.nodeuserdata': {
140
'Meta': {'object_name': 'NodeUserData'},
141
'data': ('metadataserver.fields.BinaryField', [], {}),
142
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
143
'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']", 'unique': 'True'})
146
'Meta': {'object_name': 'Consumer'},
147
'description': ('django.db.models.fields.TextField', [], {}),
148
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
149
'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
150
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
151
'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
152
'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
153
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': "orm['auth.User']"})
156
'Meta': {'object_name': 'Token'},
157
'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
158
'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
159
'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Consumer']"}),
160
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
161
'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
162
'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
163
'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
164
'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1349189580L'}),
165
'token_type': ('django.db.models.fields.IntegerField', [], {}),
166
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': "orm['auth.User']"}),
167
'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
171
complete_apps = ['metadataserver']