Merge lp:~wgrant/launchpad/flatten-bfj-1-populate into lp:launchpad

Proposed by William Grant
Status: Merged
Merged at revision: 16466
Proposed branch: lp:~wgrant/launchpad/flatten-bfj-1-populate
Merge into: lp:launchpad
Prerequisite: lp:~wgrant/launchpad/flatten-bfj-0-db
Diff against target: 682 lines (+248/-72)
10 files modified
lib/lp/buildmaster/interfaces/packagebuild.py (+2/-10)
lib/lp/buildmaster/model/buildfarmjob.py (+16/-9)
lib/lp/buildmaster/model/packagebuild.py (+6/-15)
lib/lp/buildmaster/tests/test_packagebuild.py (+4/-3)
lib/lp/code/model/sourcepackagerecipebuild.py (+67/-10)
lib/lp/soyuz/model/binarypackagebuild.py (+84/-14)
lib/lp/soyuz/scripts/gina/handlers.py (+3/-3)
lib/lp/soyuz/tests/test_binarypackagebuild.py (+20/-0)
lib/lp/soyuz/tests/test_hasbuildrecords.py (+7/-3)
lib/lp/translations/model/translationtemplatesbuild.py (+39/-5)
To merge this branch: bzr merge lp:~wgrant/launchpad/flatten-bfj-1-populate
Reviewer Review Type Date Requested Status
Steve Kowalik (community) code Approve
Review via email: mp+145541@code.launchpad.net

Commit message

Set the denormalised BPB/SPRB/TTB columns whenever the corresponding old one is set.

Description of the change

The build farm job schema is being reworked to improve performance. Columns from PackageBuild and BuildFarmJob are being merged into tables that previously delegated to them. The PackageBuild table will end up dying entirely, but BuildFarmJob will remain, a shadow of its former self, to answer questions about Archive:+builds and Builder:+history. Additionally, BinaryPackageBuild is growing new distribution, distroseries, sourcepackagename and is_distro_archive columns to make searches even faster.

This is the first non-DB component: altering the app to set the new columns on BPB/SPRB/TTB as well as the old columns on BFJ/PB. Values are still only ever read from BFJ/PB, as the new columns won't be fully populated yet.

To post a comment you must log in.
Revision history for this message
Steve Kowalik (stevenk) wrote :

472 # Create the PackageBuild to which the new BinaryPackageBuild
473 # will delegate.

This comment needs updating, since you're doing more than that.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/buildmaster/interfaces/packagebuild.py'
--- lib/lp/buildmaster/interfaces/packagebuild.py 2013-01-22 08:31:09 +0000
+++ lib/lp/buildmaster/interfaces/packagebuild.py 2013-02-04 02:47:23 +0000
@@ -133,20 +133,12 @@
133class IPackageBuildSource(Interface):133class IPackageBuildSource(Interface):
134 """A utility of this interface used to create _things_."""134 """A utility of this interface used to create _things_."""
135135
136 def new(job_type, virtualized, archive, pocket, processor=None,136 def new(build_farm_job, archive, pocket):
137 status=BuildStatus.NEEDSBUILD, dependencies=None, builder=None):
138 """Create a new `IPackageBuild`.137 """Create a new `IPackageBuild`.
139138
140 :param job_type: A `BuildFarmJobType` item.139 :param build_farm_job: An `IBuildFarmJob`.
141 :param virtualized: A boolean indicating whether this build was
142 virtualized.
143 :param archive: An `IArchive`.140 :param archive: An `IArchive`.
144 :param pocket: An item of `PackagePublishingPocket`.141 :param pocket: An item of `PackagePublishingPocket`.
145 :param processor: An `IProcessor` required to run this build farm
146 job. Default is None (processor-independent).
147 :param status: A `BuildStatus` item defaulting to NEEDSBUILD.
148 :param dependencies: An optional debian-like dependency line.
149 :parma builder: An optional `IBuilder`.
150 """142 """
151143
152144
153145
=== modified file 'lib/lp/buildmaster/model/buildfarmjob.py'
--- lib/lp/buildmaster/model/buildfarmjob.py 2013-01-30 07:49:52 +0000
+++ lib/lp/buildmaster/model/buildfarmjob.py 2013-02-04 02:47:23 +0000
@@ -196,23 +196,28 @@
196196
197 failure_count = Int(name='failure_count', allow_none=False)197 failure_count = Int(name='failure_count', allow_none=False)
198198
199 archive_id = Int(name='archive')
200 archive = Reference(archive_id, 'Archive.id')
201
199 dependencies = None202 dependencies = None
200203
201 def __init__(self, job_type, status=BuildStatus.NEEDSBUILD,204 def __init__(self, job_type, status=BuildStatus.NEEDSBUILD,
202 processor=None, virtualized=None, date_created=None,205 processor=None, virtualized=None, date_created=None,
203 builder=None):206 builder=None, archive=None):
204 super(BuildFarmJob, self).__init__()207 super(BuildFarmJob, self).__init__()
205 (self.job_type, self.status, self.processor, self.virtualized,208 (self.job_type, self.status, self.processor, self.virtualized,
206 self.builder) = (job_type, status, processor, virtualized, builder)209 self.builder, self.archive) = (
210 job_type, status, processor, virtualized, builder, archive)
207 if date_created is not None:211 if date_created is not None:
208 self.date_created = date_created212 self.date_created = date_created
209213
210 @classmethod214 @classmethod
211 def new(cls, job_type, status=BuildStatus.NEEDSBUILD, processor=None,215 def new(cls, job_type, status=BuildStatus.NEEDSBUILD, processor=None,
212 virtualized=None, date_created=None, builder=None):216 virtualized=None, date_created=None, builder=None, archive=None):
213 """See `IBuildFarmJobSource`."""217 """See `IBuildFarmJobSource`."""
214 build_farm_job = BuildFarmJob(218 build_farm_job = BuildFarmJob(
215 job_type, status, processor, virtualized, date_created, builder)219 job_type, status, processor, virtualized, date_created, builder,
220 archive)
216 store = IMasterStore(BuildFarmJob)221 store = IMasterStore(BuildFarmJob)
217 store.add(build_farm_job)222 store.add(build_farm_job)
218 return build_farm_job223 return build_farm_job
@@ -319,29 +324,30 @@
319324
320 def setLog(self, log):325 def setLog(self, log):
321 """See `IBuildFarmJob`."""326 """See `IBuildFarmJob`."""
322 self.build_farm_job.log = log327 self.build_farm_job.log = self._new_log = log
323328
324 def updateStatus(self, status, builder=None, slave_status=None,329 def updateStatus(self, status, builder=None, slave_status=None,
325 date_started=None, date_finished=None):330 date_started=None, date_finished=None):
326 """See `IBuildFarmJob`."""331 """See `IBuildFarmJob`."""
327 self.build_farm_job.status = status332 self.build_farm_job.status = self._new_status = status
328333
329 # If there's a builder provided, set it if we don't already have334 # If there's a builder provided, set it if we don't already have
330 # one, or otherwise crash if it's different from the one we335 # one, or otherwise crash if it's different from the one we
331 # expected.336 # expected.
332 if builder is not None:337 if builder is not None:
333 if self.builder is None:338 if self.builder is None:
334 self.build_farm_job.builder = builder339 self.build_farm_job.builder = self._new_builder = builder
335 else:340 else:
336 assert self.builder == builder341 assert self.builder == builder
337342
338 # If we're starting to build, set date_started and343 # If we're starting to build, set date_started and
339 # date_first_dispatched if required.344 # date_first_dispatched if required.
340 if self.date_started is None and status == BuildStatus.BUILDING:345 if self.date_started is None and status == BuildStatus.BUILDING:
341 self.build_farm_job.date_started = (346 self.build_farm_job.date_started = self._new_date_started = (
342 date_started or datetime.datetime.now(pytz.UTC))347 date_started or datetime.datetime.now(pytz.UTC))
343 if self.date_first_dispatched is None:348 if self.date_first_dispatched is None:
344 self.build_farm_job.date_first_dispatched = self.date_started349 self.build_farm_job.date_first_dispatched = self.date_started
350 self._new_date_first_dispatched = self.date_started
345351
346 # If we're in a final build state (or UPLOADING, which sort of352 # If we're in a final build state (or UPLOADING, which sort of
347 # is), set date_finished if date_started is.353 # is), set date_finished if date_started is.
@@ -352,12 +358,13 @@
352 # XXX cprov 20060615 bug=120584: Currently buildduration includes358 # XXX cprov 20060615 bug=120584: Currently buildduration includes
353 # the scanner latency, it should really be asking the slave for359 # the scanner latency, it should really be asking the slave for
354 # the duration spent building locally.360 # the duration spent building locally.
355 self.build_farm_job.date_finished = (361 self.build_farm_job.date_finished = self._new_date_finished = (
356 date_finished or datetime.datetime.now(pytz.UTC))362 date_finished or datetime.datetime.now(pytz.UTC))
357363
358 def gotFailure(self):364 def gotFailure(self):
359 """See `IBuildFarmJob`."""365 """See `IBuildFarmJob`."""
360 self.build_farm_job.failure_count += 1366 self.build_farm_job.failure_count += 1
367 self._new_failure_count = self.build_farm_job.failure_count
361368
362369
363class BuildFarmJobSet:370class BuildFarmJobSet:
364371
=== modified file 'lib/lp/buildmaster/model/packagebuild.py'
--- lib/lp/buildmaster/model/packagebuild.py 2013-01-30 07:49:52 +0000
+++ lib/lp/buildmaster/model/packagebuild.py 2013-02-04 02:47:23 +0000
@@ -84,8 +84,7 @@
84 distribution = None84 distribution = None
85 distro_series = None85 distro_series = None
8686
87 def __init__(self, build_farm_job, archive, pocket,87 def __init__(self, build_farm_job, archive, pocket, dependencies=None):
88 dependencies=None):
89 """Construct a PackageBuild."""88 """Construct a PackageBuild."""
90 super(PackageBuild, self).__init__()89 super(PackageBuild, self).__init__()
91 self.build_farm_job = build_farm_job90 self.build_farm_job = build_farm_job
@@ -94,18 +93,10 @@
94 self.dependencies = dependencies93 self.dependencies = dependencies
9594
96 @classmethod95 @classmethod
97 def new(cls, job_type, virtualized, archive, pocket, processor=None,96 def new(cls, build_farm_job, archive, pocket):
98 status=BuildStatus.NEEDSBUILD, dependencies=None,
99 date_created=None, builder=None):
100 """See `IPackageBuildSource`."""97 """See `IPackageBuildSource`."""
101 store = IMasterStore(PackageBuild)98 store = IMasterStore(PackageBuild)
10299 package_build = cls(build_farm_job, archive, pocket)
103 # Create the BuildFarmJob to which the new PackageBuild
104 # will delegate.
105 build_farm_job = getUtility(IBuildFarmJobSource).new(
106 job_type, status, processor, virtualized, date_created, builder)
107
108 package_build = cls(build_farm_job, archive, pocket, dependencies)
109 store.add(package_build)100 store.add(package_build)
110 return package_build101 return package_build
111102
@@ -174,10 +165,10 @@
174165
175 if (status == BuildStatus.MANUALDEPWAIT and slave_status is not None166 if (status == BuildStatus.MANUALDEPWAIT and slave_status is not None
176 and slave_status.get('dependencies') is not None):167 and slave_status.get('dependencies') is not None):
177 self.package_build.dependencies = (168 self.package_build.dependencies = self._new_dependencies = (
178 unicode(slave_status.get('dependencies')))169 unicode(slave_status.get('dependencies')))
179 else:170 else:
180 self.package_build.dependencies = None171 self.package_build.dependencies = self._new_dependencies = None
181172
182 def verifySuccessfulUpload(self):173 def verifySuccessfulUpload(self):
183 """See `IPackageBuild`."""174 """See `IPackageBuild`."""
@@ -213,7 +204,7 @@
213 """See `IPackageBuild`."""204 """See `IPackageBuild`."""
214 filename = "upload_%s_log.txt" % self.id205 filename = "upload_%s_log.txt" % self.id
215 library_file = self.createUploadLog(content, filename=filename)206 library_file = self.createUploadLog(content, filename=filename)
216 self.package_build.upload_log = library_file207 self.package_build.upload_log = self._new_upload_log = library_file
217208
218 def notify(self, extra_info=None):209 def notify(self, extra_info=None):
219 """See `IPackageBuild`."""210 """See `IPackageBuild`."""
220211
=== modified file 'lib/lp/buildmaster/tests/test_packagebuild.py'
--- lib/lp/buildmaster/tests/test_packagebuild.py 2013-01-30 07:29:46 +0000
+++ lib/lp/buildmaster/tests/test_packagebuild.py 2013-02-04 02:47:23 +0000
@@ -16,6 +16,7 @@
16 BuildFarmJobType,16 BuildFarmJobType,
17 BuildStatus,17 BuildStatus,
18 )18 )
19from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobSource
19from lp.buildmaster.interfaces.packagebuild import (20from lp.buildmaster.interfaces.packagebuild import (
20 IPackageBuild,21 IPackageBuild,
21 IPackageBuildSet,22 IPackageBuildSet,
@@ -46,9 +47,9 @@
46 if archive is None:47 if archive is None:
47 archive = self.factory.makeArchive()48 archive = self.factory.makeArchive()
4849
49 return getUtility(IPackageBuildSource).new(50 bfj = getUtility(IBuildFarmJobSource).new(
50 job_type=job_type, virtualized=True, archive=archive,51 job_type, virtualized=True, status=status)
51 status=status, pocket=pocket)52 return getUtility(IPackageBuildSource).new(bfj, archive, pocket)
5253
5354
54class TestPackageBuild(TestPackageBuildBase):55class TestPackageBuild(TestPackageBuildBase):
5556
=== modified file 'lib/lp/code/model/sourcepackagerecipebuild.py'
--- lib/lp/code/model/sourcepackagerecipebuild.py 2013-01-30 07:49:52 +0000
+++ lib/lp/code/model/sourcepackagerecipebuild.py 2013-02-04 02:47:23 +0000
@@ -15,11 +15,14 @@
15import logging15import logging
1616
17from psycopg2 import ProgrammingError17from psycopg2 import ProgrammingError
18from pytz import utc18import pytz
19from storm.locals import (19from storm.locals import (
20 Bool,
21 DateTime,
20 Int,22 Int,
21 Reference,23 Reference,
22 Storm,24 Storm,
25 Unicode,
23 )26 )
24from storm.store import (27from storm.store import (
25 EmptyResultSet,28 EmptyResultSet,
@@ -36,7 +39,12 @@
36 BuildFarmJobType,39 BuildFarmJobType,
37 BuildStatus,40 BuildStatus,
38 )41 )
39from lp.buildmaster.model.buildfarmjob import BuildFarmJobOld42from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobSource
43from lp.buildmaster.interfaces.packagebuild import IPackageBuildSource
44from lp.buildmaster.model.buildfarmjob import (
45 BuildFarmJob,
46 BuildFarmJobOld,
47 )
40from lp.buildmaster.model.buildqueue import BuildQueue48from lp.buildmaster.model.buildqueue import BuildQueue
41from lp.buildmaster.model.packagebuild import (49from lp.buildmaster.model.packagebuild import (
42 PackageBuild,50 PackageBuild,
@@ -61,6 +69,7 @@
61from lp.services.database.bulk import load_related69from lp.services.database.bulk import load_related
62from lp.services.database.constants import UTC_NOW70from lp.services.database.constants import UTC_NOW
63from lp.services.database.decoratedresultset import DecoratedResultSet71from lp.services.database.decoratedresultset import DecoratedResultSet
72from lp.services.database.enumcol import DBEnum
64from lp.services.database.lpstorm import (73from lp.services.database.lpstorm import (
65 IMasterStore,74 IMasterStore,
66 IStore,75 IStore,
@@ -140,6 +149,45 @@
140 requester_id = Int(name='requester', allow_none=False)149 requester_id = Int(name='requester', allow_none=False)
141 requester = Reference(requester_id, 'Person.id')150 requester = Reference(requester_id, 'Person.id')
142151
152 # Migrating from PackageBuild
153 _new_build_farm_job_id = Int(name='build_farm_job')
154 _new_build_farm_job = Reference(_new_build_farm_job_id, BuildFarmJob.id)
155
156 _new_archive_id = Int(name='archive')
157 _new_archive = Reference(_new_archive_id, 'Archive.id')
158
159 _new_pocket = DBEnum(name='pocket', enum=PackagePublishingPocket)
160
161 _new_upload_log_id = Int(name='upload_log')
162 _new_upload_log = Reference(_new_upload_log_id, 'LibraryFileAlias.id')
163
164 _new_dependencies = Unicode(name='dependencies')
165
166 # Migrating from BuildFarmJob.
167 _new_processor_id = Int(name='processor')
168 _new_processor = Reference(_new_processor_id, 'Processor.id')
169
170 _new_virtualized = Bool(name='virtualized')
171
172 _new_date_created = DateTime(name='date_created', tzinfo=pytz.UTC)
173
174 _new_date_started = DateTime(name='date_started', tzinfo=pytz.UTC)
175
176 _new_date_finished = DateTime(name='date_finished', tzinfo=pytz.UTC)
177
178 _new_date_first_dispatched = DateTime(
179 name='date_first_dispatched', tzinfo=pytz.UTC)
180
181 _new_builder_id = Int(name='builder')
182 _new_builder = Reference(_new_builder_id, 'Builder.id')
183
184 _new_status = DBEnum(name='status', enum=BuildStatus)
185
186 _new_log_id = Int(name='log')
187 _new_log = Reference(_new_log_id, 'LibraryFileAlias.id')
188
189 _new_failure_count = Int(name='failure_count')
190
143 @property191 @property
144 def buildqueue_record(self):192 def buildqueue_record(self):
145 """See `IBuildFarmJob`."""193 """See `IBuildFarmJob`."""
@@ -164,13 +212,21 @@
164 branch_name = self.recipe.base_branch.unique_name212 branch_name = self.recipe.base_branch.unique_name
165 return '%s recipe build' % branch_name213 return '%s recipe build' % branch_name
166214
167 def __init__(self, package_build, distroseries, recipe, requester):215 def __init__(self, build_farm_job, package_build, distroseries, recipe,
216 requester, archive, pocket, date_created):
168 """Construct a SourcePackageRecipeBuild."""217 """Construct a SourcePackageRecipeBuild."""
169 super(SourcePackageRecipeBuild, self).__init__()218 super(SourcePackageRecipeBuild, self).__init__()
219 self._new_build_farm_job = build_farm_job
170 self.package_build = package_build220 self.package_build = package_build
171 self.distroseries = distroseries221 self.distroseries = distroseries
172 self.recipe = recipe222 self.recipe = recipe
173 self.requester = requester223 self.requester = requester
224 self._new_archive = archive
225 self._new_pocket = pocket
226 self._new_status = BuildStatus.NEEDSBUILD
227 self._new_virtualized = True
228 if date_created is not None:
229 self._new_date_created = date_created
174230
175 @classmethod231 @classmethod
176 def new(cls, distroseries, recipe, requester, archive, pocket=None,232 def new(cls, distroseries, recipe, requester, archive, pocket=None,
@@ -181,13 +237,14 @@
181 pocket = PackagePublishingPocket.RELEASE237 pocket = PackagePublishingPocket.RELEASE
182 if date_created is None:238 if date_created is None:
183 date_created = UTC_NOW239 date_created = UTC_NOW
184 packagebuild = PackageBuild.new(cls.build_farm_job_type,240 build_farm_job = getUtility(IBuildFarmJobSource).new(
185 True, archive, pocket, date_created=date_created)241 cls.build_farm_job_type, BuildStatus.NEEDSBUILD, None, True,
242 date_created, None, archive)
243 packagebuild = getUtility(IPackageBuildSource).new(
244 build_farm_job, archive, pocket)
186 spbuild = cls(245 spbuild = cls(
187 packagebuild,246 build_farm_job, packagebuild, distroseries, recipe, requester,
188 distroseries,247 archive, pocket, date_created)
189 recipe,
190 requester)
191 store.add(spbuild)248 store.add(spbuild)
192 return spbuild249 return spbuild
193250
@@ -310,7 +367,7 @@
310 def getRecentBuilds(cls, requester, recipe, distroseries, _now=None):367 def getRecentBuilds(cls, requester, recipe, distroseries, _now=None):
311 from lp.buildmaster.model.buildfarmjob import BuildFarmJob368 from lp.buildmaster.model.buildfarmjob import BuildFarmJob
312 if _now is None:369 if _now is None:
313 _now = datetime.now(utc)370 _now = datetime.now(pytz.UTC)
314 store = IMasterStore(SourcePackageRecipeBuild)371 store = IMasterStore(SourcePackageRecipeBuild)
315 old_threshold = _now - timedelta(days=1)372 old_threshold = _now - timedelta(days=1)
316 return store.find(cls, cls.distroseries_id == distroseries.id,373 return store.find(cls, cls.distroseries_id == distroseries.id,
317374
=== modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
--- lib/lp/soyuz/model/binarypackagebuild.py 2013-01-30 07:49:52 +0000
+++ lib/lp/soyuz/model/binarypackagebuild.py 2013-02-04 02:47:23 +0000
@@ -11,6 +11,7 @@
11import operator11import operator
1212
13import apt_pkg13import apt_pkg
14import pytz
14from sqlobject import SQLObjectNotFound15from sqlobject import SQLObjectNotFound
15from storm.expr import (16from storm.expr import (
16 Desc,17 Desc,
@@ -19,8 +20,11 @@
19 SQL,20 SQL,
20 )21 )
21from storm.locals import (22from storm.locals import (
23 Bool,
24 DateTime,
22 Int,25 Int,
23 Reference,26 Reference,
27 Unicode,
24 )28 )
25from storm.store import (29from storm.store import (
26 EmptyResultSet,30 EmptyResultSet,
@@ -38,6 +42,7 @@
38 BuildFarmJobType,42 BuildFarmJobType,
39 BuildStatus,43 BuildStatus,
40 )44 )
45from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobSource
41from lp.buildmaster.interfaces.packagebuild import IPackageBuildSource46from lp.buildmaster.interfaces.packagebuild import IPackageBuildSource
42from lp.buildmaster.model.builder import Builder47from lp.buildmaster.model.builder import Builder
43from lp.buildmaster.model.buildfarmjob import BuildFarmJob48from lp.buildmaster.model.buildfarmjob import BuildFarmJob
@@ -46,9 +51,11 @@
46 PackageBuild,51 PackageBuild,
47 PackageBuildMixin,52 PackageBuildMixin,
48 )53 )
54from lp.registry.interfaces.pocket import PackagePublishingPocket
49from lp.services.config import config55from lp.services.config import config
50from lp.services.database.bulk import load_related56from lp.services.database.bulk import load_related
51from lp.services.database.decoratedresultset import DecoratedResultSet57from lp.services.database.decoratedresultset import DecoratedResultSet
58from lp.services.database.enumcol import DBEnum
52from lp.services.database.interfaces import (59from lp.services.database.interfaces import (
53 DEFAULT_FLAVOR,60 DEFAULT_FLAVOR,
54 IStoreSelector,61 IStoreSelector,
@@ -110,6 +117,57 @@
110 source_package_release = Reference(117 source_package_release = Reference(
111 source_package_release_id, 'SourcePackageRelease.id')118 source_package_release_id, 'SourcePackageRelease.id')
112119
120 # Migrating from PackageBuild
121 _new_build_farm_job_id = Int(name='build_farm_job')
122 _new_build_farm_job = Reference(_new_build_farm_job_id, BuildFarmJob.id)
123
124 _new_archive_id = Int(name='archive')
125 _new_archive = Reference(_new_archive_id, 'Archive.id')
126
127 _new_pocket = DBEnum(name='pocket', enum=PackagePublishingPocket)
128
129 _new_upload_log_id = Int(name='upload_log')
130 _new_upload_log = Reference(_new_upload_log_id, 'LibraryFileAlias.id')
131
132 _new_dependencies = Unicode(name='dependencies')
133
134 # Migrating from BuildFarmJob.
135 _new_processor_id = Int(name='processor')
136 _new_processor = Reference(_new_processor_id, 'Processor.id')
137
138 _new_virtualized = Bool(name='virtualized')
139
140 _new_date_created = DateTime(name='date_created', tzinfo=pytz.UTC)
141
142 _new_date_started = DateTime(name='date_started', tzinfo=pytz.UTC)
143
144 _new_date_finished = DateTime(name='date_finished', tzinfo=pytz.UTC)
145
146 _new_date_first_dispatched = DateTime(
147 name='date_first_dispatched', tzinfo=pytz.UTC)
148
149 _new_builder_id = Int(name='builder')
150 _new_builder = Reference(_new_builder_id, 'Builder.id')
151
152 _new_status = DBEnum(name='status', enum=BuildStatus)
153
154 _new_log_id = Int(name='log')
155 _new_log = Reference(_new_log_id, 'LibraryFileAlias.id')
156
157 _new_failure_count = Int(name='failure_count')
158
159 _new_distribution_id = Int(name='distribution')
160 _new_distribution = Reference(_new_distribution_id, 'Distribution.id')
161
162 _new_distro_series_id = Int(name='distro_series')
163 _new_distro_series = Reference(_new_distro_series_id, 'DistroSeries.id')
164
165 _new_is_distro_archive = Bool(name='is_distro_archive')
166
167 _new_source_package_name_id = Int(name='source_package_name')
168 _new_source_package_name = Reference(
169 _new_source_package_name_id, 'SourcePackageName.id')
170
113 @property171 @property
114 def buildqueue_record(self):172 def buildqueue_record(self):
115 """See `IBuild`."""173 """See `IBuild`."""
@@ -357,13 +415,13 @@
357 def retry(self):415 def retry(self):
358 """See `IBuild`."""416 """See `IBuild`."""
359 assert self.can_be_retried, "Build %s cannot be retried" % self.id417 assert self.can_be_retried, "Build %s cannot be retried" % self.id
360 self.build_farm_job.status = BuildStatus.NEEDSBUILD418 self.build_farm_job.status = self._new_status = BuildStatus.NEEDSBUILD
361 self.build_farm_job.date_finished = None419 self.build_farm_job.date_finished = self._new_date_finished = None
362 self.build_farm_job.date_started = None420 self.build_farm_job.date_started = self._new_date_started = None
363 self.build_farm_job.builder = None421 self.build_farm_job.builder = self._new_builder = None
364 self.build_farm_job.log = None422 self.build_farm_job.log = self._new_log = None
365 self.package_build.upload_log = None423 self.package_build.upload_log = self._new_upload_log = None
366 self.package_build.dependencies = None424 self.package_build.dependencies = self._new_dependencies = None
367 self.queueBuild()425 self.queueBuild()
368426
369 def rescore(self, score):427 def rescore(self, score):
@@ -513,7 +571,8 @@
513 if not self._isDependencySatisfied(token)]571 if not self._isDependencySatisfied(token)]
514572
515 # Update dependencies line573 # Update dependencies line
516 self.package_build.dependencies = u", ".join(remaining_deps)574 self.package_build.dependencies = self._new_dependencies = (
575 u", ".join(remaining_deps))
517576
518 def __getitem__(self, name):577 def __getitem__(self, name):
519 return self.getBinaryPackageRelease(name)578 return self.getBinaryPackageRelease(name)
@@ -812,17 +871,28 @@
812 archive, pocket, status=BuildStatus.NEEDSBUILD,871 archive, pocket, status=BuildStatus.NEEDSBUILD,
813 date_created=None, builder=None):872 date_created=None, builder=None):
814 """See `IBinaryPackageBuildSet`."""873 """See `IBinaryPackageBuildSet`."""
815 # Create the PackageBuild to which the new BinaryPackageBuild874 # Create the BuildFarmJob and PackageBuild to which the new
816 # will delegate.875 # BinaryPackageBuild will delegate.
876 build_farm_job = getUtility(IBuildFarmJobSource).new(
877 BinaryPackageBuild.build_farm_job_type, status, processor,
878 archive.require_virtualized, date_created, builder, archive)
817 package_build = getUtility(IPackageBuildSource).new(879 package_build = getUtility(IPackageBuildSource).new(
818 BinaryPackageBuild.build_farm_job_type,880 build_farm_job, archive, pocket)
819 archive.require_virtualized, archive, pocket, processor,
820 status, date_created=date_created, builder=builder)
821881
822 binary_package_build = BinaryPackageBuild(882 binary_package_build = BinaryPackageBuild(
883 _new_build_farm_job=build_farm_job,
823 package_build=package_build,884 package_build=package_build,
824 distro_arch_series=distro_arch_series,885 distro_arch_series=distro_arch_series,
825 source_package_release=source_package_release)886 source_package_release=source_package_release,
887 _new_archive=archive, _new_pocket=pocket,
888 _new_status=status, _new_processor=processor,
889 _new_virtualized=archive.require_virtualized,
890 _new_builder=builder, _new_is_distro_archive=archive.is_main,
891 _new_distribution=distro_arch_series.distroseries.distribution,
892 _new_distro_series=distro_arch_series.distroseries,
893 _new_source_package_name=source_package_release.sourcepackagename)
894 if date_created is not None:
895 binary_package_build._new_date_created = date_created
826 return binary_package_build896 return binary_package_build
827897
828 def getBuildBySRAndArchtag(self, sourcepackagereleaseID, archtag):898 def getBuildBySRAndArchtag(self, sourcepackagereleaseID, archtag):
829899
=== modified file 'lib/lp/soyuz/scripts/gina/handlers.py'
--- lib/lp/soyuz/scripts/gina/handlers.py 2012-08-12 09:27:55 +0000
+++ lib/lp/soyuz/scripts/gina/handlers.py 2013-02-04 02:47:23 +0000
@@ -890,10 +890,10 @@
890 else:890 else:
891 processor = distroarchinfo['processor']891 processor = distroarchinfo['processor']
892 build = getUtility(IBinaryPackageBuildSet).new(892 build = getUtility(IBinaryPackageBuildSet).new(
893 processor=processor.id,893 processor=processor,
894 distro_arch_series=distroarchseries.id,894 distro_arch_series=distroarchseries,
895 status=BuildStatus.FULLYBUILT,895 status=BuildStatus.FULLYBUILT,
896 source_package_release=srcpkg.id,896 source_package_release=srcpkg,
897 pocket=self.pocket,897 pocket=self.pocket,
898 archive=distroarchseries.main_archive)898 archive=distroarchseries.main_archive)
899 return build899 return build
900900
=== modified file 'lib/lp/soyuz/tests/test_binarypackagebuild.py'
--- lib/lp/soyuz/tests/test_binarypackagebuild.py 2013-01-24 01:09:04 +0000
+++ lib/lp/soyuz/tests/test_binarypackagebuild.py 2013-02-04 02:47:23 +0000
@@ -10,6 +10,7 @@
1010
11import pytz11import pytz
12from storm.store import Store12from storm.store import Store
13from testtools.matchers import MatchesStructure
13from zope.component import getUtility14from zope.component import getUtility
14from zope.security.proxy import removeSecurityProxy15from zope.security.proxy import removeSecurityProxy
1516
@@ -62,6 +63,25 @@
62 self.assertProvides(self.build, IPackageBuild)63 self.assertProvides(self.build, IPackageBuild)
63 self.assertProvides(self.build, IBinaryPackageBuild)64 self.assertProvides(self.build, IBinaryPackageBuild)
6465
66 def test_denormed_attributes(self):
67 primary_build = self.factory.makeBinaryPackageBuild(
68 archive=self.factory.makeArchive(purpose=ArchivePurpose.PRIMARY))
69 partner_build = self.factory.makeBinaryPackageBuild(
70 archive=self.factory.makeArchive(purpose=ArchivePurpose.PARTNER))
71 ppa_build = self.factory.makeBinaryPackageBuild(
72 archive=self.factory.makeArchive(purpose=ArchivePurpose.PPA))
73 scenarios = [
74 (primary_build, True), (partner_build, True), (ppa_build, False)]
75 for build, is_distro_archive in scenarios:
76 self.assertThat(
77 removeSecurityProxy(build),
78 MatchesStructure.byEquality(
79 _new_is_distro_archive=is_distro_archive,
80 _new_distro_series=build.distro_arch_series.distroseries,
81 _new_distribution=build.distro_series.distribution,
82 _new_source_package_name=
83 build.source_package_release.sourcepackagename))
84
65 def test_queueBuild(self):85 def test_queueBuild(self):
66 # BinaryPackageBuild can create the queue entry for itself.86 # BinaryPackageBuild can create the queue entry for itself.
67 bq = self.build.queueBuild()87 bq = self.build.queueBuild()
6888
=== modified file 'lib/lp/soyuz/tests/test_hasbuildrecords.py'
--- lib/lp/soyuz/tests/test_hasbuildrecords.py 2013-01-24 06:05:26 +0000
+++ lib/lp/soyuz/tests/test_hasbuildrecords.py 2013-02-04 02:47:23 +0000
@@ -10,7 +10,10 @@
10 BuildFarmJobType,10 BuildFarmJobType,
11 BuildStatus,11 BuildStatus,
12 )12 )
13from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJob13from lp.buildmaster.interfaces.buildfarmjob import (
14 IBuildFarmJob,
15 IBuildFarmJobSource,
16 )
14from lp.buildmaster.interfaces.packagebuild import IPackageBuildSource17from lp.buildmaster.interfaces.packagebuild import IPackageBuildSource
15from lp.registry.interfaces.person import IPersonSet18from lp.registry.interfaces.person import IPersonSet
16from lp.registry.interfaces.pocket import PackagePublishingPocket19from lp.registry.interfaces.pocket import PackagePublishingPocket
@@ -178,9 +181,10 @@
178 # Until we have different IBuildFarmJob types implemented, we181 # Until we have different IBuildFarmJob types implemented, we
179 # can only test this by creating a lone PackageBuild of a182 # can only test this by creating a lone PackageBuild of a
180 # different type.183 # different type.
184 bfj = getUtility(IBuildFarmJobSource).new(
185 BuildFarmJobType.RECIPEBRANCHBUILD, virtualized=True)
181 getUtility(IPackageBuildSource).new(186 getUtility(IPackageBuildSource).new(
182 job_type=BuildFarmJobType.RECIPEBRANCHBUILD, virtualized=True,187 bfj, archive=self.context, pocket=PackagePublishingPocket.RELEASE)
183 archive=self.context, pocket=PackagePublishingPocket.RELEASE)
184188
185 builds = self.context.getBuildRecords(binary_only=True)189 builds = self.context.getBuildRecords(binary_only=True)
186 self.failUnlessEqual(3, builds.count())190 self.failUnlessEqual(3, builds.count())
187191
=== modified file 'lib/lp/translations/model/translationtemplatesbuild.py'
--- lib/lp/translations/model/translationtemplatesbuild.py 2013-01-30 07:49:52 +0000
+++ lib/lp/translations/model/translationtemplatesbuild.py 2013-02-04 02:47:23 +0000
@@ -8,7 +8,10 @@
8 'TranslationTemplatesBuild',8 'TranslationTemplatesBuild',
9 ]9 ]
1010
11import pytz
11from storm.locals import (12from storm.locals import (
13 Bool,
14 DateTime,
12 Int,15 Int,
13 Reference,16 Reference,
14 Storm,17 Storm,
@@ -20,7 +23,10 @@
20 )23 )
2124
22from lp.app.interfaces.launchpad import ILaunchpadCelebrities25from lp.app.interfaces.launchpad import ILaunchpadCelebrities
23from lp.buildmaster.enums import BuildFarmJobType26from lp.buildmaster.enums import (
27 BuildFarmJobType,
28 BuildStatus,
29 )
24from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobSource30from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobSource
25from lp.buildmaster.model.buildfarmjob import BuildFarmJobMixin31from lp.buildmaster.model.buildfarmjob import BuildFarmJobMixin
26from lp.code.model.branch import Branch32from lp.code.model.branch import Branch
@@ -32,6 +38,7 @@
32from lp.registry.model.product import Product38from lp.registry.model.product import Product
33from lp.services.database.bulk import load_related39from lp.services.database.bulk import load_related
34from lp.services.database.decoratedresultset import DecoratedResultSet40from lp.services.database.decoratedresultset import DecoratedResultSet
41from lp.services.database.enumcol import DBEnum
35from lp.services.database.lpstorm import IStore42from lp.services.database.lpstorm import IStore
36from lp.translations.interfaces.translationtemplatesbuild import (43from lp.translations.interfaces.translationtemplatesbuild import (
37 ITranslationTemplatesBuild,44 ITranslationTemplatesBuild,
@@ -56,15 +63,42 @@
56 branch_id = Int(name='branch', allow_none=False)63 branch_id = Int(name='branch', allow_none=False)
57 branch = Reference(branch_id, 'Branch.id')64 branch = Reference(branch_id, 'Branch.id')
5865
66 # Migrating from BuildFarmJob.
67 _new_processor_id = Int(name='processor')
68 _new_processor = Reference(_new_processor_id, 'Processor.id')
69
70 _new_virtualized = Bool(name='virtualized')
71
72 _new_date_created = DateTime(name='date_created', tzinfo=pytz.UTC)
73
74 _new_date_started = DateTime(name='date_started', tzinfo=pytz.UTC)
75
76 _new_date_finished = DateTime(name='date_finished', tzinfo=pytz.UTC)
77
78 _new_date_first_dispatched = DateTime(
79 name='date_first_dispatched', tzinfo=pytz.UTC)
80
81 _new_builder_id = Int(name='builder')
82 _new_builder = Reference(_new_builder_id, 'Builder.id')
83
84 _new_status = DBEnum(name='status', enum=BuildStatus)
85
86 _new_log_id = Int(name='log')
87 _new_log = Reference(_new_log_id, 'LibraryFileAlias.id')
88
89 _new_failure_count = Int(name='failure_count')
90
59 @property91 @property
60 def title(self):92 def title(self):
61 return u'Translation template build for %s' % (93 return u'Translation template build for %s' % (
62 self.branch.displayname)94 self.branch.displayname)
6395
64 def __init__(self, build_farm_job, branch):96 def __init__(self, build_farm_job, branch, processor):
65 super(TranslationTemplatesBuild, self).__init__()97 super(TranslationTemplatesBuild, self).__init__()
66 self.build_farm_job = build_farm_job98 self.build_farm_job = build_farm_job
67 self.branch = branch99 self.branch = branch
100 self._new_status = BuildStatus.NEEDSBUILD
101 self._new_processor = processor
68102
69 def makeJob(self):103 def makeJob(self):
70 """See `IBuildFarmJobOld`."""104 """See `IBuildFarmJobOld`."""
@@ -100,10 +134,10 @@
100 @classmethod134 @classmethod
101 def create(cls, branch):135 def create(cls, branch):
102 """See `ITranslationTemplatesBuildSource`."""136 """See `ITranslationTemplatesBuildSource`."""
137 processor = cls._getBuildArch()
103 build_farm_job = getUtility(IBuildFarmJobSource).new(138 build_farm_job = getUtility(IBuildFarmJobSource).new(
104 BuildFarmJobType.TRANSLATIONTEMPLATESBUILD,139 BuildFarmJobType.TRANSLATIONTEMPLATESBUILD, processor=processor)
105 processor=cls._getBuildArch())140 build = TranslationTemplatesBuild(build_farm_job, branch, processor)
106 build = TranslationTemplatesBuild(build_farm_job, branch)
107 store = cls._getStore()141 store = cls._getStore()
108 store.add(build)142 store.add(build)
109 store.flush()143 store.flush()