Merge ~ilasc/launchpad:add-oci-feature-flag into launchpad:master

Proposed by Ioana Lasc
Status: Merged
Approved by: Ioana Lasc
Approved revision: 8743ef021790536eb9542316be1df22a67c94230
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~ilasc/launchpad:add-oci-feature-flag
Merge into: launchpad:master
Diff against target: 155 lines (+78/-9)
3 files modified
lib/lp/oci/model/ocirecipebuild.py (+12/-2)
lib/lp/oci/tests/test_ocirecipebuild.py (+20/-1)
lib/lp/oci/tests/test_ocirecipebuildbehaviour.py (+46/-6)
Reviewer Review Type Date Requested Status
Tom Wardill (community) Approve
Colin Watson (community) Approve
Review via email: mp+380769@code.launchpad.net

Commit message

Add OCI builds feature flag

Description of the change

Added an OCI feature flag (oci.build_series.<distribution>) and integrated
it with the distro_arch_series property of OCIRecipeBuild.
The feature rule is a string that names the series to use
as the OCI recipe build distroseries for a given distribution.

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Needs Fixing
9e166b6... by Ioana Lasc

Changes to OCI feature flag implementation

We want the feature rule to be a string that names
the series to use as the OCI recipe build distroseries
for a given distribution, instead of a boolean flag
that controls whether to use bionic.

Revision history for this message
Ioana Lasc (ilasc) wrote :

Thanks Colin! Hopefully it's closer to what we want now.

Revision history for this message
Tom Wardill (twom) wrote :

It's looking better to me, but I found some things while having a look through :)

review: Needs Fixing
8af9e49... by Ioana Lasc

Make changes to OCI feature flag

Addressed code review comments, changed the flag
type and added initial value.

68d2115... by Ioana Lasc

Merge branch 'master' into add-oci-feature-flag

Revision history for this message
Ioana Lasc (ilasc) wrote :

Thank you Tom! Made what I believe would be the necessary changes. Now ready for the next review.

Revision history for this message
Colin Watson (cjwatson) wrote :

Definitely getting better, but a few more tidy-ups I think, mainly in tests.

review: Needs Fixing
Revision history for this message
Colin Watson (cjwatson) wrote :

Also could you sync up the MP description with the current behaviour? This can be useful to future travellers looking up why a change was made.

8f5f127... by Ioana Lasc

Cleanup changes for OCI feature flag

Code cleanup and addressing code review comments for the OCI
feature flag names the series to use as the OCI recipe build
distroseries for a given distribution.

Revision history for this message
Ioana Lasc (ilasc) wrote :

Thank you Colin, addressed the comments and changed the Description. Ready for another review.

Revision history for this message
Colin Watson (cjwatson) wrote :

Just one more thing ...

8743ef0... by Ioana Lasc

Remove NoSuchDistroSeries from distro_arch_series

Removed the try-catch code in distro_arch_series from OCIRecipeBuild,
if the series named in the feature rule doesn't exist, we want to crash
instead of silently handling it.

Revision history for this message
Ioana Lasc (ilasc) wrote :

Agreed on your suggested approach to crash if the series doesn't exist instead of silently handling it. Thanks Colin!

Revision history for this message
Colin Watson (cjwatson) :
review: Approve
Revision history for this message
Tom Wardill (twom) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/oci/model/ocirecipebuild.py b/lib/lp/oci/model/ocirecipebuild.py
2index 89b7215..c36fce4 100644
3--- a/lib/lp/oci/model/ocirecipebuild.py
4+++ b/lib/lp/oci/model/ocirecipebuild.py
5@@ -55,6 +55,7 @@ from lp.services.database.interfaces import (
6 IMasterStore,
7 IStore,
8 )
9+from lp.services.features import getFeatureFlag
10 from lp.services.librarian.model import (
11 LibraryFileAlias,
12 LibraryFileContent,
13@@ -271,8 +272,17 @@ class OCIRecipeBuild(PackageBuildMixin, Storm):
14
15 @property
16 def distro_arch_series(self):
17- return self.distribution.currentseries.getDistroArchSeriesByProcessor(
18- self.processor)
19+ # For OCI builds we default to the series set by the feature flag.
20+ # If the feature flag is not set we default to current series under
21+ # the OCIRecipeBuild distribution.
22+
23+ oci_series = getFeatureFlag('oci.build_series.%s'
24+ % self.distribution.name)
25+ if oci_series:
26+ oci_series = self.distribution.getSeries(oci_series)
27+ else:
28+ oci_series = self.distribution.currentseries
29+ return oci_series.getDistroArchSeriesByProcessor(self.processor)
30
31 def updateStatus(self, status, builder=None, slave_status=None,
32 date_started=None, date_finished=None,
33diff --git a/lib/lp/oci/tests/test_ocirecipebuild.py b/lib/lp/oci/tests/test_ocirecipebuild.py
34index fcce007..eec8850 100644
35--- a/lib/lp/oci/tests/test_ocirecipebuild.py
36+++ b/lib/lp/oci/tests/test_ocirecipebuild.py
37@@ -226,13 +226,32 @@ class TestOCIRecipeBuildSet(TestCaseWithFactory):
38 distro_arch_series = self.factory.makeDistroArchSeries(
39 distroseries=distroseries, architecturetag="i386",
40 processor=processor)
41- distro_arch_series = self.factory.makeDistroArchSeries()
42 oci_project = self.factory.makeOCIProject(pillar=distribution)
43 recipe = self.factory.makeOCIRecipe(oci_project=oci_project)
44 target = getUtility(IOCIRecipeBuildSet).new(
45 requester, recipe, distro_arch_series)
46 with admin_logged_in():
47 self.assertProvides(target, IOCIRecipeBuild)
48+ self.assertEqual(distro_arch_series, target.distro_arch_series)
49+
50+ def test_new_oci_feature_flag_enabled(self):
51+ requester = self.factory.makePerson()
52+ distribution = self.factory.makeDistribution()
53+ distroseries = self.factory.makeDistroSeries(
54+ distribution=distribution, status=SeriesStatus.CURRENT)
55+ processor = getUtility(IProcessorSet).getByName("386")
56+ self.useFixture(FeatureFixture({
57+ "oci.build_series.%s" % distribution.name: distroseries.name}))
58+ distro_arch_series = self.factory.makeDistroArchSeries(
59+ distroseries=distroseries, architecturetag="i386",
60+ processor=processor)
61+ oci_project = self.factory.makeOCIProject(pillar=distribution)
62+ recipe = self.factory.makeOCIRecipe(oci_project=oci_project)
63+ target = getUtility(IOCIRecipeBuildSet).new(
64+ requester, recipe, distro_arch_series)
65+ with admin_logged_in():
66+ self.assertProvides(target, IOCIRecipeBuild)
67+ self.assertEqual(distro_arch_series, target.distro_arch_series)
68
69 def test_getByID(self):
70 builds = [self.factory.makeOCIRecipeBuild() for x in range(3)]
71diff --git a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
72index eeefc88..58b6adc 100644
73--- a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
74+++ b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
75@@ -33,7 +33,6 @@ from testtools.twistedsupport import (
76 AsynchronousDeferredRunTestForBrokenTwisted,
77 )
78 from twisted.internet import defer
79-from twisted.trial.unittest import TestCase as TrialTestCase
80 from zope.component import getUtility
81 from zope.security.proxy import removeSecurityProxy
82
83@@ -67,6 +66,7 @@ from lp.buildmaster.tests.test_buildfarmjobbehaviour import (
84 from lp.oci.model.ocirecipebuildbehaviour import OCIRecipeBuildBehaviour
85 from lp.registry.interfaces.series import SeriesStatus
86 from lp.services.config import config
87+from lp.services.features.testing import FeatureFixture
88 from lp.services.log.logger import DevNullLogger
89 from lp.services.webapp import canonical_url
90 from lp.soyuz.adapters.archivedependencies import (
91@@ -95,12 +95,13 @@ class MakeOCIBuildMixin:
92 build.queueBuild()
93 return build
94
95- def makeJob(self, git_ref, recipe=None):
96+ def makeJob(self, git_ref, recipe=None, build=None):
97 """Create a sample `IOCIRecipeBuildBehaviour`."""
98- if recipe is None:
99- build = self.factory.makeOCIRecipeBuild()
100- else:
101- build = self.factory.makeOCIRecipeBuild(recipe=recipe)
102+ if build is None:
103+ if recipe is None:
104+ build = self.factory.makeOCIRecipeBuild()
105+ else:
106+ build = self.factory.makeOCIRecipeBuild(recipe=recipe)
107 build.recipe.git_ref = git_ref
108
109 job = IBuildFarmJobBehaviour(build)
110@@ -339,6 +340,45 @@ class TestAsyncOCIRecipeBuildBehaviour(MakeOCIBuildMixin, TestCaseWithFactory):
111 self.assertEqual(
112 ('ensurepresent', chroot_lfa.http_url, '', ''), slave.call_log[0])
113
114+ @defer.inlineCallbacks
115+ def test_dispatchBuildToSlave_oci_feature_flag_enabled(self):
116+ self.pushConfig("snappy", builder_proxy_host=None)
117+ [ref] = self.factory.makeGitRefs()
118+
119+ distribution = self.factory.makeDistribution()
120+ distroseries = self.factory.makeDistroSeries(
121+ distribution=distribution, status=SeriesStatus.CURRENT)
122+ processor = getUtility(IProcessorSet).getByName("386")
123+ self.useFixture(FeatureFixture({
124+ "oci.build_series.%s" % distribution.name: distroseries.name}))
125+ distro_arch_series = self.factory.makeDistroArchSeries(
126+ distroseries=distroseries, architecturetag="i386",
127+ processor=processor)
128+
129+ build = self.factory.makeOCIRecipeBuild(
130+ distro_arch_series=distro_arch_series)
131+ job = self.makeJob(git_ref=ref, build=build)
132+ builder = MockBuilder()
133+ builder.processor = job.build.processor
134+ slave = OkSlave()
135+ job.setBuilder(builder, slave)
136+ chroot_lfa = self.factory.makeLibraryFileAlias(db_only=True)
137+
138+ job.build.distro_arch_series.addOrUpdateChroot(
139+ chroot_lfa, image_type=BuildBaseImageType.CHROOT)
140+ lxd_lfa = self.factory.makeLibraryFileAlias(db_only=True)
141+ job.build.distro_arch_series.addOrUpdateChroot(
142+ lxd_lfa, image_type=BuildBaseImageType.LXD)
143+ yield job.dispatchBuildToSlave(DevNullLogger())
144+ self.assertEqual(distroseries.name,
145+ job.build.distro_arch_series.distroseries.name)
146+ self.assertEqual(
147+ ('ensurepresent', lxd_lfa.http_url, '', ''), slave.call_log[0])
148+ # grab the build method log from the OKMockSlave
149+ # and check inside the arguments dict that we build
150+ # for Distro series
151+ self.assertEqual(distroseries.name, slave.call_log[1][5]['series'])
152+
153
154 class TestHandleStatusForOCIRecipeBuild(MakeOCIBuildMixin,
155 TestCaseWithFactory):

Subscribers

People subscribed via source and target branches

to status/vote changes: