Merge lp:~allanlesage/helipad/kill-jenkinsrun into lp:helipad/ci
- kill-jenkinsrun
- Merge into ci
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 |
Related bugs: |
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.
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal | # |
Francis Ginther (fginther) wrote : Posted in a previous version of this proposal | # |
LGTM
Chris Johnston (cjohnston) wrote : | # |
Conflicts
- 40. By Allan LeSage
-
Merge trunk, resolving migration conflict.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:40
http://
Executed test runs:
Click here to trigger a rebuild:
http://
- 41. By Allan LeSage
-
Re-removed last_build members from migration.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:41
http://
Executed test runs:
Click here to trigger a rebuild:
http://
Chris Johnston (cjohnston) : | # |
PS Jenkins bot (ps-jenkins) : | # |
Preview Diff
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 |
PASSED: Continuous integration, rev:39 s-jenkins: 8080/job/ helipad- ci-ci/58/
http://
Executed test runs:
Click here to trigger a rebuild: s-jenkins: 8080/job/ helipad- ci-ci/58/ rebuild
http://