Merge lp:~wgrant/launchpad/flatten-bfj-1-populate into lp:launchpad
- flatten-bfj-1-populate
- Merge into devel
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 | ||||||||
Related bugs: |
|
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.
Preview Diff
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() |
472 # Create the PackageBuild to which the new BinaryPackageBuild
473 # will delegate.
This comment needs updating, since you're doing more than that.