Merge lp:~michael.nelson/launchpad/567922-binarypackagebuild-packagebuild-4 into lp:launchpad/db-devel

Proposed by Michael Nelson
Status: Merged
Approved by: Michael Nelson
Approved revision: no longer in the source branch.
Merged at revision: 9405
Proposed branch: lp:~michael.nelson/launchpad/567922-binarypackagebuild-packagebuild-4
Merge into: lp:launchpad/db-devel
Prerequisite: lp:~michael.nelson/launchpad/567922-binarypackagebuild-packagebuild-3
Diff against target: 711 lines (+184/-237) (has conflicts)
11 files modified
BRANCH.TODO (+6/-0)
lib/lp/buildmaster/interfaces/buildfarmjob.py (+40/-34)
lib/lp/buildmaster/model/buildfarmjob.py (+109/-97)
lib/lp/buildmaster/model/packagebuild.py (+8/-71)
lib/lp/buildmaster/tests/test_buildfarmjob.py (+0/-12)
lib/lp/code/model/sourcepackagerecipebuild.py (+4/-4)
lib/lp/soyuz/interfaces/buildfarmbuildjob.py (+2/-2)
lib/lp/soyuz/model/buildpackagejob.py (+6/-6)
lib/lp/soyuz/tests/test_buildpackagejob.py (+3/-3)
lib/lp/translations/model/translationtemplatesbuildjob.py (+3/-4)
lib/lp/translations/tests/test_translationtemplatesbuildjob.py (+3/-4)
Text conflict in lib/lp/buildmaster/interfaces/buildbase.py
Text conflict in lib/lp/buildmaster/model/buildbase.py
Text conflict in lib/lp/buildmaster/tests/test_buildbase.py
To merge this branch: bzr merge lp:~michael.nelson/launchpad/567922-binarypackagebuild-packagebuild-4
Reviewer Review Type Date Requested Status
Abel Deuring (community) code Approve
Review via email: mp+24356@code.launchpad.net

Description of the change

This branch is part of a pipeline for

https://blueprints.edge.launchpad.net/soyuz/+spec/build-generalisation
https://dev.launchpad.net/LEP/GeneralBuildHistories

Overview
========
The changes in this branch just do a bit of cleaning up after the refactoring of the past 3 branches.

