Andrey Fedoseev has proposed merging 
~andrey-fedoseev/launchpad:snap-base-features into launchpad:master.

Commit message:
Use `SnapBase.features` in `snapcraft.yaml` parser

to determine whether duplicate build-on values are allowed instead of relying 
on snap base name

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~andrey-fedoseev/launchpad/+git/launchpad/+merge/431544
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of 
~andrey-fedoseev/launchpad:snap-base-features into launchpad:master.
diff --git a/lib/lp/snappy/adapters/buildarch.py b/lib/lp/snappy/adapters/buildarch.py
index 102eb74..eb87a7d 100644
--- a/lib/lp/snappy/adapters/buildarch.py
+++ b/lib/lp/snappy/adapters/buildarch.py
@@ -9,6 +9,8 @@ from collections import Counter
 from typing import Any, Dict, List, Optional, Union
 
 from lp.services.helpers import english_list
+from lp.snappy.interfaces.snapbase import SnapBaseFeature
+from lp.snappy.model.snapbase import SnapBase
 
 
 class SnapArchitecturesParserError(Exception):
@@ -146,7 +148,7 @@ class SnapBuildInstance:
 
 
 def determine_architectures_to_build(
-    snap_base: Optional[str],
+    snap_base: Optional[SnapBase],
     snapcraft_data: Dict[str, Any],
     supported_arches: List[str],
 ) -> List[SnapBuildInstance]:
@@ -184,7 +186,11 @@ def determine_architectures_to_build(
             SnapArchitecture(build_on=a) for a in supported_arches
         ]
 
-    if snap_base not in {"core22"}:
+    allow_duplicate_build_on = (
+        snap_base
+        and snap_base.features.get(SnapBaseFeature.ALLOW_DUPLICATE_BUILD_ON)
+    ) or False
+    if not allow_duplicate_build_on:
         # Ensure that multiple `build-on` items don't include the same
         # architecture; this is ambiguous and forbidden by snapcraft prior
         # to core22. Checking this here means that we don't get duplicate
diff --git a/lib/lp/snappy/adapters/tests/test_buildarch.py b/lib/lp/snappy/adapters/tests/test_buildarch.py
index db52baf..8a9ef2e 100644
--- a/lib/lp/snappy/adapters/tests/test_buildarch.py
+++ b/lib/lp/snappy/adapters/tests/test_buildarch.py
@@ -11,7 +11,9 @@ from lp.snappy.adapters.buildarch import (
     UnsupportedBuildOnError,
     determine_architectures_to_build,
 )
-from lp.testing import TestCase
+from lp.snappy.interfaces.snapbase import SnapBaseFeature
+from lp.testing import TestCase, TestCaseWithFactory
+from lp.testing.layers import ZopelessDatabaseLayer
 
 
 class TestSnapArchitecture(WithScenarios, TestCase):
@@ -174,11 +176,12 @@ class TestSnapBuildInstanceError(TestCase):
         self.assertEqual(["amd64"], raised.build_on)
 
 
-class TestDetermineArchitecturesToBuild(WithScenarios, TestCase):
-
+class TestDetermineArchitecturesToBuild(WithScenarios, TestCaseWithFactory):
     # Scenarios taken from the architectures document:
     # https://forum.snapcraft.io/t/architectures/4972
 
+    layer = ZopelessDatabaseLayer
+
     scenarios = [
         (
             "none",
@@ -396,6 +399,9 @@ class TestDetermineArchitecturesToBuild(WithScenarios, TestCase):
         (
             "multiple build-for for the same build-on",
             {
+                "snap_base_features": {
+                    SnapBaseFeature.ALLOW_DUPLICATE_BUILD_ON: True
+                },
                 "architectures": [
                     {"build-on": "amd64", "build-for": ["amd64"]},
                     {"build-on": "amd64", "build-for": ["i386"]},
@@ -418,7 +424,9 @@ class TestDetermineArchitecturesToBuild(WithScenarios, TestCase):
         (
             "multiple build-for for the same build-on: old base",
             {
-                "snap_base": "core20",
+                "snap_base_features": {
+                    SnapBaseFeature.ALLOW_DUPLICATE_BUILD_ON: False
+                },
                 "architectures": [
                     {"build-on": "amd64", "build-for": ["amd64"]},
                     {"build-on": "amd64", "build-for": ["i386"]},
@@ -431,7 +439,8 @@ class TestDetermineArchitecturesToBuild(WithScenarios, TestCase):
 
     def test_parser(self):
         snapcraft_data = {"architectures": self.architectures}
-        snap_base = getattr(self, "snap_base", "core22")
+        snap_base_features = getattr(self, "snap_base_features", {})
+        snap_base = self.factory.makeSnapBase(features=snap_base_features)
         if hasattr(self, "expected_exception"):
             self.assertRaises(
                 self.expected_exception,
diff --git a/lib/lp/snappy/model/snap.py b/lib/lp/snappy/model/snap.py
index 7728ecf..e60040f 100644
--- a/lib/lp/snappy/model/snap.py
+++ b/lib/lp/snappy/model/snap.py
@@ -1009,7 +1009,7 @@ class Snap(Storm, WebhookTargetMixin):
                 )
             )
             architectures_to_build = determine_architectures_to_build(
-                snap_base.name if snap_base is not None else None,
+                snap_base,
                 snapcraft_data,
                 list(supported_arches.keys()),
             )
_______________________________________________
Mailing list: https://launchpad.net/~launchpad-reviewers
Post to     : launchpad-reviewers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~launchpad-reviewers
More help   : https://help.launchpad.net/ListHelp

Reply via email to