launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #28546
[Merge] ~cjwatson/launchpad:archivejob-celery into launchpad:master
Colin Watson has proposed merging ~cjwatson/launchpad:archivejob-celery into launchpad:master.
Commit message:
Fix ArchiveJobs to work under Celery
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/424118
The Celery job runner uses `UniversalJobSource`, which requires the database job class to implement a `makeDerived` method.
--
Your team Launchpad code reviewers is requested to review the proposed merge of ~cjwatson/launchpad:archivejob-celery into launchpad:master.
diff --git a/lib/lp/soyuz/model/archivejob.py b/lib/lp/soyuz/model/archivejob.py
index eb918c1..c8c9cb5 100644
--- a/lib/lp/soyuz/model/archivejob.py
+++ b/lib/lp/soyuz/model/archivejob.py
@@ -87,6 +87,9 @@ class ArchiveJob(StormBase):
self.job_type = job_type
self.metadata = metadata
+ def makeDerived(self):
+ return ArchiveJobDerived.makeSubclass(self)
+
@delegate_to(IArchiveJob)
@provider(IArchiveJobSource)
diff --git a/lib/lp/soyuz/tests/test_archivejob.py b/lib/lp/soyuz/tests/test_archivejob.py
index e6c1c28..1b68478 100644
--- a/lib/lp/soyuz/tests/test_archivejob.py
+++ b/lib/lp/soyuz/tests/test_archivejob.py
@@ -16,7 +16,13 @@ from lp.code.enums import RevisionStatusArtifactType
from lp.code.model.revisionstatus import RevisionStatusArtifact
from lp.registry.interfaces.pocket import PackagePublishingPocket
from lp.services.database.interfaces import IStore
+from lp.services.features.testing import FeatureFixture
+from lp.services.job.interfaces.job import JobStatus
from lp.services.job.runner import JobRunner
+from lp.services.job.tests import (
+ block_on_job,
+ pop_remote_notifications,
+ )
from lp.services.mail.sendmail import format_address_for_person
from lp.soyuz.enums import (
ArchiveJobType,
@@ -31,9 +37,14 @@ from lp.soyuz.model.archivejob import (
PackageUploadNotificationJob,
)
from lp.soyuz.tests import datadir
-from lp.testing import TestCaseWithFactory
+from lp.testing import (
+ admin_logged_in,
+ person_logged_in,
+ TestCaseWithFactory,
+ )
from lp.testing.dbuser import dbuser
from lp.testing.layers import (
+ CeleryJobLayer,
LaunchpadZopelessLayer,
ZopelessDatabaseLayer,
)
@@ -312,3 +323,51 @@ class TestCIBuildUploadJob(TestCaseWithFactory):
filetype=BinaryPackageFileType.WHL))),
binarypackageformat=Equals(BinaryPackageFormat.WHL),
distroarchseries=Equals(dases[0]))))
+
+
+class TestViaCelery(TestCaseWithFactory):
+
+ layer = CeleryJobLayer
+
+ def test_PackageUploadNotificationJob(self):
+ # PackageUploadNotificationJob runs under Celery.
+ self.useFixture(FeatureFixture(
+ {"jobs.celery.enabled_classes": "PackageUploadNotificationJob"}))
+ creator = self.factory.makePerson()
+ changes = Changes({"Changed-By": format_address_for_person(creator)})
+ upload = self.factory.makePackageUpload(
+ changes_file_content=changes.dump().encode())
+ with admin_logged_in():
+ upload.addSource(self.factory.makeSourcePackageRelease())
+ self.factory.makeComponentSelection(
+ upload.distroseries, upload.sourcepackagerelease.component)
+ upload.setAccepted()
+ job = PackageUploadNotificationJob.create(upload)
+
+ with block_on_job():
+ transaction.commit()
+
+ self.assertEqual(JobStatus.COMPLETED, job.status)
+ self.assertEqual(1, len(pop_remote_notifications()))
+
+ def test_CIBuildUploadJob(self):
+ # CIBuildUploadJob runs under Celery.
+ self.useFixture(FeatureFixture(
+ {"jobs.celery.enabled_classes": "CIBuildUploadJob"}))
+ build = self.factory.makeCIBuild()
+ das = build.distro_arch_series
+ archive = das.distroseries.main_archive
+ report = build.getOrCreateRevisionStatusReport("build:0")
+ path = "wheel-indep/dist/wheel_indep-0.0.1-py3-none-any.whl"
+ with open(datadir(path), mode="rb") as f:
+ with person_logged_in(build.git_repository.owner):
+ report.attach(name=os.path.basename(path), data=f.read())
+ job = CIBuildUploadJob.create(
+ build, build.git_repository.owner, archive, das.distroseries,
+ PackagePublishingPocket.RELEASE, target_channel="edge")
+
+ with block_on_job():
+ transaction.commit()
+
+ self.assertEqual(JobStatus.COMPLETED, job.status)
+ self.assertEqual(1, archive.getAllPublishedBinaries().count())