Merge lp:~wgrant/launchpad/bug-1160461 into lp:launchpad

Proposed by William Grant
Status: Merged
Approved by: Steve Kowalik
Approved revision: no longer in the source branch.
Merged at revision: 16544
Proposed branch: lp:~wgrant/launchpad/bug-1160461
Merge into: lp:launchpad
Diff against target: 60 lines (+16/-3)
2 files modified
lib/lp/soyuz/browser/build.py (+2/-3)
lib/lp/soyuz/browser/tests/test_build_views.py (+14/-0)
To merge this branch: bzr merge lp:~wgrant/launchpad/bug-1160461
Reviewer Review Type Date Requested Status
Steve Kowalik (community) code Approve
Review via email: mp+155651@code.launchpad.net

Commit message

Fix BuildView.eta to handle suspended jobs, fixing a crash on SourcePackageRecipe:+index when there's a pending binary build in a disabled archive.

Description of the change

BuildView.eta doesn't handle the case where the job is suspended, causing SourcePackageRecipe:+index to crash when there's a pending binary build in a disabled PPA. Fix it to return None instead.

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
=== modified file 'lib/lp/soyuz/browser/build.py'
--- lib/lp/soyuz/browser/build.py 2013-02-05 23:43:54 +0000
+++ lib/lp/soyuz/browser/build.py 2013-03-27 03:40:29 +0000
@@ -50,7 +50,6 @@
50 InconsistentBuildFarmJobError,50 InconsistentBuildFarmJobError,
51 ISpecificBuildFarmJobSource,51 ISpecificBuildFarmJobSource,
52 )52 )
53from lp.buildmaster.interfaces.packagebuild import IPackageBuild
54from lp.buildmaster.model.buildfarmjob import BuildFarmJob53from lp.buildmaster.model.buildfarmjob import BuildFarmJob
55from lp.code.interfaces.sourcepackagerecipebuild import (54from lp.code.interfaces.sourcepackagerecipebuild import (
56 ISourcePackageRecipeBuildSource,55 ISourcePackageRecipeBuildSource,
@@ -336,10 +335,10 @@
336 queue_record = self.context.buildqueue_record335 queue_record = self.context.buildqueue_record
337 if queue_record.job.status == JobStatus.WAITING:336 if queue_record.job.status == JobStatus.WAITING:
338 start_time = queue_record.getEstimatedJobStartTime()337 start_time = queue_record.getEstimatedJobStartTime()
339 if start_time is None:
340 return None
341 else:338 else:
342 start_time = queue_record.job.date_started339 start_time = queue_record.job.date_started
340 if start_time is None:
341 return None
343 duration = queue_record.estimated_duration342 duration = queue_record.estimated_duration
344 return start_time + duration343 return start_time + duration
345344
346345
=== modified file 'lib/lp/soyuz/browser/tests/test_build_views.py'
--- lib/lp/soyuz/browser/tests/test_build_views.py 2013-01-24 05:50:23 +0000
+++ lib/lp/soyuz/browser/tests/test_build_views.py 2013-03-27 03:40:29 +0000
@@ -19,6 +19,7 @@
19from lp.registry.interfaces.person import IPersonSet19from lp.registry.interfaces.person import IPersonSet
20from lp.registry.interfaces.pocket import PackagePublishingPocket20from lp.registry.interfaces.pocket import PackagePublishingPocket
21from lp.registry.interfaces.series import SeriesStatus21from lp.registry.interfaces.series import SeriesStatus
22from lp.services.database.sqlbase import flush_database_caches
22from lp.services.job.interfaces.job import JobStatus23from lp.services.job.interfaces.job import JobStatus
23from lp.services.webapp import canonical_url24from lp.services.webapp import canonical_url
24from lp.services.webapp.interfaces import StormRangeFactoryError25from lp.services.webapp.interfaces import StormRangeFactoryError
@@ -29,6 +30,7 @@
29from lp.soyuz.interfaces.packageset import IPackagesetSet30from lp.soyuz.interfaces.packageset import IPackagesetSet
30from lp.soyuz.model.queue import PackageUploadBuild31from lp.soyuz.model.queue import PackageUploadBuild
31from lp.testing import (32from lp.testing import (
33 admin_logged_in,
32 person_logged_in,34 person_logged_in,
33 TestCaseWithFactory,35 TestCaseWithFactory,
34 )36 )
@@ -426,3 +428,15 @@
426 'start': 75,428 'start': 75,
427 'memo': '["2012-01-01T01:01:01", 0]'})429 'memo': '["2012-01-01T01:01:01", 0]'})
428 view.setupBuildList()430 view.setupBuildList()
431
432 def test_eta(self):
433 # BuildView.eta returns a non-None value when it should, or None
434 # when there's no start time.
435 build = self.factory.makeBinaryPackageBuild()
436 build.queueBuild()
437 self.factory.makeBuilder(processor=build.processor, virtualized=True)
438 self.assertIsNot(None, create_initialized_view(build, '+index').eta)
439 with admin_logged_in():
440 build.archive.disable()
441 flush_database_caches()
442 self.assertIs(None, create_initialized_view(build, '+index').eta)