Merge lp:~michael.nelson/launchpad/567922-binarypackagebuild-new-table-3 into lp:launchpad/db-devel

Proposed by Michael Nelson
Status: Merged
Approved by: Michael Nelson
Approved revision: no longer in the source branch.
Merged at revision: 9405
Proposed branch: lp:~michael.nelson/launchpad/567922-binarypackagebuild-new-table-3
Merge into: lp:launchpad/db-devel
Prerequisite: lp:~michael.nelson/launchpad/567922-binarypackagebuild-new-table-2
Diff against target: 768 lines (+159/-90) (has conflicts)
15 files modified
lib/canonical/launchpad/security.py (+3/-2)
lib/lp/buildmaster/model/buildbase.py (+18/-10)
lib/lp/buildmaster/model/buildfarmjob.py (+9/-1)
lib/lp/buildmaster/model/packagebuild.py (+4/-0)
lib/lp/registry/model/sourcepackage.py (+10/-7)
lib/lp/soyuz/configure.zcml (+2/-2)
lib/lp/soyuz/model/archive.py (+17/-8)
lib/lp/soyuz/model/binarypackagebuild.py (+25/-18)
lib/lp/soyuz/model/publishing.py (+16/-9)
lib/lp/soyuz/tests/test_archive.py (+12/-8)
lib/lp/soyuz/tests/test_binarypackagebuild.py (+15/-7)
lib/lp/soyuz/tests/test_buildpackagejob.py (+4/-2)
lib/lp/soyuz/tests/test_hasbuildrecords.py (+9/-5)
lib/lp/soyuz/tests/test_publishing.py (+13/-10)
lib/lp/soyuz/tests/test_publishing_models.py (+2/-1)
Text conflict in lib/lp/buildmaster/interfaces/buildbase.py
Text conflict in lib/lp/buildmaster/model/buildbase.py
Text conflict in lib/lp/buildmaster/tests/test_buildbase.py
To merge this branch: bzr merge lp:~michael.nelson/launchpad/567922-binarypackagebuild-new-table-3
Reviewer Review Type Date Requested Status
Abel Deuring (community) code Approve
Review via email: mp+24814@code.launchpad.net

Description of the change

This branch is part of a pipeline for

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

**Note**: If it's possible, please ignore the conflicts with db-devel - it's due to a reversion of some work that was in db-devel and that I'd already pushed through the pipeline, and I'm waiting for that work to land again on db-devel before re-merging and pumping.

The actual diff of this branch from the previous is:
http://pastebin.ubuntu.com/428892/

Overview
========
This branch continues the work to switch our BinaryPackageBuild class to the new binarypackagebuild table (using the delegated PackageBuild/BuildFarmJob).

Details
=======
This branch just gets 6 unit test modules passing again, by updating queries and attribute names as appropriate.

In some tests I've had to use removeSecurityProxy (where it wasn't used before). It is while setting attributes that should not be writable, but I'm not sure why they were writable before switching the models... if I've missed something obvious, please let me know!

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

To test
=======

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

And then:
bin/test -vv -m soyuz.tests -t test_publishing -t test_binarypackagebuild -t test_archive -t test_hasbuildrecords -t test_buildpackagejob

The next branch will continue getting the soyuz unit-tests passing with the new model.

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/canonical/launchpad/security.py'
2--- lib/canonical/launchpad/security.py 2010-04-26 15:02:03 +0000
3+++ lib/canonical/launchpad/security.py 2010-05-06 11:12:37 +0000
4@@ -1476,8 +1476,9 @@
5 # strict_component is True because the source package already exists,
6 # otherwise, how can they give it back?
7 check_perms = check_upload_to_archive(
8- user.person, self.obj.distroseries,
9- self.obj.sourcepackagerelease.sourcepackagename, self.obj.archive,
10+ user.person, self.obj.distro_series,
11+ self.obj.source_package_release.sourcepackagename,
12+ self.obj.archive,
13 self.obj.current_component, self.obj.pocket,
14 strict_component=True)
15 return check_perms == None
16
17=== modified file 'lib/lp/buildmaster/model/buildbase.py'
18--- lib/lp/buildmaster/model/buildbase.py 2010-05-06 11:12:34 +0000
19+++ lib/lp/buildmaster/model/buildbase.py 2010-05-06 11:12:37 +0000
20@@ -23,9 +23,13 @@
21 from zope.security.proxy import removeSecurityProxy
22
23 from canonical.config import config
24+<<<<<<< TREE
25 from canonical.database.constants import UTC_NOW
26 from canonical.database.sqlbase import (
27 clear_current_connection_cache, cursor, flush_database_updates)
28+=======
29+from canonical.database.sqlbase import ZopelessTransactionManager
30+>>>>>>> MERGE-SOURCE
31 from canonical.launchpad.helpers import filenameToContentType
32 from canonical.launchpad.interfaces.librarian import ILibraryFileAliasSet
33 from canonical.librarian.utils import copy_and_close
34@@ -46,7 +50,8 @@
35 the properties defined on IBuildBase on the inheriting class tables.
36 BuildBase cannot therefore implement IBuildBase itself, as storm requires
37 that the corresponding __storm_table__ be defined for the class. Instead,
38- the classes using the BuildBase mixin must ensure that they implement IBuildBase.
39+ the classes using the BuildBase mixin must ensure that they implement
40+ IBuildBase.
41 """
42 policy_name = 'buildd'
43
44@@ -138,8 +143,9 @@
45 % (status, self.buildqueue_record.builder.url))
46 =======
47 if build.buildqueue_record is not None:
48- logger.critical("Unknown BuildStatus '%s' for builder '%s'"
49- % (status, build.buildqueue_record.builder.url))
50+ logger.critical(
51+ "Unknown BuildStatus '%s' for builder '%s'" % (
52+ status, build.buildqueue_record.builder.url))
53 else:
54 logger.critical("Unknown BuildStatus '%s' for %r"
55 % (status, build))
56@@ -450,16 +456,18 @@
57 @staticmethod
58 def storeBuildInfo(build, librarian, slave_status):
59 """See `IBuildBase`."""
60- build.buildlog = build.getLogFromSlave(build)
61- build.builder = build.buildqueue_record.builder
62+ # XXX michaeln 2010-05-05 bug=567922
63+ # As this method is temporarily static until BuildBase is
64+ # removed and the implementation moved to PackageBuild,
65+ # self.attr_name is temporarily build.attr_name, which
66+ # means we cannot set the build attributes.
67+ naked_build = removeSecurityProxy(build)
68+ naked_build.log = build.getLogFromSlave(build)
69+ naked_build.builder = build.buildqueue_record.builder
70 # XXX cprov 20060615 bug=120584: Currently buildduration includes
71 # the scanner latency, it should really be asking the slave for
72 # the duration spent building locally.
73- build.datebuilt = UTC_NOW
74- # We need dynamic datetime.now() instance to be able to perform
75- # the time operations for duration.
76- RIGHT_NOW = datetime.datetime.now(pytz.timezone('UTC'))
77- build.buildduration = RIGHT_NOW - build.buildqueue_record.date_started
78+ naked_build.date_finished = datetime.datetime.now(pytz.UTC)
79 if slave_status.get('dependencies') is not None:
80 build.dependencies = unicode(slave_status.get('dependencies'))
81 else:
82
83=== modified file 'lib/lp/buildmaster/model/buildfarmjob.py'
84--- lib/lp/buildmaster/model/buildfarmjob.py 2010-05-06 11:12:34 +0000
85+++ lib/lp/buildmaster/model/buildfarmjob.py 2010-05-06 11:12:37 +0000
86@@ -90,7 +90,7 @@
87
88 def cleanUp(self):
89 """See `IBuildFarmJob`."""
90- Store.of(self).remove(self)
91+ pass
92
93 def generateSlaveBuildCookie(self):
94 """See `IBuildFarmJobOld`."""
95@@ -148,6 +148,14 @@
96
97 return hashlib.sha1(contents).hexdigest()
98
99+ def cleanUp(self):
100+ """See `IBuildFarmJob`.
101+
102+ Classes that derive from BuildFarmJobOld need to clean up
103+ after themselves correctly.
104+ """
105+ Store.of(self).remove(self)
106+
107
108 class BuildFarmJob(BuildFarmJobOld, Storm):
109 """A base implementation for `IBuildFarmJob` classes."""
110
111=== modified file 'lib/lp/buildmaster/model/packagebuild.py'
112--- lib/lp/buildmaster/model/packagebuild.py 2010-05-06 11:12:34 +0000
113+++ lib/lp/buildmaster/model/packagebuild.py 2010-05-06 11:12:37 +0000
114@@ -161,6 +161,10 @@
115 """See `IPackageBuild`."""
116 raise NotImplementedError
117
118+ def queueBuild(self, suspended=False):
119+ """See `IPackageBuild`."""
120+ raise NotImplementedError
121+
122
123 class PackageBuildDerived:
124 """Setup the delegation for package build.
125
126=== modified file 'lib/lp/registry/model/sourcepackage.py'
127--- lib/lp/registry/model/sourcepackage.py 2010-04-14 18:31:51 +0000
128+++ lib/lp/registry/model/sourcepackage.py 2010-05-06 11:12:37 +0000
129@@ -518,16 +518,17 @@
130 'SourcePackagePublishingHistory']
131
132 condition_clauses = ["""
133- Build.sourcepackagerelease = SourcePackageRelease.id AND
134+ BinaryPackageBuild.source_package_release =
135+ SourcePackageRelease.id AND
136 SourcePackageRelease.sourcepackagename = %s AND
137 SourcePackagePublishingHistory.distroseries = %s AND
138 SourcePackagePublishingHistory.archive IN %s AND
139 SourcePackagePublishingHistory.sourcepackagerelease =
140 SourcePackageRelease.id AND
141- SourcePackagePublishingHistory.archive = Build.archive
142+ SourcePackagePublishingHistory.archive = PackageBuild.archive
143 """ % sqlvalues(self.sourcepackagename,
144 self.distroseries,
145- self.distribution.all_distro_archive_ids)]
146+ list(self.distribution.all_distro_archive_ids))]
147
148 # We re-use the optional-parameter handling provided by BuildSet
149 # here, but pass None for the name argument as we've already
150@@ -539,7 +540,8 @@
151 # exclude gina-generated and security (dak-made) builds
152 # buildstate == FULLYBUILT && datebuilt == null
153 condition_clauses.append(
154- "NOT (Build.buildstate=%s AND Build.datebuilt is NULL)"
155+ "NOT (BuildFarmJob.status=%s AND "
156+ " BuildFarmJob.date_finished is NULL)"
157 % sqlvalues(BuildStatus.FULLYBUILT))
158
159 # Ordering according status
160@@ -550,13 +552,14 @@
161 if build_state in [BuildStatus.NEEDSBUILD, BuildStatus.BUILDING]:
162 orderBy = ["-BuildQueue.lastscore"]
163 clauseTables.append('BuildPackageJob')
164- condition_clauses.append('BuildPackageJob.build = Build.id')
165+ condition_clauses.append(
166+ 'BuildPackageJob.build = BinaryPackageBuild.id')
167 clauseTables.append('BuildQueue')
168 condition_clauses.append('BuildQueue.job = BuildPackageJob.job')
169 elif build_state == BuildStatus.SUPERSEDED or build_state is None:
170- orderBy = ["-Build.datecreated"]
171+ orderBy = ["-BuildFarmJob.date_created"]
172 else:
173- orderBy = ["-Build.datebuilt"]
174+ orderBy = ["-BuildFarmJob.date_finished"]
175
176 # Fallback to ordering by -id as a tie-breaker.
177 orderBy.append("-id")
178
179=== modified file 'lib/lp/soyuz/configure.zcml'
180--- lib/lp/soyuz/configure.zcml 2010-05-06 11:12:34 +0000
181+++ lib/lp/soyuz/configure.zcml 2010-05-06 11:12:37 +0000
182@@ -507,8 +507,8 @@
183
184 <require
185 permission="launchpad.Edit"
186- set_attributes="buildlog datebuilt buildduration builder
187- buildstate dependencies upload_log"/>
188+ set_attributes="log date_finished date_started builder
189+ status dependencies upload_log"/>
190 </class>
191 <adapter
192 provides="canonical.launchpad.webapp.interfaces.IBreadcrumb"
193
194=== modified file 'lib/lp/soyuz/model/archive.py'
195--- lib/lp/soyuz/model/archive.py 2010-05-03 07:32:58 +0000
196+++ lib/lp/soyuz/model/archive.py 2010-05-06 11:12:37 +0000
197@@ -33,6 +33,8 @@
198 from canonical.database.sqlbase import (
199 cursor, quote, quote_like, sqlvalues, SQLBase)
200 from lp.buildmaster.interfaces.buildbase import BuildStatus
201+from lp.buildmaster.model.buildfarmjob import BuildFarmJob
202+from lp.buildmaster.model.packagebuild import PackageBuild
203 from lp.services.job.interfaces.job import JobStatus
204 from lp.soyuz.adapters.packagelocation import PackageLocation
205 from canonical.launchpad.components.tokens import (
206@@ -1146,7 +1148,7 @@
207 BinaryPackageRelease.binarypackagename == name,
208 BinaryPackageRelease.version == version,
209 BinaryPackageBuild.id == BinaryPackageRelease.buildID,
210- DistroArchSeries.id == BinaryPackageBuild.distroarchseriesID,
211+ DistroArchSeries.id == BinaryPackageBuild.distro_arch_series_id,
212 DistroArchSeries.architecturetag == archtag,
213 BinaryPackagePublishingHistory.archive == self,
214 BinaryPackagePublishingHistory.binarypackagereleaseID ==
215@@ -1343,13 +1345,17 @@
216
217 extra_exprs = []
218 if build_status is not None:
219- extra_exprs.append(BinaryPackageBuild.buildstate == build_status)
220+ extra_exprs = [
221+ PackageBuild.build_farm_job == BuildFarmJob.id,
222+ BuildFarmJob.status == build_status,
223+ ]
224
225 result_set = store.find(
226 SourcePackageRelease,
227- (BinaryPackageBuild.sourcepackagereleaseID ==
228+ (BinaryPackageBuild.source_package_release_id ==
229 SourcePackageRelease.id),
230- BinaryPackageBuild.archive == self,
231+ BinaryPackageBuild.package_build == PackageBuild.id,
232+ PackageBuild.archive == self,
233 *extra_exprs)
234
235 result_set.config(distinct=True).order_by(SourcePackageRelease.id)
236@@ -1389,15 +1395,18 @@
237
238 query = """
239 UPDATE Job SET status = %s
240- FROM Build, BuildPackageJob, BuildQueue
241+ FROM BinaryPackageBuild, PackageBuild, BuildFarmJob,
242+ BuildPackageJob, BuildQueue
243 WHERE
244+ BinaryPackageBuild.package_build = PackageBuild.id
245 -- insert self.id here
246- Build.archive = %s
247- AND BuildPackageJob.build = Build.id
248+ AND PackageBuild.archive = %s
249+ AND BuildPackageJob.build = BinaryPackageBuild.id
250 AND BuildPackageJob.job = BuildQueue.job
251 AND Job.id = BuildQueue.job
252 -- Build is in state BuildStatus.NEEDSBUILD (0)
253- AND Build.buildstate = %s;
254+ AND PackageBuild.build_farm_job = BuildFarmJob.id
255+ AND BuildFarmJob.status = %s;
256 """ % sqlvalues(status, self, BuildStatus.NEEDSBUILD)
257
258 store = Store.of(self)
259
260=== modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
261--- lib/lp/soyuz/model/binarypackagebuild.py 2010-05-06 11:12:34 +0000
262+++ lib/lp/soyuz/model/binarypackagebuild.py 2010-05-06 11:12:37 +0000
263@@ -11,8 +11,6 @@
264 import logging
265 import operator
266
267-from lazr.delegates import delegates
268-
269 from storm.locals import Int, Reference
270
271 from zope.interface import implements
272@@ -21,8 +19,7 @@
273 from storm.expr import (
274 Desc, In, Join, LeftJoin)
275 from storm.store import Store
276-from sqlobject import (
277- ForeignKey, SQLObjectNotFound)
278+from sqlobject import SQLObjectNotFound
279 from sqlobject.sqlbuilder import AND, IN
280
281 from canonical.config import config
282@@ -76,10 +73,13 @@
283 package_build_id = Int(name='package_build', allow_none=False)
284 package_build = Reference(package_build_id, 'PackageBuild.id')
285
286- distro_arch_series = ForeignKey(dbName='distro_arch_series',
287- foreignKey='DistroArchSeries', notNull=True)
288- source_package_release = ForeignKey(dbName='source_package_release',
289- foreignKey='SourcePackageRelease', notNull=True)
290+ distro_arch_series_id = Int(name='distro_arch_series', allow_none=False)
291+ distro_arch_series = Reference(
292+ distro_arch_series_id, 'DistroArchSeries.id')
293+ source_package_release_id = Int(
294+ name='source_package_release', allow_none=False)
295+ source_package_release = Reference(
296+ source_package_release_id, 'SourcePackageRelease.id')
297
298 @property
299 def buildqueue_record(self):
300@@ -442,7 +442,7 @@
301 # in a PPA or copy archive).
302 archives = [self.archive.id]
303 if self.archive.purpose != ArchivePurpose.PRIMARY:
304- archives.append(self.distroarchseries.main_archive.id)
305+ archives.append(self.distro_arch_series.main_archive.id)
306
307 # Look for all sourcepackagerelease instances that match the name
308 # and get the (successfully built) build records for this
309@@ -852,12 +852,17 @@
310
311 # format clause according single/multiple architecture(s) form
312 if len(arch_ids) == 1:
313- condition_clauses = [('distroarchseries=%s'
314+ condition_clauses = [('distro_arch_series=%s'
315 % sqlvalues(arch_ids[0]))]
316 else:
317- condition_clauses = [('distroarchseries IN %s'
318+ condition_clauses = [('distro_arch_series IN %s'
319 % sqlvalues(arch_ids))]
320
321+ condition_clauses.extend([
322+ "BinaryPackageBuild.package_build = PackageBuild.id",
323+ "PackageBuild.build_farm_job = BuildFarmJob.id"
324+ ])
325+
326 # XXX cprov 2006-09-25: It would be nice if we could encapsulate
327 # the chunk of code below (which deals with the optional paramenters)
328 # and share it with ISourcePackage.getBuildRecords()
329@@ -865,10 +870,11 @@
330 # exclude gina-generated and security (dak-made) builds
331 # buildstate == FULLYBUILT && datebuilt == null
332 if status == BuildStatus.FULLYBUILT:
333- condition_clauses.append("Build.datebuilt IS NOT NULL")
334+ condition_clauses.append("BuildFarmJob.date_finished IS NOT NULL")
335 else:
336 condition_clauses.append(
337- "(Build.buildstate <> %s OR Build.datebuilt IS NOT NULL)"
338+ "(BuildFarmJob.status <> %s OR "
339+ " BuildFarmJob.date_finished IS NOT NULL)"
340 % sqlvalues(BuildStatus.FULLYBUILT))
341
342 # Ordering according status
343@@ -880,12 +886,13 @@
344 orderBy = ["-BuildQueue.lastscore", "Build.id"]
345 clauseTables.append('BuildQueue')
346 clauseTables.append('BuildPackageJob')
347- condition_clauses.append('BuildPackageJob.build = Build.id')
348+ condition_clauses.append(
349+ 'BuildPackageJob.build = BinaryPackageBuild.id')
350 condition_clauses.append('BuildPackageJob.job = BuildQueue.job')
351 elif status == BuildStatus.SUPERSEDED or status is None:
352- orderBy = ["-Build.datecreated"]
353+ orderBy = ["-BuildFarmJob.date_created"]
354 else:
355- orderBy = ["-Build.datebuilt"]
356+ orderBy = ["-BuildFarmJob.date_finished"]
357
358 # End of duplication (see XXX cprov 2006-09-25 above).
359
360@@ -897,7 +904,7 @@
361 clauseTables.append("Archive")
362 condition_clauses.append("""
363 Archive.purpose IN (%s) AND
364- Archive.id = Build.archive
365+ Archive.id = PackageBuild.archive
366 """ % ','.join(
367 sqlvalues(ArchivePurpose.PRIMARY, ArchivePurpose.PARTNER)))
368
369@@ -1042,7 +1049,7 @@
370 LeftJoin(
371 SourcePackageRelease,
372 (SourcePackageRelease.id ==
373- BinaryPackageBuild.source_package_releaseID)),
374+ BinaryPackageBuild.source_package_release_id)),
375 LeftJoin(
376 SourcePackageName,
377 SourcePackageName.id
378
379=== modified file 'lib/lp/soyuz/model/publishing.py'
380--- lib/lp/soyuz/model/publishing.py 2010-05-06 11:12:34 +0000
381+++ lib/lp/soyuz/model/publishing.py 2010-05-06 11:12:37 +0000
382@@ -41,6 +41,8 @@
383 IStoreSelector, MAIN_STORE, DEFAULT_FLAVOR)
384 from canonical.launchpad.webapp.interfaces import NotFoundError
385 from lp.buildmaster.interfaces.buildbase import BuildStatus
386+from lp.buildmaster.model.buildfarmjob import BuildFarmJob
387+from lp.buildmaster.model.packagebuild import PackageBuild
388 from lp.registry.interfaces.person import validate_public_person
389 from lp.registry.interfaces.pocket import PackagePublishingPocket
390 from lp.services.worlddata.model.country import Country
391@@ -1182,19 +1184,22 @@
392 # If an optional list of build states was passed in as a parameter,
393 # ensure that the result is limited to builds in those states.
394 if build_states is not None:
395- extra_exprs.append(
396- BinaryPackageBuild.buildstate.is_in(build_states))
397+ extra_exprs.extend((
398+ BinaryPackageBuild.package_build == PackageBuild.id,
399+ PackageBuild.build_farm_job == BuildFarmJob.id,
400+ BuildFarmJob.status.is_in(build_states)))
401
402 store = getUtility(IStoreSelector).get(MAIN_STORE, DEFAULT_FLAVOR)
403
404 # We'll be looking for builds in the same distroseries as the
405 # SPPH for the same release.
406 builds_for_distroseries_expr = (
407- BinaryPackageBuild.distroarchseriesID == DistroArchSeries.id,
408+ BinaryPackageBuild.package_build == PackageBuild.id,
409+ BinaryPackageBuild.distro_arch_series_id == DistroArchSeries.id,
410 SourcePackagePublishingHistory.distroseriesID ==
411 DistroArchSeries.distroseriesID,
412 SourcePackagePublishingHistory.sourcepackagereleaseID ==
413- BinaryPackageBuild.sourcepackagereleaseID,
414+ BinaryPackageBuild.source_package_release_id,
415 In(SourcePackagePublishingHistory.id, source_publication_ids)
416 )
417
418@@ -1204,7 +1209,7 @@
419 BinaryPackageBuild,
420 builds_for_distroseries_expr,
421 (SourcePackagePublishingHistory.archiveID ==
422- BinaryPackageBuild.archiveID),
423+ PackageBuild.archive_id),
424 *extra_exprs)
425
426 # Next get all the builds that have a binary published in the
427@@ -1214,7 +1219,7 @@
428 BinaryPackageBuild,
429 builds_for_distroseries_expr,
430 (SourcePackagePublishingHistory.archiveID !=
431- BinaryPackageBuild.archiveID),
432+ PackageBuild.archive_id),
433 BinaryPackagePublishingHistory.archive ==
434 SourcePackagePublishingHistory.archiveID,
435 BinaryPackagePublishingHistory.binarypackagerelease ==
436@@ -1297,7 +1302,7 @@
437
438 join = [
439 SourcePackagePublishingHistory.sourcepackagereleaseID ==
440- BinaryPackageBuild.sourcepackagereleaseID,
441+ BinaryPackageBuild.source_package_release_id,
442 BinaryPackageRelease.build == BinaryPackageBuild.id,
443 BinaryPackageRelease.binarypackagenameID ==
444 BinaryPackageName.id,
445@@ -1352,7 +1357,9 @@
446 self._getSourceBinaryJoinForSources(
447 source_publication_ids, active_binaries_only=False),
448 BinaryPackagePublishingHistory.datepublished != None,
449- BinaryPackageBuild.buildstate.is_in(build_states))
450+ BinaryPackageBuild.package_build == PackageBuild.id,
451+ PackageBuild.build_farm_job == BuildFarmJob.id,
452+ BuildFarmJob.status.is_in(build_states))
453
454 published_builds.order_by(
455 SourcePackagePublishingHistory.id,
456@@ -1385,7 +1392,7 @@
457 BinaryPackageRelease.id,
458 BinaryPackageRelease.buildID == BinaryPackageBuild.id,
459 SourcePackagePublishingHistory.sourcepackagereleaseID ==
460- BinaryPackageBuild.sourcepackagereleaseID,
461+ BinaryPackageBuild.source_package_release_id,
462 BinaryPackagePublishingHistory.binarypackagereleaseID ==
463 BinaryPackageRelease.id,
464 BinaryPackagePublishingHistory.archiveID ==
465
466=== modified file 'lib/lp/soyuz/tests/test_archive.py'
467--- lib/lp/soyuz/tests/test_archive.py 2010-05-03 07:48:54 +0000
468+++ lib/lp/soyuz/tests/test_archive.py 2010-05-06 11:12:37 +0000
469@@ -321,8 +321,8 @@
470
471 # Collect the source package releases for reference.
472 self.sourcepackagereleases = [
473- self.builds_foo[0].sourcepackagerelease,
474- self.builds_bar[0].sourcepackagerelease,
475+ self.builds_foo[0].source_package_release,
476+ self.builds_bar[0].source_package_release,
477 ]
478
479 def test_getSourcePackageReleases_with_no_params(self):
480@@ -336,7 +336,7 @@
481
482 # Set the builds for one of the sprs to needs build.
483 for build in self.builds_foo:
484- build.buildstate = BuildStatus.NEEDSBUILD
485+ removeSecurityProxy(build).status = BuildStatus.NEEDSBUILD
486
487 result = self.archive.getSourcePackageReleases(
488 build_status=BuildStatus.NEEDSBUILD)
489@@ -462,19 +462,23 @@
490 duration += 60
491 bq = build.buildqueue_record
492 bq.lastscore = score
493- bq.estimated_duration = timedelta(seconds=duration)
494+ removeSecurityProxy(bq).estimated_duration = timedelta(
495+ seconds=duration)
496
497 def _getBuildJobsByStatus(self, archive, status):
498 # Return the count for archive build jobs with the given status.
499 query = """
500 SELECT COUNT(Job.id)
501- FROM Build, BuildPackageJob, BuildQueue, Job
502+ FROM BinaryPackageBuild, BuildPackageJob, BuildQueue, Job,
503+ PackageBuild, BuildFarmJob
504 WHERE
505- Build.archive = %s
506- AND BuildPackageJob.build = Build.id
507+ BuildPackageJob.build = BinaryPackageBuild.id
508 AND BuildPackageJob.job = BuildQueue.job
509 AND Job.id = BuildQueue.job
510- AND Build.buildstate = %s
511+ AND BinaryPackageBuild.package_build = PackageBuild.id
512+ AND PackageBuild.archive = %s
513+ AND PackageBuild.build_farm_job = BuildFarmJob.id
514+ AND BuildFarmJob.status = %s
515 AND Job.status = %s;
516 """ % sqlvalues(archive, BuildStatus.NEEDSBUILD, status)
517
518
519=== modified file 'lib/lp/soyuz/tests/test_binarypackagebuild.py'
520--- lib/lp/soyuz/tests/test_binarypackagebuild.py 2010-05-06 11:12:34 +0000
521+++ lib/lp/soyuz/tests/test_binarypackagebuild.py 2010-05-06 11:12:37 +0000
522@@ -22,6 +22,7 @@
523 from lp.soyuz.interfaces.buildpackagejob import IBuildPackageJob
524 from lp.soyuz.interfaces.component import IComponentSet
525 from lp.soyuz.interfaces.publishing import PackagePublishingStatus
526+from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild
527 from lp.soyuz.model.buildpackagejob import BuildPackageJob
528 from lp.soyuz.model.processor import ProcessorFamilySet
529 from lp.soyuz.tests.soyuzbuilddhelpers import WaitingSlave
530@@ -81,7 +82,7 @@
531 status=PackagePublishingStatus.PUBLISHED)
532
533 [depwait_build] = depwait_source.createMissingBuilds()
534- depwait_build.buildstate = BuildStatus.MANUALDEPWAIT
535+ depwait_build.status = BuildStatus.MANUALDEPWAIT
536 depwait_build.dependencies = u'dep-bin'
537
538 return depwait_build
539@@ -94,6 +95,7 @@
540 """
541 # Create a build in depwait.
542 depwait_build = self._setupSimpleDepwaitContext()
543+ depwait_build_id = depwait_build.id
544
545 # Grab the relevant db records for later comparison.
546 store = Store.of(depwait_build)
547@@ -119,6 +121,13 @@
548 self.assertEqual(
549 store.find(BuildQueue, BuildQueue.id == build_queue_id).count(),
550 0)
551+ # But the build itself still exists.
552+ self.assertEqual(
553+ store.find(
554+ BinaryPackageBuild,
555+ BinaryPackageBuild.id == depwait_build_id).count(),
556+ 1)
557+
558
559 def testUpdateDependenciesWorks(self):
560 # Calling `IBinaryPackageBuild.updateDependencies` makes the build
561@@ -139,17 +148,17 @@
562 AssertionError, depwait_build.updateDependencies)
563
564 # Missing 'name'.
565- depwait_build.dependencies = '(>> version)'
566+ depwait_build.dependencies = u'(>> version)'
567 self.assertRaises(
568 AssertionError, depwait_build.updateDependencies)
569
570 # Missing 'version'.
571- depwait_build.dependencies = 'name (>>)'
572+ depwait_build.dependencies = u'name (>>)'
573 self.assertRaises(
574 AssertionError, depwait_build.updateDependencies)
575
576 # Missing comman between dependencies.
577- depwait_build.dependencies = 'name1 name2'
578+ depwait_build.dependencies = u'name1 name2'
579 self.assertRaises(
580 AssertionError, depwait_build.updateDependencies)
581
582@@ -289,11 +298,10 @@
583 """Verify that storeBuildInfo sets any dependencies."""
584 self.build.storeBuildInfo(
585 self.build, None, {'dependencies': 'somepackage'})
586- self.assertIsNot(None, self.build.buildlog)
587+ self.assertIsNot(None, self.build.log)
588 self.assertEqual(self.builder, self.build.builder)
589 self.assertEqual(u'somepackage', self.build.dependencies)
590- self.assertIsNot(None, self.build.datebuilt)
591- self.assertIsNot(None, self.build.buildduration)
592+ self.assertIsNot(None, self.build.date_finished)
593
594 def testWithoutDependencies(self):
595 """Verify that storeBuildInfo clears the build's dependencies."""
596
597=== modified file 'lib/lp/soyuz/tests/test_buildpackagejob.py'
598--- lib/lp/soyuz/tests/test_buildpackagejob.py 2010-05-06 11:12:34 +0000
599+++ lib/lp/soyuz/tests/test_buildpackagejob.py 2010-05-06 11:12:37 +0000
600@@ -6,6 +6,7 @@
601 from datetime import timedelta
602
603 from zope.component import getUtility
604+from zope.security.proxy import removeSecurityProxy
605
606 from canonical.launchpad.webapp.interfaces import (
607 IStoreSelector, MAIN_STORE, DEFAULT_FLAVOR)
608@@ -26,7 +27,7 @@
609 def find_job(test, name, processor='386'):
610 """Find build and queue instance for the given source and processor."""
611 for build in test.builds:
612- if (build.sourcepackagerelease.name == name
613+ if (build.source_package_release.name == name
614 and build.processor.name == processor):
615 return (build, build.buildqueue_record)
616 return (None, None)
617@@ -203,7 +204,8 @@
618 duration += 60
619 bq = build.buildqueue_record
620 bq.lastscore = score
621- bq.estimated_duration = timedelta(seconds=duration)
622+ removeSecurityProxy(bq).estimated_duration = timedelta(
623+ seconds=duration)
624
625 def test_processor(self):
626 # Test that BuildPackageJob returns the correct processor.
627
628=== modified file 'lib/lp/soyuz/tests/test_hasbuildrecords.py'
629--- lib/lp/soyuz/tests/test_hasbuildrecords.py 2010-05-06 11:12:34 +0000
630+++ lib/lp/soyuz/tests/test_hasbuildrecords.py 2010-05-06 11:12:37 +0000
631@@ -6,6 +6,7 @@
632 import unittest
633
634 from zope.component import getUtility
635+from zope.security.proxy import removeSecurityProxy
636
637 from canonical.testing import LaunchpadZopelessLayer
638
639@@ -49,7 +50,9 @@
640 # in total, two of which are i386 and one hppa.
641 i386_builds = self.builds[:]
642 hppa_build = i386_builds.pop()
643- hppa_build.distroarchseries = self.publisher.distroseries['hppa']
644+ removeSecurityProxy(
645+ hppa_build).distro_arch_series = self.publisher.distroseries[
646+ 'hppa']
647
648 builds = self.context.getBuildRecords(arch_tag="i386")
649 self.assertContentEqual(i386_builds, builds)
650@@ -103,16 +106,17 @@
651 def setUp(self):
652 super(TestSourcePackageHasBuildRecords, self).setUp()
653
654- gedit_name = self.builds[0].sourcepackagerelease.sourcepackagename
655+ gedit_name = self.builds[0].source_package_release.sourcepackagename
656 self.context = SourcePackage(
657 gedit_name,
658- self.builds[0].distroarchseries.distroseries)
659+ self.builds[0].distro_arch_series.distroseries)
660
661 # Convert the other two builds to be builds of
662 # gedit as well so that the one source package (gedit) will have
663 # three builds.
664- self.builds[1].sourcepackagerelease.sourcepackagename = gedit_name
665- self.builds[2].sourcepackagerelease.sourcepackagename = gedit_name
666+ for build in self.builds[1:3]:
667+ spr = build.source_package_release
668+ removeSecurityProxy(spr).sourcepackagename = gedit_name
669
670
671 def test_suite():
672
673=== modified file 'lib/lp/soyuz/tests/test_publishing.py'
674--- lib/lp/soyuz/tests/test_publishing.py 2010-05-06 11:12:34 +0000
675+++ lib/lp/soyuz/tests/test_publishing.py 2010-05-06 11:12:37 +0000
676@@ -13,6 +13,7 @@
677
678 import pytz
679 from zope.component import getUtility
680+from zope.security.proxy import removeSecurityProxy
681
682 from canonical.config import config
683 from canonical.database.constants import UTC_NOW
684@@ -361,10 +362,12 @@
685 binarypackagerelease.addFile(alias)
686
687 # Adjust the build record in way it looks complete.
688- build.buildstate = BuildStatus.FULLYBUILT
689- build.datebuilt = datetime.datetime(
690- 2008, 1, 1, 0, 5, 0, tzinfo=pytz.timezone("UTC"))
691- build.buildduration = datetime.timedelta(minutes=5)
692+ naked_build = removeSecurityProxy(build)
693+ naked_build.status = BuildStatus.FULLYBUILT
694+ naked_build.date_finished = datetime.datetime(
695+ 2008, 1, 1, 0, 5, 0, tzinfo=pytz.UTC)
696+ naked_build.date_started = (
697+ build.date_finished - datetime.timedelta(minutes=5))
698 buildlog_filename = 'buildlog_%s-%s-%s.%s_%s_%s.txt.gz' % (
699 build.distribution.name,
700 build.distro_series.name,
701@@ -372,7 +375,7 @@
702 build.source_package_release.name,
703 build.source_package_release.version,
704 build.status.name)
705- build.buildlog = self.addMockFile(
706+ naked_build.log = self.addMockFile(
707 buildlog_filename, filecontent='Built!',
708 restricted=build.archive.private)
709
710@@ -938,7 +941,7 @@
711 pubrec = self.getPubSource(architecturehintlist='any')
712 builds = pubrec.createMissingBuilds()
713 self.assertEquals(1, len(builds))
714- self.assertEquals(self.sparc_distroarch, builds[0].distroarchseries)
715+ self.assertEquals(self.sparc_distroarch, builds[0].distro_arch_series)
716
717 def test_createMissingBuilds_restricts_explicitlist(self):
718 """createMissingBuilds() should limit builds targeted at a
719@@ -947,7 +950,7 @@
720 pubrec = self.getPubSource(architecturehintlist='sparc i386 avr')
721 builds = pubrec.createMissingBuilds()
722 self.assertEquals(1, len(builds))
723- self.assertEquals(self.sparc_distroarch, builds[0].distroarchseries)
724+ self.assertEquals(self.sparc_distroarch, builds[0].distro_arch_series)
725
726 def test_createMissingBuilds_restricts_all(self):
727 """createMissingBuilds() should limit builds targeted at 'all'
728@@ -957,7 +960,7 @@
729 pubrec = self.getPubSource(architecturehintlist='all')
730 builds = pubrec.createMissingBuilds()
731 self.assertEquals(1, len(builds))
732- self.assertEquals(self.sparc_distroarch, builds[0].distroarchseries)
733+ self.assertEquals(self.sparc_distroarch, builds[0].distro_arch_series)
734
735 def test_createMissingBuilds_restrict_override(self):
736 """createMissingBuilds() should limit builds targeted at 'any'
737@@ -968,8 +971,8 @@
738 pubrec = self.getPubSource(architecturehintlist='any')
739 builds = pubrec.createMissingBuilds()
740 self.assertEquals(2, len(builds))
741- self.assertEquals(self.avr_distroarch, builds[0].distroarchseries)
742- self.assertEquals(self.sparc_distroarch, builds[1].distroarchseries)
743+ self.assertEquals(self.avr_distroarch, builds[0].distro_arch_series)
744+ self.assertEquals(self.sparc_distroarch, builds[1].distro_arch_series)
745
746
747 def test_suite():
748
749=== modified file 'lib/lp/soyuz/tests/test_publishing_models.py'
750--- lib/lp/soyuz/tests/test_publishing_models.py 2010-05-06 11:12:34 +0000
751+++ lib/lp/soyuz/tests/test_publishing_models.py 2010-05-06 11:12:37 +0000
752@@ -6,6 +6,7 @@
753 import unittest
754
755 from zope.component import getUtility
756+from zope.security.proxy import removeSecurityProxy
757
758 from canonical.database.constants import UTC_NOW
759 from canonical.testing import LaunchpadZopelessLayer
760@@ -27,7 +28,7 @@
761
762 # Ensure all the builds have been built.
763 for build in self.builds:
764- build.buildstate = BuildStatus.FULLYBUILT
765+ removeSecurityProxy(build).status = BuildStatus.FULLYBUILT
766 self.publishing_set = getUtility(IPublishingSet)
767
768 def _getBuildsForResults(self, results):

Subscribers

People subscribed via source and target branches

to status/vote changes: