Merge lp:~abentley/launchpad/fix-recipebuilder into lp:launchpad

Proposed by Aaron Bentley
Status: Merged
Merged at revision: 10917
Proposed branch: lp:~abentley/launchpad/fix-recipebuilder
Merge into: lp:launchpad
Diff against target: 139 lines (+40/-7)
5 files modified
lib/lp/code/interfaces/sourcepackagerecipebuild.py (+3/-1)
lib/lp/code/model/recipebuilder.py (+1/-1)
lib/lp/code/model/sourcepackagerecipebuild.py (+9/-3)
lib/lp/code/model/tests/test_recipebuilder.py (+23/-0)
lib/lp/testing/factory.py (+4/-2)
To merge this branch: bzr merge lp:~abentley/launchpad/fix-recipebuilder
Reviewer Review Type Date Requested Status
Paul Hummer (community) code Approve
Review via email: mp+25528@code.launchpad.net

Commit message

Fix verifyBuildRequest to use valid attribute

Description of the change

= Summary =
Fix bug #581899: verifyBuildRequest is broken

== Proposed fix ==
Update to use SourcePackageRecipeBuild.is_virtualized, like binary builds do.

== Pre-implementation notes ==
Discussed with noodles and bigjools

== Implementation details ==
Make SourcePackageRecipeBuildJob.virtualized mirror
SourcePackageRecipeBuild.is_virtualized

Allow overriding the pocket of a Build.

Add tests for error paths in verifyBuildRequest

== Tests ==
bin/test -t verifyBuildRequest test_recipebuilder

== Demo and Q/A ==
I am unclear how to test this.

= Launchpad lint =

Checking for conflicts. and issues in doctests and templates.
Running jslint, xmllint, pyflakes, and pylint.
Using normal rules.

Linting changed files:
  lib/lp/code/interfaces/sourcepackagerecipebuild.py
  lib/lp/testing/factory.py
  lib/lp/code/model/sourcepackagerecipebuild.py
  lib/lp/code/model/tests/test_recipebuilder.py
  lib/lp/code/model/recipebuilder.py

To post a comment you must log in.
Revision history for this message
Paul Hummer (rockstar) :
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/code/interfaces/sourcepackagerecipebuild.py'
2--- lib/lp/code/interfaces/sourcepackagerecipebuild.py 2010-05-06 18:34:20 +0000
3+++ lib/lp/code/interfaces/sourcepackagerecipebuild.py 2010-05-25 19:21:34 +0000
4@@ -17,7 +17,7 @@
5 from lazr.restful.declarations import export_as_webservice_entry
6
7 from zope.interface import Interface
8-from zope.schema import Datetime, Int, Object
9+from zope.schema import Bool, Datetime, Int, Object
10
11 from canonical.launchpad import _
12
13@@ -65,6 +65,8 @@
14 ISourcePackageRelease, title=_("The produced source package release"),
15 readonly=True)
16
17+ is_virtualized = Bool(title=_('If True, this build is virtualized.'))
18+
19 def getFileByName(filename):
20 """Return the file under +files with specified name."""
21
22
23=== modified file 'lib/lp/code/model/recipebuilder.py'
24--- lib/lp/code/model/recipebuilder.py 2010-05-10 15:50:23 +0000
25+++ lib/lp/code/model/recipebuilder.py 2010-05-25 19:21:34 +0000
26@@ -153,7 +153,7 @@
27 """
28 build = self.build
29 assert not (not self._builder.virtualized and build.is_virtualized), (
30- "Attempt to build non-virtual item on a virtual builder.")
31+ "Attempt to build virtual item on a non-virtual builder.")
32
33 # This should already have been checked earlier, but just check again
34 # here in case of programmer errors.
35
36=== modified file 'lib/lp/code/model/sourcepackagerecipebuild.py'
37--- lib/lp/code/model/sourcepackagerecipebuild.py 2010-05-14 21:24:48 +0000
38+++ lib/lp/code/model/sourcepackagerecipebuild.py 2010-05-25 19:21:34 +0000
39@@ -119,6 +119,8 @@
40 """See `IBuildBase`."""
41 return self.distroseries.distribution
42
43+ is_virtualized = True
44+
45 pocket = DBEnum(enum=PackagePublishingPocket)
46
47 recipe_id = Int(name='recipe', allow_none=False)
48@@ -169,11 +171,12 @@
49 self.sourcepackagename = sourcepackagename
50
51 @classmethod
52- def new(cls, sourcepackage, recipe, requester, archive,
53- pocket=PackagePublishingPocket.RELEASE,
54+ def new(cls, sourcepackage, recipe, requester, archive, pocket=None,
55 date_created=None):
56 """See `ISourcePackageRecipeBuildSource`."""
57 store = IMasterStore(SourcePackageRecipeBuild)
58+ if pocket is None:
59+ pocket = PackagePublishingPocket.RELEASE
60 if date_created is None:
61 date_created = UTC_NOW
62 spbuild = cls(
63@@ -255,7 +258,10 @@
64 def processor(self):
65 return self.build.distroseries.nominatedarchindep.default_processor
66
67- virtualized = True
68+ @property
69+ def virtualized(self):
70+ """See `IBuildFarmJob`."""
71+ return self.build.is_virtualized
72
73 def __init__(self, build, job):
74 self.build = build
75
76=== modified file 'lib/lp/code/model/tests/test_recipebuilder.py'
77--- lib/lp/code/model/tests/test_recipebuilder.py 2010-05-06 18:16:09 +0000
78+++ lib/lp/code/model/tests/test_recipebuilder.py 2010-05-25 19:21:34 +0000
79@@ -25,6 +25,7 @@
80 from lp.code.model.recipebuilder import RecipeBuildBehavior
81 from lp.code.model.sourcepackagerecipebuild import (
82 SourcePackageRecipeBuild)
83+from lp.registry.interfaces.pocket import PackagePublishingPocket
84 from lp.soyuz.adapters.archivedependencies import (
85 get_sources_list_for_building)
86 from lp.soyuz.model.processor import ProcessorFamilySet
87@@ -99,6 +100,28 @@
88 job.verifyBuildRequest(logger)
89 self.assertEquals("", logger.buffer.getvalue())
90
91+ def test_verifyBuildRequest_non_virtual(self):
92+ # verifyBuildRequest will raise if a non-virtual builder is proposed.
93+ job = self.makeJob()
94+ builder = MockBuilder('non-virtual builder', OkSlave())
95+ builder.virtualized = False
96+ job.setBuilder(builder)
97+ logger = BufferLogger()
98+ e = self.assertRaises(AssertionError, job.verifyBuildRequest, logger)
99+ self.assertEqual(
100+ 'Attempt to build virtual item on a non-virtual builder.', str(e))
101+
102+ def test_verifyBuildRequest_bad_pocket(self):
103+ # verifyBuildRequest will raise if a bad pocket is proposed.
104+ build = self.factory.makeSourcePackageRecipeBuild(
105+ pocket=PackagePublishingPocket.SECURITY)
106+ job = self.factory.makeSourcePackageRecipeBuildJob(recipe_build=build)
107+ job = IBuildFarmJobBehavior(job.specific_job)
108+ job.setBuilder(MockBuilder("bob-de-bouwer", OkSlave()))
109+ e = self.assertRaises(
110+ AssertionError, job.verifyBuildRequest, BufferLogger())
111+ self.assertIn('invalid pocket due to the series status of', str(e))
112+
113 def test__extraBuildArgs(self):
114 # _extraBuildArgs will return a sane set of additional arguments
115 bzr_builder_config = """
116
117=== modified file 'lib/lp/testing/factory.py'
118--- lib/lp/testing/factory.py 2010-05-19 07:39:42 +0000
119+++ lib/lp/testing/factory.py 2010-05-25 19:21:34 +0000
120@@ -1789,7 +1789,8 @@
121
122 def makeSourcePackageRecipeBuild(self, sourcepackage=None, recipe=None,
123 requester=None, archive=None,
124- sourcename=None, distroseries=None):
125+ sourcename=None, distroseries=None,
126+ pocket=None):
127 """Make a new SourcePackageRecipeBuild."""
128 if recipe is None:
129 recipe = self.makeSourcePackageRecipe(
130@@ -1808,7 +1809,8 @@
131 sourcepackage=sourcepackage,
132 recipe=recipe,
133 archive=archive,
134- requester=requester)
135+ requester=requester,
136+ pocket=pocket)
137
138 def makeSourcePackageRecipeBuildJob(
139 self, score=9876, virtualized=True, estimated_duration=64,