Merge lp:~allanlesage/helipad/kill-jenkinsrun into lp:helipad/ci

Proposed by Chris Johnston
Status: Merged
Approved by: Chris Johnston
Approved revision: 41
Merged at revision: 38
Proposed branch: lp:~allanlesage/helipad/kill-jenkinsrun
Merge into: lp:helipad/ci
Diff against target: 952 lines (+0/-587)
9 files modified
admin.py (+0/-5)
migrations/0001_initial.py (+0/-285)
models.py (+0/-20)
tests/unit/__init__.py (+0/-2)
tests/unit/test_jenkins_build_import.py (+0/-4)
tests/unit/test_jenkins_run.py (+0/-46)
tests/unit/test_jenkins_run_import.py (+0/-130)
util/jenkins_build.py (+0/-11)
util/jenkins_run.py (+0/-84)
To merge this branch: bzr merge lp:~allanlesage/helipad/kill-jenkinsrun
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve
Chris Johnston Approve
Francis Ginther Pending
Review via email: mp+179065@code.launchpad.net

This proposal supersedes a proposal from 2013-08-02.

Commit message

Eliminate JenkinsRun.

Description of the change

While we were re-rolling the initial migration cjohnston suggested getting rid of JenkinsRun; fginther confirmed that we're no longer doing the multi-configuration builds at all and no longer need to support JenkinsRuns; this branch eliminates and fixes relevant tests.

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

PASSED: Continuous integration, rev:39
http://s-jenkins:8080/job/helipad-ci-ci/58/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins:8080/job/helipad-ci-ci/58/rebuild

review: Approve (continuous-integration)
Revision history for this message
Francis Ginther (fginther) wrote : Posted in a previous version of this proposal

LGTM

review: Approve
Revision history for this message
Chris Johnston (cjohnston) wrote :

Conflicts

review: Needs Fixing
40. By Allan LeSage

Merge trunk, resolving migration conflict.

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

FAILED: Continuous integration, rev:40
http://s-jenkins:8080/job/helipad-ci-ci/62/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins:8080/job/helipad-ci-ci/62/rebuild

review: Needs Fixing (continuous-integration)
41. By Allan LeSage

Re-removed last_build members from migration.

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

FAILED: Continuous integration, rev:41
http://s-jenkins:8080/job/helipad-ci-ci/63/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins:8080/job/helipad-ci-ci/63/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Chris Johnston (cjohnston) :
review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'admin.py'
2--- admin.py 2013-07-16 17:11:09 +0000
3+++ admin.py 2013-08-07 23:29:27 +0000
4@@ -16,7 +16,6 @@
5 from ci.models import (CiProject,
6 JenkinsJob,
7 JenkinsBuild,
8- JenkinsRun,
9 JenkinsTestReport,
10 JenkinsCoverageReport,
11 JenkinsFlavor,
12@@ -45,9 +44,6 @@
13 list_display = ('url',)
14 filter_horizontal = ("downstream_builds",)
15
16-class JenkinsRunAdmin(admin.ModelAdmin):
17- list_display = ('url',)
18-
19 class JenkinsFlavorAdmin(admin.ModelAdmin):
20 list_display = ('name',)
21
22@@ -66,7 +62,6 @@
23 admin.site.register(CiProject, CiProjectAdmin)
24 admin.site.register(JenkinsJob, JenkinsJobAdmin)
25 admin.site.register(JenkinsBuild, JenkinsBuildAdmin)
26-admin.site.register(JenkinsRun, JenkinsRunAdmin)
27 admin.site.register(JenkinsFlavor, JenkinsFlavorAdmin)
28 admin.site.register(Series, SeriesAdmin)
29 admin.site.register(JenkinsResult, JenkinsResultAdmin)
30
31=== added file 'migrations/0001_initial.py'
32--- migrations/0001_initial.py 1970-01-01 00:00:00 +0000
33+++ migrations/0001_initial.py 2013-08-07 23:29:27 +0000
34@@ -0,0 +1,250 @@
35+# -*- coding: utf-8 -*-
36+import datetime
37+from south.db import db
38+from south.v2 import SchemaMigration
39+from django.db import models
40+
41+
42+class Migration(SchemaMigration):
43+
44+ def forwards(self, orm):
45+ # Adding model 'JenkinsJob'
46+ db.create_table('ci_jenkinsjob', (
47+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
48+ ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=256)),
49+ ('url', self.gf('django.db.models.fields.URLField')(max_length=200)),
50+ ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jenkins_jobs', null=True, to=orm['ci.CiProject'])),
51+ ('upstream_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='downstream_jobs', null=True, to=orm['ci.JenkinsJob'])),
52+ ('buildable', self.gf('django.db.models.fields.BooleanField')(default=False)),
53+ ('in_queue', self.gf('django.db.models.fields.BooleanField')(default=False)),
54+ ))
55+ db.send_create_signal('ci', ['JenkinsJob'])
56+
57+ # Adding model 'CiProject'
58+ db.create_table('ci_ciproject', (
59+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
60+ ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=256)),
61+ ('release', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Release'], null=True)),
62+ ('stack', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Cu2dStack'], null=True)),
63+ ('ci_primary_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ci_primary', null=True, to=orm['ci.JenkinsJob'])),
64+ ('autolanding_primary_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='autolanding_primary', null=True, to=orm['ci.JenkinsJob'])),
65+ ('launchpad_project', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.LaunchpadProject'], null=True)),
66+ ))
67+ db.send_create_signal('ci', ['CiProject'])
68+
69+ # Adding model 'LaunchpadProject'
70+ db.create_table('ci_launchpadproject', (
71+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
72+ ('name', self.gf('django.db.models.fields.CharField')(max_length=256)),
73+ ))
74+ db.send_create_signal('ci', ['LaunchpadProject'])
75+
76+ # Adding model 'Cu2dStack'
77+ db.create_table('ci_cu2dstack', (
78+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
79+ ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
80+ ('series', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Series'], null=True)),
81+ ('ppa', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
82+ ('release', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Release'], null=True)),
83+ ('integration_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='integration', null=True, to=orm['ci.JenkinsJob'])),
84+ ))
85+ db.send_create_signal('ci', ['Cu2dStack'])
86+
87+ # Adding model 'JenkinsTestReport'
88+ db.create_table('ci_jenkinstestreport', (
89+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
90+ ('fail_count', self.gf('django.db.models.fields.IntegerField')()),
91+ ('pass_count', self.gf('django.db.models.fields.IntegerField')()),
92+ ('skip_count', self.gf('django.db.models.fields.IntegerField')()),
93+ ('duration', self.gf('django.db.models.fields.IntegerField')()),
94+ ))
95+ db.send_create_signal('ci', ['JenkinsTestReport'])
96+
97+ # Adding model 'JenkinsCoverageReport'
98+ db.create_table('ci_jenkinscoveragereport', (
99+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
100+ ('jenkins_build', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsBuild'], unique=True, null=True)),
101+ ('line_count', self.gf('django.db.models.fields.IntegerField')()),
102+ ('hit_count', self.gf('django.db.models.fields.IntegerField')()),
103+ ('branch_count', self.gf('django.db.models.fields.IntegerField')()),
104+ ('taken_count', self.gf('django.db.models.fields.IntegerField')()),
105+ ('total_count', self.gf('django.db.models.fields.IntegerField')()),
106+ ))
107+ db.send_create_signal('ci', ['JenkinsCoverageReport'])
108+
109+ # Adding model 'JenkinsFlavor'
110+ db.create_table('ci_jenkinsflavor', (
111+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
112+ ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
113+ ))
114+ db.send_create_signal('ci', ['JenkinsFlavor'])
115+
116+ # Adding model 'Release'
117+ db.create_table('ci_release', (
118+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
119+ ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
120+ ))
121+ db.send_create_signal('ci', ['Release'])
122+
123+ # Adding model 'Series'
124+ db.create_table('ci_series', (
125+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
126+ ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
127+ ))
128+ db.send_create_signal('ci', ['Series'])
129+
130+ # Adding model 'JenkinsResult'
131+ db.create_table('ci_jenkinsresult', (
132+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
133+ ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
134+ ))
135+ db.send_create_signal('ci', ['JenkinsResult'])
136+
137+ # Adding model 'JenkinsBuild'
138+ db.create_table('ci_jenkinsbuild', (
139+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
140+ ('jenkins_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='builds', null=True, to=orm['ci.JenkinsJob'])),
141+ ('number', self.gf('django.db.models.fields.IntegerField')()),
142+ ('timestamp', self.gf('django.db.models.fields.DateTimeField')()),
143+ ('url', self.gf('django.db.models.fields.URLField')(unique=True, max_length=200)),
144+ ('result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsResult'])),
145+ ('coverage_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsCoverageReport'], null=True)),
146+ ('test_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsTestReport'], null=True)),
147+ ))
148+ db.send_create_signal('ci', ['JenkinsBuild'])
149+
150+ # Adding M2M table for field downstream_builds on 'JenkinsBuild'
151+ db.create_table('ci_jenkinsbuild_downstream_builds', (
152+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
153+ ('from_jenkinsbuild', models.ForeignKey(orm['ci.jenkinsbuild'], null=False)),
154+ ('to_jenkinsbuild', models.ForeignKey(orm['ci.jenkinsbuild'], null=False))
155+ ))
156+ db.create_unique('ci_jenkinsbuild_downstream_builds', ['from_jenkinsbuild_id', 'to_jenkinsbuild_id'])
157+
158+
159+ def backwards(self, orm):
160+ # Deleting model 'JenkinsJob'
161+ db.delete_table('ci_jenkinsjob')
162+
163+ # Deleting model 'CiProject'
164+ db.delete_table('ci_ciproject')
165+
166+ # Deleting model 'LaunchpadProject'
167+ db.delete_table('ci_launchpadproject')
168+
169+ # Deleting model 'Cu2dStack'
170+ db.delete_table('ci_cu2dstack')
171+
172+ # Deleting model 'JenkinsTestReport'
173+ db.delete_table('ci_jenkinstestreport')
174+
175+ # Deleting model 'JenkinsCoverageReport'
176+ db.delete_table('ci_jenkinscoveragereport')
177+
178+ # Deleting model 'JenkinsFlavor'
179+ db.delete_table('ci_jenkinsflavor')
180+
181+ # Deleting model 'Release'
182+ db.delete_table('ci_release')
183+
184+ # Deleting model 'Series'
185+ db.delete_table('ci_series')
186+
187+ # Deleting model 'JenkinsResult'
188+ db.delete_table('ci_jenkinsresult')
189+
190+ # Deleting model 'JenkinsBuild'
191+ db.delete_table('ci_jenkinsbuild')
192+
193+ # Removing M2M table for field downstream_builds on 'JenkinsBuild'
194+ db.delete_table('ci_jenkinsbuild_downstream_builds')
195+
196+
197+ models = {
198+ 'ci.ciproject': {
199+ 'Meta': {'object_name': 'CiProject'},
200+ 'autolanding_primary_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'autolanding_primary'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
201+ 'ci_primary_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ci_primary'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
202+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
203+ 'launchpad_project': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.LaunchpadProject']", 'null': 'True'}),
204+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
205+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Release']", 'null': 'True'}),
206+ 'stack': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Cu2dStack']", 'null': 'True'})
207+ },
208+ 'ci.cu2dstack': {
209+ 'Meta': {'object_name': 'Cu2dStack'},
210+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
211+ 'integration_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'integration'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
212+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
213+ 'ppa': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
214+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Release']", 'null': 'True'}),
215+ 'series': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Series']", 'null': 'True'})
216+ },
217+ 'ci.jenkinsbuild': {
218+ 'Meta': {'object_name': 'JenkinsBuild'},
219+ 'coverage_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsCoverageReport']", 'null': 'True'}),
220+ 'downstream_builds': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ci.JenkinsBuild']", 'symmetrical': 'False'}),
221+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
222+ 'jenkins_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'builds'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
223+ 'number': ('django.db.models.fields.IntegerField', [], {}),
224+ 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsResult']"}),
225+ 'test_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsTestReport']", 'null': 'True'}),
226+ 'timestamp': ('django.db.models.fields.DateTimeField', [], {}),
227+ 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
228+ },
229+ 'ci.jenkinscoveragereport': {
230+ 'Meta': {'object_name': 'JenkinsCoverageReport'},
231+ 'branch_count': ('django.db.models.fields.IntegerField', [], {}),
232+ 'hit_count': ('django.db.models.fields.IntegerField', [], {}),
233+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
234+ 'jenkins_build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsBuild']", 'unique': 'True', 'null': 'True'}),
235+ 'line_count': ('django.db.models.fields.IntegerField', [], {}),
236+ 'taken_count': ('django.db.models.fields.IntegerField', [], {}),
237+ 'total_count': ('django.db.models.fields.IntegerField', [], {})
238+ },
239+ 'ci.jenkinsflavor': {
240+ 'Meta': {'object_name': 'JenkinsFlavor'},
241+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
242+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
243+ },
244+ 'ci.jenkinsjob': {
245+ 'Meta': {'object_name': 'JenkinsJob'},
246+ 'buildable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
247+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
248+ 'in_queue': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
249+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
250+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jenkins_jobs'", 'null': 'True', 'to': "orm['ci.CiProject']"}),
251+ 'upstream_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'downstream_jobs'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
252+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
253+ },
254+ 'ci.jenkinsresult': {
255+ 'Meta': {'object_name': 'JenkinsResult'},
256+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
257+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
258+ },
259+ 'ci.jenkinstestreport': {
260+ 'Meta': {'object_name': 'JenkinsTestReport'},
261+ 'duration': ('django.db.models.fields.IntegerField', [], {}),
262+ 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
263+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
264+ 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
265+ 'skip_count': ('django.db.models.fields.IntegerField', [], {})
266+ },
267+ 'ci.launchpadproject': {
268+ 'Meta': {'object_name': 'LaunchpadProject'},
269+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
270+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'})
271+ },
272+ 'ci.release': {
273+ 'Meta': {'object_name': 'Release'},
274+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
275+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
276+ },
277+ 'ci.series': {
278+ 'Meta': {'object_name': 'Series'},
279+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
280+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
281+ }
282+ }
283+
284+ complete_apps = ['ci']
285
286=== removed file 'migrations/0001_initial.py'
287--- migrations/0001_initial.py 2013-08-01 19:02:22 +0000
288+++ migrations/0001_initial.py 1970-01-01 00:00:00 +0000
289@@ -1,285 +0,0 @@
290-# -*- coding: utf-8 -*-
291-import datetime
292-from south.db import db
293-from south.v2 import SchemaMigration
294-from django.db import models
295-
296-
297-class Migration(SchemaMigration):
298-
299- def forwards(self, orm):
300- # Adding model 'JenkinsJob'
301- db.create_table('ci_jenkinsjob', (
302- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
303- ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=256)),
304- ('url', self.gf('django.db.models.fields.URLField')(max_length=200)),
305- ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jenkins_jobs', null=True, to=orm['ci.CiProject'])),
306- ('upstream_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='downstream_jobs', null=True, to=orm['ci.JenkinsJob'])),
307- ('buildable', self.gf('django.db.models.fields.BooleanField')(default=False)),
308- ('in_queue', self.gf('django.db.models.fields.BooleanField')(default=False)),
309- ))
310- db.send_create_signal('ci', ['JenkinsJob'])
311-
312- # Adding model 'CiProject'
313- db.create_table('ci_ciproject', (
314- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
315- ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=256)),
316- ('release', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Release'], null=True)),
317- ('stack', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Cu2dStack'], null=True)),
318- ('ci_primary_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ci_primary', null=True, to=orm['ci.JenkinsJob'])),
319- ('autolanding_primary_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='autolanding_primary', null=True, to=orm['ci.JenkinsJob'])),
320- ('launchpad_project', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.LaunchpadProject'], null=True)),
321- ))
322- db.send_create_signal('ci', ['CiProject'])
323-
324- # Adding model 'LaunchpadProject'
325- db.create_table('ci_launchpadproject', (
326- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
327- ('name', self.gf('django.db.models.fields.CharField')(max_length=256)),
328- ))
329- db.send_create_signal('ci', ['LaunchpadProject'])
330-
331- # Adding model 'Cu2dStack'
332- db.create_table('ci_cu2dstack', (
333- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
334- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
335- ('series', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Series'], null=True)),
336- ('ppa', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
337- ('release', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Release'], null=True)),
338- ('integration_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='integration', null=True, to=orm['ci.JenkinsJob'])),
339- ))
340- db.send_create_signal('ci', ['Cu2dStack'])
341-
342- # Adding model 'JenkinsTestReport'
343- db.create_table('ci_jenkinstestreport', (
344- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
345- ('fail_count', self.gf('django.db.models.fields.IntegerField')()),
346- ('pass_count', self.gf('django.db.models.fields.IntegerField')()),
347- ('skip_count', self.gf('django.db.models.fields.IntegerField')()),
348- ('duration', self.gf('django.db.models.fields.IntegerField')()),
349- ))
350- db.send_create_signal('ci', ['JenkinsTestReport'])
351-
352- # Adding model 'JenkinsCoverageReport'
353- db.create_table('ci_jenkinscoveragereport', (
354- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
355- ('jenkins_build', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsBuild'], unique=True, null=True)),
356- ('line_count', self.gf('django.db.models.fields.IntegerField')()),
357- ('hit_count', self.gf('django.db.models.fields.IntegerField')()),
358- ('branch_count', self.gf('django.db.models.fields.IntegerField')()),
359- ('taken_count', self.gf('django.db.models.fields.IntegerField')()),
360- ('total_count', self.gf('django.db.models.fields.IntegerField')()),
361- ))
362- db.send_create_signal('ci', ['JenkinsCoverageReport'])
363-
364- # Adding model 'JenkinsFlavor'
365- db.create_table('ci_jenkinsflavor', (
366- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
367- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
368- ))
369- db.send_create_signal('ci', ['JenkinsFlavor'])
370-
371- # Adding model 'Release'
372- db.create_table('ci_release', (
373- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
374- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
375- ))
376- db.send_create_signal('ci', ['Release'])
377-
378- # Adding model 'Series'
379- db.create_table('ci_series', (
380- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
381- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
382- ))
383- db.send_create_signal('ci', ['Series'])
384-
385- # Adding model 'JenkinsResult'
386- db.create_table('ci_jenkinsresult', (
387- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
388- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
389- ))
390- db.send_create_signal('ci', ['JenkinsResult'])
391-
392- # Adding model 'JenkinsRun'
393- db.create_table('ci_jenkinsrun', (
394- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
395- ('jenkins_build', self.gf('django.db.models.fields.related.ForeignKey')(related_name='runs', null=True, to=orm['ci.JenkinsBuild'])),
396- ('number', self.gf('django.db.models.fields.IntegerField')(null=True)),
397- ('name', self.gf('django.db.models.fields.CharField')(max_length=256)),
398- ('url', self.gf('django.db.models.fields.URLField')(unique=True, max_length=200)),
399- ('duration', self.gf('django.db.models.fields.IntegerField')()),
400- ('flavor', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsFlavor'])),
401- ('series', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Series'])),
402- ('result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsResult'])),
403- ('coverage_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsCoverageReport'], null=True)),
404- ('test_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsTestReport'], null=True)),
405- ('timestamp', self.gf('django.db.models.fields.DateTimeField')()),
406- ))
407- db.send_create_signal('ci', ['JenkinsRun'])
408-
409- # Adding model 'JenkinsBuild'
410- db.create_table('ci_jenkinsbuild', (
411- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
412- ('jenkins_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='builds', null=True, to=orm['ci.JenkinsJob'])),
413- ('number', self.gf('django.db.models.fields.IntegerField')()),
414- ('timestamp', self.gf('django.db.models.fields.DateTimeField')()),
415- ('url', self.gf('django.db.models.fields.URLField')(unique=True, max_length=200)),
416- ('result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsResult'])),
417- ('coverage_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsCoverageReport'], null=True)),
418- ('test_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsTestReport'], null=True)),
419- ))
420- db.send_create_signal('ci', ['JenkinsBuild'])
421-
422- # Adding M2M table for field downstream_builds on 'JenkinsBuild'
423- db.create_table('ci_jenkinsbuild_downstream_builds', (
424- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
425- ('from_jenkinsbuild', models.ForeignKey(orm['ci.jenkinsbuild'], null=False)),
426- ('to_jenkinsbuild', models.ForeignKey(orm['ci.jenkinsbuild'], null=False))
427- ))
428- db.create_unique('ci_jenkinsbuild_downstream_builds', ['from_jenkinsbuild_id', 'to_jenkinsbuild_id'])
429-
430-
431- def backwards(self, orm):
432- # Deleting model 'JenkinsJob'
433- db.delete_table('ci_jenkinsjob')
434-
435- # Deleting model 'CiProject'
436- db.delete_table('ci_ciproject')
437-
438- # Deleting model 'LaunchpadProject'
439- db.delete_table('ci_launchpadproject')
440-
441- # Deleting model 'Cu2dStack'
442- db.delete_table('ci_cu2dstack')
443-
444- # Deleting model 'JenkinsTestReport'
445- db.delete_table('ci_jenkinstestreport')
446-
447- # Deleting model 'JenkinsCoverageReport'
448- db.delete_table('ci_jenkinscoveragereport')
449-
450- # Deleting model 'JenkinsFlavor'
451- db.delete_table('ci_jenkinsflavor')
452-
453- # Deleting model 'Release'
454- db.delete_table('ci_release')
455-
456- # Deleting model 'Series'
457- db.delete_table('ci_series')
458-
459- # Deleting model 'JenkinsResult'
460- db.delete_table('ci_jenkinsresult')
461-
462- # Deleting model 'JenkinsRun'
463- db.delete_table('ci_jenkinsrun')
464-
465- # Deleting model 'JenkinsBuild'
466- db.delete_table('ci_jenkinsbuild')
467-
468- # Removing M2M table for field downstream_builds on 'JenkinsBuild'
469- db.delete_table('ci_jenkinsbuild_downstream_builds')
470-
471-
472- models = {
473- 'ci.ciproject': {
474- 'Meta': {'object_name': 'CiProject'},
475- 'autolanding_primary_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'autolanding_primary'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
476- 'ci_primary_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ci_primary'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
477- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
478- 'launchpad_project': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.LaunchpadProject']", 'null': 'True'}),
479- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
480- 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Release']", 'null': 'True'}),
481- 'stack': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Cu2dStack']", 'null': 'True'})
482- },
483- 'ci.cu2dstack': {
484- 'Meta': {'object_name': 'Cu2dStack'},
485- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
486- 'integration_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'integration'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
487- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
488- 'ppa': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
489- 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Release']", 'null': 'True'}),
490- 'series': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Series']", 'null': 'True'})
491- },
492- 'ci.jenkinsbuild': {
493- 'Meta': {'object_name': 'JenkinsBuild'},
494- 'coverage_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsCoverageReport']", 'null': 'True'}),
495- 'downstream_builds': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ci.JenkinsBuild']", 'symmetrical': 'False'}),
496- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
497- 'jenkins_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'builds'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
498- 'number': ('django.db.models.fields.IntegerField', [], {}),
499- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsResult']"}),
500- 'test_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsTestReport']", 'null': 'True'}),
501- 'timestamp': ('django.db.models.fields.DateTimeField', [], {}),
502- 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
503- },
504- 'ci.jenkinscoveragereport': {
505- 'Meta': {'object_name': 'JenkinsCoverageReport'},
506- 'branch_count': ('django.db.models.fields.IntegerField', [], {}),
507- 'hit_count': ('django.db.models.fields.IntegerField', [], {}),
508- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
509- 'jenkins_build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsBuild']", 'unique': 'True', 'null': 'True'}),
510- 'line_count': ('django.db.models.fields.IntegerField', [], {}),
511- 'taken_count': ('django.db.models.fields.IntegerField', [], {}),
512- 'total_count': ('django.db.models.fields.IntegerField', [], {})
513- },
514- 'ci.jenkinsflavor': {
515- 'Meta': {'object_name': 'JenkinsFlavor'},
516- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
517- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
518- },
519- 'ci.jenkinsjob': {
520- 'Meta': {'object_name': 'JenkinsJob'},
521- 'buildable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
522- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
523- 'in_queue': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
524- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
525- 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jenkins_jobs'", 'null': 'True', 'to': "orm['ci.CiProject']"}),
526- 'upstream_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'downstream_jobs'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
527- 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
528- },
529- 'ci.jenkinsresult': {
530- 'Meta': {'object_name': 'JenkinsResult'},
531- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
532- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
533- },
534- 'ci.jenkinsrun': {
535- 'Meta': {'object_name': 'JenkinsRun'},
536- 'coverage_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsCoverageReport']", 'null': 'True'}),
537- 'duration': ('django.db.models.fields.IntegerField', [], {}),
538- 'flavor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsFlavor']"}),
539- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
540- 'jenkins_build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'runs'", 'null': 'True', 'to': "orm['ci.JenkinsBuild']"}),
541- 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
542- 'number': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
543- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsResult']"}),
544- 'series': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Series']"}),
545- 'test_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsTestReport']", 'null': 'True'}),
546- 'timestamp': ('django.db.models.fields.DateTimeField', [], {}),
547- 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
548- },
549- 'ci.jenkinstestreport': {
550- 'Meta': {'object_name': 'JenkinsTestReport'},
551- 'duration': ('django.db.models.fields.IntegerField', [], {}),
552- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
553- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
554- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
555- 'skip_count': ('django.db.models.fields.IntegerField', [], {})
556- },
557- 'ci.launchpadproject': {
558- 'Meta': {'object_name': 'LaunchpadProject'},
559- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
560- 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'})
561- },
562- 'ci.release': {
563- 'Meta': {'object_name': 'Release'},
564- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
565- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
566- },
567- 'ci.series': {
568- 'Meta': {'object_name': 'Series'},
569- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
570- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
571- }
572- }
573-
574- complete_apps = ['ci']
575\ No newline at end of file
576
577=== modified file 'models.py'
578--- models.py 2013-08-07 22:49:36 +0000
579+++ models.py 2013-08-07 23:29:27 +0000
580@@ -439,26 +439,6 @@
581 return self.name
582
583
584-class JenkinsRun(models.Model):
585-
586- jenkins_build = models.ForeignKey('JenkinsBuild',
587- related_name='runs',
588- null=True)
589- number = models.IntegerField(null=True)
590- name = models.CharField(max_length=256)
591- url = models.URLField(unique=True)
592- duration = models.IntegerField() # seconds
593- flavor = models.ForeignKey('JenkinsFlavor')
594- series = models.ForeignKey('Series')
595- result = models.ForeignKey('JenkinsResult')
596- coverage_report = models.ForeignKey('JenkinsCoverageReport', null=True)
597- test_report = models.ForeignKey('JenkinsTestReport', null=True)
598- timestamp = models.DateTimeField()
599-
600- def __unicode__(self):
601- return self.name
602-
603-
604 class JenkinsBuild(models.Model):
605 """A Jenkins build."""
606
607
608=== modified file 'tests/unit/__init__.py'
609--- tests/unit/__init__.py 2013-07-25 00:00:00 +0000
610+++ tests/unit/__init__.py 2013-08-07 23:29:27 +0000
611@@ -27,8 +27,6 @@
612 from test_jenkins_job_import import *
613 from test_jenkins_job import *
614 from test_jenkins_result import *
615-from test_jenkins_run_import import *
616-from test_jenkins_run import *
617 from test_jenkins_test_report_import import *
618 from test_launchpad_project_import import *
619 from test_launchpad_project import *
620
621=== modified file 'tests/unit/test_jenkins_build_import.py'
622--- tests/unit/test_jenkins_build_import.py 2013-07-26 01:50:54 +0000
623+++ tests/unit/test_jenkins_build_import.py 2013-08-07 23:29:27 +0000
624@@ -45,9 +45,6 @@
625
626 def setUp(self):
627 super(TestCreateFromUrl, self).setUp()
628- self.create_downstream_runs_patch = patch(
629- 'ci.util.jenkins_build.create_downstream_runs')
630- self.create_downstream_runs_patch.start()
631 self.create_downstream_builds_patch = patch(
632 'ci.util.jenkins_build.create_downstream_builds')
633 self.create_downstream_builds_patch.start()
634@@ -65,7 +62,6 @@
635 self.aggregate_test_report_patch.start()
636
637 def tearDown(self):
638- self.create_downstream_runs_patch.stop()
639 self.create_downstream_builds_patch.stop()
640 self.create_cobertura_report_patch.stop()
641 self.create_jenkins_test_report_patch.stop()
642
643=== removed file 'tests/unit/test_jenkins_run.py'
644--- tests/unit/test_jenkins_run.py 2013-07-16 17:29:47 +0000
645+++ tests/unit/test_jenkins_run.py 1970-01-01 00:00:00 +0000
646@@ -1,46 +0,0 @@
647-# QA Dashboard
648-# Copyright 2012-2013 Canonical Ltd.
649-
650-# This program is free software: you can redistribute it and/or modify it
651-# under the terms of the GNU Affero General Public License version 3, as
652-# published by the Free Software Foundation.
653-
654-# This program is distributed in the hope that it will be useful, but
655-# WITHOUT ANY WARRANTY; without even the implied warranties of
656-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
657-# PURPOSE. See the GNU Affero General Public License for more details.
658-
659-# You should have received a copy of the GNU Affero General Public License
660-# along with this program. If not, see <http://www.gnu.org/licenses/>.
661-
662-from mock import MagicMock, patch
663-from django.test import TestCase
664-from django.db import IntegrityError
665-from ci.models import JenkinsRun
666-import ci.util.extractor as extractor
667-
668-
669-class TestJenkinsRun(TestCase):
670-
671- def setUp(self):
672- jenkins_run_mock = MagicMock(
673- spec=JenkinsRun,
674- return_value=None)
675- self.jenkins_run_patch = patch.object(
676- JenkinsRun,
677- '__init__',
678- new=jenkins_run_mock)
679- self.jenkins_run_patch.start()
680- self.jenkins_run = \
681- JenkinsRun()
682- self.logger_patch = patch('ci.models.logger')
683- self.logger_patch.start()
684-
685- def tearDown(self):
686- self.jenkins_run_patch.stop()
687- self.logger_patch.stop()
688-
689- def test_unicode(self):
690- self.jenkins_run.name = 'indicator-sync-i386-raring-autolanding'
691- self.assertEqual('indicator-sync-i386-raring-autolanding',
692- str(self.jenkins_run))
693
694=== removed file 'tests/unit/test_jenkins_run_import.py'
695--- tests/unit/test_jenkins_run_import.py 2013-07-16 17:29:47 +0000
696+++ tests/unit/test_jenkins_run_import.py 1970-01-01 00:00:00 +0000
697@@ -1,130 +0,0 @@
698-# QA Dashboard
699-# Copyright 2012-2013 Canonical Ltd.
700-
701-# This program is free software: you can redistribute it and/or modify it
702-# under the terms of the GNU Affero General Public License version 3, as
703-# published by the Free Software Foundation.
704-
705-# This program is distributed in the hope that it will be useful, but
706-# WITHOUT ANY WARRANTY; without even the implied warranties of
707-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
708-# PURPOSE. See the GNU Affero General Public License for more details.
709-
710-# You should have received a copy of the GNU Affero General Public License
711-# along with this program. If not, see <http://www.gnu.org/licenses/>.
712-
713-from mock import MagicMock, patch
714-from django.test import TestCase
715-from django.db import IntegrityError
716-from ci.models import JenkinsJob, JenkinsRun
717-import ci.util.extractor as extractor
718-from ci.util.jenkins_run import create_jenkins_run_from_url
719-
720-
721-class TestCreateFromUrl(TestCase):
722-
723- def setUp(self):
724- self.logger_patch = patch('ci.models.logger')
725- self.logger_patch.start()
726- self.fake_url = "http://this.string.is.actually.a.URL/no/kidding"
727- self.fake_jenkins_build = "a Django representation of a Jenkins job"
728-
729- def tearDown(self):
730- self.logger_patch.stop()
731-
732- def test_vanilla(self):
733- extractor_jenkins_run = MagicMock()
734- jenkins_flavor_get_or_create = MagicMock(return_value=(
735- 'fake_jenkins_flavor', False))
736- series_get_or_create = MagicMock(return_value=(
737- 'fake_series', False))
738- jenkins_result_get_or_create = MagicMock(return_value=(
739- 'fake_jenkins_result', False))
740- with patch('ci.util.extractor.JenkinsRun', extractor_jenkins_run), \
741- patch('ci.models.JenkinsFlavor.objects.get_or_create',
742- jenkins_flavor_get_or_create), \
743- patch('ci.models.Series.objects.get_or_create',
744- series_get_or_create), \
745- patch('ci.models.JenkinsResult.objects.get_or_create',
746- jenkins_result_get_or_create), \
747- patch('ci.models.JenkinsRun.objects.create') as jenkins_run_objects_create:
748- extractor_jenkins_run.return_value.number = 42
749- extractor_jenkins_run.return_value.name = 'fake_jenkins_run_name'
750- duration_mock = MagicMock()
751- duration_mock.seconds = 3.1415
752- extractor_jenkins_run.return_value.duration = duration_mock
753- extractor_jenkins_run.return_value.timestamp = 'fake_timestamp'
754- extractor_jenkins_run.return_value.parameters = 'fake_parameters'
755- result = create_jenkins_run_from_url(
756- self.fake_url, self.fake_jenkins_build)
757- jenkins_run_objects_create.assert_called_with(
758- jenkins_build=self.fake_jenkins_build,
759- number=42,
760- name='fake_jenkins_run_name',
761- url=self.fake_url,
762- duration=3.1415,
763- timestamp='fake_timestamp',
764- flavor='fake_jenkins_flavor',
765- series='fake_series',
766- result='fake_jenkins_result')
767-
768- def test_extractor_build_result_is_none(self):
769- """Weird but extractor returns None for result b/c no runs at all."""
770-
771- self.fake_url = "http://this.string.is.actually.a.URL/no/kidding"
772- self.fake_jenkins_build = "a Django representation of a Jenkins build"
773- extractor_jenkins_run = MagicMock()
774- jenkins_flavor_get_or_create = MagicMock(return_value=(
775- 'fake_jenkins_flavor', False))
776- series_get_or_create = MagicMock(return_value=(
777- 'fake_series', False))
778- jenkins_result_get_or_create = MagicMock(side_effect=IntegrityError)
779- with patch('ci.util.extractor.JenkinsRun', extractor_jenkins_run), \
780- patch('ci.models.JenkinsFlavor.objects.get_or_create',
781- jenkins_flavor_get_or_create), \
782- patch('ci.models.Series.objects.get_or_create', series_get_or_create), \
783- patch('ci.models.JenkinsResult.objects.get_or_create', jenkins_result_get_or_create), \
784- patch('ci.models.JenkinsRun.objects.create') as jenkins_run_objects_create:
785- result = create_jenkins_run_from_url(
786- self.fake_url, self.fake_jenkins_build)
787- self.assertIsNone(result)
788-
789- def test_run_duplicate_integrity_error(self):
790- self.fake_url = "http://this.string.is.actually.a.URL/no/kidding"
791- self.fake_jenkins_build = "a Django representation of a Jenkins job"
792- extractor_jenkins_run = MagicMock()
793- jenkins_flavor_get_or_create = MagicMock(return_value=(
794- 'fake_jenkins_flavor', False))
795- series_get_or_create = MagicMock(return_value=(
796- 'fake_series', False))
797- jenkins_result_get_or_create = MagicMock(return_value=(
798- 'fake_jenkins_result', False))
799- with patch('ci.util.extractor.JenkinsRun', extractor_jenkins_run), \
800- patch('ci.models.JenkinsFlavor.objects.get_or_create',
801- jenkins_flavor_get_or_create), \
802- patch('ci.models.Series.objects.get_or_create',
803- series_get_or_create), \
804- patch('ci.models.JenkinsResult.objects.get_or_create',
805- jenkins_result_get_or_create), \
806- patch('ci.models.JenkinsRun.objects.create') as jenkins_run_objects_create:
807- jenkins_run_objects_create.side_effect = IntegrityError
808- extractor_jenkins_run.return_value.number = 42
809- extractor_jenkins_run.return_value.name = 'fake_jenkins_run_name'
810- duration_mock = MagicMock()
811- duration_mock.seconds = 3.1415
812- extractor_jenkins_run.return_value.duration = duration_mock
813- extractor_jenkins_run.return_value.timestamp = 'fake_timestamp'
814- extractor_jenkins_run.return_value.parameters = 'fake_parameters'
815- result = create_jenkins_run_from_url(
816- self.fake_url, self.fake_jenkins_build)
817- jenkins_run_objects_create.assert_called_with(
818- jenkins_build=self.fake_jenkins_build,
819- number=42,
820- name='fake_jenkins_run_name',
821- url=self.fake_url,
822- duration=3.1415,
823- timestamp='fake_timestamp',
824- flavor='fake_jenkins_flavor',
825- series='fake_series',
826- result='fake_jenkins_result')
827- self.assertIsNone(result)
828
829=== modified file 'util/jenkins_build.py'
830--- util/jenkins_build.py 2013-07-20 19:28:08 +0000
831+++ util/jenkins_build.py 2013-08-07 23:29:27 +0000
832@@ -23,7 +23,6 @@
833 import ci.util.extractor as extractor
834 from ci.util.coverage_report import create_coverage_report_from_url
835 from ci.util.jenkins_test_report import create_jenkins_test_report_from_url
836-from ci.util.jenkins_run import create_jenkins_run_from_url
837
838 logger = logging.getLogger('qa_dashboard')
839
840@@ -81,15 +80,6 @@
841 ci_jenkins_build.save()
842
843
844-# FIXME: restore support for multi-configuration builds
845-def create_downstream_runs(ci_jenkins_build, extractor_build):
846- logger.debug("importing runs associated with JenkinsBuild at {}".format(extractor_build.url))
847- for run in extractor_build.runs:
848- pass
849- # FIXME: retore this, it breaks within
850- #jenkins_run = create_jenkins_run_from_url(run.url,
851- # ci_jenkins_build)
852-
853 def create_cobertura_report(jenkins_build, extractor_build):
854 """Get a Cobertura coverage report associated with a build url.
855
856@@ -248,7 +238,6 @@
857 logger.info("Duplicate Jenkins build found at {}".format(url))
858 return None
859
860- create_downstream_runs(jenkins_build, extractor_build)
861 create_downstream_builds(jenkins_build, extractor_build)
862 create_cobertura_report(jenkins_build, extractor_build)
863 create_jenkins_test_report(jenkins_build, extractor_build)
864
865=== removed file 'util/jenkins_run.py'
866--- util/jenkins_run.py 2013-07-16 17:29:47 +0000
867+++ util/jenkins_run.py 1970-01-01 00:00:00 +0000
868@@ -1,84 +0,0 @@
869-# QA Dashboard
870-# Copyright 2012-2013 Canonical Ltd.
871-
872-# This program is free software: you can redistribute it and/or modify it
873-# under the terms of the GNU Affero General Public License version 3, as
874-# published by the Free Software Foundation.
875-
876-# This program is distributed in the hope that it will be useful, but
877-# WITHOUT ANY WARRANTY; without even the implied warranties of
878-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
879-# PURPOSE. See the GNU Affero General Public License for more details.
880-
881-# You should have received a copy of the GNU Affero General Public License
882-# along with this program. If not, see <http://www.gnu.org/licenses/>.
883-
884-import logging
885-from django.db import IntegrityError, transaction
886-from ci.models import (JenkinsFlavor,
887- JenkinsRun,
888- Series,
889- JenkinsResult)
890-import ci.util.extractor as extractor
891-
892-logger = logging.getLogger("qa_dashboard")
893-
894-
895-def create_jenkins_run_from_url(url, jenkins_build):
896- extractor_run = extractor.JenkinsRun(url)
897- flavor, created = JenkinsFlavor.objects.get_or_create(name=extractor_run.flavor)
898- series, created = Series.objects.get_or_create(name=extractor_run.series)
899- try:
900- result, created = JenkinsResult.objects.get_or_create(name=extractor_run.result)
901- except IntegrityError, e:
902- # no builds yet, IntegrityError on None name
903- transaction.rollback()
904- return None
905- try:
906- logger.debug("creating JenkinsRun at {}".format(url))
907- jenkins_run = JenkinsRun.objects.create(
908- jenkins_build=jenkins_build,
909- number=extractor_run.number,
910- name=extractor_run.name,
911- url=url,
912- duration=extractor_run.duration.seconds,
913- timestamp=extractor_run.timestamp,
914- flavor=flavor,
915- series=series,
916- result=result)
917- except IntegrityError:
918- transaction.rollback()
919- logger.debug("Duplicate Jenkins run found at {}.".format(url))
920- # TODO make it possible to update a run
921- return None
922- except TypeError, e:
923- logger.debug("Error creating JenkinsRun: {}".format(e))
924- return None
925- # Disabling this until we have a JenkinsRun-specific JenkinsReport create
926- #logger.debug("Importing coverage reports associated with JenkinsRun at {}.".format(url))
927- # TODO FJG Fix this
928- #try:
929- # jenkins_run.coverage_report = JenkinsCoverageReport.objects.create(
930- # # FIXME: restore
931- # # run = jenkins_run,
932- # xml_text=extractor_run.coverage_report.xml_text,
933- # line_rate=extractor_run.coverage_report.line_rate,
934- # branch_rate=extractor_run.coverage_report.branch_rate)
935- # jenkins_run.save()
936- #except EnvironmentError:
937- # # no data was found at the coverage report url
938- # pass
939- #logger.debug("importing test reports associated with JenkinsRun at {}".format(url))
940- #try:
941- # jenkins_run.test_report = JenkinsTestReport.objects.create(
942- # fail_count=extractor_run.test_report.fail_count,
943- # pass_count=extractor_run.test_report.pass_count,
944- # skip_count=extractor_run.test_report.skip_count,
945- # duration=extractor_run.test_report.duration.seconds)
946- # jenkins_run.save()
947- #except EnvironmentError:
948- # # no data was found at the test report url
949- # pass
950- #except EnvironmentError, e:
951- # logger.error(e)
952- return jenkins_run

Subscribers

People subscribed via source and target branches

to all changes: