Merge lp:~wgrant/launchpad/bfjb-from-bfj into lp:launchpad
- bfjb-from-bfj
- Merge into devel
Proposed by
William Grant
Status: | Merged |
---|---|
Approved by: | Steve Kowalik |
Approved revision: | no longer in the source branch. |
Merged at revision: | 16826 |
Proposed branch: | lp:~wgrant/launchpad/bfjb-from-bfj |
Merge into: | lp:launchpad |
Diff against target: |
859 lines (+101/-125) 19 files modified
lib/lp/archiveuploader/tests/test_uploadprocessor.py (+6/-9) lib/lp/buildmaster/interactor.py (+2/-2) lib/lp/buildmaster/interfaces/buildqueue.py (+4/-0) lib/lp/buildmaster/manager.py (+3/-3) lib/lp/buildmaster/model/builder.py (+1/-1) lib/lp/buildmaster/model/buildfarmjobbehavior.py (+4/-8) lib/lp/buildmaster/model/buildqueue.py (+8/-4) lib/lp/buildmaster/tests/test_buildfarmjobbehavior.py (+3/-4) lib/lp/buildmaster/tests/test_buildqueue.py (+2/-2) lib/lp/buildmaster/tests/test_manager.py (+2/-2) lib/lp/buildmaster/tests/test_queuedepth.py (+13/-13) lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py (+5/-5) lib/lp/code/model/recipebuilder.py (+2/-6) lib/lp/code/model/tests/test_recipebuilder.py (+7/-16) lib/lp/soyuz/configure.zcml (+1/-1) lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py (+7/-13) lib/lp/translations/configure.zcml (+1/-1) lib/lp/translations/model/translationtemplatesbuildbehavior.py (+3/-3) lib/lp/translations/tests/test_translationtemplatesbuildbehavior.py (+27/-32) |
To merge this branch: | bzr merge lp:~wgrant/launchpad/bfjb-from-bfj |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Steve Kowalik (community) | code | Approve | |
Review via email: mp+194805@code.launchpad.net |
Commit message
IBuildFarmJobBe
Description of the change
IBuildFarmJobBe
This makes the TTBB tests rather awkward, but that will be resolved as part of the disposal of TTBJ.
To post a comment you must log in.
Revision history for this message
Steve Kowalik (stevenk) : | # |
review:
Approve
(code)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'lib/lp/archiveuploader/tests/test_uploadprocessor.py' |
2 | --- lib/lp/archiveuploader/tests/test_uploadprocessor.py 2013-06-25 07:40:53 +0000 |
3 | +++ lib/lp/archiveuploader/tests/test_uploadprocessor.py 2013-11-12 09:11:23 +0000 |
4 | @@ -2095,7 +2095,7 @@ |
5 | |
6 | # Commit so the build cookie has the right ids. |
7 | self.layer.txn.commit() |
8 | - behavior = IBuildFarmJobBehavior(build.buildqueue_record.specific_job) |
9 | + behavior = IBuildFarmJobBehavior(build) |
10 | leaf_name = behavior.getUploadDirLeaf(behavior.getBuildCookie()) |
11 | os.mkdir(os.path.join(self.incoming_folder, leaf_name)) |
12 | self.options.context = 'buildd' |
13 | @@ -2138,7 +2138,7 @@ |
14 | |
15 | # Commit so the build cookie has the right ids. |
16 | self.layer.txn.commit() |
17 | - behavior = IBuildFarmJobBehavior(build.buildqueue_record.specific_job) |
18 | + behavior = IBuildFarmJobBehavior(build) |
19 | leaf_name = behavior.getUploadDirLeaf(behavior.getBuildCookie()) |
20 | upload_dir = self.queueUpload("bar_1.0-1_binary", |
21 | queue_entry=leaf_name) |
22 | @@ -2163,11 +2163,10 @@ |
23 | distroseries=self.breezy, archive=archive, |
24 | requester=archive.owner) |
25 | self.assertEquals(archive.owner, build.requester) |
26 | - bq = self.factory.makeSourcePackageRecipeBuildJob(recipe_build=build) |
27 | self.switchToUploader() |
28 | # Commit so the build cookie has the right ids. |
29 | self.layer.txn.commit() |
30 | - behavior = IBuildFarmJobBehavior(bq.specific_job) |
31 | + behavior = IBuildFarmJobBehavior(build) |
32 | leaf_name = behavior.getUploadDirLeaf(behavior.getBuildCookie()) |
33 | relative_path = "~%s/%s/%s/%s" % ( |
34 | archive.owner.name, archive.name, self.breezy.distribution.name, |
35 | @@ -2211,10 +2210,9 @@ |
36 | archive.require_virtualized = False |
37 | build = self.factory.makeSourcePackageRecipeBuild(sourcename=u"bar", |
38 | distroseries=self.breezy, archive=archive) |
39 | - bq = self.factory.makeSourcePackageRecipeBuildJob(recipe_build=build) |
40 | # Commit so the build cookie has the right ids. |
41 | Store.of(build).flush() |
42 | - behavior = IBuildFarmJobBehavior(bq.specific_job) |
43 | + behavior = IBuildFarmJobBehavior(build) |
44 | leaf_name = behavior.getUploadDirLeaf(behavior.getBuildCookie()) |
45 | os.mkdir(os.path.join(self.incoming_folder, leaf_name)) |
46 | self.options.context = 'buildd' |
47 | @@ -2255,11 +2253,10 @@ |
48 | archive.require_virtualized = False |
49 | build = self.factory.makeSourcePackageRecipeBuild(sourcename=u"bar", |
50 | distroseries=self.breezy, archive=archive) |
51 | - bq = self.factory.makeSourcePackageRecipeBuildJob(recipe_build=build) |
52 | self.switchToUploader() |
53 | # Commit so the build cookie has the right ids. |
54 | Store.of(build).flush() |
55 | - behavior = IBuildFarmJobBehavior(bq.specific_job) |
56 | + behavior = IBuildFarmJobBehavior(build) |
57 | leaf_name = behavior.getUploadDirLeaf(behavior.getBuildCookie()) |
58 | os.mkdir(os.path.join(self.incoming_folder, leaf_name)) |
59 | self.options.context = 'buildd' |
60 | @@ -2307,7 +2304,7 @@ |
61 | |
62 | # Commit so the build cookie has the right ids. |
63 | self.layer.txn.commit() |
64 | - behavior = IBuildFarmJobBehavior(build.buildqueue_record.specific_job) |
65 | + behavior = IBuildFarmJobBehavior(build) |
66 | leaf_name = behavior.getUploadDirLeaf(behavior.getBuildCookie()) |
67 | upload_dir = self.queueUpload( |
68 | "bar_1.0-1_binary", queue_entry=leaf_name) |
69 | |
70 | === modified file 'lib/lp/buildmaster/interactor.py' |
71 | --- lib/lp/buildmaster/interactor.py 2013-10-26 11:02:51 +0000 |
72 | +++ lib/lp/buildmaster/interactor.py 2013-11-12 09:11:23 +0000 |
73 | @@ -242,7 +242,7 @@ |
74 | def getBuildBehavior(queue_item, builder, slave): |
75 | if queue_item is None: |
76 | return None |
77 | - behavior = IBuildFarmJobBehavior(queue_item.specific_job) |
78 | + behavior = IBuildFarmJobBehavior(queue_item.specific_build) |
79 | behavior.setBuilder(builder, slave) |
80 | return behavior |
81 | |
82 | @@ -413,7 +413,7 @@ |
83 | |
84 | new_behavior = cls.getBuildBehavior(candidate, builder, slave) |
85 | needed_bfjb = type(removeSecurityProxy( |
86 | - IBuildFarmJobBehavior(candidate.specific_job))) |
87 | + IBuildFarmJobBehavior(candidate.specific_build))) |
88 | if not zope_isinstance(new_behavior, needed_bfjb): |
89 | raise AssertionError( |
90 | "Inappropriate IBuildFarmJobBehavior: %r is not a %r" % |
91 | |
92 | === modified file 'lib/lp/buildmaster/interfaces/buildqueue.py' |
93 | --- lib/lp/buildmaster/interfaces/buildqueue.py 2013-09-02 08:11:58 +0000 |
94 | +++ lib/lp/buildmaster/interfaces/buildqueue.py 2013-11-12 09:11:23 +0000 |
95 | @@ -101,6 +101,10 @@ |
96 | IBuildFarmJob, title=_("Job"), |
97 | description=_("Data and operations common to all build farm jobs.")) |
98 | |
99 | + specific_build = Reference( |
100 | + IBuildFarmJob, title=_("Build farm job"), |
101 | + description=_("Concrete build farm job object.")) |
102 | + |
103 | date_started = Datetime( |
104 | title=_('Start time'), |
105 | description=_('Time when the job started.')) |
106 | |
107 | === modified file 'lib/lp/buildmaster/manager.py' |
108 | --- lib/lp/buildmaster/manager.py 2013-10-26 11:02:51 +0000 |
109 | +++ lib/lp/buildmaster/manager.py 2013-11-12 09:11:23 +0000 |
110 | @@ -143,7 +143,7 @@ |
111 | if current_job is None: |
112 | job_failure_count = 0 |
113 | else: |
114 | - job_failure_count = current_job.specific_job.build.failure_count |
115 | + job_failure_count = current_job.specific_build.failure_count |
116 | |
117 | if builder.failure_count == job_failure_count and current_job is not None: |
118 | # If the failure count for the builder is the same as the |
119 | @@ -186,7 +186,7 @@ |
120 | # have already caused any relevant slave data to be stored |
121 | # on the build record so don't worry about that here. |
122 | builder.resetFailureCount() |
123 | - build_job = current_job.specific_job.build |
124 | + build_job = current_job.specific_build |
125 | build_job.updateStatus(BuildStatus.FAILEDTOBUILD) |
126 | builder.currentjob.destroySelf() |
127 | |
128 | @@ -333,7 +333,7 @@ |
129 | if vitals.build_queue is None: |
130 | self.date_cancel = None |
131 | defer.returnValue(False) |
132 | - build = vitals.build_queue.specific_job.build |
133 | + build = vitals.build_queue.specific_build |
134 | if build.status != BuildStatus.CANCELLING: |
135 | self.date_cancel = None |
136 | defer.returnValue(False) |
137 | |
138 | === modified file 'lib/lp/buildmaster/model/builder.py' |
139 | --- lib/lp/buildmaster/model/builder.py 2013-11-11 07:18:55 +0000 |
140 | +++ lib/lp/buildmaster/model/builder.py 2013-11-12 09:11:23 +0000 |
141 | @@ -236,7 +236,7 @@ |
142 | """See IBuilder.""" |
143 | self.gotFailure() |
144 | if self.currentjob is not None: |
145 | - build_farm_job = self.currentjob.specific_job.build |
146 | + build_farm_job = self.currentjob.specific_build |
147 | build_farm_job.gotFailure() |
148 | logger.info( |
149 | "Builder %s failure count: %s, job '%s' failure count: %s" % ( |
150 | |
151 | === modified file 'lib/lp/buildmaster/model/buildfarmjobbehavior.py' |
152 | --- lib/lp/buildmaster/model/buildfarmjobbehavior.py 2013-10-08 11:56:24 +0000 |
153 | +++ lib/lp/buildmaster/model/buildfarmjobbehavior.py 2013-11-12 09:11:23 +0000 |
154 | @@ -39,15 +39,11 @@ |
155 | All build-farm job behaviors should inherit from this. |
156 | """ |
157 | |
158 | - def __init__(self, buildfarmjob): |
159 | + def __init__(self, build): |
160 | """Store a reference to the job_type with which we were created.""" |
161 | - self.buildfarmjob = buildfarmjob |
162 | + self.build = build |
163 | self._builder = None |
164 | |
165 | - @property |
166 | - def build(self): |
167 | - return self.buildfarmjob.build |
168 | - |
169 | def setBuilder(self, builder, slave): |
170 | """The builder should be set once and not changed.""" |
171 | self._builder = builder |
172 | @@ -157,7 +153,7 @@ |
173 | logger.info( |
174 | 'Processing finished %s build %s (%s) from builder %s' |
175 | % (status, self.getBuildCookie(), |
176 | - self.build.buildqueue_record.specific_job.build.title, |
177 | + self.build.buildqueue_record.specific_build.title, |
178 | self.build.buildqueue_record.builder.name)) |
179 | d = method(slave_status, logger, notify) |
180 | return d |
181 | @@ -176,7 +172,7 @@ |
182 | # If this is a binary package build, discard it if its source is |
183 | # no longer published. |
184 | if build.job_type == BuildFarmJobType.PACKAGEBUILD: |
185 | - build = build.buildqueue_record.specific_job.build |
186 | + build = build.buildqueue_record.specific_build |
187 | if not build.current_source_publication: |
188 | yield self._slave.clean() |
189 | build.updateStatus(BuildStatus.SUPERSEDED) |
190 | |
191 | === modified file 'lib/lp/buildmaster/model/buildqueue.py' |
192 | --- lib/lp/buildmaster/model/buildqueue.py 2013-11-12 00:12:53 +0000 |
193 | +++ lib/lp/buildmaster/model/buildqueue.py 2013-11-12 09:11:23 +0000 |
194 | @@ -111,6 +111,10 @@ |
195 | processor = ForeignKey(dbName='processor', foreignKey='Processor') |
196 | virtualized = BoolCol(dbName='virtualized') |
197 | |
198 | + @property |
199 | + def specific_build(self): |
200 | + return self.specific_job.build |
201 | + |
202 | @cachedproperty |
203 | def specific_job(self): |
204 | """See `IBuildQueue`.""" |
205 | @@ -180,14 +184,14 @@ |
206 | return |
207 | # Allow the `IBuildFarmJob` instance with the data/logic specific to |
208 | # the job at hand to calculate the score as appropriate. |
209 | - self.lastscore = self.specific_job.build.calculateScore() |
210 | + self.lastscore = self.specific_build.calculateScore() |
211 | |
212 | def markAsBuilding(self, builder): |
213 | """See `IBuildQueue`.""" |
214 | self.builder = builder |
215 | if self.job.status != JobStatus.RUNNING: |
216 | self.job.start() |
217 | - self.specific_job.build.updateStatus(BuildStatus.BUILDING) |
218 | + self.specific_build.updateStatus(BuildStatus.BUILDING) |
219 | if builder is not None: |
220 | del get_property_cache(builder).currentjob |
221 | |
222 | @@ -200,13 +204,13 @@ |
223 | self.job.date_started = None |
224 | self.job.date_finished = None |
225 | self.logtail = None |
226 | - self.specific_job.build.updateStatus(BuildStatus.NEEDSBUILD) |
227 | + self.specific_build.updateStatus(BuildStatus.NEEDSBUILD) |
228 | if builder is not None: |
229 | del get_property_cache(builder).currentjob |
230 | |
231 | def cancel(self): |
232 | """See `IBuildQueue`.""" |
233 | - self.specific_job.build.updateStatus(BuildStatus.CANCELLED) |
234 | + self.specific_build.updateStatus(BuildStatus.CANCELLED) |
235 | self.destroySelf() |
236 | |
237 | def getEstimatedJobStartTime(self, now=None): |
238 | |
239 | === modified file 'lib/lp/buildmaster/tests/test_buildfarmjobbehavior.py' |
240 | --- lib/lp/buildmaster/tests/test_buildfarmjobbehavior.py 2013-10-01 00:32:26 +0000 |
241 | +++ lib/lp/buildmaster/tests/test_buildfarmjobbehavior.py 2013-11-12 09:11:23 +0000 |
242 | @@ -69,9 +69,8 @@ |
243 | distroarchseries=distroarchseries, pocket=pocket, archive=archive) |
244 | |
245 | def test_getBuildCookie(self): |
246 | - buildfarmjob = self.factory.makeTranslationTemplatesBuildJob() |
247 | - build = buildfarmjob.build |
248 | - behavior = self._makeBehavior(buildfarmjob) |
249 | + build = self.factory.makeTranslationTemplatesBuildJob().build |
250 | + behavior = self._makeBehavior(build) |
251 | self.assertEqual( |
252 | '%s-%s' % (build.job_type.name, build.id), |
253 | behavior.getBuildCookie()) |
254 | @@ -101,7 +100,7 @@ |
255 | super(TestGetUploadMethodsMixin, self).setUp() |
256 | self.build = self.makeBuild() |
257 | self.behavior = IBuildFarmJobBehavior( |
258 | - self.build.buildqueue_record.specific_job) |
259 | + self.build.buildqueue_record.specific_build) |
260 | |
261 | def test_getUploadDirLeafCookie_parseable(self): |
262 | # getUploadDirLeaf should return a directory name |
263 | |
264 | === modified file 'lib/lp/buildmaster/tests/test_buildqueue.py' |
265 | --- lib/lp/buildmaster/tests/test_buildqueue.py 2013-11-11 07:18:55 +0000 |
266 | +++ lib/lp/buildmaster/tests/test_buildqueue.py 2013-11-12 09:11:23 +0000 |
267 | @@ -69,7 +69,7 @@ |
268 | for queue_entry in queue_entries: |
269 | source = None |
270 | for attr in ('sourcepackagerelease', 'sourcepackagename'): |
271 | - source = getattr(queue_entry.specific_job.build, attr, None) |
272 | + source = getattr(queue_entry.specific_build, attr, None) |
273 | if source is not None: |
274 | break |
275 | print "%5s, %18s, p:%5s, v:%5s e:%s *** s:%5s" % ( |
276 | @@ -110,7 +110,7 @@ |
277 | |
278 | def test_recipebuild_cancel(self): |
279 | bq = self.factory.makeSourcePackageRecipeBuildJob() |
280 | - build = bq.specific_job.build |
281 | + build = bq.specific_build |
282 | bq.markAsBuilding(self.builder) |
283 | bq.cancel() |
284 | |
285 | |
286 | === modified file 'lib/lp/buildmaster/tests/test_manager.py' |
287 | --- lib/lp/buildmaster/tests/test_manager.py 2013-10-26 11:02:51 +0000 |
288 | +++ lib/lp/buildmaster/tests/test_manager.py 2013-11-12 09:11:23 +0000 |
289 | @@ -376,7 +376,7 @@ |
290 | self.assertEqual(expected_builder_count, builder.failure_count) |
291 | self.assertEqual( |
292 | expected_job_count, |
293 | - builder.currentjob.specific_job.build.failure_count) |
294 | + builder.currentjob.specific_build.failure_count) |
295 | self.assertEqual(1, manager_module.assessFailureCounts.call_count) |
296 | |
297 | def test_scan_first_fail(self): |
298 | @@ -495,7 +495,7 @@ |
299 | transaction.commit() |
300 | login(ANONYMOUS) |
301 | buildqueue = builder.currentjob |
302 | - behavior = IBuildFarmJobBehavior(buildqueue.specific_job) |
303 | + behavior = IBuildFarmJobBehavior(buildqueue.specific_build) |
304 | slave.build_id = behavior.getBuildCookie() |
305 | self.assertBuildingJob(buildqueue, builder) |
306 | |
307 | |
308 | === modified file 'lib/lp/buildmaster/tests/test_queuedepth.py' |
309 | --- lib/lp/buildmaster/tests/test_queuedepth.py 2013-10-31 06:29:13 +0000 |
310 | +++ lib/lp/buildmaster/tests/test_queuedepth.py 2013-11-12 09:11:23 +0000 |
311 | @@ -503,7 +503,7 @@ |
312 | job = self.factory.makeSourcePackageRecipeBuildJob( |
313 | estimated_duration=111, sourcename=u'xxr-gftp', score=1055, |
314 | virtualized=False) |
315 | - self.builds.append(job.specific_job.build) |
316 | + self.builds.append(job.specific_build) |
317 | |
318 | # Disable all native builders. |
319 | for builder in self.builders[(None, False)]: |
320 | @@ -756,11 +756,11 @@ |
321 | job = self.factory.makeSourcePackageRecipeBuildJob( |
322 | virtualized=False, estimated_duration=22, |
323 | sourcename=u'xx-recipe-bash', score=1025) |
324 | - self.builds.append(job.specific_job.build) |
325 | + self.builds.append(job.specific_build) |
326 | job = self.factory.makeSourcePackageRecipeBuildJob( |
327 | virtualized=False, estimated_duration=222, |
328 | sourcename=u'xx-recipe-zsh', score=1053) |
329 | - self.builds.append(job.specific_job.build) |
330 | + self.builds.append(job.specific_build) |
331 | |
332 | # Assign the same score to the '386' vim and apg build jobs. |
333 | _apg_build, apg_job = find_job(self, 'apg', '386') |
334 | @@ -856,7 +856,7 @@ |
335 | job = self.factory.makeSourcePackageRecipeBuildJob( |
336 | virtualized=True, estimated_duration=332, |
337 | sourcename=u'xxr-openssh-client', score=1050) |
338 | - self.builds.append(job.specific_job.build) |
339 | + self.builds.append(job.specific_build) |
340 | # print_build_setup(self.builds) |
341 | # ... |
342 | # 15, flex, p: hppa, v: True e:0:13:00 *** s: 1039 |
343 | @@ -878,7 +878,7 @@ |
344 | job = self.factory.makeSourcePackageRecipeBuildJob( |
345 | estimated_duration=111, sourcename=u'xxr-gwibber', score=1051, |
346 | virtualized=None) |
347 | - self.builds.append(job.specific_job.build) |
348 | + self.builds.append(job.specific_build) |
349 | # print_build_setup(self.builds) |
350 | self.assertEqual(None, job.virtualized) |
351 | # ... |
352 | @@ -948,33 +948,33 @@ |
353 | job = self.factory.makeSourcePackageRecipeBuildJob( |
354 | virtualized=False, estimated_duration=332, |
355 | sourcename=u'xxr-aptitude', score=1025) |
356 | - self.builds.append(job.specific_job.build) |
357 | + self.builds.append(job.specific_build) |
358 | job = self.factory.makeSourcePackageRecipeBuildJob( |
359 | virtualized=False, estimated_duration=443, |
360 | sourcename=u'xxr-auto-apt', score=1053) |
361 | - self.builds.append(job.specific_job.build) |
362 | + self.builds.append(job.specific_build) |
363 | job = self.factory.makeSourcePackageRecipeBuildJob( |
364 | estimated_duration=554, sourcename=u'xxr-daptup', score=1051, |
365 | virtualized=None) |
366 | - self.builds.append(job.specific_job.build) |
367 | + self.builds.append(job.specific_build) |
368 | job = self.factory.makeSourcePackageRecipeBuildJob( |
369 | estimated_duration=665, sourcename=u'xxr-cron-apt', score=1043) |
370 | - self.builds.append(job.specific_job.build) |
371 | + self.builds.append(job.specific_build) |
372 | job = self.factory.makeSourcePackageRecipeBuildJob( |
373 | estimated_duration=776, sourcename=u'xxr-apt-build', score=1043) |
374 | - self.builds.append(job.specific_job.build) |
375 | + self.builds.append(job.specific_build) |
376 | job = self.factory.makeSourcePackageRecipeBuildJob( |
377 | estimated_duration=887, sourcename=u'xxr-debdelta', score=1044, |
378 | virtualized=None) |
379 | - self.builds.append(job.specific_job.build) |
380 | + self.builds.append(job.specific_build) |
381 | job = self.factory.makeSourcePackageRecipeBuildJob( |
382 | estimated_duration=998, sourcename=u'xxr-apt', score=1044, |
383 | virtualized=None) |
384 | - self.builds.append(job.specific_job.build) |
385 | + self.builds.append(job.specific_build) |
386 | job = self.factory.makeSourcePackageRecipeBuildJob( |
387 | estimated_duration=1110, sourcename=u'xxr-cupt', score=1044, |
388 | virtualized=None) |
389 | - self.builds.append(job.specific_job.build) |
390 | + self.builds.append(job.specific_build) |
391 | |
392 | # Assign the same score to the '386' vim and apg build jobs. |
393 | _apg_build, apg_job = find_job(self, 'apg', '386') |
394 | |
395 | === modified file 'lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py' |
396 | --- lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py 2013-09-11 06:05:44 +0000 |
397 | +++ lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py 2013-11-12 09:11:23 +0000 |
398 | @@ -89,7 +89,7 @@ |
399 | def test_cancel_build(self): |
400 | """An admin can cancel a build.""" |
401 | queue = self.factory.makeSourcePackageRecipeBuildJob() |
402 | - build = queue.specific_job.build |
403 | + build = queue.specific_build |
404 | transaction.commit() |
405 | build_url = canonical_url(build) |
406 | logout() |
407 | @@ -115,7 +115,7 @@ |
408 | def test_cancel_build_not_admin(self): |
409 | """No one but an admin can cancel a build.""" |
410 | queue = self.factory.makeSourcePackageRecipeBuildJob() |
411 | - build = queue.specific_job.build |
412 | + build = queue.specific_build |
413 | transaction.commit() |
414 | build_url = canonical_url(build) |
415 | logout() |
416 | @@ -145,7 +145,7 @@ |
417 | def test_rescore_build(self): |
418 | """An admin can rescore a build.""" |
419 | queue = self.factory.makeSourcePackageRecipeBuildJob() |
420 | - build = queue.specific_job.build |
421 | + build = queue.specific_build |
422 | transaction.commit() |
423 | build_url = canonical_url(build) |
424 | logout() |
425 | @@ -173,7 +173,7 @@ |
426 | def test_rescore_build_invalid_score(self): |
427 | """Build scores can only take numbers.""" |
428 | queue = self.factory.makeSourcePackageRecipeBuildJob() |
429 | - build = queue.specific_job.build |
430 | + build = queue.specific_build |
431 | transaction.commit() |
432 | build_url = canonical_url(build) |
433 | logout() |
434 | @@ -196,7 +196,7 @@ |
435 | def test_rescore_build_not_admin(self): |
436 | """No one but admin can rescore a build.""" |
437 | queue = self.factory.makeSourcePackageRecipeBuildJob() |
438 | - build = queue.specific_job.build |
439 | + build = queue.specific_build |
440 | transaction.commit() |
441 | build_url = canonical_url(build) |
442 | logout() |
443 | |
444 | === modified file 'lib/lp/code/model/recipebuilder.py' |
445 | --- lib/lp/code/model/recipebuilder.py 2013-10-08 11:56:24 +0000 |
446 | +++ lib/lp/code/model/recipebuilder.py 2013-11-12 09:11:23 +0000 |
447 | @@ -20,7 +20,7 @@ |
448 | ) |
449 | from lp.buildmaster.model.buildfarmjobbehavior import BuildFarmJobBehaviorBase |
450 | from lp.code.interfaces.sourcepackagerecipebuild import ( |
451 | - ISourcePackageRecipeBuildJob, |
452 | + ISourcePackageRecipeBuild, |
453 | ) |
454 | from lp.registry.interfaces.pocket import PackagePublishingPocket |
455 | from lp.services.config import config |
456 | @@ -33,7 +33,7 @@ |
457 | class RecipeBuildBehavior(BuildFarmJobBehaviorBase): |
458 | """How to build a recipe on the build farm.""" |
459 | |
460 | - adapts(ISourcePackageRecipeBuildJob) |
461 | + adapts(ISourcePackageRecipeBuild) |
462 | implements(IBuildFarmJobBehavior) |
463 | |
464 | # The list of build status values for which email notifications are |
465 | @@ -44,10 +44,6 @@ |
466 | 'OK', 'PACKAGEFAIL', 'DEPFAIL', 'CHROOTFAIL'] |
467 | |
468 | @property |
469 | - def build(self): |
470 | - return self.buildfarmjob.build |
471 | - |
472 | - @property |
473 | def display_name(self): |
474 | ret = "%s, %s, %s" % ( |
475 | self.build.distroseries.displayname, self.build.recipe.name, |
476 | |
477 | === modified file 'lib/lp/code/model/tests/test_recipebuilder.py' |
478 | --- lib/lp/code/model/tests/test_recipebuilder.py 2013-11-11 11:26:02 +0000 |
479 | +++ lib/lp/code/model/tests/test_recipebuilder.py 2013-11-12 09:11:23 +0000 |
480 | @@ -21,16 +21,12 @@ |
481 | from zope.component import getUtility |
482 | from zope.security.proxy import removeSecurityProxy |
483 | |
484 | -from lp.buildmaster.enums import ( |
485 | - BuildFarmJobType, |
486 | - BuildStatus, |
487 | - ) |
488 | +from lp.buildmaster.enums import BuildStatus |
489 | from lp.buildmaster.interactor import BuilderInteractor |
490 | from lp.buildmaster.interfaces.builder import CannotBuild |
491 | from lp.buildmaster.interfaces.buildfarmjobbehavior import ( |
492 | IBuildFarmJobBehavior, |
493 | ) |
494 | -from lp.buildmaster.model.buildqueue import BuildQueue |
495 | from lp.buildmaster.tests.mock_slaves import ( |
496 | MockBuilder, |
497 | OkSlave, |
498 | @@ -89,10 +85,7 @@ |
499 | spb = self.factory.makeSourcePackageRecipeBuild( |
500 | sourcepackage=sourcepackage, archive=archive, |
501 | recipe=recipe, requester=recipe_owner, distroseries=distroseries) |
502 | - job = spb.makeJob() |
503 | - job_id = removeSecurityProxy(job.job).id |
504 | - BuildQueue(job_type=BuildFarmJobType.RECIPEBRANCHBUILD, job=job_id) |
505 | - job = IBuildFarmJobBehavior(job) |
506 | + job = IBuildFarmJobBehavior(spb) |
507 | return job |
508 | |
509 | def test_providesInterface(self): |
510 | @@ -102,8 +95,8 @@ |
511 | |
512 | def test_adapts_ISourcePackageRecipeBuildJob(self): |
513 | # IBuildFarmJobBehavior adapts a ISourcePackageRecipeBuildJob |
514 | - job = self.factory.makeSourcePackageRecipeBuild().makeJob() |
515 | - job = IBuildFarmJobBehavior(job) |
516 | + build = self.factory.makeSourcePackageRecipeBuild() |
517 | + job = IBuildFarmJobBehavior(build) |
518 | self.assertProvides(job, IBuildFarmJobBehavior) |
519 | |
520 | def test_display_name(self): |
521 | @@ -145,8 +138,7 @@ |
522 | # verifyBuildRequest will raise if a bad pocket is proposed. |
523 | build = self.factory.makeSourcePackageRecipeBuild( |
524 | pocket=PackagePublishingPocket.SECURITY) |
525 | - job = self.factory.makeSourcePackageRecipeBuildJob(recipe_build=build) |
526 | - job = IBuildFarmJobBehavior(job.specific_job) |
527 | + job = IBuildFarmJobBehavior(build) |
528 | job.setBuilder(MockBuilder("bob-de-bouwer"), OkSlave()) |
529 | e = self.assertRaises( |
530 | AssertionError, job.verifyBuildRequest, BufferLogger()) |
531 | @@ -156,8 +148,7 @@ |
532 | # A build cookie is made up of the job type and record id. |
533 | # The uploadprocessor relies on this format. |
534 | build = self.factory.makeSourcePackageRecipeBuild() |
535 | - job = self.factory.makeSourcePackageRecipeBuildJob(recipe_build=build) |
536 | - job = IBuildFarmJobBehavior(job.specific_job) |
537 | + job = IBuildFarmJobBehavior(build) |
538 | cookie = removeSecurityProxy(job).getBuildCookie() |
539 | expected_cookie = "RECIPEBRANCHBUILD-%d" % build.id |
540 | self.assertEquals(expected_cookie, cookie) |
541 | @@ -351,7 +342,7 @@ |
542 | |
543 | def prepareBehavior(self, fake_successful_upload=False): |
544 | self.queue_record = self.factory.makeSourcePackageRecipeBuildJob() |
545 | - build = self.queue_record.specific_job.build |
546 | + build = self.queue_record.specific_build |
547 | build.updateStatus(BuildStatus.FULLYBUILT) |
548 | if fake_successful_upload: |
549 | removeSecurityProxy(build).verifySuccessfulUpload = FakeMethod( |
550 | |
551 | === modified file 'lib/lp/soyuz/configure.zcml' |
552 | --- lib/lp/soyuz/configure.zcml 2013-09-12 05:19:43 +0000 |
553 | +++ lib/lp/soyuz/configure.zcml 2013-11-12 09:11:23 +0000 |
554 | @@ -797,7 +797,7 @@ |
555 | |
556 | <!-- BinaryPackageBuildBehavior --> |
557 | <adapter |
558 | - for="lp.soyuz.interfaces.buildpackagejob.IBuildPackageJob" |
559 | + for="lp.soyuz.interfaces.buildpackagejob.IBinaryPackageBuild" |
560 | provides="lp.buildmaster.interfaces.buildfarmjobbehavior.IBuildFarmJobBehavior" |
561 | factory="lp.soyuz.model.binarypackagebuildbehavior.BinaryPackageBuildBehavior" |
562 | permission="zope.Public" /> |
563 | |
564 | === modified file 'lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py' |
565 | --- lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py 2013-10-28 07:07:44 +0000 |
566 | +++ lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py 2013-11-12 09:11:23 +0000 |
567 | @@ -98,8 +98,7 @@ |
568 | in order to trick the slave into building correctly. |
569 | :return: A list of the calls we expect to be made. |
570 | """ |
571 | - cookie = IBuildFarmJobBehavior( |
572 | - build.buildqueue_record.specific_job).getBuildCookie() |
573 | + cookie = IBuildFarmJobBehavior(build).getBuildCookie() |
574 | ds_name = build.distro_arch_series.distroseries.name |
575 | suite = ds_name + pocketsuffix[build.pocket] |
576 | archives = get_sources_list_for_building( |
577 | @@ -228,8 +227,7 @@ |
578 | lf = self.factory.makeLibraryFileAlias() |
579 | transaction.commit() |
580 | build.distro_arch_series.addOrUpdateChroot(lf) |
581 | - candidate = build.queueBuild() |
582 | - behavior = IBuildFarmJobBehavior(candidate.specific_job) |
583 | + behavior = IBuildFarmJobBehavior(build) |
584 | behavior.setBuilder(builder, None) |
585 | e = self.assertRaises( |
586 | AssertionError, behavior.verifyBuildRequest, BufferLogger()) |
587 | @@ -249,8 +247,7 @@ |
588 | lf = self.factory.makeLibraryFileAlias() |
589 | transaction.commit() |
590 | build.distro_arch_series.addOrUpdateChroot(lf) |
591 | - candidate = build.queueBuild() |
592 | - behavior = IBuildFarmJobBehavior(candidate.specific_job) |
593 | + behavior = IBuildFarmJobBehavior(build) |
594 | behavior.setBuilder(builder, None) |
595 | e = self.assertRaises( |
596 | AssertionError, behavior.verifyBuildRequest, BufferLogger()) |
597 | @@ -268,8 +265,7 @@ |
598 | lf = self.factory.makeLibraryFileAlias() |
599 | transaction.commit() |
600 | build.distro_arch_series.addOrUpdateChroot(lf) |
601 | - candidate = build.queueBuild() |
602 | - behavior = IBuildFarmJobBehavior(candidate.specific_job) |
603 | + behavior = IBuildFarmJobBehavior(build) |
604 | behavior.setBuilder(builder, None) |
605 | e = self.assertRaises( |
606 | AssertionError, behavior.verifyBuildRequest, BufferLogger()) |
607 | @@ -283,8 +279,7 @@ |
608 | builder = self.factory.makeBuilder() |
609 | build = self.factory.makeBinaryPackageBuild( |
610 | builder=builder, archive=archive) |
611 | - candidate = build.queueBuild() |
612 | - behavior = IBuildFarmJobBehavior(candidate.specific_job) |
613 | + behavior = IBuildFarmJobBehavior(build) |
614 | behavior.setBuilder(builder, None) |
615 | e = self.assertRaises( |
616 | CannotBuild, behavior.verifyBuildRequest, BufferLogger()) |
617 | @@ -294,8 +289,7 @@ |
618 | # A build cookie is made up of the job type and record id. |
619 | # The uploadprocessor relies on this format. |
620 | build = self.factory.makeBinaryPackageBuild() |
621 | - candidate = build.queueBuild() |
622 | - behavior = IBuildFarmJobBehavior(candidate.specific_job) |
623 | + behavior = IBuildFarmJobBehavior(build) |
624 | cookie = removeSecurityProxy(behavior).getBuildCookie() |
625 | expected_cookie = "PACKAGEBUILD-%d" % build.id |
626 | self.assertEqual(expected_cookie, cookie) |
627 | @@ -508,7 +502,7 @@ |
628 | 'buildlog', tmp_orig_file_name) |
629 | return d.addCallback(got_orig_log) |
630 | |
631 | - behavior = IBuildFarmJobBehavior(self.candidate.specific_job) |
632 | + behavior = IBuildFarmJobBehavior(self.build) |
633 | behavior.setBuilder(self.builder, slave) |
634 | d = behavior.getLogFromSlave(self.build.buildqueue_record) |
635 | return d.addCallback(got_log) |
636 | |
637 | === modified file 'lib/lp/translations/configure.zcml' |
638 | --- lib/lp/translations/configure.zcml 2013-05-09 06:04:22 +0000 |
639 | +++ lib/lp/translations/configure.zcml 2013-11-12 09:11:23 +0000 |
640 | @@ -654,7 +654,7 @@ |
641 | |
642 | <adapter |
643 | provides="lp.buildmaster.interfaces.buildfarmjobbehavior.IBuildFarmJobBehavior" |
644 | - for="lp.translations.model.translationtemplatesbuildjob.TranslationTemplatesBuildJob" |
645 | + for="lp.translations.model.translationtemplatesbuild.TranslationTemplatesBuild" |
646 | factory="lp.translations.model.translationtemplatesbuildbehavior.TranslationTemplatesBuildBehavior" |
647 | /> |
648 | |
649 | |
650 | === modified file 'lib/lp/translations/model/translationtemplatesbuildbehavior.py' |
651 | --- lib/lp/translations/model/translationtemplatesbuildbehavior.py 2013-10-08 11:56:24 +0000 |
652 | +++ lib/lp/translations/model/translationtemplatesbuildbehavior.py 2013-11-12 09:11:23 +0000 |
653 | @@ -50,7 +50,7 @@ |
654 | def getLogFileName(self): |
655 | """See `IBuildFarmJob`.""" |
656 | safe_name = re.sub( |
657 | - self.unsafe_chars, '_', self.buildfarmjob.branch.unique_name) |
658 | + self.unsafe_chars, '_', self.build.branch.unique_name) |
659 | return "translationtemplates_%s_%d.txt" % (safe_name, self.build.id) |
660 | |
661 | def dispatchBuildToSlave(self, build_queue_item, logger): |
662 | @@ -66,7 +66,7 @@ |
663 | def got_cache_file(ignored): |
664 | args = { |
665 | 'arch_tag': self._getDistroArchSeries().architecturetag, |
666 | - 'branch_url': self.buildfarmjob.branch.composePublicURL(), |
667 | + 'branch_url': self.build.branch.composePublicURL(), |
668 | } |
669 | |
670 | filemap = {} |
671 | @@ -88,7 +88,7 @@ |
672 | logger.info( |
673 | "Starting templates build %s for %s." % ( |
674 | self.getBuildCookie(), |
675 | - self.buildfarmjob.branch.bzr_identity)) |
676 | + self.build.branch.bzr_identity)) |
677 | |
678 | def _readTarball(self, buildqueue, filemap, logger): |
679 | """Read tarball with generated translation templates from slave.""" |
680 | |
681 | === modified file 'lib/lp/translations/tests/test_translationtemplatesbuildbehavior.py' |
682 | --- lib/lp/translations/tests/test_translationtemplatesbuildbehavior.py 2013-10-08 11:56:24 +0000 |
683 | +++ lib/lp/translations/tests/test_translationtemplatesbuildbehavior.py 2013-11-12 09:11:23 +0000 |
684 | @@ -11,7 +11,6 @@ |
685 | from testtools.deferredruntest import AsynchronousDeferredRunTest |
686 | from twisted.internet import defer |
687 | from zope.component import getUtility |
688 | -from zope.security.proxy import removeSecurityProxy |
689 | |
690 | from lp.app.interfaces.launchpad import ILaunchpadCelebrities |
691 | from lp.buildmaster.enums import BuildStatus |
692 | @@ -20,13 +19,11 @@ |
693 | from lp.buildmaster.interfaces.buildfarmjobbehavior import ( |
694 | IBuildFarmJobBehavior, |
695 | ) |
696 | -from lp.buildmaster.model.buildqueue import BuildQueue |
697 | from lp.buildmaster.tests.mock_slaves import ( |
698 | SlaveTestHelpers, |
699 | WaitingSlave, |
700 | ) |
701 | from lp.services.config import config |
702 | -from lp.services.database.interfaces import IStore |
703 | from lp.services.librarian.interfaces import ILibraryFileAliasSet |
704 | from lp.services.librarian.utils import copy_and_close |
705 | from lp.testing import TestCaseWithFactory |
706 | @@ -45,13 +42,13 @@ |
707 | class FakeBuildQueue: |
708 | """Pretend `BuildQueue`.""" |
709 | |
710 | - def __init__(self, behavior): |
711 | + def __init__(self, behavior, bfjo): |
712 | """Pretend to be a BuildQueue item for the given build behavior. |
713 | |
714 | Copies its builder from the behavior object. |
715 | """ |
716 | self.builder = behavior._builder |
717 | - self.specific_job = behavior.buildfarmjob |
718 | + self.specific_job = bfjo |
719 | self.date_started = datetime.datetime.now(pytz.UTC) |
720 | self.destroySelf = FakeMethod() |
721 | |
722 | @@ -59,7 +56,8 @@ |
723 | class MakeBehaviorMixin(object): |
724 | """Provide common test methods.""" |
725 | |
726 | - def makeBehavior(self, branch=None, use_fake_chroot=True, **kwargs): |
727 | + def makeBehavior(self, branch=None, use_fake_chroot=True, want_bfjo=False, |
728 | + **kwargs): |
729 | """Create a TranslationTemplatesBuildBehavior. |
730 | |
731 | Anything that might communicate with build slaves and such |
732 | @@ -67,14 +65,17 @@ |
733 | """ |
734 | specific_job = self.factory.makeTranslationTemplatesBuildJob( |
735 | branch=branch) |
736 | - behavior = IBuildFarmJobBehavior(specific_job) |
737 | + behavior = IBuildFarmJobBehavior(specific_job.build) |
738 | slave = WaitingSlave(**kwargs) |
739 | behavior.setBuilder(self.factory.makeBuilder(), slave) |
740 | if use_fake_chroot: |
741 | lf = self.factory.makeLibraryFileAlias() |
742 | self.layer.txn.commit() |
743 | behavior._getChroot = lambda: lf |
744 | - return behavior |
745 | + if want_bfjo: |
746 | + return behavior, specific_job |
747 | + else: |
748 | + return behavior |
749 | |
750 | def makeProductSeriesWithBranchForTranslation(self): |
751 | productseries = self.factory.makeProductSeries() |
752 | @@ -97,11 +98,6 @@ |
753 | super(TestTranslationTemplatesBuildBehavior, self).setUp() |
754 | self.slave_helper = self.useFixture(SlaveTestHelpers()) |
755 | |
756 | - def _getBuildQueueItem(self, behavior): |
757 | - """Get `BuildQueue` for an `IBuildFarmJobBehavior`.""" |
758 | - job = removeSecurityProxy(behavior.buildfarmjob.job) |
759 | - return IStore(BuildQueue).find(BuildQueue, job=job).one() |
760 | - |
761 | def test_getLogFileName(self): |
762 | # Each job has a unique log file name. |
763 | b1 = self.makeBehavior() |
764 | @@ -110,9 +106,8 @@ |
765 | |
766 | def test_dispatchBuildToSlave_no_chroot_fails(self): |
767 | # dispatchBuildToSlave will fail if the chroot does not exist. |
768 | - behavior = self.makeBehavior(use_fake_chroot=False) |
769 | - buildqueue_item = self._getBuildQueueItem(behavior) |
770 | - |
771 | + behavior, buildqueue_item = self.makeBehavior( |
772 | + use_fake_chroot=False, want_bfjo=True) |
773 | switch_dbuser(config.builddmaster.dbuser) |
774 | self.assertRaises( |
775 | CannotBuild, behavior.dispatchBuildToSlave, buildqueue_item, |
776 | @@ -122,9 +117,7 @@ |
777 | # dispatchBuildToSlave ultimately causes the slave's build |
778 | # method to be invoked. The slave receives the URL of the |
779 | # branch it should build from. |
780 | - behavior = self.makeBehavior() |
781 | - buildqueue_item = self._getBuildQueueItem(behavior) |
782 | - |
783 | + behavior, buildqueue_item = self.makeBehavior(want_bfjo=True) |
784 | switch_dbuser(config.builddmaster.dbuser) |
785 | d = behavior.dispatchBuildToSlave(buildqueue_item, logging) |
786 | |
787 | @@ -140,7 +133,7 @@ |
788 | # The slave receives the public http URL for the branch. |
789 | self.assertEqual( |
790 | branch_url, |
791 | - behavior.buildfarmjob.branch.composePublicURL()) |
792 | + behavior.build.branch.composePublicURL()) |
793 | return d.addCallback(got_dispatch) |
794 | |
795 | def test_getChroot(self): |
796 | @@ -162,8 +155,8 @@ |
797 | self.assertEqual(fake_chroot_file, chroot) |
798 | |
799 | def test_readTarball(self): |
800 | - behavior = self.makeBehavior() |
801 | - buildqueue = FakeBuildQueue(behavior) |
802 | + behavior, bfjo = self.makeBehavior(want_bfjo=True) |
803 | + buildqueue = FakeBuildQueue(behavior, bfjo) |
804 | path = behavior.templates_tarball_path |
805 | # Poke the file we're expecting into the mock slave. |
806 | behavior._slave.valid_file_hashes.append(path) |
807 | @@ -182,10 +175,10 @@ |
808 | |
809 | def test_handleStatus_OK(self): |
810 | # Hopefully, a build will succeed and produce a tarball. |
811 | - behavior = self.makeBehavior( |
812 | - filemap={'translation-templates.tar.gz': 'foo'}) |
813 | + behavior, bfjo = self.makeBehavior( |
814 | + filemap={'translation-templates.tar.gz': 'foo'}, want_bfjo=True) |
815 | behavior._uploadTarball = FakeMethod() |
816 | - queue_item = FakeBuildQueue(behavior) |
817 | + queue_item = FakeBuildQueue(behavior, bfjo) |
818 | slave = behavior._slave |
819 | |
820 | d = behavior.dispatchBuildToSlave(queue_item, logging) |
821 | @@ -221,9 +214,10 @@ |
822 | |
823 | def test_handleStatus_failed(self): |
824 | # Builds may also fail (and produce no tarball). |
825 | - behavior = self.makeBehavior(state='BuildStatus.FAILEDTOBUILD') |
826 | + behavior, bfjo = self.makeBehavior( |
827 | + state='BuildStatus.FAILEDTOBUILD', want_bfjo=True) |
828 | behavior._uploadTarball = FakeMethod() |
829 | - queue_item = FakeBuildQueue(behavior) |
830 | + queue_item = FakeBuildQueue(behavior, bfjo) |
831 | slave = behavior._slave |
832 | d = behavior.dispatchBuildToSlave(queue_item, logging) |
833 | |
834 | @@ -254,9 +248,9 @@ |
835 | def test_handleStatus_notarball(self): |
836 | # Even if the build status is "OK," absence of a tarball will |
837 | # not faze the Behavior class. |
838 | - behavior = self.makeBehavior() |
839 | + behavior, bfjo = self.makeBehavior(want_bfjo=True) |
840 | behavior._uploadTarball = FakeMethod() |
841 | - queue_item = FakeBuildQueue(behavior) |
842 | + queue_item = FakeBuildQueue(behavior, bfjo) |
843 | slave = behavior._slave |
844 | d = behavior.dispatchBuildToSlave(queue_item, logging) |
845 | |
846 | @@ -284,9 +278,10 @@ |
847 | def test_handleStatus_uploads(self): |
848 | productseries = self.makeProductSeriesWithBranchForTranslation() |
849 | branch = productseries.branch |
850 | - behavior = self.makeBehavior( |
851 | - branch=branch, filemap={'translation-templates.tar.gz': 'foo'}) |
852 | - queue_item = FakeBuildQueue(behavior) |
853 | + behavior, bfjo = self.makeBehavior( |
854 | + branch=branch, filemap={'translation-templates.tar.gz': 'foo'}, |
855 | + want_bfjo=True) |
856 | + queue_item = FakeBuildQueue(behavior, bfjo) |
857 | slave = behavior._slave |
858 | |
859 | d = behavior.dispatchBuildToSlave(queue_item, logging) |