Merge lp:~rvb/maas/maas-new-event-index 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: 4000
Proposed branch: lp:~rvb/maas/maas-new-event-index
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 464 lines (+448/-0)
2 files modified
src/maasserver/migrations/0138_perf_index_on_node_events.py (+445/-0)
src/maasserver/models/event.py (+3/-0)
To merge this branch: bzr merge lp:~rvb/maas/maas-new-event-index
Reviewer Review Type Date Requested Status
Andres Rodriguez (community) Approve
Gavin Panella (community) Approve
Review via email: mp+261473@code.launchpad.net

Commit message

Add index (node_id, id) on node events: it speeds up the query that gets the last events that's issued for the UI display.

Description of the change

Note that this is a manually created migration since index_together indexes are only supported (as in "detected automatically") by South 0.8 and Trusty uses 0.7.5.

I've tested the index in OIL (manually) and tested this fix in my lab.

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

lgtm!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'src/maasserver/migrations/0138_perf_index_on_node_events.py'
2--- src/maasserver/migrations/0138_perf_index_on_node_events.py 1970-01-01 00:00:00 +0000
3+++ src/maasserver/migrations/0138_perf_index_on_node_events.py 2015-06-09 08:14:30 +0000
4@@ -0,0 +1,445 @@
5+# -*- coding: utf-8 -*-
6+import datetime
7+
8+from django.db import models
9+from south.db import db
10+from south.v2 import SchemaMigration
11+
12+
13+class Migration(SchemaMigration):
14+
15+ def forwards(self, orm):
16+ # Adding index on 'Event', fields ['node', u'id']
17+ db.create_index(u'maasserver_event', ['node_id', u'id'])
18+
19+
20+ def backwards(self, orm):
21+ # Removing index on 'Event', fields ['node', u'id']
22+ db.delete_index(u'maasserver_event', ['node_id', u'id'])
23+
24+
25+ models = {
26+ u'auth.group': {
27+ 'Meta': {'object_name': 'Group'},
28+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
29+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
30+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
31+ },
32+ u'auth.permission': {
33+ 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
34+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
35+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
36+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
37+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
38+ },
39+ u'auth.user': {
40+ 'Meta': {'object_name': 'User'},
41+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
42+ 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
43+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
44+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
45+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
46+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
47+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
48+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
49+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
50+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
51+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
52+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
53+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
54+ },
55+ u'contenttypes.contenttype': {
56+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
57+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
58+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
59+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
60+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
61+ },
62+ u'maasserver.blockdevice': {
63+ 'Meta': {'ordering': "[u'id']", 'unique_together': "((u'node', u'path'),)", 'object_name': 'BlockDevice'},
64+ 'block_size': ('django.db.models.fields.IntegerField', [], {}),
65+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
66+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
67+ 'id_path': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
68+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
69+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
70+ 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
71+ 'size': ('django.db.models.fields.BigIntegerField', [], {}),
72+ 'tags': ('djorm_pgarray.fields.ArrayField', [], {'default': '[]', 'dbtype': "u'text'", 'blank': 'True'}),
73+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
74+ },
75+ u'maasserver.bootresource': {
76+ 'Meta': {'unique_together': "((u'name', u'architecture'),)", 'object_name': 'BootResource'},
77+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
78+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
79+ 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
80+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
81+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
82+ 'rtype': ('django.db.models.fields.IntegerField', [], {'max_length': '10'}),
83+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
84+ },
85+ u'maasserver.bootresourcefile': {
86+ 'Meta': {'unique_together': "((u'resource_set', u'filetype'),)", 'object_name': 'BootResourceFile'},
87+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
88+ 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
89+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
90+ 'filetype': ('django.db.models.fields.CharField', [], {'default': "u'root-tgz'", 'max_length': '20'}),
91+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
92+ 'largefile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.LargeFile']"}),
93+ 'resource_set': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'files'", 'to': u"orm['maasserver.BootResourceSet']"}),
94+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
95+ },
96+ u'maasserver.bootresourceset': {
97+ 'Meta': {'unique_together': "((u'resource', u'version'),)", 'object_name': 'BootResourceSet'},
98+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
99+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
100+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
101+ 'resource': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'sets'", 'to': u"orm['maasserver.BootResource']"}),
102+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
103+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'})
104+ },
105+ u'maasserver.bootsource': {
106+ 'Meta': {'object_name': 'BootSource'},
107+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
108+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
109+ 'keyring_data': ('maasserver.fields.EditableBinaryField', [], {'blank': 'True'}),
110+ 'keyring_filename': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}),
111+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
112+ 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
113+ },
114+ u'maasserver.bootsourcecache': {
115+ 'Meta': {'object_name': 'BootSourceCache'},
116+ 'arch': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
117+ 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}),
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', [], {'max_length': '20'}),
121+ 'os': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
122+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
123+ 'subarch': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
124+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
125+ },
126+ u'maasserver.bootsourceselection': {
127+ 'Meta': {'unique_together': "((u'boot_source', u'os', u'release'),)", 'object_name': 'BootSourceSelection'},
128+ 'arches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
129+ 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}),
130+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
131+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
132+ 'labels': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
133+ 'os': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
134+ 'release': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
135+ 'subarches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
136+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
137+ },
138+ u'maasserver.candidatename': {
139+ 'Meta': {'unique_together': "((u'name', u'position'),)", 'object_name': 'CandidateName'},
140+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
141+ 'name': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
142+ 'position': ('django.db.models.fields.IntegerField', [], {})
143+ },
144+ u'maasserver.componenterror': {
145+ 'Meta': {'object_name': 'ComponentError'},
146+ 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
147+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
148+ 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
149+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
150+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
151+ },
152+ u'maasserver.config': {
153+ 'Meta': {'object_name': 'Config'},
154+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
155+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
156+ 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
157+ },
158+ u'maasserver.dhcplease': {
159+ 'Meta': {'object_name': 'DHCPLease'},
160+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
161+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
162+ 'mac': ('maasserver.fields.MACAddressField', [], {}),
163+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
164+ },
165+ u'maasserver.downloadprogress': {
166+ 'Meta': {'object_name': 'DownloadProgress'},
167+ 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
168+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
169+ 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}),
170+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
171+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
172+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
173+ 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
174+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
175+ },
176+ u'maasserver.event': {
177+ 'Meta': {'object_name': 'Event', 'index_together': "((u'node', u'id'),)"},
178+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
179+ 'description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}),
180+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
181+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
182+ 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.EventType']"}),
183+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
184+ },
185+ u'maasserver.eventtype': {
186+ 'Meta': {'object_name': 'EventType'},
187+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
188+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
189+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
190+ 'level': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
191+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
192+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
193+ },
194+ u'maasserver.filestorage': {
195+ 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'},
196+ 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}),
197+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
198+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
199+ 'key': ('django.db.models.fields.CharField', [], {'default': "u'ca7f9ec6-0e7e-11e5-8f3a-3c970e0e56dc'", 'unique': 'True', 'max_length': '36'}),
200+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
201+ },
202+ u'maasserver.filesystem': {
203+ 'Meta': {'object_name': 'Filesystem'},
204+ 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']", 'null': 'True', 'blank': 'True'}),
205+ 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
206+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
207+ 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filesystems'", 'null': 'True', 'to': u"orm['maasserver.FilesystemGroup']"}),
208+ 'fstype': ('django.db.models.fields.CharField', [], {'default': "u'ext4'", 'max_length': '20'}),
209+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
210+ 'mount_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
211+ 'mount_point': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
212+ 'partition': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Partition']", 'null': 'True', 'blank': 'True'}),
213+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
214+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
215+ },
216+ u'maasserver.filesystemgroup': {
217+ 'Meta': {'object_name': 'FilesystemGroup'},
218+ 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
219+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
220+ 'group_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
221+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
222+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
223+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
224+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
225+ },
226+ u'maasserver.largefile': {
227+ 'Meta': {'object_name': 'LargeFile'},
228+ 'content': ('maasserver.fields.LargeObjectField', [], {}),
229+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
230+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
231+ 'sha256': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}),
232+ 'total_size': ('django.db.models.fields.BigIntegerField', [], {}),
233+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
234+ },
235+ u'maasserver.licensekey': {
236+ 'Meta': {'unique_together': "((u'osystem', u'distro_series'),)", 'object_name': 'LicenseKey'},
237+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
238+ 'distro_series': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
239+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
240+ 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
241+ 'osystem': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
242+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
243+ },
244+ u'maasserver.macaddress': {
245+ 'Meta': {'ordering': "(u'created',)", 'object_name': 'MACAddress'},
246+ 'cluster_interface': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.NodeGroupInterface']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
247+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
248+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
249+ 'ip_addresses': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.StaticIPAddress']", 'symmetrical': 'False', 'through': u"orm['maasserver.MACStaticIPAddressLink']", 'blank': 'True'}),
250+ 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
251+ 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Network']", 'symmetrical': 'False', 'blank': 'True'}),
252+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']", 'null': 'True', 'blank': 'True'}),
253+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
254+ },
255+ u'maasserver.macstaticipaddresslink': {
256+ 'Meta': {'unique_together': "((u'ip_address', u'mac_address'),)", 'object_name': 'MACStaticIPAddressLink'},
257+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
258+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
259+ 'ip_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.StaticIPAddress']", 'unique': 'True'}),
260+ 'mac_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.MACAddress']"}),
261+ 'nic_alias': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
262+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
263+ },
264+ u'maasserver.network': {
265+ 'Meta': {'object_name': 'Network'},
266+ 'default_gateway': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
267+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
268+ 'dns_servers': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
269+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
270+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
271+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
272+ 'netmask': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}),
273+ 'vlan_tag': ('django.db.models.fields.PositiveSmallIntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'})
274+ },
275+ u'maasserver.node': {
276+ 'Meta': {'object_name': 'Node'},
277+ 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
278+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}),
279+ 'boot_type': ('django.db.models.fields.CharField', [], {'default': "u'fastpath'", 'max_length': '20'}),
280+ 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
281+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
282+ 'disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
283+ 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
284+ 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
285+ 'error_description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}),
286+ 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}),
287+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
288+ 'installable': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
289+ 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
290+ 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
291+ 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
292+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
293+ 'osystem': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
294+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
295+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "u'children'", 'null': 'True', 'blank': 'True', 'to': u"orm['maasserver.Node']"}),
296+ 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
297+ 'power_state': ('django.db.models.fields.CharField', [], {'default': "u'unknown'", 'max_length': '10'}),
298+ 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
299+ 'pxe_mac': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': u"orm['maasserver.MACAddress']", 'blank': 'True', 'null': 'True'}),
300+ 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}),
301+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
302+ 'swap_size': ('django.db.models.fields.BigIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
303+ 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-ca8290ae-0e7e-11e5-8f3a-3c970e0e56dc'", 'unique': 'True', 'max_length': '41'}),
304+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
305+ 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}),
306+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
307+ 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Zone']", 'on_delete': 'models.SET_DEFAULT'})
308+ },
309+ u'maasserver.nodegroup': {
310+ 'Meta': {'object_name': 'NodeGroup'},
311+ 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
312+ 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}),
313+ 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
314+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
315+ 'default_disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
316+ 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
317+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
318+ 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
319+ 'name': ('maasserver.models.nodegroup.DomainNameField', [], {'max_length': '80', 'blank': 'True'}),
320+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
321+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
322+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
323+ },
324+ u'maasserver.nodegroupinterface': {
325+ 'Meta': {'unique_together': "((u'nodegroup', u'name'),)", 'object_name': 'NodeGroupInterface'},
326+ 'broadcast_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
327+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
328+ 'foreign_dhcp_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
329+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
330+ 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
331+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}),
332+ 'ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
333+ 'ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
334+ 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
335+ 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
336+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
337+ 'router_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
338+ 'static_ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
339+ 'static_ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
340+ 'subnet_mask': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
341+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
342+ },
343+ u'maasserver.partition': {
344+ 'Meta': {'object_name': 'Partition'},
345+ 'bootable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
346+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
347+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
348+ 'partition_table': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'partitions'", 'to': u"orm['maasserver.PartitionTable']"}),
349+ 'size': ('django.db.models.fields.BigIntegerField', [], {}),
350+ 'start_offset': ('django.db.models.fields.BigIntegerField', [], {}),
351+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
352+ 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '36', 'unique': 'True', 'null': 'True', 'blank': 'True'})
353+ },
354+ u'maasserver.partitiontable': {
355+ 'Meta': {'object_name': 'PartitionTable'},
356+ 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']"}),
357+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
358+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
359+ 'table_type': ('django.db.models.fields.CharField', [], {'default': "u'GPT'", 'max_length': '20'}),
360+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
361+ },
362+ u'maasserver.physicalblockdevice': {
363+ 'Meta': {'ordering': "[u'id']", 'object_name': 'PhysicalBlockDevice', '_ormbases': [u'maasserver.BlockDevice']},
364+ u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}),
365+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
366+ 'serial': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
367+ },
368+ u'maasserver.sshkey': {
369+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
370+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
371+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
372+ 'key': ('django.db.models.fields.TextField', [], {}),
373+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
374+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
375+ },
376+ u'maasserver.sslkey': {
377+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSLKey'},
378+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
379+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
380+ 'key': ('django.db.models.fields.TextField', [], {}),
381+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
382+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
383+ },
384+ u'maasserver.staticipaddress': {
385+ 'Meta': {'object_name': 'StaticIPAddress'},
386+ 'alloc_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
387+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
388+ 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
389+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
390+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
391+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
392+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
393+ },
394+ u'maasserver.tag': {
395+ 'Meta': {'object_name': 'Tag'},
396+ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
397+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
398+ 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
399+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
400+ 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
401+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
402+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
403+ },
404+ u'maasserver.userprofile': {
405+ 'Meta': {'object_name': 'UserProfile'},
406+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
407+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
408+ },
409+ u'maasserver.virtualblockdevice': {
410+ 'Meta': {'ordering': "[u'id']", 'object_name': 'VirtualBlockDevice', '_ormbases': [u'maasserver.BlockDevice']},
411+ u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}),
412+ 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'virtual_devices'", 'to': u"orm['maasserver.FilesystemGroup']"}),
413+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
414+ },
415+ u'maasserver.zone': {
416+ 'Meta': {'ordering': "[u'name']", 'object_name': 'Zone'},
417+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
418+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
419+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
420+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
421+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
422+ },
423+ u'piston.consumer': {
424+ 'Meta': {'object_name': 'Consumer'},
425+ 'description': ('django.db.models.fields.TextField', [], {}),
426+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
427+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
428+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
429+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
430+ 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
431+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"})
432+ },
433+ u'piston.token': {
434+ 'Meta': {'object_name': 'Token'},
435+ 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
436+ 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
437+ 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}),
438+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
439+ 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
440+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
441+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
442+ 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1433837342L'}),
443+ 'token_type': ('django.db.models.fields.IntegerField', [], {}),
444+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}),
445+ 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
446+ }
447+ }
448+
449+ complete_apps = ['maasserver']
450\ No newline at end of file
451
452=== modified file 'src/maasserver/models/event.py'
453--- src/maasserver/models/event.py 2015-05-07 18:14:38 +0000
454+++ src/maasserver/models/event.py 2015-06-09 08:14:30 +0000
455@@ -80,6 +80,9 @@
456
457 class Meta(DefaultMeta):
458 verbose_name = "Event record"
459+ index_together = (
460+ ("node", "id"),
461+ )
462
463 def __unicode__(self):
464 return "%s (node=%s, type=%s, created=%s)" % (