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
diff --git a/lib/lp/oci/model/ocirecipebuild.py b/lib/lp/oci/model/ocirecipebuild.py
index 89b7215..c36fce4 100644
--- a/lib/lp/oci/model/ocirecipebuild.py
+++ b/lib/lp/oci/model/ocirecipebuild.py
@@ -55,6 +55,7 @@ from lp.services.database.interfaces import (
55 IMasterStore,55 IMasterStore,
56 IStore,56 IStore,
57 )57 )
58from lp.services.features import getFeatureFlag
58from lp.services.librarian.model import (59from lp.services.librarian.model import (
59 LibraryFileAlias,60 LibraryFileAlias,
60 LibraryFileContent,61 LibraryFileContent,
@@ -271,8 +272,17 @@ class OCIRecipeBuild(PackageBuildMixin, Storm):
271272
272 @property273 @property
273 def distro_arch_series(self):274 def distro_arch_series(self):
274 return self.distribution.currentseries.getDistroArchSeriesByProcessor(275 # For OCI builds we default to the series set by the feature flag.
275 self.processor)276 # If the feature flag is not set we default to current series under
277 # the OCIRecipeBuild distribution.
278
279 oci_series = getFeatureFlag('oci.build_series.%s'
280 % self.distribution.name)
281 if oci_series:
282 oci_series = self.distribution.getSeries(oci_series)
283 else:
284 oci_series = self.distribution.currentseries
285 return oci_series.getDistroArchSeriesByProcessor(self.processor)
276286
277 def updateStatus(self, status, builder=None, slave_status=None,287 def updateStatus(self, status, builder=None, slave_status=None,
278 date_started=None, date_finished=None,288 date_started=None, date_finished=None,
diff --git a/lib/lp/oci/tests/test_ocirecipebuild.py b/lib/lp/oci/tests/test_ocirecipebuild.py
index fcce007..eec8850 100644
--- a/lib/lp/oci/tests/test_ocirecipebuild.py
+++ b/lib/lp/oci/tests/test_ocirecipebuild.py
@@ -226,13 +226,32 @@ class TestOCIRecipeBuildSet(TestCaseWithFactory):
226 distro_arch_series = self.factory.makeDistroArchSeries(226 distro_arch_series = self.factory.makeDistroArchSeries(
227 distroseries=distroseries, architecturetag="i386",227 distroseries=distroseries, architecturetag="i386",
228 processor=processor)228 processor=processor)
229 distro_arch_series = self.factory.makeDistroArchSeries()
230 oci_project = self.factory.makeOCIProject(pillar=distribution)229 oci_project = self.factory.makeOCIProject(pillar=distribution)
231 recipe = self.factory.makeOCIRecipe(oci_project=oci_project)230 recipe = self.factory.makeOCIRecipe(oci_project=oci_project)
232 target = getUtility(IOCIRecipeBuildSet).new(231 target = getUtility(IOCIRecipeBuildSet).new(
233 requester, recipe, distro_arch_series)232 requester, recipe, distro_arch_series)
234 with admin_logged_in():233 with admin_logged_in():
235 self.assertProvides(target, IOCIRecipeBuild)234 self.assertProvides(target, IOCIRecipeBuild)
235 self.assertEqual(distro_arch_series, target.distro_arch_series)
236
237 def test_new_oci_feature_flag_enabled(self):
238 requester = self.factory.makePerson()
239 distribution = self.factory.makeDistribution()
240 distroseries = self.factory.makeDistroSeries(
241 distribution=distribution, status=SeriesStatus.CURRENT)
242 processor = getUtility(IProcessorSet).getByName("386")
243 self.useFixture(FeatureFixture({
244 "oci.build_series.%s" % distribution.name: distroseries.name}))
245 distro_arch_series = self.factory.makeDistroArchSeries(
246 distroseries=distroseries, architecturetag="i386",
247 processor=processor)
248 oci_project = self.factory.makeOCIProject(pillar=distribution)
249 recipe = self.factory.makeOCIRecipe(oci_project=oci_project)
250 target = getUtility(IOCIRecipeBuildSet).new(
251 requester, recipe, distro_arch_series)
252 with admin_logged_in():
253 self.assertProvides(target, IOCIRecipeBuild)
254 self.assertEqual(distro_arch_series, target.distro_arch_series)
236255
237 def test_getByID(self):256 def test_getByID(self):
238 builds = [self.factory.makeOCIRecipeBuild() for x in range(3)]257 builds = [self.factory.makeOCIRecipeBuild() for x in range(3)]
diff --git a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
index eeefc88..58b6adc 100644
--- a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
+++ b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
@@ -33,7 +33,6 @@ from testtools.twistedsupport import (
33 AsynchronousDeferredRunTestForBrokenTwisted,33 AsynchronousDeferredRunTestForBrokenTwisted,
34 )34 )
35from twisted.internet import defer35from twisted.internet import defer
36from twisted.trial.unittest import TestCase as TrialTestCase
37from zope.component import getUtility36from zope.component import getUtility
38from zope.security.proxy import removeSecurityProxy37from zope.security.proxy import removeSecurityProxy
3938
@@ -67,6 +66,7 @@ from lp.buildmaster.tests.test_buildfarmjobbehaviour import (
67from lp.oci.model.ocirecipebuildbehaviour import OCIRecipeBuildBehaviour66from lp.oci.model.ocirecipebuildbehaviour import OCIRecipeBuildBehaviour
68from lp.registry.interfaces.series import SeriesStatus67from lp.registry.interfaces.series import SeriesStatus
69from lp.services.config import config68from lp.services.config import config
69from lp.services.features.testing import FeatureFixture
70from lp.services.log.logger import DevNullLogger70from lp.services.log.logger import DevNullLogger
71from lp.services.webapp import canonical_url71from lp.services.webapp import canonical_url
72from lp.soyuz.adapters.archivedependencies import (72from lp.soyuz.adapters.archivedependencies import (
@@ -95,12 +95,13 @@ class MakeOCIBuildMixin:
95 build.queueBuild()95 build.queueBuild()
96 return build96 return build
9797
98 def makeJob(self, git_ref, recipe=None):98 def makeJob(self, git_ref, recipe=None, build=None):
99 """Create a sample `IOCIRecipeBuildBehaviour`."""99 """Create a sample `IOCIRecipeBuildBehaviour`."""
100 if recipe is None:100 if build is None:
101 build = self.factory.makeOCIRecipeBuild()101 if recipe is None:
102 else:102 build = self.factory.makeOCIRecipeBuild()
103 build = self.factory.makeOCIRecipeBuild(recipe=recipe)103 else:
104 build = self.factory.makeOCIRecipeBuild(recipe=recipe)
104 build.recipe.git_ref = git_ref105 build.recipe.git_ref = git_ref
105106
106 job = IBuildFarmJobBehaviour(build)107 job = IBuildFarmJobBehaviour(build)
@@ -339,6 +340,45 @@ class TestAsyncOCIRecipeBuildBehaviour(MakeOCIBuildMixin, TestCaseWithFactory):
339 self.assertEqual(340 self.assertEqual(
340 ('ensurepresent', chroot_lfa.http_url, '', ''), slave.call_log[0])341 ('ensurepresent', chroot_lfa.http_url, '', ''), slave.call_log[0])
341342
343 @defer.inlineCallbacks
344 def test_dispatchBuildToSlave_oci_feature_flag_enabled(self):
345 self.pushConfig("snappy", builder_proxy_host=None)
346 [ref] = self.factory.makeGitRefs()
347
348 distribution = self.factory.makeDistribution()
349 distroseries = self.factory.makeDistroSeries(
350 distribution=distribution, status=SeriesStatus.CURRENT)
351 processor = getUtility(IProcessorSet).getByName("386")
352 self.useFixture(FeatureFixture({
353 "oci.build_series.%s" % distribution.name: distroseries.name}))
354 distro_arch_series = self.factory.makeDistroArchSeries(
355 distroseries=distroseries, architecturetag="i386",
356 processor=processor)
357
358 build = self.factory.makeOCIRecipeBuild(
359 distro_arch_series=distro_arch_series)
360 job = self.makeJob(git_ref=ref, build=build)
361 builder = MockBuilder()
362 builder.processor = job.build.processor
363 slave = OkSlave()
364 job.setBuilder(builder, slave)
365 chroot_lfa = self.factory.makeLibraryFileAlias(db_only=True)
366
367 job.build.distro_arch_series.addOrUpdateChroot(
368 chroot_lfa, image_type=BuildBaseImageType.CHROOT)
369 lxd_lfa = self.factory.makeLibraryFileAlias(db_only=True)
370 job.build.distro_arch_series.addOrUpdateChroot(
371 lxd_lfa, image_type=BuildBaseImageType.LXD)
372 yield job.dispatchBuildToSlave(DevNullLogger())
373 self.assertEqual(distroseries.name,
374 job.build.distro_arch_series.distroseries.name)
375 self.assertEqual(
376 ('ensurepresent', lxd_lfa.http_url, '', ''), slave.call_log[0])
377 # grab the build method log from the OKMockSlave
378 # and check inside the arguments dict that we build
379 # for Distro series
380 self.assertEqual(distroseries.name, slave.call_log[1][5]['series'])
381
342382
343class TestHandleStatusForOCIRecipeBuild(MakeOCIBuildMixin,383class TestHandleStatusForOCIRecipeBuild(MakeOCIBuildMixin,
344 TestCaseWithFactory):384 TestCaseWithFactory):

Subscribers

People subscribed via source and target branches

to status/vote changes: