Merge lp:~cjohnston/qa-dashboard/hide-memory-test-framework-data into lp:qa-dashboard

Proposed by Chris Johnston
Status: Work in progress
Proposed branch: lp:~cjohnston/qa-dashboard/hide-memory-test-framework-data
Merge into: lp:qa-dashboard
Prerequisite: lp:~cjohnston/qa-dashboard/add-admin-link
Diff against target: 439 lines (+281/-8)
9 files modified
common/templates/layout.html (+2/-1)
memory/admin.py (+11/-0)
memory/api.py (+9/-1)
memory/management/commands/agg_results.py (+10/-3)
memory/migrations/0002_add_memory_config.py (+213/-0)
memory/models.py (+4/-0)
memory/templates/memory/machine_details.html (+14/-1)
memory/tests.py (+1/-1)
memory/views.py (+17/-1)
To merge this branch: bzr merge lp:~cjohnston/qa-dashboard/hide-memory-test-framework-data
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve
Chris Johnston Needs Resubmitting
Joe Talbott Approve
Review via email: mp+174325@code.launchpad.net

Commit message

Hides test framework results by default from memory graphs and tables, adding the ability to see the test framework results

Description of the change

In order to display proper results for memory testing, we should not be displaying the memory usage caused by the testing frame work. To fix this, we will add a set of blacklist processes, and exclude those from the results. Just for the ability to follow the usage by the testing framework, we added an option to display the data including the testing framework data.

The aggregated data will need to be reformulated after this branch lands in order to provide consistency.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:496
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~cjohnston/qa-dashboard/hide-memory-test-framework-data/+merge/174325/+edit-commit-message

http://s-jenkins:8080/job/dashboard-ci/78/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins:8080/job/dashboard-ci/78/rebuild

review: Needs Fixing (continuous-integration)
497. By Chris Johnston

Fix tests

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:497
http://s-jenkins:8080/job/dashboard-ci/79/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins:8080/job/dashboard-ci/79/rebuild

review: Approve (continuous-integration)
Revision history for this message
Joe Talbott (joetalbott) wrote :

LGTM.

review: Approve
498. By Chris Johnston

Change exclude to be in agg script

Revision history for this message
Chris Johnston (cjohnston) :
review: Needs Resubmitting
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:498
http://s-jenkins:8080/job/dashboard-ci/80/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins:8080/job/dashboard-ci/80/rebuild

review: Approve (continuous-integration)

Unmerged revisions

498. By Chris Johnston

Change exclude to be in agg script

497. By Chris Johnston

Fix tests

496. By Chris Johnston

Add the ability to exclude test framework data

495. By Chris Johnston

