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
1=== modified file 'lib/lp/buildmaster/interfaces/packagebuild.py'
2--- lib/lp/buildmaster/interfaces/packagebuild.py 2013-01-22 08:31:09 +0000
3+++ lib/lp/buildmaster/interfaces/packagebuild.py 2013-02-04 02:47:23 +0000
4@@ -133,20 +133,12 @@
5 class IPackageBuildSource(Interface):
6 """A utility of this interface used to create _things_."""
7
8- def new(job_type, virtualized, archive, pocket, processor=None,
9- status=BuildStatus.NEEDSBUILD, dependencies=None, builder=None):
10+ def new(build_farm_job, archive, pocket):
11 """Create a new `IPackageBuild`.
12
13- :param job_type: A `BuildFarmJobType` item.
14- :param virtualized: A boolean indicating whether this build was
15- virtualized.
16+ :param build_farm_job: An `IBuildFarmJob`.
17 :param archive: An `IArchive`.
18 :param pocket: An item of `PackagePublishingPocket`.
19- :param processor: An `IProcessor` required to run this build farm
20- job. Default is None (processor-independent).
21- :param status: A `BuildStatus` item defaulting to NEEDSBUILD.
22- :param dependencies: An optional debian-like dependency line.
23- :parma builder: An optional `IBuilder`.
24 """
25
26
27
28=== modified file 'lib/lp/buildmaster/model/buildfarmjob.py'
29--- lib/lp/buildmaster/model/buildfarmjob.py 2013-01-30 07:49:52 +0000
30+++ lib/lp/buildmaster/model/buildfarmjob.py 2013-02-04 02:47:23 +0000
31@@ -196,23 +196,28 @@
32
33 failure_count = Int(name='failure_count', allow_none=False)
34
35+ archive_id = Int(name='archive')
36+ archive = Reference(archive_id, 'Archive.id')
37+
38 dependencies = None
39
40 def __init__(self, job_type, status=BuildStatus.NEEDSBUILD,
41 processor=None, virtualized=None, date_created=None,
42- builder=None):
43+ builder=None, archive=None):
44 super(BuildFarmJob, self).__init__()
45 (self.job_type, self.status, self.processor, self.virtualized,
46- self.builder) = (job_type, status, processor, virtualized, builder)
47+ self.builder, self.archive) = (
48+ job_type, status, processor, virtualized, builder, archive)
49 if date_created is not None:
50 self.date_created = date_created
51
52 @classmethod
53 def new(cls, job_type, status=BuildStatus.NEEDSBUILD, processor=None,
54- virtualized=None, date_created=None, builder=None):
55+ virtualized=None, date_created=None, builder=None, archive=None):
56 """See `IBuildFarmJobSource`."""
57 build_farm_job = BuildFarmJob(
58- job_type, status, processor, virtualized, date_created, builder)
59+ job_type, status, processor, virtualized, date_created, builder,
60+ archive)
61 store = IMasterStore(BuildFarmJob)
62 store.add(build_farm_job)
63 return build_farm_job
64@@ -319,29 +324,30 @@
65
66 def setLog(self, log):
67 """See `IBuildFarmJob`."""
68- self.build_farm_job.log = log
69+ self.build_farm_job.log = self._new_log = log
70
71 def updateStatus(self, status, builder=None, slave_status=None,
72 date_started=None, date_finished=None):
73 """See `IBuildFarmJob`."""
74- self.build_farm_job.status = status
75+ self.build_farm_job.status = self._new_status = status
76
77 # If there's a builder provided, set it if we don't already have
78 # one, or otherwise crash if it's different from the one we
79 # expected.
80 if builder is not None:
81 if self.builder is None:
82- self.build_farm_job.builder = builder
83+ self.build_farm_job.builder = self._new_builder = builder
84 else:
85 assert self.builder == builder
86
87 # If we're starting to build, set date_started and
88 # date_first_dispatched if required.
89 if self.date_started is None and status == BuildStatus.BUILDING:
90- self.build_farm_job.date_started = (
91+ self.build_farm_job.date_started = self._new_date_started = (
92 date_started or datetime.datetime.now(pytz.UTC))
93 if self.date_first_dispatched is None:
94 self.build_farm_job.date_first_dispatched = self.date_started
95+ self._new_date_first_dispatched = self.date_started
96
97 # If we're in a final build state (or UPLOADING, which sort of
98 # is), set date_finished if date_started is.
99@@ -352,12 +358,13 @@
100 # XXX cprov 20060615 bug=120584: Currently buildduration includes
101 # the scanner latency, it should really be asking the slave for
102 # the duration spent building locally.
103- self.build_farm_job.date_finished = (
104+ self.build_farm_job.date_finished = self._new_date_finished = (
105 date_finished or datetime.datetime.now(pytz.UTC))
106
107 def gotFailure(self):
108 """See `IBuildFarmJob`."""
109 self.build_farm_job.failure_count += 1
110+ self._new_failure_count = self.build_farm_job.failure_count
111
112
113 class BuildFarmJobSet:
114
115=== modified file 'lib/lp/buildmaster/model/packagebuild.py'
116--- lib/lp/buildmaster/model/packagebuild.py 2013-01-30 07:49:52 +0000
117+++ lib/lp/buildmaster/model/packagebuild.py 2013-02-04 02:47:23 +0000
118@@ -84,8 +84,7 @@
119 distribution = None
120 distro_series = None
121
122- def __init__(self, build_farm_job, archive, pocket,
123- dependencies=None):
124+ def __init__(self, build_farm_job, archive, pocket, dependencies=None):
125 """Construct a PackageBuild."""
126 super(PackageBuild, self).__init__()
127 self.build_farm_job = build_farm_job
128@@ -94,18 +93,10 @@
129 self.dependencies = dependencies
130
131 @classmethod
132- def new(cls, job_type, virtualized, archive, pocket, processor=None,
133- status=BuildStatus.NEEDSBUILD, dependencies=None,
134- date_created=None, builder=None):
135+ def new(cls, build_farm_job, archive, pocket):
136 """See `IPackageBuildSource`."""
137 store = IMasterStore(PackageBuild)
138-
139- # Create the BuildFarmJob to which the new PackageBuild
140- # will delegate.
141- build_farm_job = getUtility(IBuildFarmJobSource).new(
142- job_type, status, processor, virtualized, date_created, builder)
143-
144- package_build = cls(build_farm_job, archive, pocket, dependencies)
145+ package_build = cls(build_farm_job, archive, pocket)
146 store.add(package_build)
147 return package_build
148
149@@ -174,10 +165,10 @@
150
151 if (status == BuildStatus.MANUALDEPWAIT and slave_status is not None
152 and slave_status.get('dependencies') is not None):
153- self.package_build.dependencies = (
154+ self.package_build.dependencies = self._new_dependencies = (
155 unicode(slave_status.get('dependencies')))
156 else:
157- self.package_build.dependencies = None
158+ self.package_build.dependencies = self._new_dependencies = None
159
160 def verifySuccessfulUpload(self):
161 """See `IPackageBuild`."""
162@@ -213,7 +204,7 @@
163 """See `IPackageBuild`."""
164 filename = "upload_%s_log.txt" % self.id
165 library_file = self.createUploadLog(content, filename=filename)
166- self.package_build.upload_log = library_file
167+ self.package_build.upload_log = self._new_upload_log = library_file
168
169 def notify(self, extra_info=None):
170 """See `IPackageBuild`."""
171
172=== modified file 'lib/lp/buildmaster/tests/test_packagebuild.py'
173--- lib/lp/buildmaster/tests/test_packagebuild.py 2013-01-30 07:29:46 +0000
174+++ lib/lp/buildmaster/tests/test_packagebuild.py 2013-02-04 02:47:23 +0000
175@@ -16,6 +16,7 @@
176 BuildFarmJobType,
177 BuildStatus,
178 )
179+from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobSource
180 from lp.buildmaster.interfaces.packagebuild import (
181 IPackageBuild,
182 IPackageBuildSet,
183@@ -46,9 +47,9 @@
184 if archive is None:
185 archive = self.factory.makeArchive()
186
187- return getUtility(IPackageBuildSource).new(
188- job_type=job_type, virtualized=True, archive=archive,
189- status=status, pocket=pocket)
190+ bfj = getUtility(IBuildFarmJobSource).new(
191+ job_type, virtualized=True, status=status)
192+ return getUtility(IPackageBuildSource).new(bfj, archive, pocket)
193
194
195 class TestPackageBuild(TestPackageBuildBase):
196
197=== modified file 'lib/lp/code/model/sourcepackagerecipebuild.py'
198--- lib/lp/code/model/sourcepackagerecipebuild.py 2013-01-30 07:49:52 +0000
199+++ lib/lp/code/model/sourcepackagerecipebuild.py 2013-02-04 02:47:23 +0000
200@@ -15,11 +15,14 @@
201 import logging
202
203 from psycopg2 import ProgrammingError
204-from pytz import utc
205+import pytz
206 from storm.locals import (
207+ Bool,
208+ DateTime,
209 Int,
210 Reference,
211 Storm,
212+ Unicode,
213 )
214 from storm.store import (
215 EmptyResultSet,
216@@ -36,7 +39,12 @@
217 BuildFarmJobType,
218 BuildStatus,
219 )
220-from lp.buildmaster.model.buildfarmjob import BuildFarmJobOld
221+from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobSource
222+from lp.buildmaster.interfaces.packagebuild import IPackageBuildSource
223+from lp.buildmaster.model.buildfarmjob import (
224+ BuildFarmJob,
225+ BuildFarmJobOld,
226+ )
227 from lp.buildmaster.model.buildqueue import BuildQueue
228 from lp.buildmaster.model.packagebuild import (
229 PackageBuild,
230@@ -61,6 +69,7 @@
231 from lp.services.database.bulk import load_related
232 from lp.services.database.constants import UTC_NOW
233 from lp.services.database.decoratedresultset import DecoratedResultSet
234+from lp.services.database.enumcol import DBEnum
235 from lp.services.database.lpstorm import (
236 IMasterStore,
237 IStore,
238@@ -140,6 +149,45 @@
239 requester_id = Int(name='requester', allow_none=False)
240 requester = Reference(requester_id, 'Person.id')
241
242+ # Migrating from PackageBuild
243+ _new_build_farm_job_id = Int(name='build_farm_job')
244+ _new_build_farm_job = Reference(_new_build_farm_job_id, BuildFarmJob.id)
245+
246+ _new_archive_id = Int(name='archive')
247+ _new_archive = Reference(_new_archive_id, 'Archive.id')
248+
249+ _new_pocket = DBEnum(name='pocket', enum=PackagePublishingPocket)
250+
251+ _new_upload_log_id = Int(name='upload_log')
252+ _new_upload_log = Reference(_new_upload_log_id, 'LibraryFileAlias.id')
253+
254+ _new_dependencies = Unicode(name='dependencies')
255+
256+ # Migrating from BuildFarmJob.
257+ _new_processor_id = Int(name='processor')
258+ _new_processor = Reference(_new_processor_id, 'Processor.id')
259+
260+ _new_virtualized = Bool(name='virtualized')
261+
262+ _new_date_created = DateTime(name='date_created', tzinfo=pytz.UTC)
263+
264+ _new_date_started = DateTime(name='date_started', tzinfo=pytz.UTC)
265+
266+ _new_date_finished = DateTime(name='date_finished', tzinfo=pytz.UTC)
267+
268+ _new_date_first_dispatched = DateTime(
269+ name='date_first_dispatched', tzinfo=pytz.UTC)
270+
271+ _new_builder_id = Int(name='builder')
272+ _new_builder = Reference(_new_builder_id, 'Builder.id')
273+
274+ _new_status = DBEnum(name='status', enum=BuildStatus)
275+
276+ _new_log_id = Int(name='log')
277+ _new_log = Reference(_new_log_id, 'LibraryFileAlias.id')
278+
279+ _new_failure_count = Int(name='failure_count')
280+
281 @property
282 def buildqueue_record(self):
283 """See `IBuildFarmJob`."""
284@@ -164,13 +212,21 @@
285 branch_name = self.recipe.base_branch.unique_name
286 return '%s recipe build' % branch_name
287
288- def __init__(self, package_build, distroseries, recipe, requester):
289+ def __init__(self, build_farm_job, package_build, distroseries, recipe,
290+ requester, archive, pocket, date_created):
291 """Construct a SourcePackageRecipeBuild."""
292 super(SourcePackageRecipeBuild, self).__init__()
293+ self._new_build_farm_job = build_farm_job
294 self.package_build = package_build
295 self.distroseries = distroseries
296 self.recipe = recipe
297 self.requester = requester
298+ self._new_archive = archive
299+ self._new_pocket = pocket
300+ self._new_status = BuildStatus.NEEDSBUILD
301+ self._new_virtualized = True
302+ if date_created is not None:
303+ self._new_date_created = date_created
304
305 @classmethod
306 def new(cls, distroseries, recipe, requester, archive, pocket=None,
307@@ -181,13 +237,14 @@
308 pocket = PackagePublishingPocket.RELEASE
309 if date_created is None:
310 date_created = UTC_NOW
311- packagebuild = PackageBuild.new(cls.build_farm_job_type,
312- True, archive, pocket, date_created=date_created)
313+ build_farm_job = getUtility(IBuildFarmJobSource).new(
314+ cls.build_farm_job_type, BuildStatus.NEEDSBUILD, None, True,
315+ date_created, None, archive)
316+ packagebuild = getUtility(IPackageBuildSource).new(
317+ build_farm_job, archive, pocket)
318 spbuild = cls(
319- packagebuild,
320- distroseries,
321- recipe,
322- requester)
323+ build_farm_job, packagebuild, distroseries, recipe, requester,
324+ archive, pocket, date_created)
325 store.add(spbuild)
326 return spbuild
327
328@@ -310,7 +367,7 @@
329 def getRecentBuilds(cls, requester, recipe, distroseries, _now=None):
330 from lp.buildmaster.model.buildfarmjob import BuildFarmJob
331 if _now is None:
332- _now = datetime.now(utc)
333+ _now = datetime.now(pytz.UTC)
334 store = IMasterStore(SourcePackageRecipeBuild)
335 old_threshold = _now - timedelta(days=1)
336 return store.find(cls, cls.distroseries_id == distroseries.id,
337
338=== modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
339--- lib/lp/soyuz/model/binarypackagebuild.py 2013-01-30 07:49:52 +0000
340+++ lib/lp/soyuz/model/binarypackagebuild.py 2013-02-04 02:47:23 +0000
341@@ -11,6 +11,7 @@
342 import operator
343
344 import apt_pkg
345+import pytz
346 from sqlobject import SQLObjectNotFound
347 from storm.expr import (
348 Desc,
349@@ -19,8 +20,11 @@
350 SQL,
351 )
352 from storm.locals import (
353+ Bool,
354+ DateTime,
355 Int,
356 Reference,
357+ Unicode,
358 )
359 from storm.store import (
360 EmptyResultSet,
361@@ -38,6 +42,7 @@
362 BuildFarmJobType,
363 BuildStatus,
364 )
365+from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobSource
366 from lp.buildmaster.interfaces.packagebuild import IPackageBuildSource
367 from lp.buildmaster.model.builder import Builder
368 from lp.buildmaster.model.buildfarmjob import BuildFarmJob
369@@ -46,9 +51,11 @@
370 PackageBuild,
371 PackageBuildMixin,
372 )
373+from lp.registry.interfaces.pocket import PackagePublishingPocket
374 from lp.services.config import config
375 from lp.services.database.bulk import load_related
376 from lp.services.database.decoratedresultset import DecoratedResultSet
377+from lp.services.database.enumcol import DBEnum
378 from lp.services.database.interfaces import (
379 DEFAULT_FLAVOR,
380 IStoreSelector,
381@@ -110,6 +117,57 @@
382 source_package_release = Reference(
383 source_package_release_id, 'SourcePackageRelease.id')
384
385+ # Migrating from PackageBuild
386+ _new_build_farm_job_id = Int(name='build_farm_job')
387+ _new_build_farm_job = Reference(_new_build_farm_job_id, BuildFarmJob.id)
388+
389+ _new_archive_id = Int(name='archive')
390+ _new_archive = Reference(_new_archive_id, 'Archive.id')
391+
392+ _new_pocket = DBEnum(name='pocket', enum=PackagePublishingPocket)
393+
394+ _new_upload_log_id = Int(name='upload_log')
395+ _new_upload_log = Reference(_new_upload_log_id, 'LibraryFileAlias.id')
396+
397+ _new_dependencies = Unicode(name='dependencies')
398+
399+ # Migrating from BuildFarmJob.
400+ _new_processor_id = Int(name='processor')
401+ _new_processor = Reference(_new_processor_id, 'Processor.id')
402+
403+ _new_virtualized = Bool(name='virtualized')
404+
405+ _new_date_created = DateTime(name='date_created', tzinfo=pytz.UTC)
406+
407+ _new_date_started = DateTime(name='date_started', tzinfo=pytz.UTC)
408+
409+ _new_date_finished = DateTime(name='date_finished', tzinfo=pytz.UTC)
410+
411+ _new_date_first_dispatched = DateTime(
412+ name='date_first_dispatched', tzinfo=pytz.UTC)
413+
414+ _new_builder_id = Int(name='builder')
415+ _new_builder = Reference(_new_builder_id, 'Builder.id')
416+
417+ _new_status = DBEnum(name='status', enum=BuildStatus)
418+
419+ _new_log_id = Int(name='log')
420+ _new_log = Reference(_new_log_id, 'LibraryFileAlias.id')
421+
422+ _new_failure_count = Int(name='failure_count')
423+
424+ _new_distribution_id = Int(name='distribution')
425+ _new_distribution = Reference(_new_distribution_id, 'Distribution.id')
426+
427+ _new_distro_series_id = Int(name='distro_series')
428+ _new_distro_series = Reference(_new_distro_series_id, 'DistroSeries.id')
429+
430+ _new_is_distro_archive = Bool(name='is_distro_archive')
431+
432+ _new_source_package_name_id = Int(name='source_package_name')
433+ _new_source_package_name = Reference(
434+ _new_source_package_name_id, 'SourcePackageName.id')
435+
436 @property
437 def buildqueue_record(self):
438 """See `IBuild`."""
439@@ -357,13 +415,13 @@
440 def retry(self):
441 """See `IBuild`."""
442 assert self.can_be_retried, "Build %s cannot be retried" % self.id
443- self.build_farm_job.status = BuildStatus.NEEDSBUILD
444- self.build_farm_job.date_finished = None
445- self.build_farm_job.date_started = None
446- self.build_farm_job.builder = None
447- self.build_farm_job.log = None
448- self.package_build.upload_log = None
449- self.package_build.dependencies = None
450+ self.build_farm_job.status = self._new_status = BuildStatus.NEEDSBUILD
451+ self.build_farm_job.date_finished = self._new_date_finished = None
452+ self.build_farm_job.date_started = self._new_date_started = None
453+ self.build_farm_job.builder = self._new_builder = None
454+ self.build_farm_job.log = self._new_log = None
455+ self.package_build.upload_log = self._new_upload_log = None
456+ self.package_build.dependencies = self._new_dependencies = None
457 self.queueBuild()
458
459 def rescore(self, score):
460@@ -513,7 +571,8 @@
461 if not self._isDependencySatisfied(token)]
462
463 # Update dependencies line
464- self.package_build.dependencies = u", ".join(remaining_deps)
465+ self.package_build.dependencies = self._new_dependencies = (
466+ u", ".join(remaining_deps))
467
468 def __getitem__(self, name):
469 return self.getBinaryPackageRelease(name)
470@@ -812,17 +871,28 @@
471 archive, pocket, status=BuildStatus.NEEDSBUILD,
472 date_created=None, builder=None):
473 """See `IBinaryPackageBuildSet`."""
474- # Create the PackageBuild to which the new BinaryPackageBuild
475- # will delegate.
476+ # Create the BuildFarmJob and PackageBuild to which the new
477+ # BinaryPackageBuild will delegate.
478+ build_farm_job = getUtility(IBuildFarmJobSource).new(
479+ BinaryPackageBuild.build_farm_job_type, status, processor,
480+ archive.require_virtualized, date_created, builder, archive)
481 package_build = getUtility(IPackageBuildSource).new(
482- BinaryPackageBuild.build_farm_job_type,
483- archive.require_virtualized, archive, pocket, processor,
484- status, date_created=date_created, builder=builder)
485+ build_farm_job, archive, pocket)
486
487 binary_package_build = BinaryPackageBuild(
488+ _new_build_farm_job=build_farm_job,
489 package_build=package_build,
490 distro_arch_series=distro_arch_series,
491- source_package_release=source_package_release)
492+ source_package_release=source_package_release,
493+ _new_archive=archive, _new_pocket=pocket,
494+ _new_status=status, _new_processor=processor,
495+ _new_virtualized=archive.require_virtualized,
496+ _new_builder=builder, _new_is_distro_archive=archive.is_main,
497+ _new_distribution=distro_arch_series.distroseries.distribution,
498+ _new_distro_series=distro_arch_series.distroseries,
499+ _new_source_package_name=source_package_release.sourcepackagename)
500+ if date_created is not None:
501+ binary_package_build._new_date_created = date_created
502 return binary_package_build
503
504 def getBuildBySRAndArchtag(self, sourcepackagereleaseID, archtag):
505
506=== modified file 'lib/lp/soyuz/scripts/gina/handlers.py'
507--- lib/lp/soyuz/scripts/gina/handlers.py 2012-08-12 09:27:55 +0000
508+++ lib/lp/soyuz/scripts/gina/handlers.py 2013-02-04 02:47:23 +0000
509@@ -890,10 +890,10 @@
510 else:
511 processor = distroarchinfo['processor']
512 build = getUtility(IBinaryPackageBuildSet).new(
513- processor=processor.id,
514- distro_arch_series=distroarchseries.id,
515+ processor=processor,
516+ distro_arch_series=distroarchseries,
517 status=BuildStatus.FULLYBUILT,
518- source_package_release=srcpkg.id,
519+ source_package_release=srcpkg,
520 pocket=self.pocket,
521 archive=distroarchseries.main_archive)
522 return build
523
524=== modified file 'lib/lp/soyuz/tests/test_binarypackagebuild.py'
525--- lib/lp/soyuz/tests/test_binarypackagebuild.py 2013-01-24 01:09:04 +0000
526+++ lib/lp/soyuz/tests/test_binarypackagebuild.py 2013-02-04 02:47:23 +0000
527@@ -10,6 +10,7 @@
528
529 import pytz
530 from storm.store import Store
531+from testtools.matchers import MatchesStructure
532 from zope.component import getUtility
533 from zope.security.proxy import removeSecurityProxy
534
535@@ -62,6 +63,25 @@
536 self.assertProvides(self.build, IPackageBuild)
537 self.assertProvides(self.build, IBinaryPackageBuild)
538
539+ def test_denormed_attributes(self):
540+ primary_build = self.factory.makeBinaryPackageBuild(
541+ archive=self.factory.makeArchive(purpose=ArchivePurpose.PRIMARY))
542+ partner_build = self.factory.makeBinaryPackageBuild(
543+ archive=self.factory.makeArchive(purpose=ArchivePurpose.PARTNER))
544+ ppa_build = self.factory.makeBinaryPackageBuild(
545+ archive=self.factory.makeArchive(purpose=ArchivePurpose.PPA))
546+ scenarios = [
547+ (primary_build, True), (partner_build, True), (ppa_build, False)]
548+ for build, is_distro_archive in scenarios:
549+ self.assertThat(
550+ removeSecurityProxy(build),
551+ MatchesStructure.byEquality(
552+ _new_is_distro_archive=is_distro_archive,
553+ _new_distro_series=build.distro_arch_series.distroseries,
554+ _new_distribution=build.distro_series.distribution,
555+ _new_source_package_name=
556+ build.source_package_release.sourcepackagename))
557+
558 def test_queueBuild(self):
559 # BinaryPackageBuild can create the queue entry for itself.
560 bq = self.build.queueBuild()
561
562=== modified file 'lib/lp/soyuz/tests/test_hasbuildrecords.py'
563--- lib/lp/soyuz/tests/test_hasbuildrecords.py 2013-01-24 06:05:26 +0000
564+++ lib/lp/soyuz/tests/test_hasbuildrecords.py 2013-02-04 02:47:23 +0000
565@@ -10,7 +10,10 @@
566 BuildFarmJobType,
567 BuildStatus,
568 )
569-from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJob
570+from lp.buildmaster.interfaces.buildfarmjob import (
571+ IBuildFarmJob,
572+ IBuildFarmJobSource,
573+ )
574 from lp.buildmaster.interfaces.packagebuild import IPackageBuildSource
575 from lp.registry.interfaces.person import IPersonSet
576 from lp.registry.interfaces.pocket import PackagePublishingPocket
577@@ -178,9 +181,10 @@
578 # Until we have different IBuildFarmJob types implemented, we
579 # can only test this by creating a lone PackageBuild of a
580 # different type.
581+ bfj = getUtility(IBuildFarmJobSource).new(
582+ BuildFarmJobType.RECIPEBRANCHBUILD, virtualized=True)
583 getUtility(IPackageBuildSource).new(
584- job_type=BuildFarmJobType.RECIPEBRANCHBUILD, virtualized=True,
585- archive=self.context, pocket=PackagePublishingPocket.RELEASE)
586+ bfj, archive=self.context, pocket=PackagePublishingPocket.RELEASE)
587
588 builds = self.context.getBuildRecords(binary_only=True)
589 self.failUnlessEqual(3, builds.count())
590
591=== modified file 'lib/lp/translations/model/translationtemplatesbuild.py'
592--- lib/lp/translations/model/translationtemplatesbuild.py 2013-01-30 07:49:52 +0000
593+++ lib/lp/translations/model/translationtemplatesbuild.py 2013-02-04 02:47:23 +0000
594@@ -8,7 +8,10 @@
595 'TranslationTemplatesBuild',
596 ]
597
598+import pytz
599 from storm.locals import (
600+ Bool,
601+ DateTime,
602 Int,
603 Reference,
604 Storm,
605@@ -20,7 +23,10 @@
606 )
607
608 from lp.app.interfaces.launchpad import ILaunchpadCelebrities
609-from lp.buildmaster.enums import BuildFarmJobType
610+from lp.buildmaster.enums import (
611+ BuildFarmJobType,
612+ BuildStatus,
613+ )
614 from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJobSource
615 from lp.buildmaster.model.buildfarmjob import BuildFarmJobMixin
616 from lp.code.model.branch import Branch
617@@ -32,6 +38,7 @@
618 from lp.registry.model.product import Product
619 from lp.services.database.bulk import load_related
620 from lp.services.database.decoratedresultset import DecoratedResultSet
621+from lp.services.database.enumcol import DBEnum
622 from lp.services.database.lpstorm import IStore
623 from lp.translations.interfaces.translationtemplatesbuild import (
624 ITranslationTemplatesBuild,
625@@ -56,15 +63,42 @@
626 branch_id = Int(name='branch', allow_none=False)
627 branch = Reference(branch_id, 'Branch.id')
628
629+ # Migrating from BuildFarmJob.
630+ _new_processor_id = Int(name='processor')
631+ _new_processor = Reference(_new_processor_id, 'Processor.id')
632+
633+ _new_virtualized = Bool(name='virtualized')
634+
635+ _new_date_created = DateTime(name='date_created', tzinfo=pytz.UTC)
636+
637+ _new_date_started = DateTime(name='date_started', tzinfo=pytz.UTC)
638+
639+ _new_date_finished = DateTime(name='date_finished', tzinfo=pytz.UTC)
640+
641+ _new_date_first_dispatched = DateTime(
642+ name='date_first_dispatched', tzinfo=pytz.UTC)
643+
644+ _new_builder_id = Int(name='builder')
645+ _new_builder = Reference(_new_builder_id, 'Builder.id')
646+
647+ _new_status = DBEnum(name='status', enum=BuildStatus)
648+
649+ _new_log_id = Int(name='log')
650+ _new_log = Reference(_new_log_id, 'LibraryFileAlias.id')
651+
652+ _new_failure_count = Int(name='failure_count')
653+
654 @property
655 def title(self):
656 return u'Translation template build for %s' % (
657 self.branch.displayname)
658
659- def __init__(self, build_farm_job, branch):
660+ def __init__(self, build_farm_job, branch, processor):
661 super(TranslationTemplatesBuild, self).__init__()
662 self.build_farm_job = build_farm_job
663 self.branch = branch
664+ self._new_status = BuildStatus.NEEDSBUILD
665+ self._new_processor = processor
666
667 def makeJob(self):
668 """See `IBuildFarmJobOld`."""
669@@ -100,10 +134,10 @@
670 @classmethod
671 def create(cls, branch):
672 """See `ITranslationTemplatesBuildSource`."""
673+ processor = cls._getBuildArch()
674 build_farm_job = getUtility(IBuildFarmJobSource).new(
675- BuildFarmJobType.TRANSLATIONTEMPLATESBUILD,
676- processor=cls._getBuildArch())
677- build = TranslationTemplatesBuild(build_farm_job, branch)
678+ BuildFarmJobType.TRANSLATIONTEMPLATESBUILD, processor=processor)
679+ build = TranslationTemplatesBuild(build_farm_job, branch, processor)
680 store = cls._getStore()
681 store.add(build)
682 store.flush()