Merge lp:~michael.nelson/launchpad/589058-upload-rejected-date-started-not-set into lp:launchpad

Proposed by Michael Nelson on 2010-06-09
Status: Merged
Approved by: Edwin Grubbs on 2010-06-09
Approved revision: no longer in the source branch.
Merged at revision: 10981
Proposed branch: lp:~michael.nelson/launchpad/589058-upload-rejected-date-started-not-set
Merge into: lp:launchpad
Diff against target: 71 lines (+36/-5)
2 files modified
lib/lp/soyuz/model/binarypackagebuild.py (+6/-5)
lib/lp/soyuz/tests/test_binarypackagebuild.py (+30/-0)
To merge this branch: bzr merge lp:~michael.nelson/launchpad/589058-upload-rejected-date-started-not-set
Reviewer Review Type Date Requested Status
Edwin Grubbs (community) code 2010-06-09 Approve on 2010-06-09
Review via email: mp+27147@code.launchpad.net

Description of the Change

This fixes bug 589068 (despite the branch name) by ensuring that, when estimating the duration of a build, the previous build is only used if it has both date_started and date_finished.

See the bug for why there are completed builds without date_started (rollout related). This branch just makes sure we don't fall over when this occurs.

to test:
bin/test -vvm test_binarypackagebuild -t test_estimateDuration

No lint (although strange exceptions while running `make lint`.

To post a comment you must log in.
Edwin Grubbs (edwin-grubbs) wrote :

Looks good.

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/soyuz/model/binarypackagebuild.py'
2--- lib/lp/soyuz/model/binarypackagebuild.py 2010-06-08 11:30:29 +0000
3+++ lib/lp/soyuz/model/binarypackagebuild.py 2010-06-09 12:18:28 +0000
4@@ -484,13 +484,14 @@
5 clauseTables=['PackageBuild', 'BuildFarmJob', 'SourcePackageName',
6 'SourcePackageRelease'])
7
8+ estimated_duration = None
9 if completed_builds.count() > 0:
10- # Historic build data exists, use the most recent value.
11+ # Historic build data exists, use the most recent value -
12+ # assuming it has valid data.
13 most_recent_build = completed_builds[0]
14- date_finished = most_recent_build.date_finished
15- date_started = most_recent_build.date_started
16- estimated_duration = date_finished - date_started
17- else:
18+ estimated_duration = most_recent_build.duration
19+
20+ if estimated_duration is None:
21 # Estimate the build duration based on package size if no
22 # historic build data exists.
23
24
25=== modified file 'lib/lp/soyuz/tests/test_binarypackagebuild.py'
26--- lib/lp/soyuz/tests/test_binarypackagebuild.py 2010-06-08 17:48:08 +0000
27+++ lib/lp/soyuz/tests/test_binarypackagebuild.py 2010-06-09 12:18:28 +0000
28@@ -3,6 +3,8 @@
29
30 """Test Build features."""
31
32+from datetime import datetime, timedelta
33+import pytz
34 import unittest
35
36 from storm.store import Store
37@@ -62,6 +64,34 @@
38 self.failIfEqual(None, bq.processor)
39 self.failUnless(bq, self.build.buildqueue_record)
40
41+ def test_estimateDuration(self):
42+ # Without previous builds, a negligable package size estimate is 60s
43+ self.assertEqual(60, self.build.estimateDuration().seconds)
44+
45+ def create_previous_build(self, duration):
46+ spr = self.build.source_package_release
47+ build = spr.createBuild(
48+ distro_arch_series=self.build.distro_arch_series,
49+ archive=spr.upload_archive, pocket=spr.package_upload.pocket)
50+ build.status = BuildStatus.FULLYBUILT
51+ now = datetime.now(pytz.UTC)
52+ build.date_finished = now
53+ build.date_started = now - timedelta(seconds=duration)
54+ return build
55+
56+ def test_estimateDuration_with_history(self):
57+ # Previous builds of the same source are used for estimates.
58+ self.create_previous_build(335)
59+ self.assertEqual(335, self.build.estimateDuration().seconds)
60+
61+ def test_estimateDuration_with_bad_history(self):
62+ # If the latest matching build has bad data, ignore it.
63+ # See bug 589068.
64+ previous_build = self.create_previous_build(335)
65+ previous_build.date_started = None
66+ self.assertEqual(60, self.build.estimateDuration().seconds)
67+
68+
69 def addFakeBuildLog(self):
70 lfa = self.factory.makeLibraryFileAlias('mybuildlog.txt')
71 removeSecurityProxy(self.build).log = lfa