commit

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'common/templates/layout.html'
2--- common/templates/layout.html 2013-07-11 15:30:27 +0000
3+++ common/templates/layout.html 2013-07-12 13:44:34 +0000
4@@ -28,7 +28,8 @@
5 <li {% ifequal url.0 'bootspeed' %}class="active" {% endifequal %}id="main-nav"><a class="main-nav-item" href="{% url bootspeed_arch_overview %}">Bootspeed</a></li>
6 <li {% ifequal url.0 'power' %}class="active" {% endifequal %}id="main-nav"><a class="main-nav-item" href="{% url power_overview %}">Power</a></li>
7 <li {% ifequal url.0 'memory' %}class="active" {% endifequal %}id="main-nav"><a class="main-nav-item" href="{% url memory_arch_overview %}">Memory</a></li>
8- <li id="main-nav"><a class="main-nav-item" href="https://jenkins.qa.ubuntu.com/view/Saucy/view/AutoPkgTest/">Autopackage</a></li>
9+ <li id="main-nav"><a class="main-nav-item" href="https://jenkins.qa.ubuntu.com/view/Saucy/view/AutoPkgTest/">Autopackage</a></li>
10+ {% if user.is_staff %}<li id="main-nav"><a class="main-nav-item" href="/admin">Admin</a></li>{% endif %}
11 </ul>
12 </nav>
13 <a href='{% url index %}' class="logo-ubuntu">
14
15=== modified file 'memory/admin.py'
16--- memory/admin.py 2013-03-21 18:59:36 +0000
17+++ memory/admin.py 2013-07-12 13:44:34 +0000
18@@ -22,6 +22,8 @@
19 MemoryResult,
20 MemoryMetric,
21 MemoryBuild,
22+ MemoryConfig,
23+ MemoryProcess,
24 )
25
26 from django.contrib import admin
27@@ -131,6 +133,14 @@
28 )
29
30
31+class MemoryConfigAdmin(admin.ModelAdmin):
32+ list_display = ('blacklist_process', )
33+
34+
35+class MemoryProcessAdmin(admin.ModelAdmin):
36+ list_display = ('image', 'upgrade', 'machine', 'process',)
37+
38+admin.site.register(MemoryConfig, MemoryConfigAdmin)
39 admin.site.register(MemoryUpgrade, MemoryUpgradeAdmin)
40 admin.site.register(MemoryMachine, MemoryMachineAdmin)
41 admin.site.register(MemoryLog, MemoryLogAdmin)
42@@ -139,3 +149,4 @@
43 admin.site.register(MemoryDetail, MemoryDetailAdmin)
44 admin.site.register(MemoryResult, MemoryResultAdmin)
45 admin.site.register(MemoryBuild, MemoryBuildAdmin)
46+admin.site.register(MemoryProcess, MemoryProcessAdmin)
47
48=== modified file 'memory/api.py'
49--- memory/api.py 2013-06-09 23:59:45 +0000
50+++ memory/api.py 2013-07-12 13:44:34 +0000
51@@ -32,6 +32,7 @@
52 MemoryProcess,
53 MemoryResult,
54 MemoryUpgrade,
55+ MemoryConfig,
56 )
57
58 MAX_RESULTS = 180
59@@ -353,7 +354,14 @@
60 def result_processes(request, result_id):
61 result = get_object_or_404(MemoryResult, id=result_id)
62
63- procs = result.memorydetail_set.filter(publish=True).order_by('-pss')
64+ exclude = MemoryConfig.objects.all().values_list(
65+ 'blacklist_process',
66+ flat=True,
67+ )
68+
69+ procs = result.memorydetail_set.exclude(
70+ command__in=exclude,
71+ ).filter(publish=True).order_by('-pss')
72
73 data = []
74 for p in procs:
75
76=== modified file 'memory/management/commands/agg_results.py'
77--- memory/management/commands/agg_results.py 2013-03-22 21:10:26 +0000
78+++ memory/management/commands/agg_results.py 2013-07-12 13:44:34 +0000
79@@ -22,17 +22,20 @@
80 from memory.models import (
81 MemoryDetail,
82 MemoryResult,
83+ MemoryConfig,
84 )
85
86
87 class Command(BaseCommand):
88 help = "Do result calculations."
89
90- def _aggregate(self, result):
91+ def _aggregate(self, result, exclude):
92 """ Aggregate values by name. """
93
94 details = MemoryDetail.objects.filter(
95 result=result,
96+ ).exclude(
97+ command__in=exclude,
98 )
99
100 if details.count() == 0:
101@@ -49,7 +52,6 @@
102 return result
103
104 def handle(self, *args, **options):
105-
106 verbosity = int(options.get('verbosity'))
107
108 log_level = logging.WARN
109@@ -64,9 +66,14 @@
110 name='pss',
111 )
112
113+ exclude = MemoryConfig.objects.all().values_list(
114+ 'blacklist_process',
115+ flat=True,
116+ )
117+
118 logging.info("results: {}".format(results))
119 for result in results.iterator():
120 logging.info("name: {}".format(result.name))
121- res = self._aggregate(result)
122+ res = self._aggregate(result, exclude)
123
124 logging.info("result: {}".format(res))
125
126=== added file 'memory/migrations/0002_add_memory_config.py'
127--- memory/migrations/0002_add_memory_config.py 1970-01-01 00:00:00 +0000
128+++ memory/migrations/0002_add_memory_config.py 2013-07-12 13:44:34 +0000
129@@ -0,0 +1,213 @@
130+# -*- coding: utf-8 -*-
131+import datetime
132+from south.db import db
133+from south.v2 import SchemaMigration
134+from django.db import models
135+
136+
137+class Migration(SchemaMigration):
138+
139+ def forwards(self, orm):
140+ # Adding model 'MemoryConfig'
141+ db.create_table('memory_memoryconfig', (
142+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
143+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
144+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
145+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
146+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
147+ ('blacklist_process', self.gf('django.db.models.fields.CharField')(max_length=4096)),
148+ ))
149+ db.send_create_signal('memory', ['MemoryConfig'])
150+
151+
152+ def backwards(self, orm):
153+ # Deleting model 'MemoryConfig'
154+ db.delete_table('memory_memoryconfig')
155+
156+
157+ models = {
158+ 'common.bug': {
159+ 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
160+ 'assignee': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'}),
161+ 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
162+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
163+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
164+ 'importance': ('django.db.models.fields.CharField', [], {'default': "u'unknown'", 'max_length': '4096'}),
165+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
166+ 'project': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'}),
167+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
168+ 'status': ('django.db.models.fields.CharField', [], {'default': "u'unknown'", 'max_length': '4096'}),
169+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'}),
170+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
171+ },
172+ 'common.jenkinsbuild': {
173+ 'Meta': {'unique_together': "(('job', 'build_number'),)", 'object_name': 'JenkinsBuild', 'db_table': "'jenkins_builds'"},
174+ 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'build_bugs'", 'symmetrical': 'False', 'to': "orm['common.Bug']"}),
175+ 'build_description': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
176+ 'build_number': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
177+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
178+ 'failed': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
179+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
180+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
181+ 'job': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['common.JenkinsJob']"}),
182+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
183+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
184+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
185+ },
186+ 'common.jenkinsjob': {
187+ 'Meta': {'object_name': 'JenkinsJob', 'db_table': "'jenkins_jobs'"},
188+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
189+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
190+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
191+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
192+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
193+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
194+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
195+ },
196+ 'memory.memorybuild': {
197+ 'Meta': {'object_name': 'MemoryBuild', 'db_table': "'memory_builds'"},
198+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['common.JenkinsBuild']"}),
199+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
200+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
201+ 'image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryImage']", 'null': 'True'}),
202+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
203+ 'machine': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryMachine']"}),
204+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
205+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
206+ 'upgrade': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryUpgrade']", 'null': 'True'})
207+ },
208+ 'memory.memoryconfig': {
209+ 'Meta': {'object_name': 'MemoryConfig'},
210+ 'blacklist_process': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
211+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
212+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
213+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
214+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
215+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
216+ },
217+ 'memory.memorydetail': {
218+ 'Meta': {'object_name': 'MemoryDetail', 'db_table': "'memory_details'"},
219+ 'command': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
220+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
221+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
222+ 'image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryImage']", 'null': 'True'}),
223+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
224+ 'machine': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryMachine']"}),
225+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
226+ 'pss': ('django.db.models.fields.PositiveIntegerField', [], {}),
227+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
228+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
229+ 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryResult']"}),
230+ 'rss': ('django.db.models.fields.PositiveIntegerField', [], {}),
231+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
232+ 'upgrade': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryUpgrade']", 'null': 'True'}),
233+ 'uss': ('django.db.models.fields.PositiveIntegerField', [], {}),
234+ 'vss': ('django.db.models.fields.PositiveIntegerField', [], {})
235+ },
236+ 'memory.memoryimage': {
237+ 'Meta': {'object_name': 'MemoryImage', 'db_table': "'memory_images'"},
238+ 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
239+ 'build_number': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
240+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
241+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
242+ 'image_type': ('django.db.models.fields.CharField', [], {'default': "u'daily'", 'max_length': '10'}),
243+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
244+ 'md5': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
245+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
246+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
247+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
248+ 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
249+ },
250+ 'memory.memorylog': {
251+ 'Meta': {'object_name': 'MemoryLog', 'db_table': "'memory_logs'"},
252+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
253+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
254+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
255+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
256+ 'path': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
257+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
258+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
259+ },
260+ 'memory.memorymachine': {
261+ 'Meta': {'object_name': 'MemoryMachine', 'db_table': "'memory_machines'"},
262+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
263+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
264+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
265+ 'mac_address': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
266+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
267+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
268+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
269+ },
270+ 'memory.memorymetric': {
271+ 'Meta': {'object_name': 'MemoryMetric', 'db_table': "'memory_metrics'"},
272+ 'average': ('django.db.models.fields.FloatField', [], {'default': '0'}),
273+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
274+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
275+ 'image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryImage']", 'null': 'True'}),
276+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
277+ 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}),
278+ 'kernel': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
279+ 'machine': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryMachine']"}),
280+ 'maximum': ('django.db.models.fields.FloatField', [], {'default': '0'}),
281+ 'minimum': ('django.db.models.fields.FloatField', [], {'default': '0'}),
282+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
283+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
284+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
285+ 'stddev': ('django.db.models.fields.FloatField', [], {'default': '0'}),
286+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
287+ 'upgrade': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryUpgrade']", 'null': 'True'})
288+ },
289+ 'memory.memoryprocess': {
290+ 'Meta': {'object_name': 'MemoryProcess', 'db_table': "'memory_processes'"},
291+ 'average': ('django.db.models.fields.FloatField', [], {'default': '0'}),
292+ 'command': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
293+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
294+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
295+ 'image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryImage']", 'null': 'True'}),
296+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
297+ 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}),
298+ 'machine': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryMachine']"}),
299+ 'maximum': ('django.db.models.fields.FloatField', [], {'default': '0'}),
300+ 'minimum': ('django.db.models.fields.FloatField', [], {'default': '0'}),
301+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
302+ 'process': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
303+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
304+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
305+ 'stddev': ('django.db.models.fields.FloatField', [], {'default': '0'}),
306+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
307+ 'upgrade': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryUpgrade']", 'null': 'True'})
308+ },
309+ 'memory.memoryresult': {
310+ 'Meta': {'object_name': 'MemoryResult', 'db_table': "'memory_results'"},
311+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
312+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
313+ 'image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryImage']", 'null': 'True'}),
314+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
315+ 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}),
316+ 'kernel': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
317+ 'log': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryLog']"}),
318+ 'machine': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryMachine']"}),
319+ 'metric': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryMetric']"}),
320+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
321+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
322+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
323+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
324+ 'upgrade': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['memory.MemoryUpgrade']", 'null': 'True'}),
325+ 'value': ('django.db.models.fields.FloatField', [], {})
326+ },
327+ 'memory.memoryupgrade': {
328+ 'Meta': {'object_name': 'MemoryUpgrade', 'db_table': "'memory_upgrades'"},
329+ 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
330+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
331+ 'date': ('django.db.models.fields.DateTimeField', [], {}),
332+ 'from_release': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
333+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
334+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
335+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
336+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
337+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
338+ 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
339+ }
340+ }
341+
342+ complete_apps = ['memory']
343\ No newline at end of file
344
345=== modified file 'memory/models.py'
346--- memory/models.py 2013-05-06 21:18:46 +0000
347+++ memory/models.py 2013-07-12 13:44:34 +0000
348@@ -351,3 +351,7 @@
349 return 0
350
351 return self.average - prev.average
352+
353+
354+class MemoryConfig(DashboardBaseModel):
355+ blacklist_process = models.CharField(max_length=4096)
356
357=== modified file 'memory/templates/memory/machine_details.html'
358--- memory/templates/memory/machine_details.html 2013-07-10 19:05:25 +0000
359+++ memory/templates/memory/machine_details.html 2013-07-12 13:44:34 +0000
360@@ -12,7 +12,20 @@
361 {% block content %}
362
363 <div class="grid_15">
364- <h2>Memory consumption details for {{ build }} on {{ result.machine.name|display_name }} using {{ arch }}</h2>
365+ <h2>Memory consumption details for {{ result.machine.name|display_name }}</h2>
366+ <p>
367+ <strong>Build #:</strong> {{ build }}<br />
368+ <strong>Arch:</strong> {{ arch }}<br />
369+ {% if all %}
370+ <a href="{% url memory_machine_image_details arch result.machine.id result.id %}">
371+ Hide test framework data
372+ </a>
373+ {% else %}
374+ <a href="?all">
375+ Show test framework data
376+ </a>
377+ {% endif %}
378+ </p>
379 </div>
380 <div class="grid_15">
381 <div id="stackedchart">
382
383=== modified file 'memory/tests.py'
384--- memory/tests.py 2013-05-31 20:07:19 +0000
385+++ memory/tests.py 2013-07-12 13:44:34 +0000
386@@ -173,9 +173,9 @@
387
388 self.assert_(self.detail2)
389
390+ call_command('agg_processes')
391 call_command('agg_results')
392 call_command('agg_metrics')
393- call_command('agg_processes')
394
395 # get updated instances from the DB
396 self.result = MemoryResult.objects.get(id=self.result.id)
397
398=== modified file 'memory/views.py'
399--- memory/views.py 2013-07-10 19:05:25 +0000
400+++ memory/views.py 2013-07-12 13:44:34 +0000
401@@ -39,6 +39,7 @@
402 MemoryMetric,
403 MemoryProcess,
404 MemoryResult,
405+ MemoryConfig,
406 )
407
408 from memory.tables import (
409@@ -292,7 +293,21 @@
410 @require_GET
411 def machine_image_details(request, arch, machine_id, result_id):
412 result = get_object_or_404(MemoryResult, id=result_id)
413- details = result.memorydetail_set.all().select_related('image', 'machine')
414+ exclude = MemoryConfig.objects.all().values_list(
415+ 'blacklist_process',
416+ flat=True,
417+ )
418+
419+ all = request.GET.get('all')
420+
421+ if all is None:
422+ all = False
423+ details = result.memorydetail_set.exclude(
424+ command__in=exclude,
425+ ).select_related('image', 'machine')
426+ else:
427+ all = True
428+ details = result.memorydetail_set.select_related('image', 'machine')
429
430 chart_api = reverse(
431 'memory_api_result_processes',
432@@ -354,6 +369,7 @@
433 'table': table,
434 'totals': totals,
435 'chart_api': chart_api,
436+ 'all': all,
437 'bread_crumb_trail': BreadCrumbTrail.leading_to(
438 machine_image_details,
439 arch=arch,

Subscribers

People subscribed via source and target branches