The previous 3 branches added all the IBuildBase attributes and methods to IBuildFarmJob/IPackageJob in preparation for switching our build infrastructure to the new build tables (similar, but not exactly like http://people.ubuntu.com/~wgrant/launchpad/buildfarm/new-build-model-again.png)

This branch does some retrospective cleaning up.

Details
=======
The previous branches update the IBuildFarmJob as planned so that new database-backed BuildFarmJob/PackageBuild objects can be created and tested while still ensuring that existing classes that use IBuildFarmJob implementations and expect them to be non-database objects providing functionality still pass their tests. But it was getting complicated to see these two different ways in which IBuildFarmJob was expected to behave (see has_concrete_build_farm_job that is removed in this branch).

So, to simplify the ongoing refactoring work, I split out IBuildFarmJobOld from IBuildFarmJob, where IBuildFarmJobOld is the exact interface that existing classes currently expect, while IBuildFarmJob is a superset representing the new database-backed objects. I also added a note in the BRANCH.TODO that these *Old classes will be removed before the branch is landed.

This allowed IBuildFarmJob and IPackageBuild to be simplified, as they no longer need to worry about whether they are representing a database-backed object or not.

This branch is dependent on the pending schema patch in a previous branch.

To test
=======

First update the test db schema (required as the db patch still needs to be updated to remove the old build table):
psql launchpad_ftest_template -f database/schema/pending/michaeln-build-generalisation.sql
bin/py database/schema/security.py -d launchpad_ftest_template

And then either:
bin/test -vvt test_*build (lots of tests), or for a quicker run:
bin/test -vvt test_packagebuild -t test_buildfarmjob -t doc/build.txt -t test_buildqueue -t test_sourcepackagerecipebuild -t test_buildpackagejob -t test_buildbase

(there is one intentional test failure in test_buildfarmjob for a method that can't be implemented until I switch BinaryPackageBuild to the new delegation model of IPackageBuild/IBuildFarmJob).

The next branch will (finally) the work to switch BinaryPackageBuild from the old build table to the new buildfarmjob/packagebuild/binarypackagebuild tables.

To post a comment you must log in.
Revision history for this message
Abel Deuring (adeuring) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'BRANCH.TODO'
--- BRANCH.TODO 2010-05-05 15:48:49 +0000
+++ BRANCH.TODO 2010-05-05 15:48:52 +0000
@@ -2,6 +2,12 @@
2# landing. There is a test to ensure it is empty in trunk. If there is2# landing. There is a test to ensure it is empty in trunk. If there is
3# stuff still here when you are ready to land, the items should probably3# stuff still here when you are ready to land, the items should probably
4# be converted to bugs so they can be scheduled.4# be converted to bugs so they can be scheduled.
5The following temporary classes need to be removed before this branch can
6land:
7 * BuildFarmJobOld/IBuildFarmJobOld (update the classes using this to
8 use the new db versions).
9 * BuildFarmJobOldDerived (move queue-methods onto BuildFarmJobDerived).
10 * BuildBase.
511
6The static methods on IBuildFarmJob/IPackageBuild should be reverted12The static methods on IBuildFarmJob/IPackageBuild should be reverted
7to normal methods once all *Build classes have transitioned to the new13to normal methods once all *Build classes have transitioned to the new
814
=== modified file 'lib/lp/buildmaster/interfaces/buildfarmjob.py'
--- lib/lp/buildmaster/interfaces/buildfarmjob.py 2010-05-05 15:48:49 +0000
+++ lib/lp/buildmaster/interfaces/buildfarmjob.py 2010-05-05 15:48:52 +0000
@@ -9,6 +9,7 @@
99
10__all__ = [10__all__ = [
11 'IBuildFarmJob',11 'IBuildFarmJob',
12 'IBuildFarmJobOld',
12 'IBuildFarmJobSource',13 'IBuildFarmJobSource',
13 'IBuildFarmJobDerived',14 'IBuildFarmJobDerived',
14 'BuildFarmJobType',15 'BuildFarmJobType',
@@ -59,11 +60,18 @@
59 """)60 """)
6061
6162
62class IBuildFarmJob(Interface):63class IBuildFarmJobOld(Interface):
63 """Operations that jobs for the build farm must implement."""64 """Defines the previous non-database BuildFarmJob interface.
6465
65 id = Attribute('The build farm job ID.')66 This interface is still used by the temporary build queue related
6667 classes (TranslationTemplatesBuildJob, SourcePackageRecipeBuildJob
68 and BuildPackageJob).
69
70 XXX 2010-04-28 michael.nelson bug=567922
71 This class can be removed (merging all the attributes directly into
72 IBuildFarmJob) once all the corresponding *Build classes and the
73 BuildQueue have been transitioned to the new database schema.
74 """
67 processor = Reference(75 processor = Reference(
68 IProcessor, title=_("Processor"), required=False, readonly=True,76 IProcessor, title=_("Processor"), required=False, readonly=True,
69 description=_(77 description=_(
@@ -77,6 +85,33 @@
77 "This should be None for job types that do not care whether "85 "This should be None for job types that do not care whether "
78 "they run virtualized."))86 "they run virtualized."))
7987
88 def score():
89 """Calculate a job score appropriate for the job type in question."""
90
91 def getLogFileName():
92 """The preferred file name for this job's log."""
93
94 def getName():
95 """An appropriate name for this job."""
96
97 def getTitle():
98 """A string to identify and describe the job to users."""
99
100 def jobStarted():
101 """'Job started' life cycle event, handle as appropriate."""
102
103 def jobReset():
104 """'Job reset' life cycle event, handle as appropriate."""
105
106 def jobAborted():
107 """'Job aborted' life cycle event, handle as appropriate."""
108
109
110class IBuildFarmJob(IBuildFarmJobOld):
111 """Operations that jobs for the build farm must implement."""
112
113 id = Attribute('The build farm job ID.')
114
80 date_created = exported(115 date_created = exported(
81 Datetime(116 Datetime(
82 title=_("Date created"), required=True, readonly=True,117 title=_("Date created"), required=True, readonly=True,
@@ -142,37 +177,8 @@
142 vocabulary=BuildFarmJobType,177 vocabulary=BuildFarmJobType,
143 description=_("The specific type of job."))178 description=_("The specific type of job."))
144179
145 # XXX 2010-04-21 michael.nelson bug=567922. This property
146 # can be removed once all *Build classes use the concrete
147 # BuildFarmJob.
148 has_concrete_build_farm_job = Bool(
149 title=_('Has concrete build farm job'), required=False,
150 readonly=True, description=_(
151 'Whether this instance is or has a concrete build farm job.'))
152
153 title = exported(TextLine(title=_("Title"), required=False))180 title = exported(TextLine(title=_("Title"), required=False))
154181
155 def score():
156 """Calculate a job score appropriate for the job type in question."""
157
158 def getLogFileName():
159 """The preferred file name for this job's log."""
160
161 def getName():
162 """An appropriate name for this job."""
163
164 def getTitle():
165 """A string to identify and describe the job to users."""
166
167 def jobStarted():
168 """'Job started' life cycle event, handle as appropriate."""
169
170 def jobReset():
171 """'Job reset' life cycle event, handle as appropriate."""
172
173 def jobAborted():
174 """'Job aborted' life cycle event, handle as appropriate."""
175
176 def makeJob():182 def makeJob():
177 """Create the specific job relating this with an lp.services.job.183 """Create the specific job relating this with an lp.services.job.
178184
179185
=== modified file 'lib/lp/buildmaster/model/buildfarmjob.py'
--- lib/lp/buildmaster/model/buildfarmjob.py 2010-05-05 15:48:49 +0000
+++ lib/lp/buildmaster/model/buildfarmjob.py 2010-05-05 15:48:52 +0000
@@ -5,6 +5,8 @@
5__all__ = [5__all__ = [
6 'BuildFarmJob',6 'BuildFarmJob',
7 'BuildFarmJobDerived',7 'BuildFarmJobDerived',
8 'BuildFarmJobOld',
9 'BuildFarmJobOldDerived',
8 ]10 ]
911
1012
@@ -15,7 +17,6 @@
15import hashlib17import hashlib
16import pytz18import pytz
1719
18from storm.info import get_obj_info
19from storm.locals import Bool, DateTime, Int, Reference, Storm20from storm.locals import Bool, DateTime, Int, Reference, Storm
20from storm.store import Store21from storm.store import Store
2122
@@ -32,13 +33,116 @@
32from lp.buildmaster.interfaces.buildbase import BuildStatus33from lp.buildmaster.interfaces.buildbase import BuildStatus
33from lp.buildmaster.interfaces.buildfarmjob import (34from lp.buildmaster.interfaces.buildfarmjob import (
34 BuildFarmJobType, IBuildFarmJob, IBuildFarmJobDerived,35 BuildFarmJobType, IBuildFarmJob, IBuildFarmJobDerived,
35 IBuildFarmJobSource)36 IBuildFarmJobOld, IBuildFarmJobSource)
36from lp.buildmaster.interfaces.buildqueue import IBuildQueueSet37from lp.buildmaster.interfaces.buildqueue import IBuildQueueSet
3738
3839
39class BuildFarmJob(Storm):40class BuildFarmJobOld:
41 """See `IBuildFarmJobOld`."""
42 implements(IBuildFarmJobOld)
43 processor = None
44 virtualized = None
45
46 def score(self):
47 """See `IBuildFarmJobOld`."""
48 raise NotImplementedError
49
50 def getLogFileName(self):
51 """See `IBuildFarmJobOld`."""
52 return 'buildlog.txt'
53
54 def getName(self):
55 """See `IBuildFarmJobOld`."""
56 raise NotImplementedError
57
58 def getTitle(self):
59 """See `IBuildFarmJobOld`."""
60 raise NotImplementedError
61
62 def makeJob(self):
63 """See `IBuildFarmJobOld`."""
64 raise NotImplementedError
65
66 def jobStarted(self):
67 """See `IBuildFarmJobOld`."""
68 pass
69
70 def jobReset(self):
71 """See `IBuildFarmJobOld`."""
72 pass
73
74 def jobAborted(self):
75 """See `IBuildFarmJobOld`."""
76 pass
77
78
79class BuildFarmJobOldDerived:
80 delegates(IBuildFarmJobOld, context='build_farm_job')
81
82 def __init__(self, *args, **kwargs):
83 """Ensure the instance to which we delegate is set on creation."""
84 self._set_build_farm_job()
85 super(BuildFarmJobOldDerived, self).__init__(*args, **kwargs)
86
87 def __storm_loaded__(self):
88 """Set the attribute for our IBuildFarmJob delegation.
89
90 This is needed here as __init__() is not called when a storm object
91 is loaded from the database.
92 """
93 self._set_build_farm_job()
94
95 def _set_build_farm_job(self):
96 """Set the build farm job to which we will delegate.
97
98 Deriving classes must set the build_farm_job attribute for the
99 delegation.
100 """
101 raise NotImplementedError
102
103 @classmethod
104 def getByJob(cls, job):
105 """See `IBuildFarmJobDerived`."""
106 store = getUtility(IStoreSelector).get(MAIN_STORE, DEFAULT_FLAVOR)
107 return store.find(cls, cls.job == job).one()
108
109 @staticmethod
110 def addCandidateSelectionCriteria(processor, virtualized):
111 """See `IBuildFarmJobDerived`."""
112 return ('')
113
114 @staticmethod
115 def postprocessCandidate(job, logger):
116 """See `IBuildFarmJobDerived`."""
117 return True
118
119 def generateSlaveBuildCookie(self):
120 """See `IBuildFarmJobDerived`."""
121 buildqueue = getUtility(IBuildQueueSet).getByJob(self.job)
122
123 if buildqueue.processor is None:
124 processor = '*'
125 else:
126 processor = repr(buildqueue.processor.id)
127
128 contents = ';'.join([
129 repr(removeSecurityProxy(self.job).id),
130 self.job.date_created.isoformat(),
131 repr(buildqueue.id),
132 buildqueue.job_type.name,
133 processor,
134 self.getName(),
135 ])
136
137 return hashlib.sha1(contents).hexdigest()
138
139 def cleanUp(self):
140 """See `IBuildFarmJob`."""
141 Store.of(self).remove(self)
142
143
144class BuildFarmJob(BuildFarmJobOld, Storm):
40 """A base implementation for `IBuildFarmJob` classes."""145 """A base implementation for `IBuildFarmJob` classes."""
41
42 __storm_table__ = 'BuildFarmJob'146 __storm_table__ = 'BuildFarmJob'
43147
44 implements(IBuildFarmJob)148 implements(IBuildFarmJob)
@@ -76,6 +180,7 @@
76180
77 def __init__(self, job_type, status=BuildStatus.NEEDSBUILD,181 def __init__(self, job_type, status=BuildStatus.NEEDSBUILD,
78 processor=None, virtualized=None):182 processor=None, virtualized=None):
183 super(BuildFarmJob, self).__init__()
79 self.job_type, self.status, self.process, self.virtualized = (184 self.job_type, self.status, self.process, self.virtualized = (
80 job_type,185 job_type,
81 status,186 status,
@@ -95,40 +200,16 @@
95 return build_farm_job200 return build_farm_job
96201
97 @property202 @property
98 def has_concrete_build_farm_job(self):
99 """See `IBuildFarmJob`."""
100 # Check if the object has been added to the store.
101 return get_obj_info(self).get('store') is not None
102
103 @property
104 def title(self):203 def title(self):
105 """See `IBuildFarmJob`."""204 """See `IBuildFarmJob`."""
106 return self.job_type.title205 return self.job_type.title
107206
108 def score(self):
109 """See `IBuildFarmJob`."""
110 raise NotImplementedError
111
112 def getLogFileName(self):
113 """See `IBuildFarmJob`."""
114 return 'buildlog.txt'
115
116 def getName(self):
117 """See `IBuildFarmJob`."""
118 raise NotImplementedError
119
120 def getTitle(self):
121 """See `IBuildFarmJob`."""
122 raise NotImplementedError
123
124 def makeJob(self):207 def makeJob(self):
125 """See `IBuildFarmJob`."""208 """See `IBuildFarmJob`."""
126 raise NotImplementedError209 raise NotImplementedError
127210
128 def jobStarted(self):211 def jobStarted(self):
129 """See `IBuildFarmJob`."""212 """See `IBuildFarmJob`."""
130 if not self.has_concrete_build_farm_job:
131 return
132 self.status = BuildStatus.BUILDING213 self.status = BuildStatus.BUILDING
133 # The build started, set the start time if not set already.214 # The build started, set the start time if not set already.
134 self.date_started = UTC_NOW215 self.date_started = UTC_NOW
@@ -137,8 +218,6 @@
137218
138 def jobReset(self):219 def jobReset(self):
139 """See `IBuildFarmJob`."""220 """See `IBuildFarmJob`."""
140 if not self.has_concrete_build_farm_job:
141 return
142 self.status = BuildStatus.NEEDSBUILD221 self.status = BuildStatus.NEEDSBUILD
143 self.date_started = None222 self.date_started = None
144223
@@ -186,70 +265,3 @@
186 """See `IBuildFarmJobDerived`."""265 """See `IBuildFarmJobDerived`."""
187 implements(IBuildFarmJobDerived)266 implements(IBuildFarmJobDerived)
188 delegates(IBuildFarmJob, context='build_farm_job')267 delegates(IBuildFarmJob, context='build_farm_job')
189
190 def __init__(self, *args, **kwargs):
191 """Ensure the instance to which we delegate is set on creation."""
192 self._set_build_farm_job()
193 super(BuildFarmJobDerived, self).__init__(*args, **kwargs)
194
195 def __storm_loaded__(self):
196 """Set the attribute for our IBuildFarmJob delegation.
197
198 This is needed here as __init__() is not called when a storm object
199 is loaded from the database.
200 """
201 self._set_build_farm_job()
202
203 def _set_build_farm_job(self):
204 """Set the default build farm job to which we will delegate.
205
206 Sub-classes should override as required.
207
208 XXX 2010-04-27 michael.nelson bug=570939
209 This only exists because certain classes assume that
210 BuildFarmJob/PackageBuild are in-memory objects that simply
211 provide methods to update the associated builds.
212 We can remove it once the above bug is completed.
213 """
214 self.build_farm_job = BuildFarmJob(
215 job_type=BuildFarmJobType.PACKAGEBUILD)
216
217 @classmethod
218 def getByJob(cls, job):
219 """See `IBuildFarmJobDerived`."""
220 store = getUtility(IStoreSelector).get(MAIN_STORE, DEFAULT_FLAVOR)
221 return store.find(cls, cls.job == job).one()
222
223 @staticmethod
224 def addCandidateSelectionCriteria(processor, virtualized):
225 """See `IBuildFarmJobDerived`."""
226 return ('')
227
228 @staticmethod
229 def postprocessCandidate(job, logger):
230 """See `IBuildFarmJobDerived`."""
231 return True
232
233 def generateSlaveBuildCookie(self):
234 """See `IBuildFarmJobDerived`."""
235 buildqueue = getUtility(IBuildQueueSet).getByJob(self.job)
236
237 if buildqueue.processor is None:
238 processor = '*'
239 else:
240 processor = repr(buildqueue.processor.id)
241
242 contents = ';'.join([
243 repr(removeSecurityProxy(self.job).id),
244 self.job.date_created.isoformat(),
245 repr(buildqueue.id),
246 buildqueue.job_type.name,
247 processor,
248 self.getName(),
249 ])
250
251 return hashlib.sha1(contents).hexdigest()
252
253 def cleanUp(self):
254 """See `IBuildFarmJob`."""
255 Store.of(self).remove(self)
256268
=== modified file 'lib/lp/buildmaster/model/packagebuild.py'
--- lib/lp/buildmaster/model/packagebuild.py 2010-05-05 15:48:49 +0000
+++ lib/lp/buildmaster/model/packagebuild.py 2010-05-05 15:48:52 +0000
@@ -13,7 +13,6 @@
13from zope.component import getUtility13from zope.component import getUtility
14from zope.interface import classProvides, implements14from zope.interface import classProvides, implements
1515
16from canonical.database.constants import UTC_NOW
17from canonical.database.enumcol import DBEnum16from canonical.database.enumcol import DBEnum
18from canonical.launchpad.browser.librarian import (17from canonical.launchpad.browser.librarian import (
19 ProxiedLibraryFileAlias)18 ProxiedLibraryFileAlias)
@@ -59,19 +58,14 @@
59 policy_name = 'buildd'58 policy_name = 'buildd'
60 distribution = None59 distribution = None
6160
62 def __init__(self, build):61 def __init__(self, build_farm_job, archive, pocket,
63 """Construct a PackageBuild.62 dependencies=None):
6463 """Construct a PackageBuild."""
65 XXX 2010-04-21 michael.nelson bug=570939
66 This initialiser is only used by IBuildFarmJobDerived classes
67 that are not yet expecting a concrete BuildFarmJob (and so are
68 expecting to pass in the build to which they refer, such as
69 BinaryPackageBuild/BuildPackageJob, SPRecipeBuild/SPRecipeBuildJob
70 and TranslationTemplatesBuild). Once they have been updated it
71 can be updated for use by new below.
72 """
73 super(PackageBuild, self).__init__()64 super(PackageBuild, self).__init__()
74 self.build = build65 self.build_farm_job = build_farm_job
66 self.archive = archive
67 self.pocket = pocket
68 self.dependencies = dependencies
7569
76 @classmethod70 @classmethod
77 def new(cls, job_type, virtualized, archive, pocket,71 def new(cls, job_type, virtualized, archive, pocket,
@@ -84,67 +78,10 @@
84 build_farm_job = getUtility(IBuildFarmJobSource).new(78 build_farm_job = getUtility(IBuildFarmJobSource).new(
85 job_type, status, processor, virtualized)79 job_type, status, processor, virtualized)
8680
87 # Update the __init__ and call instead once all callsites use81 package_build = cls(build_farm_job, archive, pocket, dependencies)
88 # instances of this class as a concrete class.
89 package_build = cls(None)
90 package_build.build_farm_job = build_farm_job
91 package_build.archive = archive
92 package_build.pocket = pocket
93 package_build.dependencies = dependencies
94 store.add(package_build)82 store.add(package_build)
95 return package_build83 return package_build
9684
97 def getTitle(self):
98 """See `IBuildFarmJob`.
99
100 XXX 2010-04-21 michael.nelson bug=567922. This method
101 can be removed once all *Build classes use the concrete
102 BuildFarmJob.
103 """
104 if self.has_concrete_build_farm_job:
105 return self.build_farm_job.getTitle()
106
107 return self.build.title
108
109 def jobStarted(self):
110 """See `IBuildFarmJob`.
111
112 XXX 2010-04-21 michael.nelson bug=567922. This method
113 can be removed once all *Build classes use the concrete
114 BuildFarmJob.
115 """
116 if self.has_concrete_build_farm_job:
117 return self.build_farm_job.jobStarted()
118
119 self.build.buildstate = BuildStatus.BUILDING
120 # The build started, set the start time if not set already.
121 if self.build.date_first_dispatched is None:
122 self.build.date_first_dispatched = UTC_NOW
123
124 def jobReset(self):
125 """See `IBuildFarmJob`.
126
127 XXX 2010-04-21 michael.nelson bug=567922. This method
128 can be removed once all *Build classes use the concrete
129 BuildFarmJob.
130 """
131 if self.has_concrete_build_farm_job:
132 return self.build_farm_job.jobReset()
133
134 self.build.buildstate = BuildStatus.NEEDSBUILD
135
136 def jobAborted(self):
137 """See `IBuildFarmJob`.
138
139 XXX 2010-04-21 michael.nelson bug=567922. This method
140 can be removed once all *Build classes use the concrete
141 BuildFarmJob.
142 """
143 if self.has_concrete_build_farm_job:
144 return self.build_farm_job.jobAborted()
145
146 self.build.buildstate = BuildStatus.NEEDSBUILD
147
148 @property85 @property
149 def current_component(self):86 def current_component(self):
150 """See `IPackageBuild`."""87 """See `IPackageBuild`."""
15188
=== modified file 'lib/lp/buildmaster/tests/test_buildfarmjob.py'
--- lib/lp/buildmaster/tests/test_buildfarmjob.py 2010-05-05 15:48:49 +0000
+++ lib/lp/buildmaster/tests/test_buildfarmjob.py 2010-05-05 15:48:52 +0000
@@ -34,18 +34,6 @@
34 return getUtility(IBuildFarmJobSource).new(34 return getUtility(IBuildFarmJobSource).new(
35 job_type=BuildFarmJobType.PACKAGEBUILD)35 job_type=BuildFarmJobType.PACKAGEBUILD)
3636
37 def test_has_concrete_build_farm_job(self):
38 # This temporary property returns true if the instance
39 # corresponds to a concrete database record, even if
40 # db updates have not yet been flushed, and false
41 # otherwise.
42 concrete_build_farm_job = self.makeBuildFarmJob()
43 self.failUnless(concrete_build_farm_job.has_concrete_build_farm_job)
44
45 mem_build_farm_job = BuildFarmJob(
46 job_type=BuildFarmJobType.PACKAGEBUILD)
47 self.failIf(mem_build_farm_job.has_concrete_build_farm_job)
48
49 def test_providesInterface(self):37 def test_providesInterface(self):
50 # BuildFarmJob provides IBuildFarmJob38 # BuildFarmJob provides IBuildFarmJob
51 self.assertProvides(self.build_farm_job, IBuildFarmJob)39 self.assertProvides(self.build_farm_job, IBuildFarmJob)
5240
=== modified file 'lib/lp/code/model/sourcepackagerecipebuild.py'
--- lib/lp/code/model/sourcepackagerecipebuild.py 2010-05-05 15:48:49 +0000
+++ lib/lp/code/model/sourcepackagerecipebuild.py 2010-05-05 15:48:52 +0000
@@ -27,8 +27,7 @@
27from lp.buildmaster.interfaces.buildfarmjob import BuildFarmJobType27from lp.buildmaster.interfaces.buildfarmjob import BuildFarmJobType
28from lp.buildmaster.model.buildbase import BuildBase28from lp.buildmaster.model.buildbase import BuildBase
29from lp.buildmaster.model.buildqueue import BuildQueue29from lp.buildmaster.model.buildqueue import BuildQueue
30from lp.buildmaster.model.buildfarmjob import BuildFarmJobDerived30from lp.buildmaster.model.buildfarmjob import BuildFarmJobOldDerived
31from lp.buildmaster.model.packagebuild import PackageBuild
32from lp.code.interfaces.sourcepackagerecipebuild import (31from lp.code.interfaces.sourcepackagerecipebuild import (
33 ISourcePackageRecipeBuildJob, ISourcePackageRecipeBuildJobSource,32 ISourcePackageRecipeBuildJob, ISourcePackageRecipeBuildJobSource,
34 ISourcePackageRecipeBuild, ISourcePackageRecipeBuildSource)33 ISourcePackageRecipeBuild, ISourcePackageRecipeBuildSource)
@@ -37,6 +36,7 @@
37from lp.soyuz.adapters.archivedependencies import (36from lp.soyuz.adapters.archivedependencies import (
38 default_component_dependency_name,)37 default_component_dependency_name,)
39from lp.soyuz.interfaces.component import IComponentSet38from lp.soyuz.interfaces.component import IComponentSet
39from lp.soyuz.model.buildfarmbuildjob import BuildFarmBuildJob
40from lp.soyuz.model.sourcepackagerelease import SourcePackageRelease40from lp.soyuz.model.sourcepackagerelease import SourcePackageRelease
4141
4242
@@ -199,7 +199,7 @@
199 return199 return
200200
201201
202class SourcePackageRecipeBuildJob(BuildFarmJobDerived, Storm):202class SourcePackageRecipeBuildJob(BuildFarmJobOldDerived, Storm):
203 classProvides(ISourcePackageRecipeBuildJobSource)203 classProvides(ISourcePackageRecipeBuildJobSource)
204 implements(ISourcePackageRecipeBuildJob)204 implements(ISourcePackageRecipeBuildJob)
205205
@@ -226,7 +226,7 @@
226 """Setup the IBuildFarmJob delegate.226 """Setup the IBuildFarmJob delegate.
227227
228 We override this to provide a delegate specific to package builds."""228 We override this to provide a delegate specific to package builds."""
229 self.build_farm_job = PackageBuild(self.build)229 self.build_farm_job = BuildFarmBuildJob(self.build)
230230
231 @classmethod231 @classmethod
232 def new(cls, build, job):232 def new(cls, build, job):
233233
=== modified file 'lib/lp/soyuz/interfaces/buildfarmbuildjob.py'
--- lib/lp/soyuz/interfaces/buildfarmbuildjob.py 2010-04-09 15:46:09 +0000
+++ lib/lp/soyuz/interfaces/buildfarmbuildjob.py 2010-05-05 15:48:52 +0000
@@ -10,11 +10,11 @@
1010
11from canonical.launchpad import _11from canonical.launchpad import _
12from lazr.restful.fields import Reference12from lazr.restful.fields import Reference
13from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJob13from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobOld
14from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuild14from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuild
1515
1616
17class IBuildFarmBuildJob(IBuildFarmJob):17class IBuildFarmBuildJob(IBuildFarmJobOld):
18 """An `IBuildFarmJob` with an `IBuild` reference."""18 """An `IBuildFarmJob` with an `IBuild` reference."""
19 build = Reference(19 build = Reference(
20 IBinaryPackageBuild, title=_("Build"), required=True, readonly=True,20 IBinaryPackageBuild, title=_("Build"), required=True, readonly=True,
2121
=== modified file 'lib/lp/soyuz/model/buildpackagejob.py'
--- lib/lp/soyuz/model/buildpackagejob.py 2010-05-05 15:48:49 +0000
+++ lib/lp/soyuz/model/buildpackagejob.py 2010-05-05 15:48:52 +0000
@@ -18,17 +18,17 @@
18from canonical.database.sqlbase import sqlvalues18from canonical.database.sqlbase import sqlvalues
1919
20from lp.buildmaster.interfaces.buildbase import BuildStatus20from lp.buildmaster.interfaces.buildbase import BuildStatus
21from lp.buildmaster.model.buildfarmjob import BuildFarmJobDerived21from lp.buildmaster.model.buildfarmjob import BuildFarmJobOldDerived
22from lp.buildmaster.model.packagebuild import PackageBuild
23from lp.registry.interfaces.sourcepackage import SourcePackageUrgency22from lp.registry.interfaces.sourcepackage import SourcePackageUrgency
24from lp.registry.interfaces.pocket import PackagePublishingPocket23from lp.registry.interfaces.pocket import PackagePublishingPocket
25from lp.soyuz.interfaces.archive import ArchivePurpose24from lp.soyuz.interfaces.archive import ArchivePurpose
26from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuildSet25from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuildSet
27from lp.soyuz.interfaces.buildpackagejob import IBuildPackageJob26from lp.soyuz.interfaces.buildpackagejob import IBuildPackageJob
28from lp.soyuz.interfaces.publishing import PackagePublishingStatus27from lp.soyuz.interfaces.publishing import PackagePublishingStatus
2928from lp.soyuz.model.buildfarmbuildjob import BuildFarmBuildJob
3029
31class BuildPackageJob(BuildFarmJobDerived, Storm):30
31class BuildPackageJob(BuildFarmJobOldDerived, Storm):
32 """See `IBuildPackageJob`."""32 """See `IBuildPackageJob`."""
33 implements(IBuildPackageJob)33 implements(IBuildPackageJob)
3434
@@ -49,7 +49,7 @@
49 """Setup the IBuildFarmJob delegate.49 """Setup the IBuildFarmJob delegate.
5050
51 We override this to provide a delegate specific to package builds."""51 We override this to provide a delegate specific to package builds."""
52 self.build_farm_job = PackageBuild(self.build)52 self.build_farm_job = BuildFarmBuildJob(self.build)
5353
54 def score(self):54 def score(self):
55 """See `IBuildPackageJob`."""55 """See `IBuildPackageJob`."""
5656
=== modified file 'lib/lp/soyuz/tests/test_buildpackagejob.py'
--- lib/lp/soyuz/tests/test_buildpackagejob.py 2010-04-20 14:30:00 +0000
+++ lib/lp/soyuz/tests/test_buildpackagejob.py 2010-05-05 15:48:52 +0000
@@ -13,9 +13,9 @@
1313
14from lp.buildmaster.interfaces.buildbase import BuildStatus14from lp.buildmaster.interfaces.buildbase import BuildStatus
15from lp.buildmaster.interfaces.builder import IBuilderSet15from lp.buildmaster.interfaces.builder import IBuilderSet
16from lp.buildmaster.interfaces.buildfarmjob import (16from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobDerived
17 IBuildFarmJob, IBuildFarmJobDerived)
18from lp.soyuz.interfaces.archive import ArchivePurpose17from lp.soyuz.interfaces.archive import ArchivePurpose
18from lp.soyuz.interfaces.buildfarmbuildjob import IBuildFarmBuildJob
19from lp.soyuz.interfaces.buildpackagejob import IBuildPackageJob19from lp.soyuz.interfaces.buildpackagejob import IBuildPackageJob
20from lp.soyuz.interfaces.publishing import PackagePublishingStatus20from lp.soyuz.interfaces.publishing import PackagePublishingStatus
21from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild21from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild
@@ -234,7 +234,7 @@
234 build, bq = find_job(self, 'gcc', '386')234 build, bq = find_job(self, 'gcc', '386')
235 build_farm_job = bq.specific_job235 build_farm_job = bq.specific_job
236 self.assertProvides(build_farm_job, IBuildPackageJob)236 self.assertProvides(build_farm_job, IBuildPackageJob)
237 self.assertProvides(build_farm_job, IBuildFarmJob)237 self.assertProvides(build_farm_job, IBuildFarmBuildJob)
238 self.assertProvides(build_farm_job, IBuildFarmJobDerived)238 self.assertProvides(build_farm_job, IBuildFarmJobDerived)
239239
240240
241241
=== modified file 'lib/lp/translations/model/translationtemplatesbuildjob.py'
--- lib/lp/translations/model/translationtemplatesbuildjob.py 2010-05-05 15:48:49 +0000
+++ lib/lp/translations/model/translationtemplatesbuildjob.py 2010-05-05 15:48:52 +0000
@@ -23,7 +23,7 @@
23from lp.buildmaster.interfaces.buildfarmjob import BuildFarmJobType23from lp.buildmaster.interfaces.buildfarmjob import BuildFarmJobType
24from lp.buildmaster.interfaces.buildqueue import IBuildQueueSet24from lp.buildmaster.interfaces.buildqueue import IBuildQueueSet
25from lp.buildmaster.model.buildfarmjob import (25from lp.buildmaster.model.buildfarmjob import (
26 BuildFarmJob, BuildFarmJobDerived)26 BuildFarmJobOld, BuildFarmJobOldDerived)
27from lp.buildmaster.model.buildqueue import BuildQueue27from lp.buildmaster.model.buildqueue import BuildQueue
28from lp.code.interfaces.branchjob import IRosettaUploadJobSource28from lp.code.interfaces.branchjob import IRosettaUploadJobSource
29from lp.buildmaster.interfaces.buildfarmbranchjob import IBuildFarmBranchJob29from lp.buildmaster.interfaces.buildfarmbranchjob import IBuildFarmBranchJob
@@ -33,7 +33,7 @@
33from lp.translations.pottery.detect_intltool import is_intltool_structure33from lp.translations.pottery.detect_intltool import is_intltool_structure
3434
3535
36class TranslationTemplatesBuildJob(BuildFarmJobDerived, BranchJobDerived):36class TranslationTemplatesBuildJob(BuildFarmJobOldDerived, BranchJobDerived):
37 """An `IBuildFarmJob` implementation that generates templates.37 """An `IBuildFarmJob` implementation that generates templates.
3838
39 Implementation-wise, this is actually a `BranchJob`.39 Implementation-wise, this is actually a `BranchJob`.
@@ -55,8 +55,7 @@
5555
56 We override this to provide a non-database delegate that simply56 We override this to provide a non-database delegate that simply
57 provides required functionality to the queue system."""57 provides required functionality to the queue system."""
58 self.build_farm_job = BuildFarmJob(58 self.build_farm_job = BuildFarmJobOld()
59 job_type=BuildFarmJobType.TRANSLATIONTEMPLATESBUILD)
6059
61 def score(self):60 def score(self):
62 """See `IBuildFarmJob`."""61 """See `IBuildFarmJob`."""
6362
=== modified file 'lib/lp/translations/tests/test_translationtemplatesbuildjob.py'
--- lib/lp/translations/tests/test_translationtemplatesbuildjob.py 2010-04-30 03:10:17 +0000
+++ lib/lp/translations/tests/test_translationtemplatesbuildjob.py 2010-05-05 15:48:52 +0000
@@ -9,7 +9,6 @@
9from zope.event import notify9from zope.event import notify
10from zope.security.proxy import removeSecurityProxy10from zope.security.proxy import removeSecurityProxy
1111
12from sqlobject import SQLObjectNotFound
13from storm.store import Store12from storm.store import Store
1413
15from canonical.launchpad.webapp.testing import verifyObject14from canonical.launchpad.webapp.testing import verifyObject
@@ -20,7 +19,7 @@
20from lp.testing import TestCaseWithFactory19from lp.testing import TestCaseWithFactory
2120
22from lp.buildmaster.interfaces.buildfarmjob import (21from lp.buildmaster.interfaces.buildfarmjob import (
23 IBuildFarmJob, IBuildFarmJobDerived)22 IBuildFarmJobOld, IBuildFarmJobDerived)
24from lp.buildmaster.interfaces.buildqueue import IBuildQueueSet23from lp.buildmaster.interfaces.buildqueue import IBuildQueueSet
25from lp.buildmaster.model.buildqueue import BuildQueue24from lp.buildmaster.model.buildqueue import BuildQueue
26from lp.code.interfaces.branch import IBranchSet25from lp.code.interfaces.branch import IBranchSet
@@ -54,11 +53,11 @@
54 self.specific_job = self.jobset.create(self.branch)53 self.specific_job = self.jobset.create(self.branch)
5554
56 def test_new_TranslationTemplatesBuildJob(self):55 def test_new_TranslationTemplatesBuildJob(self):
57 # TranslationTemplateBuildJob implements IBuildFarmJob,56 # TranslationTemplateBuildJob implements IBuildFarmJobOld,
58 # IBuildFarmJobDerived, and IBranchJob.57 # IBuildFarmJobDerived, and IBranchJob.
59 verifyObject(IBranchJob, self.specific_job)58 verifyObject(IBranchJob, self.specific_job)
60 verifyObject(IBuildFarmJobDerived, self.specific_job)59 verifyObject(IBuildFarmJobDerived, self.specific_job)
61 verifyObject(IBuildFarmJob, self.specific_job)60 verifyObject(IBuildFarmJobOld, self.specific_job)
6261
63 # Each of these jobs knows the branch it will operate on.62 # Each of these jobs knows the branch it will operate on.
64 self.assertEqual(self.branch, self.specific_job.branch)63 self.assertEqual(self.branch, self.specific_job.branch)

Subscribers

People subscribed via source and target branches

to status/vote changes: