Merge lp:~michael.nelson/launchpad/567922-binarypackagebuild-new-table-3 into lp:launchpad/db-devel
- 567922-binarypackagebuild-new-table-3
- Merge into db-devel
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 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Abel Deuring (community) | code | Approve | |
Review via email: mp+24814@code.launchpad.net |
Commit message
Description of the change
This branch is part of a pipeline for
https:/
https:/
**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://
Overview
========
This branch continues the work to switch our BinaryPackageBuild class to the new binarypackagebuild table (using the delegated PackageBuild/
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_
bin/py database/
And then:
bin/test -vv -m soyuz.tests -t test_publishing -t test_binarypack
The next branch will continue getting the soyuz unit-tests passing with the new model.
Abel Deuring (adeuring) : | # |
Preview Diff
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): |