Merge ~cjwatson/launchpad:archivejob-celery into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 3dc25ddba3ea30fdeb733b638d2e34fef39bb357
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:archivejob-celery
Merge into: launchpad:master
Diff against target: 100 lines (+63/-1)
2 files modified
lib/lp/soyuz/model/archivejob.py (+3/-0)
lib/lp/soyuz/tests/test_archivejob.py (+60/-1)
Reviewer Review Type Date Requested Status
Ioana Lasc (community) Approve
Review via email: mp+424118@code.launchpad.net

Commit message

Fix ArchiveJobs to work under Celery

Description of the change

The Celery job runner uses `UniversalJobSource`, which requires the database job class to implement a `makeDerived` method.

To post a comment you must log in.
Revision history for this message
Ioana Lasc (ilasc) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/soyuz/model/archivejob.py b/lib/lp/soyuz/model/archivejob.py
2index eb918c1..c8c9cb5 100644
3--- a/lib/lp/soyuz/model/archivejob.py
4+++ b/lib/lp/soyuz/model/archivejob.py
5@@ -87,6 +87,9 @@ class ArchiveJob(StormBase):
6 self.job_type = job_type
7 self.metadata = metadata
8
9+ def makeDerived(self):
10+ return ArchiveJobDerived.makeSubclass(self)
11+
12
13 @delegate_to(IArchiveJob)
14 @provider(IArchiveJobSource)
15diff --git a/lib/lp/soyuz/tests/test_archivejob.py b/lib/lp/soyuz/tests/test_archivejob.py
16index e6c1c28..1b68478 100644
17--- a/lib/lp/soyuz/tests/test_archivejob.py
18+++ b/lib/lp/soyuz/tests/test_archivejob.py
19@@ -16,7 +16,13 @@ from lp.code.enums import RevisionStatusArtifactType
20 from lp.code.model.revisionstatus import RevisionStatusArtifact
21 from lp.registry.interfaces.pocket import PackagePublishingPocket
22 from lp.services.database.interfaces import IStore
23+from lp.services.features.testing import FeatureFixture
24+from lp.services.job.interfaces.job import JobStatus
25 from lp.services.job.runner import JobRunner
26+from lp.services.job.tests import (
27+ block_on_job,
28+ pop_remote_notifications,
29+ )
30 from lp.services.mail.sendmail import format_address_for_person
31 from lp.soyuz.enums import (
32 ArchiveJobType,
33@@ -31,9 +37,14 @@ from lp.soyuz.model.archivejob import (
34 PackageUploadNotificationJob,
35 )
36 from lp.soyuz.tests import datadir
37-from lp.testing import TestCaseWithFactory
38+from lp.testing import (
39+ admin_logged_in,
40+ person_logged_in,
41+ TestCaseWithFactory,
42+ )
43 from lp.testing.dbuser import dbuser
44 from lp.testing.layers import (
45+ CeleryJobLayer,
46 LaunchpadZopelessLayer,
47 ZopelessDatabaseLayer,
48 )
49@@ -312,3 +323,51 @@ class TestCIBuildUploadJob(TestCaseWithFactory):
50 filetype=BinaryPackageFileType.WHL))),
51 binarypackageformat=Equals(BinaryPackageFormat.WHL),
52 distroarchseries=Equals(dases[0]))))
53+
54+
55+class TestViaCelery(TestCaseWithFactory):
56+
57+ layer = CeleryJobLayer
58+
59+ def test_PackageUploadNotificationJob(self):
60+ # PackageUploadNotificationJob runs under Celery.
61+ self.useFixture(FeatureFixture(
62+ {"jobs.celery.enabled_classes": "PackageUploadNotificationJob"}))
63+ creator = self.factory.makePerson()
64+ changes = Changes({"Changed-By": format_address_for_person(creator)})
65+ upload = self.factory.makePackageUpload(
66+ changes_file_content=changes.dump().encode())
67+ with admin_logged_in():
68+ upload.addSource(self.factory.makeSourcePackageRelease())
69+ self.factory.makeComponentSelection(
70+ upload.distroseries, upload.sourcepackagerelease.component)
71+ upload.setAccepted()
72+ job = PackageUploadNotificationJob.create(upload)
73+
74+ with block_on_job():
75+ transaction.commit()
76+
77+ self.assertEqual(JobStatus.COMPLETED, job.status)
78+ self.assertEqual(1, len(pop_remote_notifications()))
79+
80+ def test_CIBuildUploadJob(self):
81+ # CIBuildUploadJob runs under Celery.
82+ self.useFixture(FeatureFixture(
83+ {"jobs.celery.enabled_classes": "CIBuildUploadJob"}))
84+ build = self.factory.makeCIBuild()
85+ das = build.distro_arch_series
86+ archive = das.distroseries.main_archive
87+ report = build.getOrCreateRevisionStatusReport("build:0")
88+ path = "wheel-indep/dist/wheel_indep-0.0.1-py3-none-any.whl"
89+ with open(datadir(path), mode="rb") as f:
90+ with person_logged_in(build.git_repository.owner):
91+ report.attach(name=os.path.basename(path), data=f.read())
92+ job = CIBuildUploadJob.create(
93+ build, build.git_repository.owner, archive, das.distroseries,
94+ PackagePublishingPocket.RELEASE, target_channel="edge")
95+
96+ with block_on_job():
97+ transaction.commit()
98+
99+ self.assertEqual(JobStatus.COMPLETED, job.status)
100+ self.assertEqual(1, archive.getAllPublishedBinaries().count())

Subscribers

People subscribed via source and target branches

to status/vote changes: