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
=== modified file 'admin.py'
--- admin.py 2013-07-16 17:11:09 +0000
+++ admin.py 2013-08-07 23:29:27 +0000
@@ -16,7 +16,6 @@
16from ci.models import (CiProject,16from ci.models import (CiProject,
17 JenkinsJob,17 JenkinsJob,
18 JenkinsBuild,18 JenkinsBuild,
19 JenkinsRun,
20 JenkinsTestReport,19 JenkinsTestReport,
21 JenkinsCoverageReport,20 JenkinsCoverageReport,
22 JenkinsFlavor,21 JenkinsFlavor,
@@ -45,9 +44,6 @@
45 list_display = ('url',)44 list_display = ('url',)
46 filter_horizontal = ("downstream_builds",)45 filter_horizontal = ("downstream_builds",)
4746
48class JenkinsRunAdmin(admin.ModelAdmin):
49 list_display = ('url',)
50
51class JenkinsFlavorAdmin(admin.ModelAdmin):47class JenkinsFlavorAdmin(admin.ModelAdmin):
52 list_display = ('name',)48 list_display = ('name',)
5349
@@ -66,7 +62,6 @@
66admin.site.register(CiProject, CiProjectAdmin)62admin.site.register(CiProject, CiProjectAdmin)
67admin.site.register(JenkinsJob, JenkinsJobAdmin)63admin.site.register(JenkinsJob, JenkinsJobAdmin)
68admin.site.register(JenkinsBuild, JenkinsBuildAdmin)64admin.site.register(JenkinsBuild, JenkinsBuildAdmin)
69admin.site.register(JenkinsRun, JenkinsRunAdmin)
70admin.site.register(JenkinsFlavor, JenkinsFlavorAdmin)65admin.site.register(JenkinsFlavor, JenkinsFlavorAdmin)
71admin.site.register(Series, SeriesAdmin)66admin.site.register(Series, SeriesAdmin)
72admin.site.register(JenkinsResult, JenkinsResultAdmin)67admin.site.register(JenkinsResult, JenkinsResultAdmin)
7368
=== added file 'migrations/0001_initial.py'
--- migrations/0001_initial.py 1970-01-01 00:00:00 +0000
+++ migrations/0001_initial.py 2013-08-07 23:29:27 +0000
@@ -0,0 +1,250 @@
1# -*- coding: utf-8 -*-
2import datetime
3from south.db import db
4from south.v2 import SchemaMigration
5from django.db import models
6
7
8class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11 # Adding model 'JenkinsJob'
12 db.create_table('ci_jenkinsjob', (
13 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
14 ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=256)),
15 ('url', self.gf('django.db.models.fields.URLField')(max_length=200)),
16 ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jenkins_jobs', null=True, to=orm['ci.CiProject'])),
17 ('upstream_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='downstream_jobs', null=True, to=orm['ci.JenkinsJob'])),
18 ('buildable', self.gf('django.db.models.fields.BooleanField')(default=False)),
19 ('in_queue', self.gf('django.db.models.fields.BooleanField')(default=False)),
20 ))
21 db.send_create_signal('ci', ['JenkinsJob'])
22
23 # Adding model 'CiProject'
24 db.create_table('ci_ciproject', (
25 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
26 ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=256)),
27 ('release', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Release'], null=True)),
28 ('stack', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Cu2dStack'], null=True)),
29 ('ci_primary_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ci_primary', null=True, to=orm['ci.JenkinsJob'])),
30 ('autolanding_primary_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='autolanding_primary', null=True, to=orm['ci.JenkinsJob'])),
31 ('launchpad_project', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.LaunchpadProject'], null=True)),
32 ))
33 db.send_create_signal('ci', ['CiProject'])
34
35 # Adding model 'LaunchpadProject'
36 db.create_table('ci_launchpadproject', (
37 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
38 ('name', self.gf('django.db.models.fields.CharField')(max_length=256)),
39 ))
40 db.send_create_signal('ci', ['LaunchpadProject'])
41
42 # Adding model 'Cu2dStack'
43 db.create_table('ci_cu2dstack', (
44 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
45 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
46 ('series', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Series'], null=True)),
47 ('ppa', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
48 ('release', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Release'], null=True)),
49 ('integration_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='integration', null=True, to=orm['ci.JenkinsJob'])),
50 ))
51 db.send_create_signal('ci', ['Cu2dStack'])
52
53 # Adding model 'JenkinsTestReport'
54 db.create_table('ci_jenkinstestreport', (
55 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
56 ('fail_count', self.gf('django.db.models.fields.IntegerField')()),
57 ('pass_count', self.gf('django.db.models.fields.IntegerField')()),
58 ('skip_count', self.gf('django.db.models.fields.IntegerField')()),
59 ('duration', self.gf('django.db.models.fields.IntegerField')()),
60 ))
61 db.send_create_signal('ci', ['JenkinsTestReport'])
62
63 # Adding model 'JenkinsCoverageReport'
64 db.create_table('ci_jenkinscoveragereport', (
65 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
66 ('jenkins_build', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsBuild'], unique=True, null=True)),
67 ('line_count', self.gf('django.db.models.fields.IntegerField')()),
68 ('hit_count', self.gf('django.db.models.fields.IntegerField')()),
69 ('branch_count', self.gf('django.db.models.fields.IntegerField')()),
70 ('taken_count', self.gf('django.db.models.fields.IntegerField')()),
71 ('total_count', self.gf('django.db.models.fields.IntegerField')()),
72 ))
73 db.send_create_signal('ci', ['JenkinsCoverageReport'])
74
75 # Adding model 'JenkinsFlavor'
76 db.create_table('ci_jenkinsflavor', (
77 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
78 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
79 ))
80 db.send_create_signal('ci', ['JenkinsFlavor'])
81
82 # Adding model 'Release'
83 db.create_table('ci_release', (
84 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
85 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
86 ))
87 db.send_create_signal('ci', ['Release'])
88
89 # Adding model 'Series'
90 db.create_table('ci_series', (
91 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
92 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
93 ))
94 db.send_create_signal('ci', ['Series'])
95
96 # Adding model 'JenkinsResult'
97 db.create_table('ci_jenkinsresult', (
98 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
99 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
100 ))
101 db.send_create_signal('ci', ['JenkinsResult'])
102
103 # Adding model 'JenkinsBuild'
104 db.create_table('ci_jenkinsbuild', (
105 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
106 ('jenkins_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='builds', null=True, to=orm['ci.JenkinsJob'])),
107 ('number', self.gf('django.db.models.fields.IntegerField')()),
108 ('timestamp', self.gf('django.db.models.fields.DateTimeField')()),
109 ('url', self.gf('django.db.models.fields.URLField')(unique=True, max_length=200)),
110 ('result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsResult'])),
111 ('coverage_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsCoverageReport'], null=True)),
112 ('test_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsTestReport'], null=True)),
113 ))
114 db.send_create_signal('ci', ['JenkinsBuild'])
115
116 # Adding M2M table for field downstream_builds on 'JenkinsBuild'
117 db.create_table('ci_jenkinsbuild_downstream_builds', (
118 ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
119 ('from_jenkinsbuild', models.ForeignKey(orm['ci.jenkinsbuild'], null=False)),
120 ('to_jenkinsbuild', models.ForeignKey(orm['ci.jenkinsbuild'], null=False))
121 ))
122 db.create_unique('ci_jenkinsbuild_downstream_builds', ['from_jenkinsbuild_id', 'to_jenkinsbuild_id'])
123
124
125 def backwards(self, orm):
126 # Deleting model 'JenkinsJob'
127 db.delete_table('ci_jenkinsjob')
128
129 # Deleting model 'CiProject'
130 db.delete_table('ci_ciproject')
131
132 # Deleting model 'LaunchpadProject'
133 db.delete_table('ci_launchpadproject')
134
135 # Deleting model 'Cu2dStack'
136 db.delete_table('ci_cu2dstack')
137
138 # Deleting model 'JenkinsTestReport'
139 db.delete_table('ci_jenkinstestreport')
140
141 # Deleting model 'JenkinsCoverageReport'
142 db.delete_table('ci_jenkinscoveragereport')
143
144 # Deleting model 'JenkinsFlavor'
145 db.delete_table('ci_jenkinsflavor')
146
147 # Deleting model 'Release'
148 db.delete_table('ci_release')
149
150 # Deleting model 'Series'
151 db.delete_table('ci_series')
152
153 # Deleting model 'JenkinsResult'
154 db.delete_table('ci_jenkinsresult')
155
156 # Deleting model 'JenkinsBuild'
157 db.delete_table('ci_jenkinsbuild')
158
159 # Removing M2M table for field downstream_builds on 'JenkinsBuild'
160 db.delete_table('ci_jenkinsbuild_downstream_builds')
161
162
163 models = {
164 'ci.ciproject': {
165 'Meta': {'object_name': 'CiProject'},
166 'autolanding_primary_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'autolanding_primary'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
167 'ci_primary_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ci_primary'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
168 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
169 'launchpad_project': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.LaunchpadProject']", 'null': 'True'}),
170 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
171 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Release']", 'null': 'True'}),
172 'stack': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Cu2dStack']", 'null': 'True'})
173 },
174 'ci.cu2dstack': {
175 'Meta': {'object_name': 'Cu2dStack'},
176 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
177 'integration_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'integration'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
178 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
179 'ppa': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
180 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Release']", 'null': 'True'}),
181 'series': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Series']", 'null': 'True'})
182 },
183 'ci.jenkinsbuild': {
184 'Meta': {'object_name': 'JenkinsBuild'},
185 'coverage_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsCoverageReport']", 'null': 'True'}),
186 'downstream_builds': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ci.JenkinsBuild']", 'symmetrical': 'False'}),
187 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
188 'jenkins_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'builds'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
189 'number': ('django.db.models.fields.IntegerField', [], {}),
190 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsResult']"}),
191 'test_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsTestReport']", 'null': 'True'}),
192 'timestamp': ('django.db.models.fields.DateTimeField', [], {}),
193 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
194 },
195 'ci.jenkinscoveragereport': {
196 'Meta': {'object_name': 'JenkinsCoverageReport'},
197 'branch_count': ('django.db.models.fields.IntegerField', [], {}),
198 'hit_count': ('django.db.models.fields.IntegerField', [], {}),
199 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
200 'jenkins_build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsBuild']", 'unique': 'True', 'null': 'True'}),
201 'line_count': ('django.db.models.fields.IntegerField', [], {}),
202 'taken_count': ('django.db.models.fields.IntegerField', [], {}),
203 'total_count': ('django.db.models.fields.IntegerField', [], {})
204 },
205 'ci.jenkinsflavor': {
206 'Meta': {'object_name': 'JenkinsFlavor'},
207 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
208 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
209 },
210 'ci.jenkinsjob': {
211 'Meta': {'object_name': 'JenkinsJob'},
212 'buildable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
213 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
214 'in_queue': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
215 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
216 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jenkins_jobs'", 'null': 'True', 'to': "orm['ci.CiProject']"}),
217 'upstream_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'downstream_jobs'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
218 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
219 },
220 'ci.jenkinsresult': {
221 'Meta': {'object_name': 'JenkinsResult'},
222 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
223 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
224 },
225 'ci.jenkinstestreport': {
226 'Meta': {'object_name': 'JenkinsTestReport'},
227 'duration': ('django.db.models.fields.IntegerField', [], {}),
228 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
229 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
230 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
231 'skip_count': ('django.db.models.fields.IntegerField', [], {})
232 },
233 'ci.launchpadproject': {
234 'Meta': {'object_name': 'LaunchpadProject'},
235 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
236 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'})
237 },
238 'ci.release': {
239 'Meta': {'object_name': 'Release'},
240 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
241 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
242 },
243 'ci.series': {
244 'Meta': {'object_name': 'Series'},
245 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
246 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
247 }
248 }
249
250 complete_apps = ['ci']
0251
=== removed file 'migrations/0001_initial.py'
--- migrations/0001_initial.py 2013-08-01 19:02:22 +0000
+++ migrations/0001_initial.py 1970-01-01 00:00:00 +0000
@@ -1,285 +0,0 @@
1# -*- coding: utf-8 -*-
2import datetime
3from south.db import db
4from south.v2 import SchemaMigration
5from django.db import models
6
7
8class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11 # Adding model 'JenkinsJob'
12 db.create_table('ci_jenkinsjob', (
13 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
14 ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=256)),
15 ('url', self.gf('django.db.models.fields.URLField')(max_length=200)),
16 ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='jenkins_jobs', null=True, to=orm['ci.CiProject'])),
17 ('upstream_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='downstream_jobs', null=True, to=orm['ci.JenkinsJob'])),
18 ('buildable', self.gf('django.db.models.fields.BooleanField')(default=False)),
19 ('in_queue', self.gf('django.db.models.fields.BooleanField')(default=False)),
20 ))
21 db.send_create_signal('ci', ['JenkinsJob'])
22
23 # Adding model 'CiProject'
24 db.create_table('ci_ciproject', (
25 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
26 ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=256)),
27 ('release', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Release'], null=True)),
28 ('stack', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Cu2dStack'], null=True)),
29 ('ci_primary_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ci_primary', null=True, to=orm['ci.JenkinsJob'])),
30 ('autolanding_primary_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='autolanding_primary', null=True, to=orm['ci.JenkinsJob'])),
31 ('launchpad_project', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.LaunchpadProject'], null=True)),
32 ))
33 db.send_create_signal('ci', ['CiProject'])
34
35 # Adding model 'LaunchpadProject'
36 db.create_table('ci_launchpadproject', (
37 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
38 ('name', self.gf('django.db.models.fields.CharField')(max_length=256)),
39 ))
40 db.send_create_signal('ci', ['LaunchpadProject'])
41
42 # Adding model 'Cu2dStack'
43 db.create_table('ci_cu2dstack', (
44 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
45 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
46 ('series', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Series'], null=True)),
47 ('ppa', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
48 ('release', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Release'], null=True)),
49 ('integration_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='integration', null=True, to=orm['ci.JenkinsJob'])),
50 ))
51 db.send_create_signal('ci', ['Cu2dStack'])
52
53 # Adding model 'JenkinsTestReport'
54 db.create_table('ci_jenkinstestreport', (
55 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
56 ('fail_count', self.gf('django.db.models.fields.IntegerField')()),
57 ('pass_count', self.gf('django.db.models.fields.IntegerField')()),
58 ('skip_count', self.gf('django.db.models.fields.IntegerField')()),
59 ('duration', self.gf('django.db.models.fields.IntegerField')()),
60 ))
61 db.send_create_signal('ci', ['JenkinsTestReport'])
62
63 # Adding model 'JenkinsCoverageReport'
64 db.create_table('ci_jenkinscoveragereport', (
65 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
66 ('jenkins_build', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsBuild'], unique=True, null=True)),
67 ('line_count', self.gf('django.db.models.fields.IntegerField')()),
68 ('hit_count', self.gf('django.db.models.fields.IntegerField')()),
69 ('branch_count', self.gf('django.db.models.fields.IntegerField')()),
70 ('taken_count', self.gf('django.db.models.fields.IntegerField')()),
71 ('total_count', self.gf('django.db.models.fields.IntegerField')()),
72 ))
73 db.send_create_signal('ci', ['JenkinsCoverageReport'])
74
75 # Adding model 'JenkinsFlavor'
76 db.create_table('ci_jenkinsflavor', (
77 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
78 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
79 ))
80 db.send_create_signal('ci', ['JenkinsFlavor'])
81
82 # Adding model 'Release'
83 db.create_table('ci_release', (
84 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
85 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
86 ))
87 db.send_create_signal('ci', ['Release'])
88
89 # Adding model 'Series'
90 db.create_table('ci_series', (
91 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
92 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
93 ))
94 db.send_create_signal('ci', ['Series'])
95
96 # Adding model 'JenkinsResult'
97 db.create_table('ci_jenkinsresult', (
98 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
99 ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
100 ))
101 db.send_create_signal('ci', ['JenkinsResult'])
102
103 # Adding model 'JenkinsRun'
104 db.create_table('ci_jenkinsrun', (
105 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
106 ('jenkins_build', self.gf('django.db.models.fields.related.ForeignKey')(related_name='runs', null=True, to=orm['ci.JenkinsBuild'])),
107 ('number', self.gf('django.db.models.fields.IntegerField')(null=True)),
108 ('name', self.gf('django.db.models.fields.CharField')(max_length=256)),
109 ('url', self.gf('django.db.models.fields.URLField')(unique=True, max_length=200)),
110 ('duration', self.gf('django.db.models.fields.IntegerField')()),
111 ('flavor', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsFlavor'])),
112 ('series', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.Series'])),
113 ('result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsResult'])),
114 ('coverage_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsCoverageReport'], null=True)),
115 ('test_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsTestReport'], null=True)),
116 ('timestamp', self.gf('django.db.models.fields.DateTimeField')()),
117 ))
118 db.send_create_signal('ci', ['JenkinsRun'])
119
120 # Adding model 'JenkinsBuild'
121 db.create_table('ci_jenkinsbuild', (
122 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
123 ('jenkins_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='builds', null=True, to=orm['ci.JenkinsJob'])),
124 ('number', self.gf('django.db.models.fields.IntegerField')()),
125 ('timestamp', self.gf('django.db.models.fields.DateTimeField')()),
126 ('url', self.gf('django.db.models.fields.URLField')(unique=True, max_length=200)),
127 ('result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsResult'])),
128 ('coverage_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsCoverageReport'], null=True)),
129 ('test_report', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ci.JenkinsTestReport'], null=True)),
130 ))
131 db.send_create_signal('ci', ['JenkinsBuild'])
132
133 # Adding M2M table for field downstream_builds on 'JenkinsBuild'
134 db.create_table('ci_jenkinsbuild_downstream_builds', (
135 ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
136 ('from_jenkinsbuild', models.ForeignKey(orm['ci.jenkinsbuild'], null=False)),
137 ('to_jenkinsbuild', models.ForeignKey(orm['ci.jenkinsbuild'], null=False))
138 ))
139 db.create_unique('ci_jenkinsbuild_downstream_builds', ['from_jenkinsbuild_id', 'to_jenkinsbuild_id'])
140
141
142 def backwards(self, orm):
143 # Deleting model 'JenkinsJob'
144 db.delete_table('ci_jenkinsjob')
145
146 # Deleting model 'CiProject'
147 db.delete_table('ci_ciproject')
148
149 # Deleting model 'LaunchpadProject'
150 db.delete_table('ci_launchpadproject')
151
152 # Deleting model 'Cu2dStack'
153 db.delete_table('ci_cu2dstack')
154
155 # Deleting model 'JenkinsTestReport'
156 db.delete_table('ci_jenkinstestreport')
157
158 # Deleting model 'JenkinsCoverageReport'
159 db.delete_table('ci_jenkinscoveragereport')
160
161 # Deleting model 'JenkinsFlavor'
162 db.delete_table('ci_jenkinsflavor')
163
164 # Deleting model 'Release'
165 db.delete_table('ci_release')
166
167 # Deleting model 'Series'
168 db.delete_table('ci_series')
169
170 # Deleting model 'JenkinsResult'
171 db.delete_table('ci_jenkinsresult')
172
173 # Deleting model 'JenkinsRun'
174 db.delete_table('ci_jenkinsrun')
175
176 # Deleting model 'JenkinsBuild'
177 db.delete_table('ci_jenkinsbuild')
178
179 # Removing M2M table for field downstream_builds on 'JenkinsBuild'
180 db.delete_table('ci_jenkinsbuild_downstream_builds')
181
182
183 models = {
184 'ci.ciproject': {
185 'Meta': {'object_name': 'CiProject'},
186 'autolanding_primary_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'autolanding_primary'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
187 'ci_primary_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ci_primary'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
188 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
189 'launchpad_project': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.LaunchpadProject']", 'null': 'True'}),
190 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
191 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Release']", 'null': 'True'}),
192 'stack': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Cu2dStack']", 'null': 'True'})
193 },
194 'ci.cu2dstack': {
195 'Meta': {'object_name': 'Cu2dStack'},
196 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
197 'integration_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'integration'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
198 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
199 'ppa': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
200 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Release']", 'null': 'True'}),
201 'series': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Series']", 'null': 'True'})
202 },
203 'ci.jenkinsbuild': {
204 'Meta': {'object_name': 'JenkinsBuild'},
205 'coverage_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsCoverageReport']", 'null': 'True'}),
206 'downstream_builds': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ci.JenkinsBuild']", 'symmetrical': 'False'}),
207 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
208 'jenkins_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'builds'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
209 'number': ('django.db.models.fields.IntegerField', [], {}),
210 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsResult']"}),
211 'test_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsTestReport']", 'null': 'True'}),
212 'timestamp': ('django.db.models.fields.DateTimeField', [], {}),
213 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
214 },
215 'ci.jenkinscoveragereport': {
216 'Meta': {'object_name': 'JenkinsCoverageReport'},
217 'branch_count': ('django.db.models.fields.IntegerField', [], {}),
218 'hit_count': ('django.db.models.fields.IntegerField', [], {}),
219 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
220 'jenkins_build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsBuild']", 'unique': 'True', 'null': 'True'}),
221 'line_count': ('django.db.models.fields.IntegerField', [], {}),
222 'taken_count': ('django.db.models.fields.IntegerField', [], {}),
223 'total_count': ('django.db.models.fields.IntegerField', [], {})
224 },
225 'ci.jenkinsflavor': {
226 'Meta': {'object_name': 'JenkinsFlavor'},
227 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
228 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
229 },
230 'ci.jenkinsjob': {
231 'Meta': {'object_name': 'JenkinsJob'},
232 'buildable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
233 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
234 'in_queue': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
235 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
236 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jenkins_jobs'", 'null': 'True', 'to': "orm['ci.CiProject']"}),
237 'upstream_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'downstream_jobs'", 'null': 'True', 'to': "orm['ci.JenkinsJob']"}),
238 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
239 },
240 'ci.jenkinsresult': {
241 'Meta': {'object_name': 'JenkinsResult'},
242 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
243 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
244 },
245 'ci.jenkinsrun': {
246 'Meta': {'object_name': 'JenkinsRun'},
247 'coverage_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsCoverageReport']", 'null': 'True'}),
248 'duration': ('django.db.models.fields.IntegerField', [], {}),
249 'flavor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsFlavor']"}),
250 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
251 'jenkins_build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'runs'", 'null': 'True', 'to': "orm['ci.JenkinsBuild']"}),
252 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
253 'number': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
254 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsResult']"}),
255 'series': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.Series']"}),
256 'test_report': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ci.JenkinsTestReport']", 'null': 'True'}),
257 'timestamp': ('django.db.models.fields.DateTimeField', [], {}),
258 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
259 },
260 'ci.jenkinstestreport': {
261 'Meta': {'object_name': 'JenkinsTestReport'},
262 'duration': ('django.db.models.fields.IntegerField', [], {}),
263 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
264 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
265 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
266 'skip_count': ('django.db.models.fields.IntegerField', [], {})
267 },
268 'ci.launchpadproject': {
269 'Meta': {'object_name': 'LaunchpadProject'},
270 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
271 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'})
272 },
273 'ci.release': {
274 'Meta': {'object_name': 'Release'},
275 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
276 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
277 },
278 'ci.series': {
279 'Meta': {'object_name': 'Series'},
280 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
281 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
282 }
283 }
284
285 complete_apps = ['ci']
286\ No newline at end of file0\ No newline at end of file
2871
=== modified file 'models.py'
--- models.py 2013-08-07 22:49:36 +0000
+++ models.py 2013-08-07 23:29:27 +0000
@@ -439,26 +439,6 @@
439 return self.name439 return self.name
440440
441441
442class JenkinsRun(models.Model):
443
444 jenkins_build = models.ForeignKey('JenkinsBuild',
445 related_name='runs',
446 null=True)
447 number = models.IntegerField(null=True)
448 name = models.CharField(max_length=256)
449 url = models.URLField(unique=True)
450 duration = models.IntegerField() # seconds
451 flavor = models.ForeignKey('JenkinsFlavor')
452 series = models.ForeignKey('Series')
453 result = models.ForeignKey('JenkinsResult')
454 coverage_report = models.ForeignKey('JenkinsCoverageReport', null=True)
455 test_report = models.ForeignKey('JenkinsTestReport', null=True)
456 timestamp = models.DateTimeField()
457
458 def __unicode__(self):
459 return self.name
460
461
462class JenkinsBuild(models.Model):442class JenkinsBuild(models.Model):
463 """A Jenkins build."""443 """A Jenkins build."""
464444
465445
=== modified file 'tests/unit/__init__.py'
--- tests/unit/__init__.py 2013-07-25 00:00:00 +0000
+++ tests/unit/__init__.py 2013-08-07 23:29:27 +0000
@@ -27,8 +27,6 @@
27from test_jenkins_job_import import *27from test_jenkins_job_import import *
28from test_jenkins_job import *28from test_jenkins_job import *
29from test_jenkins_result import *29from test_jenkins_result import *
30from test_jenkins_run_import import *
31from test_jenkins_run import *
32from test_jenkins_test_report_import import *30from test_jenkins_test_report_import import *
33from test_launchpad_project_import import *31from test_launchpad_project_import import *
34from test_launchpad_project import *32from test_launchpad_project import *
3533
=== modified file 'tests/unit/test_jenkins_build_import.py'
--- tests/unit/test_jenkins_build_import.py 2013-07-26 01:50:54 +0000
+++ tests/unit/test_jenkins_build_import.py 2013-08-07 23:29:27 +0000
@@ -45,9 +45,6 @@
4545
46 def setUp(self):46 def setUp(self):
47 super(TestCreateFromUrl, self).setUp()47 super(TestCreateFromUrl, self).setUp()
48 self.create_downstream_runs_patch = patch(
49 'ci.util.jenkins_build.create_downstream_runs')
50 self.create_downstream_runs_patch.start()
51 self.create_downstream_builds_patch = patch(48 self.create_downstream_builds_patch = patch(
52 'ci.util.jenkins_build.create_downstream_builds')49 'ci.util.jenkins_build.create_downstream_builds')
53 self.create_downstream_builds_patch.start()50 self.create_downstream_builds_patch.start()
@@ -65,7 +62,6 @@
65 self.aggregate_test_report_patch.start()62 self.aggregate_test_report_patch.start()
6663
67 def tearDown(self):64 def tearDown(self):
68 self.create_downstream_runs_patch.stop()
69 self.create_downstream_builds_patch.stop()65 self.create_downstream_builds_patch.stop()
70 self.create_cobertura_report_patch.stop()66 self.create_cobertura_report_patch.stop()
71 self.create_jenkins_test_report_patch.stop()67 self.create_jenkins_test_report_patch.stop()
7268
=== removed file 'tests/unit/test_jenkins_run.py'
--- tests/unit/test_jenkins_run.py 2013-07-16 17:29:47 +0000
+++ tests/unit/test_jenkins_run.py 1970-01-01 00:00:00 +0000
@@ -1,46 +0,0 @@
1# QA Dashboard
2# Copyright 2012-2013 Canonical Ltd.
3
4# This program is free software: you can redistribute it and/or modify it
5# under the terms of the GNU Affero General Public License version 3, as
6# published by the Free Software Foundation.
7
8# This program is distributed in the hope that it will be useful, but
9# WITHOUT ANY WARRANTY; without even the implied warranties of
10# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11# PURPOSE. See the GNU Affero General Public License for more details.
12
13# You should have received a copy of the GNU Affero General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16from mock import MagicMock, patch
17from django.test import TestCase
18from django.db import IntegrityError
19from ci.models import JenkinsRun
20import ci.util.extractor as extractor
21
22
23class TestJenkinsRun(TestCase):
24
25 def setUp(self):
26 jenkins_run_mock = MagicMock(
27 spec=JenkinsRun,
28 return_value=None)
29 self.jenkins_run_patch = patch.object(
30 JenkinsRun,
31 '__init__',
32 new=jenkins_run_mock)
33 self.jenkins_run_patch.start()
34 self.jenkins_run = \
35 JenkinsRun()
36 self.logger_patch = patch('ci.models.logger')
37 self.logger_patch.start()
38
39 def tearDown(self):
40 self.jenkins_run_patch.stop()
41 self.logger_patch.stop()
42
43 def test_unicode(self):
44 self.jenkins_run.name = 'indicator-sync-i386-raring-autolanding'
45 self.assertEqual('indicator-sync-i386-raring-autolanding',
46 str(self.jenkins_run))
470
=== removed file 'tests/unit/test_jenkins_run_import.py'
--- tests/unit/test_jenkins_run_import.py 2013-07-16 17:29:47 +0000
+++ tests/unit/test_jenkins_run_import.py 1970-01-01 00:00:00 +0000
@@ -1,130 +0,0 @@
1# QA Dashboard
2# Copyright 2012-2013 Canonical Ltd.
3
4# This program is free software: you can redistribute it and/or modify it
5# under the terms of the GNU Affero General Public License version 3, as
6# published by the Free Software Foundation.
7
8# This program is distributed in the hope that it will be useful, but
9# WITHOUT ANY WARRANTY; without even the implied warranties of
10# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11# PURPOSE. See the GNU Affero General Public License for more details.
12
13# You should have received a copy of the GNU Affero General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16from mock import MagicMock, patch
17from django.test import TestCase
18from django.db import IntegrityError
19from ci.models import JenkinsJob, JenkinsRun
20import ci.util.extractor as extractor
21from ci.util.jenkins_run import create_jenkins_run_from_url
22
23
24class TestCreateFromUrl(TestCase):
25
26 def setUp(self):
27 self.logger_patch = patch('ci.models.logger')
28 self.logger_patch.start()
29 self.fake_url = "http://this.string.is.actually.a.URL/no/kidding"
30 self.fake_jenkins_build = "a Django representation of a Jenkins job"
31
32 def tearDown(self):
33 self.logger_patch.stop()
34
35 def test_vanilla(self):
36 extractor_jenkins_run = MagicMock()
37 jenkins_flavor_get_or_create = MagicMock(return_value=(
38 'fake_jenkins_flavor', False))
39 series_get_or_create = MagicMock(return_value=(
40 'fake_series', False))
41 jenkins_result_get_or_create = MagicMock(return_value=(
42 'fake_jenkins_result', False))
43 with patch('ci.util.extractor.JenkinsRun', extractor_jenkins_run), \
44 patch('ci.models.JenkinsFlavor.objects.get_or_create',
45 jenkins_flavor_get_or_create), \
46 patch('ci.models.Series.objects.get_or_create',
47 series_get_or_create), \
48 patch('ci.models.JenkinsResult.objects.get_or_create',
49 jenkins_result_get_or_create), \
50 patch('ci.models.JenkinsRun.objects.create') as jenkins_run_objects_create:
51 extractor_jenkins_run.return_value.number = 42
52 extractor_jenkins_run.return_value.name = 'fake_jenkins_run_name'
53 duration_mock = MagicMock()
54 duration_mock.seconds = 3.1415
55 extractor_jenkins_run.return_value.duration = duration_mock
56 extractor_jenkins_run.return_value.timestamp = 'fake_timestamp'
57 extractor_jenkins_run.return_value.parameters = 'fake_parameters'
58 result = create_jenkins_run_from_url(
59 self.fake_url, self.fake_jenkins_build)
60 jenkins_run_objects_create.assert_called_with(
61 jenkins_build=self.fake_jenkins_build,
62 number=42,
63 name='fake_jenkins_run_name',
64 url=self.fake_url,
65 duration=3.1415,
66 timestamp='fake_timestamp',
67 flavor='fake_jenkins_flavor',
68 series='fake_series',
69 result='fake_jenkins_result')
70
71 def test_extractor_build_result_is_none(self):
72 """Weird but extractor returns None for result b/c no runs at all."""
73
74 self.fake_url = "http://this.string.is.actually.a.URL/no/kidding"
75 self.fake_jenkins_build = "a Django representation of a Jenkins build"
76 extractor_jenkins_run = MagicMock()
77 jenkins_flavor_get_or_create = MagicMock(return_value=(
78 'fake_jenkins_flavor', False))
79 series_get_or_create = MagicMock(return_value=(
80 'fake_series', False))
81 jenkins_result_get_or_create = MagicMock(side_effect=IntegrityError)
82 with patch('ci.util.extractor.JenkinsRun', extractor_jenkins_run), \
83 patch('ci.models.JenkinsFlavor.objects.get_or_create',
84 jenkins_flavor_get_or_create), \
85 patch('ci.models.Series.objects.get_or_create', series_get_or_create), \
86 patch('ci.models.JenkinsResult.objects.get_or_create', jenkins_result_get_or_create), \
87 patch('ci.models.JenkinsRun.objects.create') as jenkins_run_objects_create:
88 result = create_jenkins_run_from_url(
89 self.fake_url, self.fake_jenkins_build)
90 self.assertIsNone(result)
91
92 def test_run_duplicate_integrity_error(self):
93 self.fake_url = "http://this.string.is.actually.a.URL/no/kidding"
94 self.fake_jenkins_build = "a Django representation of a Jenkins job"
95 extractor_jenkins_run = MagicMock()
96 jenkins_flavor_get_or_create = MagicMock(return_value=(
97 'fake_jenkins_flavor', False))
98 series_get_or_create = MagicMock(return_value=(
99 'fake_series', False))
100 jenkins_result_get_or_create = MagicMock(return_value=(
101 'fake_jenkins_result', False))
102 with patch('ci.util.extractor.JenkinsRun', extractor_jenkins_run), \
103 patch('ci.models.JenkinsFlavor.objects.get_or_create',
104 jenkins_flavor_get_or_create), \
105 patch('ci.models.Series.objects.get_or_create',
106 series_get_or_create), \
107 patch('ci.models.JenkinsResult.objects.get_or_create',
108 jenkins_result_get_or_create), \
109 patch('ci.models.JenkinsRun.objects.create') as jenkins_run_objects_create:
110 jenkins_run_objects_create.side_effect = IntegrityError
111 extractor_jenkins_run.return_value.number = 42
112 extractor_jenkins_run.return_value.name = 'fake_jenkins_run_name'
113 duration_mock = MagicMock()
114 duration_mock.seconds = 3.1415
115 extractor_jenkins_run.return_value.duration = duration_mock
116 extractor_jenkins_run.return_value.timestamp = 'fake_timestamp'
117 extractor_jenkins_run.return_value.parameters = 'fake_parameters'
118 result = create_jenkins_run_from_url(
119 self.fake_url, self.fake_jenkins_build)
120 jenkins_run_objects_create.assert_called_with(
121 jenkins_build=self.fake_jenkins_build,
122 number=42,
123 name='fake_jenkins_run_name',
124 url=self.fake_url,
125 duration=3.1415,
126 timestamp='fake_timestamp',
127 flavor='fake_jenkins_flavor',
128 series='fake_series',
129 result='fake_jenkins_result')
130 self.assertIsNone(result)
1310
=== modified file 'util/jenkins_build.py'
--- util/jenkins_build.py 2013-07-20 19:28:08 +0000
+++ util/jenkins_build.py 2013-08-07 23:29:27 +0000
@@ -23,7 +23,6 @@
23import ci.util.extractor as extractor23import ci.util.extractor as extractor
24from ci.util.coverage_report import create_coverage_report_from_url24from ci.util.coverage_report import create_coverage_report_from_url
25from ci.util.jenkins_test_report import create_jenkins_test_report_from_url25from ci.util.jenkins_test_report import create_jenkins_test_report_from_url
26from ci.util.jenkins_run import create_jenkins_run_from_url
2726
28logger = logging.getLogger('qa_dashboard')27logger = logging.getLogger('qa_dashboard')
2928
@@ -81,15 +80,6 @@
81 ci_jenkins_build.save()80 ci_jenkins_build.save()
8281
8382
84# FIXME: restore support for multi-configuration builds
85def create_downstream_runs(ci_jenkins_build, extractor_build):
86 logger.debug("importing runs associated with JenkinsBuild at {}".format(extractor_build.url))
87 for run in extractor_build.runs:
88 pass
89 # FIXME: retore this, it breaks within
90 #jenkins_run = create_jenkins_run_from_url(run.url,
91 # ci_jenkins_build)
92
93def create_cobertura_report(jenkins_build, extractor_build):83def create_cobertura_report(jenkins_build, extractor_build):
94 """Get a Cobertura coverage report associated with a build url.84 """Get a Cobertura coverage report associated with a build url.
95 85
@@ -248,7 +238,6 @@
248 logger.info("Duplicate Jenkins build found at {}".format(url))238 logger.info("Duplicate Jenkins build found at {}".format(url))
249 return None239 return None
250240
251 create_downstream_runs(jenkins_build, extractor_build)
252 create_downstream_builds(jenkins_build, extractor_build)241 create_downstream_builds(jenkins_build, extractor_build)
253 create_cobertura_report(jenkins_build, extractor_build)242 create_cobertura_report(jenkins_build, extractor_build)
254 create_jenkins_test_report(jenkins_build, extractor_build)243 create_jenkins_test_report(jenkins_build, extractor_build)
255244
=== removed file 'util/jenkins_run.py'
--- util/jenkins_run.py 2013-07-16 17:29:47 +0000
+++ util/jenkins_run.py 1970-01-01 00:00:00 +0000
@@ -1,84 +0,0 @@
1# QA Dashboard
2# Copyright 2012-2013 Canonical Ltd.
3
4# This program is free software: you can redistribute it and/or modify it
5# under the terms of the GNU Affero General Public License version 3, as
6# published by the Free Software Foundation.
7
8# This program is distributed in the hope that it will be useful, but
9# WITHOUT ANY WARRANTY; without even the implied warranties of
10# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11# PURPOSE. See the GNU Affero General Public License for more details.
12
13# You should have received a copy of the GNU Affero General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16import logging
17from django.db import IntegrityError, transaction
18from ci.models import (JenkinsFlavor,
19 JenkinsRun,
20 Series,
21 JenkinsResult)
22import ci.util.extractor as extractor
23
24logger = logging.getLogger("qa_dashboard")
25
26
27def create_jenkins_run_from_url(url, jenkins_build):
28 extractor_run = extractor.JenkinsRun(url)
29 flavor, created = JenkinsFlavor.objects.get_or_create(name=extractor_run.flavor)
30 series, created = Series.objects.get_or_create(name=extractor_run.series)
31 try:
32 result, created = JenkinsResult.objects.get_or_create(name=extractor_run.result)
33 except IntegrityError, e:
34 # no builds yet, IntegrityError on None name
35 transaction.rollback()
36 return None
37 try:
38 logger.debug("creating JenkinsRun at {}".format(url))
39 jenkins_run = JenkinsRun.objects.create(
40 jenkins_build=jenkins_build,
41 number=extractor_run.number,
42 name=extractor_run.name,
43 url=url,
44 duration=extractor_run.duration.seconds,
45 timestamp=extractor_run.timestamp,
46 flavor=flavor,
47 series=series,
48 result=result)
49 except IntegrityError:
50 transaction.rollback()
51 logger.debug("Duplicate Jenkins run found at {}.".format(url))
52 # TODO make it possible to update a run
53 return None
54 except TypeError, e:
55 logger.debug("Error creating JenkinsRun: {}".format(e))
56 return None
57 # Disabling this until we have a JenkinsRun-specific JenkinsReport create
58 #logger.debug("Importing coverage reports associated with JenkinsRun at {}.".format(url))
59 # TODO FJG Fix this
60 #try:
61 # jenkins_run.coverage_report = JenkinsCoverageReport.objects.create(
62 # # FIXME: restore
63 # # run = jenkins_run,
64 # xml_text=extractor_run.coverage_report.xml_text,
65 # line_rate=extractor_run.coverage_report.line_rate,
66 # branch_rate=extractor_run.coverage_report.branch_rate)
67 # jenkins_run.save()
68 #except EnvironmentError:
69 # # no data was found at the coverage report url
70 # pass
71 #logger.debug("importing test reports associated with JenkinsRun at {}".format(url))
72 #try:
73 # jenkins_run.test_report = JenkinsTestReport.objects.create(
74 # fail_count=extractor_run.test_report.fail_count,
75 # pass_count=extractor_run.test_report.pass_count,
76 # skip_count=extractor_run.test_report.skip_count,
77 # duration=extractor_run.test_report.duration.seconds)
78 # jenkins_run.save()
79 #except EnvironmentError:
80 # # no data was found at the test report url
81 # pass
82 #except EnvironmentError, e:
83 # logger.error(e)
84 return jenkins_run

Subscribers

People subscribed via source and target branches

to all changes: