Merge lp:~michael.nelson/launchpad/567922-binarypackagebuild-new-table-2 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-2
Merge into: lp:launchpad/db-devel
Prerequisite: lp:~michael.nelson/launchpad/567922-binarypackagebuild-new-table-1
Diff against target: 756 lines (+188/-86) (has conflicts)
17 files modified
lib/lp/buildmaster/interfaces/buildbase.py (+7/-1)
lib/lp/buildmaster/interfaces/packagebuild.py (+7/-0)
lib/lp/buildmaster/model/buildbase.py (+6/-5)
lib/lp/buildmaster/model/buildfarmjob.py (+1/-1)
lib/lp/buildmaster/model/packagebuild.py (+11/-4)
lib/lp/code/model/sourcepackagerecipe.py (+1/-1)
lib/lp/code/tests/test_sourcepackagerecipebuild.py (+1/-1)
lib/lp/soyuz/interfaces/binarypackagebuild.py (+2/-1)
lib/lp/soyuz/model/binarypackagebuild.py (+48/-29)
lib/lp/soyuz/model/buildfarmbuildjob.py (+50/-0)
lib/lp/soyuz/model/buildpackagejob.py (+7/-7)
lib/lp/soyuz/model/publishing.py (+1/-1)
lib/lp/soyuz/model/sourcepackagerelease.py (+15/-8)
lib/lp/soyuz/tests/test_binarypackagebuild.py (+11/-9)
lib/lp/soyuz/tests/test_hasbuildrecords.py (+3/-1)
lib/lp/soyuz/tests/test_publishing.py (+14/-14)
lib/lp/soyuz/tests/test_publishing_models.py (+3/-3)
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-2
Reviewer Review Type Date Requested Status
Brad Crittenden (community) code Approve
Review via email: mp+24688@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

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

Details
=======
Renames test_build to test_binarypackagebuild, adds BinaryPackageBuild.queueBuild (converting it temporarily to a static method so the implementation can be shared with BuildBase until BuildBase is later deleted), and basically renames lots of attributes to get the tests below to pass.

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 test_binarypackagebuild -t test_getBuildsForBuilder -t test_getBuildsForArchive -t test_providesInterface

The next branch will continue to update the BinaryPackageBuild implementation to get the rest of the tests working.

To post a comment you must log in.
Revision history for this message
Michael Nelson (michael.nelson) wrote :

Diff here: http://pastebin.ubuntu.com/427743/ (in case the scanner is still catching up).

Revision history for this message
Brad Crittenden (bac) wrote :

Hi Michael,

Man I know you're going to be happy to get these changes all wrapped
up. Thanks for doing a very tedious series of branches.

I'm glad to see soyuzvariablenames expanded. thank_you.

--bac

> === modified file 'lib/lp/buildmaster/interfaces/packagebuild.py'
> --- lib/lp/buildmaster/interfaces/packagebuild.py 2010-05-04 12:07:35 +0000
> +++ lib/lp/buildmaster/interfaces/packagebuild.py 2010-05-04 15:29:42 +0000
> @@ -151,6 +151,13 @@
> :param slave_status: A dict as returned by IBuilder.slaveStatus
> """
>
> + def queueBuild(suspended=False):
> + """Create a BuildQueue entry for this build.
> +
> + :param suspended: Whether the associated `Job` instance should be
> + created in a suspended state.
> + """

So interface method specifications leave off the 'self' argument but
as a staticmethod there is no self, so the first argument 'build' is
dropped? That's no good.

>
> class IPackageBuildSource(Interface):
> """A utility of this interface used to create _things_."""

> === modified file 'lib/lp/buildmaster/model/buildfarmjob.py'
> --- lib/lp/buildmaster/model/buildfarmjob.py 2010-05-04 13:42:25 +0000
> +++ lib/lp/buildmaster/model/buildfarmjob.py 2010-05-04 15:29:42 +0000
> @@ -189,7 +189,7 @@
> def __init__(self, job_type, status=BuildStatus.NEEDSBUILD,
> processor=None, virtualized=None):
> super(BuildFarmJob, self).__init__()
> - self.job_type, self.status, self.process, self.virtualized = (
> + self.job_type, self.status, self.processor, self.virtualized = (
> job_type,
> status,
> processor,

> === modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
> --- lib/lp/soyuz/model/binarypackagebuild.py 2010-05-04 09:45:26 +0000
> +++ lib/lp/soyuz/model/binarypackagebuild.py 2010-05-04 15:29:42 +0000

> @@ -778,7 +791,7 @@
>
> # This code MUST match the logic in the Build security adapter,
> # otherwise users are likely to get 403 errors, or worse.

If it MUST match then perhaps it should be refactored and shared?
(Not a requirement for this branch.)

> === renamed file 'lib/lp/soyuz/tests/test_build.py' => 'lib/lp/soyuz/tests/test_binarypackagebuild.py'
> --- lib/lp/soyuz/tests/test_build.py 2010-04-29 08:28:30 +0000
> +++ lib/lp/soyuz/tests/test_binarypackagebuild.py 2010-05-04 15:29:42 +0000
> @@ -7,6 +7,7 @@
>
> from storm.store import Store
> from zope.component import getUtility
> +from zope.security.proxy import removeSecurityProxy
>
> from canonical.database.constants import UTC_NOW
> from canonical.testing import LaunchpadZopelessLayer
> @@ -81,7 +82,7 @@
>
> [depwait_build] = depwait_source.createMissingBuilds()
> depwait_build.buildstate = BuildStatus.MANUALDEPWAIT
> - depwait_build.dependencies = 'dep-bin'
> + depwait_build.dependencies = u'dep-bin'

Why did you need to convert these strings to unicode?

review: Approve (code)
Revision history for this message
Michael Nelson (michael.nelson) wrote :
Download full text (5.4 KiB)

On Tue, May 4, 2010 at 7:52 PM, Brad Crittenden <email address hidden> wrote:
> Review: Approve code
> Hi Michael,
>
> Man I know you're going to be happy to get these changes all wrapped
> up.  Thanks for doing a very tedious series of branches.
>
> I'm glad to see soyuzvariablenames expanded.  thank_you.
>
> --bac

Thanks for the review bac, a few comments below.

>
>
>> === modified file 'lib/lp/buildmaster/interfaces/packagebuild.py'
>> --- lib/lp/buildmaster/interfaces/packagebuild.py     2010-05-04 12:07:35 +0000
>> +++ lib/lp/buildmaster/interfaces/packagebuild.py     2010-05-04 15:29:42 +0000
>> @@ -151,6 +151,13 @@
>>          :param slave_status: A dict as returned by IBuilder.slaveStatus
>>          """
>>
>> +    def queueBuild(suspended=False):
>> +        """Create a BuildQueue entry for this build.
>> +
>> +        :param suspended: Whether the associated `Job` instance should be
>> +            created in a suspended state.
>> +        """
>
> So interface method specifications leave off the 'self' argument but
> as a staticmethod there is no self, so the first argument 'build' is
> dropped?  That's no good.

It's not a static method on PackageBuild... the
PackageBuild.queueBuild() method calls BuildBase.queueBuild() which is
a static method (so the implementation can be shared in the transition
by old BuildBase-based classes and the new PackageBuild classes).

Let me know if that was obvious to you and there is still something
you'd like to see changed?

>
>>
>>  class IPackageBuildSource(Interface):
>>      """A utility of this interface used to create _things_."""
>
>> === modified file 'lib/lp/buildmaster/model/buildfarmjob.py'
>> --- lib/lp/buildmaster/model/buildfarmjob.py  2010-05-04 13:42:25 +0000
>> +++ lib/lp/buildmaster/model/buildfarmjob.py  2010-05-04 15:29:42 +0000
>> @@ -189,7 +189,7 @@
>>      def __init__(self, job_type, status=BuildStatus.NEEDSBUILD,
>>                   processor=None, virtualized=None):
>>          super(BuildFarmJob, self).__init__()
>> -        self.job_type, self.status, self.process, self.virtualized = (
>> +        self.job_type, self.status, self.processor, self.virtualized = (
>>              job_type,
>>              status,
>>              processor,
>
>> === modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
>> --- lib/lp/soyuz/model/binarypackagebuild.py  2010-05-04 09:45:26 +0000
>> +++ lib/lp/soyuz/model/binarypackagebuild.py  2010-05-04 15:29:42 +0000
>
>> @@ -778,7 +791,7 @@
>>
>>          # This code MUST match the logic in the Build security adapter,
>>          # otherwise users are likely to get 403 errors, or worse.
>
> If it MUST match then perhaps it should be refactored and shared?
> (Not a requirement for this branch.)

Yeah, I thought the same thing when I moved that comment.

>
>> === renamed file 'lib/lp/soyuz/tests/test_build.py' => 'lib/lp/soyuz/tests/test_binarypackagebuild.py'
>> --- lib/lp/soyuz/tests/test_build.py  2010-04-29 08:28:30 +0000
>> +++ lib/lp/soyuz/tests/test_binarypackagebuild.py     2010-05-04 15:29:42 +0000
>> @@ -7,6 +7,7 @@
>>
>>  from storm.store import Store
>>  from zope.component import getUtility
>> +from zope.security.proxy import r...

Read more...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/buildmaster/interfaces/buildbase.py'
--- lib/lp/buildmaster/interfaces/buildbase.py 2010-05-05 15:51:54 +0000
+++ lib/lp/buildmaster/interfaces/buildbase.py 2010-05-05 15:51:57 +0000
@@ -20,6 +20,7 @@
20from lazr.restful.fields import Reference20from lazr.restful.fields import Reference
2121
22from lp.buildmaster.interfaces.builder import IBuilder22from lp.buildmaster.interfaces.builder import IBuilder
23from lp.buildmaster.interfaces.buildfarmjob import BuildFarmJobType
23from lp.buildmaster.interfaces.buildqueue import IBuildQueue24from lp.buildmaster.interfaces.buildqueue import IBuildQueue
24from lp.registry.interfaces.distribution import IDistribution25from lp.registry.interfaces.distribution import IDistribution
25from lp.registry.interfaces.pocket import PackagePublishingPocket26from lp.registry.interfaces.pocket import PackagePublishingPocket
@@ -117,6 +118,11 @@
117 # can be removed once all *Build classes inherit from118 # can be removed once all *Build classes inherit from
118 # IBuildFarmJob/IPackageBuild.119 # IBuildFarmJob/IPackageBuild.
119120
121 build_farm_job_type = Choice(
122 title=_("Job type"), required=True, readonly=True,
123 vocabulary=BuildFarmJobType,
124 description=_("The specific type of job."))
125
120 # XXX: wgrant 2010-01-20 bug=507712: Most of these attribute names126 # XXX: wgrant 2010-01-20 bug=507712: Most of these attribute names
121 # are bad.127 # are bad.
122 datecreated = exported(128 datecreated = exported(
@@ -241,7 +247,7 @@
241 Invoke getFileFromSlave method with 'buildlog' identifier.247 Invoke getFileFromSlave method with 'buildlog' identifier.
242 """248 """
243249
244 def queueBuild(suspended=False):250 def queueBuild(build, suspended=False):
245 """Create a BuildQueue entry for this build.251 """Create a BuildQueue entry for this build.
246252
247 :param suspended: Whether the associated `Job` instance should be253 :param suspended: Whether the associated `Job` instance should be
248254
=== modified file 'lib/lp/buildmaster/interfaces/packagebuild.py'
--- lib/lp/buildmaster/interfaces/packagebuild.py 2010-05-05 15:51:54 +0000
+++ lib/lp/buildmaster/interfaces/packagebuild.py 2010-05-05 15:51:57 +0000
@@ -151,6 +151,13 @@
151 :param slave_status: A dict as returned by IBuilder.slaveStatus151 :param slave_status: A dict as returned by IBuilder.slaveStatus
152 """152 """
153153
154 def queueBuild(suspended=False):
155 """Create a BuildQueue entry for this build.
156
157 :param suspended: Whether the associated `Job` instance should be
158 created in a suspended state.
159 """
160
154161
155class IPackageBuildSource(Interface):162class IPackageBuildSource(Interface):
156 """A utility of this interface used to create _things_."""163 """A utility of this interface used to create _things_."""
157164
=== modified file 'lib/lp/buildmaster/model/buildbase.py'
--- lib/lp/buildmaster/model/buildbase.py 2010-05-05 15:51:54 +0000
+++ lib/lp/buildmaster/model/buildbase.py 2010-05-05 15:51:57 +0000
@@ -495,20 +495,21 @@
495 library_file = self.createUploadLog(self, content)495 library_file = self.createUploadLog(self, content)
496 self.upload_log = library_file496 self.upload_log = library_file
497497
498 def queueBuild(self, suspended=False):498 @staticmethod
499 def queueBuild(build, suspended=False):
499 """See `IBuildBase`"""500 """See `IBuildBase`"""
500 specific_job = self.makeJob()501 specific_job = build.makeJob()
501502
502 # This build queue job is to be created in a suspended state.503 # This build queue job is to be created in a suspended state.
503 if suspended:504 if suspended:
504 specific_job.job.suspend()505 specific_job.job.suspend()
505506
506 duration_estimate = self.estimateDuration()507 duration_estimate = build.estimateDuration()
507 queue_entry = BuildQueue(508 queue_entry = BuildQueue(
508 estimated_duration=duration_estimate,509 estimated_duration=duration_estimate,
509 job_type=self.build_farm_job_type,510 job_type=build.build_farm_job_type,
510 job=specific_job.job, processor=specific_job.processor,511 job=specific_job.job, processor=specific_job.processor,
511 virtualized=specific_job.virtualized)512 virtualized=specific_job.virtualized)
512 Store.of(self).add(queue_entry)513 Store.of(build).add(queue_entry)
513 return queue_entry514 return queue_entry
514515
515516
=== modified file 'lib/lp/buildmaster/model/buildfarmjob.py'
--- lib/lp/buildmaster/model/buildfarmjob.py 2010-05-05 15:51:54 +0000
+++ lib/lp/buildmaster/model/buildfarmjob.py 2010-05-05 15:51:57 +0000
@@ -189,7 +189,7 @@
189 def __init__(self, job_type, status=BuildStatus.NEEDSBUILD,189 def __init__(self, job_type, status=BuildStatus.NEEDSBUILD,
190 processor=None, virtualized=None):190 processor=None, virtualized=None):
191 super(BuildFarmJob, self).__init__()191 super(BuildFarmJob, self).__init__()
192 self.job_type, self.status, self.process, self.virtualized = (192 self.job_type, self.status, self.processor, self.virtualized = (
193 job_type,193 job_type,
194 status,194 status,
195 processor,195 processor,
196196
=== modified file 'lib/lp/buildmaster/model/packagebuild.py'
--- lib/lp/buildmaster/model/packagebuild.py 2010-05-05 15:51:54 +0000
+++ lib/lp/buildmaster/model/packagebuild.py 2010-05-05 15:51:57 +0000
@@ -122,9 +122,10 @@
122 return BuildBase.getUploaderCommand(122 return BuildBase.getUploaderCommand(
123 package_build, distro_series, upload_leaf, upload_logfilename)123 package_build, distro_series, upload_leaf, upload_logfilename)
124124
125 def getLogFromSlave(self):125 @staticmethod
126 def getLogFromSlave(package_build):
126 """See `IPackageBuild`."""127 """See `IPackageBuild`."""
127 return BuildBase.getLogFromSlave(self)128 return BuildBase.getLogFromSlave(package_build)
128129
129 @staticmethod130 @staticmethod
130 def getUploadLogContent(root, leaf):131 def getUploadLogContent(root, leaf):
@@ -135,9 +136,11 @@
135 """See `IPackageBuild`."""136 """See `IPackageBuild`."""
136 raise NotImplementedError137 raise NotImplementedError
137138
138 def storeBuildInfo(self, librarian, slave_status):139 @staticmethod
140 def storeBuildInfo(package_build, librarian, slave_status):
139 """See `IPackageBuild`."""141 """See `IPackageBuild`."""
140 return BuildBase.storeBuildInfo(self, librarian, slave_status)142 return BuildBase.storeBuildInfo(package_build, librarian,
143 slave_status)
141144
142 def verifySuccessfulUpload(self):145 def verifySuccessfulUpload(self):
143 """See `IPackageBuild`."""146 """See `IPackageBuild`."""
@@ -167,6 +170,10 @@
167 """170 """
168 delegates(IPackageBuild, context="package_build")171 delegates(IPackageBuild, context="package_build")
169172
173 def queueBuild(self, suspended=False):
174 """See `IPackageBuild`."""
175 return BuildBase.queueBuild(self, suspended=False)
176
170 def handleStatus(self, status, librarian, slave_status):177 def handleStatus(self, status, librarian, slave_status):
171 """See `IPackageBuild`."""178 """See `IPackageBuild`."""
172 return BuildBase.handleStatus(self, status, librarian, slave_status)179 return BuildBase.handleStatus(self, status, librarian, slave_status)
173180
=== modified file 'lib/lp/code/model/sourcepackagerecipe.py'
--- lib/lp/code/model/sourcepackagerecipe.py 2010-04-30 12:33:16 +0000
+++ lib/lp/code/model/sourcepackagerecipe.py 2010-05-05 15:51:57 +0000
@@ -163,7 +163,7 @@
163 self.sourcepackagename)163 self.sourcepackagename)
164 build = getUtility(ISourcePackageRecipeBuildSource).new(sourcepackage,164 build = getUtility(ISourcePackageRecipeBuildSource).new(sourcepackage,
165 self, requester, archive)165 self, requester, archive)
166 build.queueBuild()166 build.queueBuild(build)
167 return build167 return build
168168
169 def getBuilds(self, pending=False):169 def getBuilds(self, pending=False):
170170
=== modified file 'lib/lp/code/tests/test_sourcepackagerecipebuild.py'
--- lib/lp/code/tests/test_sourcepackagerecipebuild.py 2010-04-20 05:07:52 +0000
+++ lib/lp/code/tests/test_sourcepackagerecipebuild.py 2010-05-05 15:51:57 +0000
@@ -58,7 +58,7 @@
5858
59 def test_queueBuild(self):59 def test_queueBuild(self):
60 spb = self.makeSourcePackageRecipeBuild()60 spb = self.makeSourcePackageRecipeBuild()
61 bq = spb.queueBuild()61 bq = spb.queueBuild(spb)
62 self.assertProvides(bq, IBuildQueue)62 self.assertProvides(bq, IBuildQueue)
63 self.assertProvides(bq.specific_job, ISourcePackageRecipeBuildJob)63 self.assertProvides(bq.specific_job, ISourcePackageRecipeBuildJob)
64 self.assertEqual(True, bq.virtualized)64 self.assertEqual(True, bq.virtualized)
6565
=== modified file 'lib/lp/soyuz/interfaces/binarypackagebuild.py'
--- lib/lp/soyuz/interfaces/binarypackagebuild.py 2010-05-05 15:51:54 +0000
+++ lib/lp/soyuz/interfaces/binarypackagebuild.py 2010-05-05 15:51:57 +0000
@@ -21,7 +21,8 @@
2121
22from canonical.launchpad import _22from canonical.launchpad import _
23from lp.buildmaster.interfaces.buildbase import BuildStatus23from lp.buildmaster.interfaces.buildbase import BuildStatus
24from lp.buildmaster.interfaces.packagebuild import IPackageBuild24from lp.buildmaster.interfaces.packagebuild import (
25 IPackageBuild)
25from lp.soyuz.interfaces.processor import IProcessor26from lp.soyuz.interfaces.processor import IProcessor
26from lp.soyuz.interfaces.publishing import (27from lp.soyuz.interfaces.publishing import (
27 ISourcePackagePublishingHistory)28 ISourcePackagePublishingHistory)
2829
=== modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
--- lib/lp/soyuz/model/binarypackagebuild.py 2010-05-05 15:51:54 +0000
+++ lib/lp/soyuz/model/binarypackagebuild.py 2010-05-05 15:51:57 +0000
@@ -45,9 +45,11 @@
45from lp.buildmaster.interfaces.buildbase import BuildStatus45from lp.buildmaster.interfaces.buildbase import BuildStatus
46from lp.buildmaster.interfaces.buildfarmjob import BuildFarmJobType46from lp.buildmaster.interfaces.buildfarmjob import BuildFarmJobType
47from lp.buildmaster.interfaces.packagebuild import (47from lp.buildmaster.interfaces.packagebuild import (
48 IPackageBuild, IPackageBuildSource)48 IPackageBuildSource)
49from lp.buildmaster.model.buildfarmjob import BuildFarmJob
49from lp.buildmaster.model.buildqueue import BuildQueue50from lp.buildmaster.model.buildqueue import BuildQueue
50from lp.buildmaster.model.packagebuild import PackageBuildDerived51from lp.buildmaster.model.packagebuild import (
52 PackageBuild, PackageBuildDerived)
51from lp.services.job.model.job import Job53from lp.services.job.model.job import Job
52from lp.soyuz.adapters.archivedependencies import get_components_for_building54from lp.soyuz.adapters.archivedependencies import get_components_for_building
53from lp.soyuz.interfaces.archive import ArchivePurpose55from lp.soyuz.interfaces.archive import ArchivePurpose
@@ -66,7 +68,6 @@
6668
67class BinaryPackageBuild(PackageBuildDerived, SQLBase):69class BinaryPackageBuild(PackageBuildDerived, SQLBase):
68 implements(IBinaryPackageBuild)70 implements(IBinaryPackageBuild)
69 delegates(IPackageBuild, context="package_build")
70 _table = 'BinaryPackageBuild'71 _table = 'BinaryPackageBuild'
71 _defaultOrder = 'id'72 _defaultOrder = 'id'
7273
@@ -355,7 +356,7 @@
355 name, version, relation = self._parseDependencyToken(token)356 name, version, relation = self._parseDependencyToken(token)
356357
357 dep_candidate = self.archive.findDepCandidateByName(358 dep_candidate = self.archive.findDepCandidateByName(
358 self.distroarchseries, name)359 self.distro_arch_series, name)
359360
360 if not dep_candidate:361 if not dep_candidate:
361 return False362 return False
@@ -404,7 +405,7 @@
404 if not self._isDependencySatisfied(token)]405 if not self._isDependencySatisfied(token)]
405406
406 # Update dependencies line407 # Update dependencies line
407 self.dependencies = ", ".join(remaining_deps)408 self.dependencies = u", ".join(remaining_deps)
408409
409 def __getitem__(self, name):410 def __getitem__(self, name):
410 return self.getBinaryPackageRelease(name)411 return self.getBinaryPackageRelease(name)
@@ -447,30 +448,35 @@
447 # and get the (successfully built) build records for this448 # and get the (successfully built) build records for this
448 # package.449 # package.
449 completed_builds = BinaryPackageBuild.select("""450 completed_builds = BinaryPackageBuild.select("""
450 Build.sourcepackagerelease = SourcePackageRelease.id AND451 BinaryPackageBuild.source_package_release = SourcePackageRelease.id AND
451 Build.id != %s AND452 BinaryPackageBuild.id != %s AND
452 Build.buildduration IS NOT NULL AND453 BinaryPackageBuild.distro_arch_series = %s AND
453 SourcePackageRelease.sourcepackagename = SourcePackageName.id AND454 SourcePackageRelease.sourcepackagename = SourcePackageName.id AND
454 SourcePackageName.name = %s AND455 SourcePackageName.name = %s AND
455 distroarchseries = %s AND456 BinaryPackageBuild.package_build = PackageBuild.id AND
456 archive IN %s AND457 PackageBuild.archive IN %s AND
457 buildstate = %s458 PackageBuild.build_farm_job = BuildFarmJob.id AND
458 """ % sqlvalues(self, self.sourcepackagerelease.name,459 BuildFarmJob.date_finished IS NOT NULL AND
459 self.distroarchseries, archives,460 BuildFarmJob.status = %s
461 """ % sqlvalues(self, self.distro_arch_series,
462 self.source_package_release.name, archives,
460 BuildStatus.FULLYBUILT),463 BuildStatus.FULLYBUILT),
461 orderBy=['-datebuilt', '-id'],464 orderBy=['-BuildFarmJob.date_finished', '-id'],
462 clauseTables=['SourcePackageName', 'SourcePackageRelease'])465 clauseTables=['PackageBuild', 'BuildFarmJob', 'SourcePackageName',
466 'SourcePackageRelease'])
463467
464 if completed_builds.count() > 0:468 if completed_builds.count() > 0:
465 # Historic build data exists, use the most recent value.469 # Historic build data exists, use the most recent value.
466 most_recent_build = completed_builds[0]470 most_recent_build = completed_builds[0]
467 estimated_duration = most_recent_build.buildduration471 date_finished = most_recent_build.date_finished
472 date_started = most_recent_build.date_started
473 estimated_duration = date_finished - date_started
468 else:474 else:
469 # Estimate the build duration based on package size if no475 # Estimate the build duration based on package size if no
470 # historic build data exists.476 # historic build data exists.
471477
472 # Get the package size in KB.478 # Get the package size in KB.
473 package_size = self.sourcepackagerelease.getPackageSize()479 package_size = self.source_package_release.getPackageSize()
474480
475 if package_size > 0:481 if package_size > 0:
476 # Analysis of previous build data shows that a build rate482 # Analysis of previous build data shows that a build rate
@@ -739,19 +745,25 @@
739 query clause if present.745 query clause if present.
740 """746 """
741747
748 # Ensure the underlying buildfarmjob and package build tables
749 # are included.
750 queries.append('BinaryPackageBuild.package_build = PackageBuild.id')
751 queries.append('PackageBuild.build_farm_job = BuildFarmJob.id')
752 tables.extend(['PackageBuild', 'BuildFarmJob'])
753
742 # Add query clause that filters on build state if the latter is754 # Add query clause that filters on build state if the latter is
743 # provided.755 # provided.
744 if status is not None:756 if status is not None:
745 queries.append('Build.buildstate=%s' % sqlvalues(status))757 queries.append('BuildFarmJob.status=%s' % sqlvalues(status))
746758
747 # Add query clause that filters on pocket if the latter is provided.759 # Add query clause that filters on pocket if the latter is provided.
748 if pocket:760 if pocket:
749 queries.append('Build.pocket=%s' % sqlvalues(pocket))761 queries.append('PackageBuild.pocket=%s' % sqlvalues(pocket))
750762
751 # Add query clause that filters on architecture tag if provided.763 # Add query clause that filters on architecture tag if provided.
752 if arch_tag is not None:764 if arch_tag is not None:
753 queries.append('''765 queries.append('''
754 Build.distroarchseries = DistroArchSeries.id AND766 BinaryPackageBuild.distro_arch_series = DistroArchSeries.id AND
755 DistroArchSeries.architecturetag = %s767 DistroArchSeries.architecturetag = %s
756 ''' % sqlvalues(arch_tag))768 ''' % sqlvalues(arch_tag))
757 tables.extend(['DistroArchSeries'])769 tables.extend(['DistroArchSeries'])
@@ -760,7 +772,8 @@
760 # latter is provided.772 # latter is provided.
761 if name is not None:773 if name is not None:
762 queries.append('''774 queries.append('''
763 Build.sourcepackagerelease = SourcePackageRelease.id AND775 BinaryPackageBuild.source_package_release =
776 SourcePackageRelease.id AND
764 SourcePackageRelease.sourcepackagename = SourcePackageName.id777 SourcePackageRelease.sourcepackagename = SourcePackageName.id
765 AND SourcepackageName.name LIKE '%%' || %s || '%%'778 AND SourcepackageName.name LIKE '%%' || %s || '%%'
766 ''' % quote_like(name))779 ''' % quote_like(name))
@@ -778,7 +791,7 @@
778791
779 # This code MUST match the logic in the Build security adapter,792 # This code MUST match the logic in the Build security adapter,
780 # otherwise users are likely to get 403 errors, or worse.793 # otherwise users are likely to get 403 errors, or worse.
781 queries.append("Archive.id = Build.archive")794 queries.append("Archive.id = PackageBuild.archive")
782 clauseTables.append('Archive')795 clauseTables.append('Archive')
783 if user is not None:796 if user is not None:
784 if not user.inTeam(getUtility(ILaunchpadCelebrities).admin):797 if not user.inTeam(getUtility(ILaunchpadCelebrities).admin):
@@ -796,7 +809,7 @@
796809
797 return BinaryPackageBuild.select(810 return BinaryPackageBuild.select(
798 " AND ".join(queries), clauseTables=clauseTables,811 " AND ".join(queries), clauseTables=clauseTables,
799 orderBy=["-Build.datebuilt", "id"])812 orderBy=["-BuildFarmJob.date_finished", "id"])
800813
801 def getBuildsForArchive(self, archive, status=None, name=None,814 def getBuildsForArchive(self, archive, status=None, name=None,
802 pocket=None, arch_tag=None):815 pocket=None, arch_tag=None):
@@ -812,9 +825,9 @@
812 # * FULLYBUILT & FAILURES by -datebuilt825 # * FULLYBUILT & FAILURES by -datebuilt
813 # It should present the builds in a more natural order.826 # It should present the builds in a more natural order.
814 if status == BuildStatus.SUPERSEDED or status is None:827 if status == BuildStatus.SUPERSEDED or status is None:
815 orderBy = ["-Build.datecreated"]828 orderBy = ["-BuildFarmJob.date_created"]
816 else:829 else:
817 orderBy = ["-Build.datebuilt"]830 orderBy = ["-BuildFarmJob.date_finished"]
818 # All orders fallback to id if the primary order doesn't succeed831 # All orders fallback to id if the primary order doesn't succeed
819 orderBy.append("id")832 orderBy.append("id")
820833
@@ -1021,24 +1034,30 @@
1021 origin = (1034 origin = (
1022 BinaryPackageBuild,1035 BinaryPackageBuild,
1023 LeftJoin(1036 LeftJoin(
1037 PackageBuild,
1038 BinaryPackageBuild.package_build == PackageBuild.id),
1039 LeftJoin(
1040 BuildFarmJob,
1041 PackageBuild.build_farm_job == BuildFarmJob.id),
1042 LeftJoin(
1024 SourcePackageRelease,1043 SourcePackageRelease,
1025 (SourcePackageRelease.id ==1044 (SourcePackageRelease.id ==
1026 BinaryPackageBuild.sourcepackagereleaseID)),1045 BinaryPackageBuild.source_package_releaseID)),
1027 LeftJoin(1046 LeftJoin(
1028 SourcePackageName,1047 SourcePackageName,
1029 SourcePackageName.id1048 SourcePackageName.id
1030 == SourcePackageRelease.sourcepackagenameID),1049 == SourcePackageRelease.sourcepackagenameID),
1031 LeftJoin(LibraryFileAlias,1050 LeftJoin(LibraryFileAlias,
1032 LibraryFileAlias.id == BinaryPackageBuild.buildlogID),1051 LibraryFileAlias.id == BuildFarmJob.log_id),
1033 LeftJoin(LibraryFileContent,1052 LeftJoin(LibraryFileContent,
1034 LibraryFileContent.id == LibraryFileAlias.contentID),1053 LibraryFileContent.id == LibraryFileAlias.contentID),
1035 LeftJoin(1054 LeftJoin(
1036 Builder,1055 Builder,
1037 Builder.id == BinaryPackageBuild.builderID),1056 Builder.id == BuildFarmJob.builder_id),
1038 )1057 )
1039 result_set = store.using(*origin).find(1058 result_set = store.using(*origin).find(
1040 (SourcePackageRelease, LibraryFileAlias, SourcePackageName,1059 (SourcePackageRelease, LibraryFileAlias, SourcePackageName,
1041 LibraryFileContent, Builder),1060 LibraryFileContent, Builder, PackageBuild, BuildFarmJob),
1042 In(BinaryPackageBuild.id, build_ids))1061 In(BinaryPackageBuild.id, build_ids))
10431062
1044 # Force query execution so that the ancillary data gets fetched1063 # Force query execution so that the ancillary data gets fetched
10451064
=== added file 'lib/lp/soyuz/model/buildfarmbuildjob.py'
--- lib/lp/soyuz/model/buildfarmbuildjob.py 1970-01-01 00:00:00 +0000
+++ lib/lp/soyuz/model/buildfarmbuildjob.py 2010-05-05 15:51:57 +0000
@@ -0,0 +1,50 @@
1# Copyright 2010 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).
3
4__metaclass__ = type
5__all__ = [
6 'BuildFarmBuildJob',
7 ]
8
9
10from zope.interface import implements
11
12from canonical.database.constants import UTC_NOW
13
14from lp.buildmaster.interfaces.buildbase import BuildStatus
15from lp.buildmaster.model.buildfarmjob import BuildFarmJobOld
16from lp.soyuz.interfaces.buildfarmbuildjob import IBuildFarmBuildJob
17
18
19class BuildFarmBuildJob(BuildFarmJobOld):
20 """See `IBuildFaramBuildJob`."""
21 implements(IBuildFarmBuildJob)
22 def __init__(self, build):
23 """Store the build for this package build farm job.
24
25 XXX 2010-04-12 michael.nelson bug=536700
26 The build param will no longer be necessary once BuildFarmJob is
27 itself a concrete class. This class (PackageBuildFarmJob)
28 will also be renamed PackageBuild and turned into a concrete class.
29 """
30 super(BuildFarmBuildJob, self).__init__()
31 self.build = build
32
33 def getTitle(self):
34 """See `IBuildFarmJob`."""
35 return self.build.title
36
37 def jobStarted(self):
38 """See `IBuildFarmJob`."""
39 self.build.buildstate = BuildStatus.BUILDING
40 # The build started, set the start time if not set already.
41 if self.build.date_first_dispatched is None:
42 self.build.date_first_dispatched = UTC_NOW
43
44 def jobReset(self):
45 """See `IBuildFarmJob`."""
46 self.build.buildstate = BuildStatus.NEEDSBUILD
47
48 def jobAborted(self):
49 """See `IBuildFarmJob`."""
50 self.build.buildstate = BuildStatus.NEEDSBUILD
051
=== modified file 'lib/lp/soyuz/model/buildpackagejob.py'
--- lib/lp/soyuz/model/buildpackagejob.py 2010-05-05 15:51:54 +0000
+++ lib/lp/soyuz/model/buildpackagejob.py 2010-05-05 15:51:57 +0000
@@ -101,13 +101,13 @@
101 # Please note: the score for language packs is to be zero because101 # Please note: the score for language packs is to be zero because
102 # they unduly delay the building of packages in the main component102 # they unduly delay the building of packages in the main component
103 # otherwise.103 # otherwise.
104 if self.build.sourcepackagerelease.section.name == 'translations':104 if self.build.source_package_release.section.name == 'translations':
105 pass105 pass
106 elif self.build.archive.purpose == ArchivePurpose.COPY:106 elif self.build.archive.purpose == ArchivePurpose.COPY:
107 score = rebuild_archive_score107 score = rebuild_archive_score
108 else:108 else:
109 # Calculates the urgency-related part of the score.109 # Calculates the urgency-related part of the score.
110 urgency = score_urgency[self.build.sourcepackagerelease.urgency]110 urgency = score_urgency[self.build.source_package_release.urgency]
111 score += urgency111 score += urgency
112112
113 # Calculates the pocket-related part of the score.113 # Calculates the pocket-related part of the score.
@@ -140,13 +140,13 @@
140140
141 def getLogFileName(self):141 def getLogFileName(self):
142 """See `IBuildPackageJob`."""142 """See `IBuildPackageJob`."""
143 sourcename = self.build.sourcepackagerelease.name143 sourcename = self.build.source_package_release.name
144 version = self.build.sourcepackagerelease.version144 version = self.build.source_package_release.version
145 # we rely on previous storage of current buildstate145 # we rely on previous storage of current buildstate
146 # in the state handling methods.146 # in the state handling methods.
147 state = self.build.buildstate.name147 state = self.build.status.name
148148
149 dar = self.build.distroarchseries149 dar = self.build.distro_arch_series
150 distroname = dar.distroseries.distribution.name150 distroname = dar.distroseries.distribution.name
151 distroseriesname = dar.distroseries.name151 distroseriesname = dar.distroseries.name
152 archname = dar.architecturetag152 archname = dar.architecturetag
@@ -163,7 +163,7 @@
163163
164 def getName(self):164 def getName(self):
165 """See `IBuildPackageJob`."""165 """See `IBuildPackageJob`."""
166 return self.build.sourcepackagerelease.name166 return self.build.source_package_release.name
167167
168 @property168 @property
169 def processor(self):169 def processor(self):
170170
=== modified file 'lib/lp/soyuz/model/publishing.py'
--- lib/lp/soyuz/model/publishing.py 2010-04-22 08:47:32 +0000
+++ lib/lp/soyuz/model/publishing.py 2010-05-05 15:51:57 +0000
@@ -568,7 +568,7 @@
568 return None568 return None
569569
570 build = self.sourcepackagerelease.createBuild(570 build = self.sourcepackagerelease.createBuild(
571 distroarchseries=arch, archive=self.archive, pocket=self.pocket)571 distro_arch_series=arch, archive=self.archive, pocket=self.pocket)
572 # Create the builds in suspended mode for disabled archives.572 # Create the builds in suspended mode for disabled archives.
573 build_queue = build.queueBuild(suspended=not self.archive.enabled)573 build_queue = build.queueBuild(suspended=not self.archive.enabled)
574 build_queue.score()574 build_queue.score()
575575
=== modified file 'lib/lp/soyuz/model/sourcepackagerelease.py'
--- lib/lp/soyuz/model/sourcepackagerelease.py 2010-05-05 15:51:54 +0000
+++ lib/lp/soyuz/model/sourcepackagerelease.py 2010-05-05 15:51:57 +0000
@@ -347,9 +347,9 @@
347 'DistroArchSeries']347 'DistroArchSeries']
348348
349 query = """349 query = """
350 Build.sourcepackagerelease = %s AND350 BinaryPackageBuild.source_package_release = %s AND
351 BinaryPackageRelease.build = Build.id AND351 BinaryPackageRelease.build = BinaryPackageBuild.id AND
352 DistroArchSeries.id = Build.distroarchseries AND352 DistroArchSeries.id = BinaryPackageBuild.distro_arch_series AND
353 DistroArchSeries.architecturetag = %s AND353 DistroArchSeries.architecturetag = %s AND
354 BinaryPackagePublishingHistory.binarypackagerelease =354 BinaryPackagePublishingHistory.binarypackagerelease =
355 BinaryPackageRelease.id AND355 BinaryPackageRelease.id AND
@@ -360,7 +360,7 @@
360360
361 select_results = BinaryPackageBuild.select(361 select_results = BinaryPackageBuild.select(
362 query, clauseTables=clauseTables, distinct=True,362 query, clauseTables=clauseTables, distinct=True,
363 orderBy='-Build.id')363 orderBy='-BinaryPackageBuild.id')
364364
365 # XXX cprov 20080216: this if/elif/else block could be avoided or,365 # XXX cprov 20080216: this if/elif/else block could be avoided or,
366 # at least, simplified if SelectOne accepts 'distinct' argument.366 # at least, simplified if SelectOne accepts 'distinct' argument.
@@ -386,7 +386,11 @@
386 # inheritance tree. See bellow.386 # inheritance tree. See bellow.
387 pass387 pass
388388
389 queries = ["Build.sourcepackagerelease = %s" % sqlvalues(self)]389 queries = [
390 "BinaryPackageBuild.package_build = PackageBuild.id AND "
391 "PackageBuild.build_farm_job = BuildFarmJob.id AND "
392 "BinaryPackageBuild.source_package_release = %s" % (
393 sqlvalues(self))]
390394
391 # Find out all the possible parent DistroArchSeries395 # Find out all the possible parent DistroArchSeries
392 # a build could be issued (then inherited).396 # a build could be issued (then inherited).
@@ -417,7 +421,8 @@
417 architectures = [421 architectures = [
418 architecture.id for architecture in parent_architectures]422 architecture.id for architecture in parent_architectures]
419 queries.append(423 queries.append(
420 "Build.distroarchseries IN %s" % sqlvalues(architectures))424 "BinaryPackageBuild.distro_arch_series IN %s" % (
425 sqlvalues(architectures)))
421426
422 # Follow archive inheritance across distribution offical archives,427 # Follow archive inheritance across distribution offical archives,
423 # for example:428 # for example:
@@ -436,13 +441,15 @@
436 archives = [archive.id, ]441 archives = [archive.id, ]
437442
438 queries.append(443 queries.append(
439 "Build.archive IN %s" % sqlvalues(archives))444 "PackageBuild.archive IN %s" % sqlvalues(archives))
440445
441 # Query only the last build record for this sourcerelease446 # Query only the last build record for this sourcerelease
442 # across all possible locations.447 # across all possible locations.
443 query = " AND ".join(queries)448 query = " AND ".join(queries)
444449
445 return BinaryPackageBuild.selectFirst(query, orderBy=['-datecreated'])450 return BinaryPackageBuild.selectFirst(
451 query, clauseTables=['BuildFarmJob', 'PackageBuild'],
452 orderBy=['-BuildFarmJob.date_created'])
446453
447 def override(self, component=None, section=None, urgency=None):454 def override(self, component=None, section=None, urgency=None):
448 """See ISourcePackageRelease."""455 """See ISourcePackageRelease."""
449456
=== renamed file 'lib/lp/soyuz/tests/test_build.py' => 'lib/lp/soyuz/tests/test_binarypackagebuild.py'
--- lib/lp/soyuz/tests/test_build.py 2010-05-05 15:51:54 +0000
+++ lib/lp/soyuz/tests/test_binarypackagebuild.py 2010-05-05 15:51:57 +0000
@@ -7,6 +7,7 @@
77
8from storm.store import Store8from storm.store import Store
9from zope.component import getUtility9from zope.component import getUtility
10from zope.security.proxy import removeSecurityProxy
1011
11from canonical.database.constants import UTC_NOW12from canonical.database.constants import UTC_NOW
12from canonical.testing import LaunchpadZopelessLayer13from canonical.testing import LaunchpadZopelessLayer
@@ -81,7 +82,7 @@
8182
82 [depwait_build] = depwait_source.createMissingBuilds()83 [depwait_build] = depwait_source.createMissingBuilds()
83 depwait_build.buildstate = BuildStatus.MANUALDEPWAIT84 depwait_build.buildstate = BuildStatus.MANUALDEPWAIT
84 depwait_build.dependencies = 'dep-bin'85 depwait_build.dependencies = u'dep-bin'
8586
86 return depwait_build87 return depwait_build
8788
@@ -159,10 +160,11 @@
159 # valid ubuntu component.160 # valid ubuntu component.
160 depwait_build = self._setupSimpleDepwaitContext()161 depwait_build = self._setupSimpleDepwaitContext()
161162
163 spr = depwait_build.source_package_release
162 depwait_build.current_source_publication.requestDeletion(164 depwait_build.current_source_publication.requestDeletion(
163 depwait_build.sourcepackagerelease.creator)165 spr.creator)
164 contrib = getUtility(IComponentSet).new('contrib')166 contrib = getUtility(IComponentSet).new('contrib')
165 depwait_build.sourcepackagerelease.component = contrib167 removeSecurityProxy(spr).component = contrib
166168
167 depwait_build.updateDependencies()169 depwait_build.updateDependencies()
168 self.assertEquals(depwait_build.dependencies, '')170 self.assertEquals(depwait_build.dependencies, '')
@@ -218,7 +220,8 @@
218 # Results can be filtered by architecture tag.220 # Results can be filtered by architecture tag.
219 i386_builds = self.builds[:]221 i386_builds = self.builds[:]
220 hppa_build = i386_builds.pop()222 hppa_build = i386_builds.pop()
221 hppa_build.distroarchseries = self.publisher.distroseries['hppa']223 removeSecurityProxy(hppa_build).distro_arch_series = (
224 self.publisher.distroseries['hppa'])
222225
223 builds = self.build_set.getBuildsForArchive(self.archive,226 builds = self.build_set.getBuildsForArchive(self.archive,
224 arch_tag="i386")227 arch_tag="i386")
@@ -256,7 +259,8 @@
256 # Results can be filtered by architecture tag.259 # Results can be filtered by architecture tag.
257 i386_builds = self.builds[:]260 i386_builds = self.builds[:]
258 hppa_build = i386_builds.pop()261 hppa_build = i386_builds.pop()
259 hppa_build.distroarchseries = self.publisher.distroseries['hppa']262 removeSecurityProxy(hppa_build).distro_arch_series = (
263 self.publisher.distroseries['hppa'])
260264
261 builds = self.build_set.getBuildsForBuilder(self.builder.id,265 builds = self.build_set.getBuildsForBuilder(self.builder.id,
262 arch_tag="i386")266 arch_tag="i386")
@@ -296,13 +300,11 @@
296 # Set something just to make sure that storeBuildInfo actually300 # Set something just to make sure that storeBuildInfo actually
297 # empties it.301 # empties it.
298 self.build.dependencies = u'something'302 self.build.dependencies = u'something'
299
300 self.build.storeBuildInfo(self.build, None, {})303 self.build.storeBuildInfo(self.build, None, {})
301 self.assertIsNot(None, self.build.buildlog)304 self.assertIsNot(None, self.build.log)
302 self.assertEqual(self.builder, self.build.builder)305 self.assertEqual(self.builder, self.build.builder)
303 self.assertIs(None, self.build.dependencies)306 self.assertIs(None, self.build.dependencies)
304 self.assertIsNot(None, self.build.datebuilt)307 self.assertIsNot(None, self.build.date_finished)
305 self.assertIsNot(None, self.build.buildduration)
306308
307309
308def test_suite():310def test_suite():
309311
=== modified file 'lib/lp/soyuz/tests/test_hasbuildrecords.py'
--- lib/lp/soyuz/tests/test_hasbuildrecords.py 2010-01-11 23:43:59 +0000
+++ lib/lp/soyuz/tests/test_hasbuildrecords.py 2010-05-05 15:51:57 +0000
@@ -13,7 +13,9 @@
13from lp.buildmaster.interfaces.builder import IBuilderSet13from lp.buildmaster.interfaces.builder import IBuilderSet
14from lp.soyuz.interfaces.buildrecords import IHasBuildRecords14from lp.soyuz.interfaces.buildrecords import IHasBuildRecords
15from lp.soyuz.model.processor import ProcessorFamilySet15from lp.soyuz.model.processor import ProcessorFamilySet
16from lp.soyuz.tests.test_build import BaseTestCaseWithThreeBuilds16from lp.soyuz.tests.test_binarypackagebuild import (
17 BaseTestCaseWithThreeBuilds)
18
1719
18class TestHasBuildRecordsInterface(BaseTestCaseWithThreeBuilds):20class TestHasBuildRecordsInterface(BaseTestCaseWithThreeBuilds):
19 """Tests the implementation of IHasBuildRecords by the21 """Tests the implementation of IHasBuildRecords by the
2022
=== modified file 'lib/lp/soyuz/tests/test_publishing.py'
--- lib/lp/soyuz/tests/test_publishing.py 2010-03-17 00:47:49 +0000
+++ lib/lp/soyuz/tests/test_publishing.py 2010-05-05 15:51:57 +0000
@@ -317,8 +317,8 @@
317 replaces=None, provides=None, pre_depends=None, enhances=None,317 replaces=None, provides=None, pre_depends=None, enhances=None,
318 breaks=None, format=BinaryPackageFormat.DEB):318 breaks=None, format=BinaryPackageFormat.DEB):
319 """Return the corresponding `BinaryPackageRelease`."""319 """Return the corresponding `BinaryPackageRelease`."""
320 sourcepackagerelease = build.sourcepackagerelease320 sourcepackagerelease = build.source_package_release
321 distroarchseries = build.distroarchseries321 distroarchseries = build.distro_arch_series
322 architecturespecific = (322 architecturespecific = (
323 not sourcepackagerelease.architecturehintlist == 'all')323 not sourcepackagerelease.architecturehintlist == 'all')
324324
@@ -367,11 +367,11 @@
367 build.buildduration = datetime.timedelta(minutes=5)367 build.buildduration = datetime.timedelta(minutes=5)
368 buildlog_filename = 'buildlog_%s-%s-%s.%s_%s_%s.txt.gz' % (368 buildlog_filename = 'buildlog_%s-%s-%s.%s_%s_%s.txt.gz' % (
369 build.distribution.name,369 build.distribution.name,
370 build.distroseries.name,370 build.distro_series.name,
371 build.distroarchseries.architecturetag,371 build.distro_arch_series.architecturetag,
372 build.sourcepackagerelease.name,372 build.source_package_release.name,
373 build.sourcepackagerelease.version,373 build.source_package_release.version,
374 build.buildstate.name)374 build.status.name)
375 build.buildlog = self.addMockFile(375 build.buildlog = self.addMockFile(
376 buildlog_filename, filecontent='Built!',376 buildlog_filename, filecontent='Built!',
377 restricted=build.archive.private)377 restricted=build.archive.private)
@@ -384,7 +384,7 @@
384 pocket=PackagePublishingPocket.RELEASE,384 pocket=PackagePublishingPocket.RELEASE,
385 scheduleddeletiondate=None, dateremoved=None):385 scheduleddeletiondate=None, dateremoved=None):
386 """Return the corresponding BinaryPackagePublishingHistory."""386 """Return the corresponding BinaryPackagePublishingHistory."""
387 distroarchseries = binarypackagerelease.build.distroarchseries387 distroarchseries = binarypackagerelease.build.distro_arch_series
388388
389 # Publish the binary.389 # Publish the binary.
390 if binarypackagerelease.architecturespecific:390 if binarypackagerelease.architecturespecific:
@@ -898,7 +898,7 @@
898 self.addFakeChroots(self.distroseries)898 self.addFakeChroots(self.distroseries)
899899
900 def getPubSource(self, architecturehintlist):900 def getPubSource(self, architecturehintlist):
901 """Return a mock source package publishing record for the archive 901 """Return a mock source package publishing record for the archive
902 and architecture used in this testcase.902 and architecture used in this testcase.
903903
904 :param architecturehintlist: Architecture hint list (e.g. "i386 amd64")904 :param architecturehintlist: Architecture hint list (e.g. "i386 amd64")
@@ -922,13 +922,13 @@
922 def test__getAllowedArchitectures_restricted_override(self):922 def test__getAllowedArchitectures_restricted_override(self):
923 """Test _getAllowedArchitectures honors overrides of restricted archs.923 """Test _getAllowedArchitectures honors overrides of restricted archs.
924924
925 Restricted architectures should only be allowed if there is 925 Restricted architectures should only be allowed if there is
926 an explicit ArchiveArch association with the archive.926 an explicit ArchiveArch association with the archive.
927 """927 """
928 available_archs = [self.sparc_distroarch, self.avr_distroarch]928 available_archs = [self.sparc_distroarch, self.avr_distroarch]
929 getUtility(IArchiveArchSet).new(self.archive, self.avr_family)929 getUtility(IArchiveArchSet).new(self.archive, self.avr_family)
930 pubrec = self.getPubSource(architecturehintlist='any')930 pubrec = self.getPubSource(architecturehintlist='any')
931 self.assertEquals([self.sparc_distroarch, self.avr_distroarch], 931 self.assertEquals([self.sparc_distroarch, self.avr_distroarch],
932 pubrec._getAllowedArchitectures(available_archs))932 pubrec._getAllowedArchitectures(available_archs))
933933
934 def test_createMissingBuilds_restricts_any(self):934 def test_createMissingBuilds_restricts_any(self):
@@ -941,7 +941,7 @@
941 self.assertEquals(self.sparc_distroarch, builds[0].distroarchseries)941 self.assertEquals(self.sparc_distroarch, builds[0].distroarchseries)
942942
943 def test_createMissingBuilds_restricts_explicitlist(self):943 def test_createMissingBuilds_restricts_explicitlist(self):
944 """createMissingBuilds() should limit builds targeted at a 944 """createMissingBuilds() should limit builds targeted at a
945 variety of architectures architecture to those allowed for the archive.945 variety of architectures architecture to those allowed for the archive.
946 """946 """
947 pubrec = self.getPubSource(architecturehintlist='sparc i386 avr')947 pubrec = self.getPubSource(architecturehintlist='sparc i386 avr')
@@ -951,7 +951,7 @@
951951
952 def test_createMissingBuilds_restricts_all(self):952 def test_createMissingBuilds_restricts_all(self):
953 """createMissingBuilds() should limit builds targeted at 'all'953 """createMissingBuilds() should limit builds targeted at 'all'
954 architectures to the nominated independent architecture, 954 architectures to the nominated independent architecture,
955 if that is allowed for the archive.955 if that is allowed for the archive.
956 """956 """
957 pubrec = self.getPubSource(architecturehintlist='all')957 pubrec = self.getPubSource(architecturehintlist='all')
@@ -961,7 +961,7 @@
961961
962 def test_createMissingBuilds_restrict_override(self):962 def test_createMissingBuilds_restrict_override(self):
963 """createMissingBuilds() should limit builds targeted at 'any'963 """createMissingBuilds() should limit builds targeted at 'any'
964 architecture to architectures that are unrestricted or 964 architecture to architectures that are unrestricted or
965 explicitly associated with the archive.965 explicitly associated with the archive.
966 """966 """
967 getUtility(IArchiveArchSet).new(self.archive, self.avr_family)967 getUtility(IArchiveArchSet).new(self.archive, self.avr_family)
968968
=== modified file 'lib/lp/soyuz/tests/test_publishing_models.py'
--- lib/lp/soyuz/tests/test_publishing_models.py 2010-03-06 04:57:40 +0000
+++ lib/lp/soyuz/tests/test_publishing_models.py 2010-05-05 15:51:57 +0000
@@ -13,7 +13,7 @@
13from lp.buildmaster.interfaces.buildbase import BuildStatus13from lp.buildmaster.interfaces.buildbase import BuildStatus
14from lp.soyuz.interfaces.publishing import (IPublishingSet,14from lp.soyuz.interfaces.publishing import (IPublishingSet,
15 PackagePublishingStatus)15 PackagePublishingStatus)
16from lp.soyuz.tests.test_build import BaseTestCaseWithThreeBuilds16from lp.soyuz.tests.test_binarypackagebuild import BaseTestCaseWithThreeBuilds
1717
1818
19class TestPublishingSet(BaseTestCaseWithThreeBuilds):19class TestPublishingSet(BaseTestCaseWithThreeBuilds):
@@ -83,8 +83,8 @@
83 for hist in self.sources)83 for hist in self.sources)
84 urls = [lfa.http_url for lfa in lfas]84 urls = [lfa.http_url for lfa in lfas]
85 self.assertEqual(urls, [85 self.assertEqual(urls, [
86 'http://localhost:58000/94/gedit_666_source.changes', 86 'http://localhost:58000/94/gedit_666_source.changes',
87 'http://localhost:58000/96/firefox_666_source.changes', 87 'http://localhost:58000/96/firefox_666_source.changes',
88 'http://localhost:58000/98/getting-things-gnome_666_source.changes'88 'http://localhost:58000/98/getting-things-gnome_666_source.changes'
89 ])89 ])
9090

Subscribers

People subscribed via source and target branches

to status/vote changes: