Merge ~cjwatson/launchpad:generalise-snap-build-base into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 6a29280462f4f3d3f82bd8f4e356747e9ea06f3a
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:generalise-snap-build-base
Merge into: launchpad:master
Diff against target: 113 lines (+45/-10)
2 files modified
lib/lp/snappy/model/snap.py (+16/-7)
lib/lp/snappy/tests/test_snap.py (+29/-3)
Reviewer Review Type Date Requested Status
Ioana Lasc (community) Approve
Review via email: mp+383436@code.launchpad.net

Commit message

Implement build-base for snaps without base: bare

Description of the change

Sync up our base selection for snap builds with snapcraft:

  https://github.com/snapcore/snapcraft/blob/4.0/snapcraft/internal/meta/snap.py#L161-L181

This makes two significant changes to base selection:

 * `build-base` now wins in all cases, even if the snap does not have `base: bare`;

 * if `build-base` is not set and the snap has `type: base`, then the snap's `name` is used as the base.

If neither of those apply, then the value of `base` is used, as before.

`base: bare` without `build-base` is now an error, while previously the default base would have been used. However, this combination is forbidden by snapcraft at the schema-validation change, so this change shouldn't matter in practice.

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

looks good!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/lib/lp/snappy/model/snap.py b/lib/lp/snappy/model/snap.py
index 229eaa4..4860fad 100644
--- a/lib/lp/snappy/model/snap.py
+++ b/lib/lp/snappy/model/snap.py
@@ -1,4 +1,4 @@
1# Copyright 2015-2019 Canonical Ltd. This software is licensed under the1# Copyright 2015-2020 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4from __future__ import absolute_import, print_function, unicode_literals4from __future__ import absolute_import, print_function, unicode_literals
@@ -689,18 +689,27 @@ class Snap(Storm, WebhookTargetMixin):
689 @staticmethod689 @staticmethod
690 def _findBase(snapcraft_data):690 def _findBase(snapcraft_data):
691 """Find a suitable base for a build."""691 """Find a suitable base for a build."""
692 base = snapcraft_data.get("base")
693 build_base = snapcraft_data.get("build-base")
694 name = snapcraft_data.get("name")
695 snap_type = snapcraft_data.get("type")
696
697 # Keep this in sync with
698 # snapcraft.internal.meta.snap.Snap.get_build_base.
692 snap_base_set = getUtility(ISnapBaseSet)699 snap_base_set = getUtility(ISnapBaseSet)
693 snap_base_name = snapcraft_data.get("base")700 if build_base is not None:
701 snap_base_name = build_base
702 elif name is not None and snap_type == "base":
703 snap_base_name = name
704 else:
705 snap_base_name = base
706
694 if isinstance(snap_base_name, bytes):707 if isinstance(snap_base_name, bytes):
695 snap_base_name = snap_base_name.decode("UTF-8")708 snap_base_name = snap_base_name.decode("UTF-8")
696 if snap_base_name == "bare":
697 snap_base_name = snapcraft_data.get("build-base")
698 if isinstance(snap_base_name, bytes):
699 snap_base_name = snap_base_name.decode("UTF-8")
700 if snap_base_name is not None:709 if snap_base_name is not None:
701 return snap_base_set.getByName(snap_base_name), snap_base_name710 return snap_base_set.getByName(snap_base_name), snap_base_name
702 else:711 else:
703 return snap_base_set.getDefault(), snap_base_name712 return snap_base_set.getDefault(), None
704713
705 def _pickDistroSeries(self, snap_base, snap_base_name):714 def _pickDistroSeries(self, snap_base, snap_base_name):
706 """Pick a suitable `IDistroSeries` for a build."""715 """Pick a suitable `IDistroSeries` for a build."""
diff --git a/lib/lp/snappy/tests/test_snap.py b/lib/lp/snappy/tests/test_snap.py
index 809b617..0b712fe 100644
--- a/lib/lp/snappy/tests/test_snap.py
+++ b/lib/lp/snappy/tests/test_snap.py
@@ -1,4 +1,4 @@
1# Copyright 2015-2019 Canonical Ltd. This software is licensed under the1# Copyright 2015-2020 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""Test snap packages."""4"""Test snap packages."""
@@ -564,14 +564,27 @@ class TestSnap(TestCaseWithFactory):
564 self.assertEqual(564 self.assertEqual(
565 (snap_base, snap_base.name),565 (snap_base, snap_base.name),
566 Snap._findBase({"base": "bare", "build-base": snap_base.name}))566 Snap._findBase({"base": "bare", "build-base": snap_base.name}))
567 self.assertEqual(
568 (snap_base, snap_base.name),
569 Snap._findBase({"build-base": snap_base.name}))
570 self.assertEqual(
571 (snap_base, snap_base.name),
572 Snap._findBase({"type": "base", "name": snap_base.name}))
567 self.assertRaises(573 self.assertRaises(
568 NoSuchSnapBase, Snap._findBase,574 NoSuchSnapBase, Snap._findBase,
569 {"base": "nonexistent"})575 {"base": "nonexistent"})
570 self.assertRaises(576 self.assertRaises(
571 NoSuchSnapBase, Snap._findBase,577 NoSuchSnapBase, Snap._findBase,
578 {"base": "bare"})
579 self.assertRaises(
580 NoSuchSnapBase, Snap._findBase,
572 {"base": "bare", "build-base": "nonexistent"})581 {"base": "bare", "build-base": "nonexistent"})
582 self.assertRaises(
583 NoSuchSnapBase, Snap._findBase,
584 {"build-base": "nonexistent"})
573 self.assertEqual((None, None), Snap._findBase({}))585 self.assertEqual((None, None), Snap._findBase({}))
574 self.assertEqual((None, None), Snap._findBase({"base": "bare"}))586 self.assertEqual(
587 (None, None), Snap._findBase({"name": snap_bases[0].name}))
575588
576 def test__findBase_with_default(self):589 def test__findBase_with_default(self):
577 with admin_logged_in():590 with admin_logged_in():
@@ -585,15 +598,28 @@ class TestSnap(TestCaseWithFactory):
585 self.assertEqual(598 self.assertEqual(
586 (snap_base, snap_base.name),599 (snap_base, snap_base.name),
587 Snap._findBase({"base": "bare", "build-base": snap_base.name}))600 Snap._findBase({"base": "bare", "build-base": snap_base.name}))
601 self.assertEqual(
602 (snap_base, snap_base.name),
603 Snap._findBase({"build-base": snap_base.name}))
604 self.assertEqual(
605 (snap_base, snap_base.name),
606 Snap._findBase({"type": "base", "name": snap_base.name}))
588 self.assertRaises(607 self.assertRaises(
589 NoSuchSnapBase, Snap._findBase,608 NoSuchSnapBase, Snap._findBase,
590 {"base": "nonexistent"})609 {"base": "nonexistent"})
591 self.assertRaises(610 self.assertRaises(
592 NoSuchSnapBase, Snap._findBase,611 NoSuchSnapBase, Snap._findBase,
612 {"base": "bare"})
613 self.assertRaises(
614 NoSuchSnapBase, Snap._findBase,
593 {"base": "bare", "build-base": "nonexistent"})615 {"base": "bare", "build-base": "nonexistent"})
616 self.assertRaises(
617 NoSuchSnapBase, Snap._findBase,
618 {"build-base": "nonexistent"})
594 self.assertEqual((snap_bases[0], None), Snap._findBase({}))619 self.assertEqual((snap_bases[0], None), Snap._findBase({}))
595 self.assertEqual(620 self.assertEqual(
596 (snap_bases[0], None), Snap._findBase({"base": "bare"}))621 (snap_bases[0], None),
622 Snap._findBase({"name": snap_bases[0].name}))
597623
598 def makeRequestBuildsJob(self, arch_tags, git_ref=None):624 def makeRequestBuildsJob(self, arch_tags, git_ref=None):
599 distro = self.factory.makeDistribution()625 distro = self.factory.makeDistribution()

Subscribers

People subscribed via source and target branches

to status/vote changes: