Merge ~cjwatson/launchpad:snap-base-dispatch-dependencies into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 04be32e0c6f0c5abf4e7843c746633adddf2a6dc
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:snap-base-dispatch-dependencies
Merge into: launchpad:master
Diff against target: 215 lines (+110/-7)
4 files modified
lib/lp/snappy/model/snapbuildbehaviour.py (+4/-0)
lib/lp/snappy/tests/test_snapbuildbehaviour.py (+88/-0)
lib/lp/soyuz/adapters/archivedependencies.py (+16/-6)
lib/lp/soyuz/model/archive.py (+2/-1)
Reviewer Review Type Date Requested Status
Tom Wardill (community) Approve
Review via email: mp+400836@code.launchpad.net

Commit message

Dispatch SnapBase archive dependencies

Description of the change

We now dispatch these to snap builds in addition to the dependencies of the source archive, if any. This will be used for the "core" snap base once 16.04 enters ESM.

To post a comment you must log in.
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/snappy/model/snapbuildbehaviour.py b/lib/lp/snappy/model/snapbuildbehaviour.py
2index 4dd89f0..f554268 100644
3--- a/lib/lp/snappy/model/snapbuildbehaviour.py
4+++ b/lib/lp/snappy/model/snapbuildbehaviour.py
5@@ -171,9 +171,13 @@ class SnapBuildBehaviour(SnapProxyMixin, BuildFarmJobBehaviourBase):
6 args["channels"] = removeSecurityProxy(channels)
7 tools_source = None
8 tools_fingerprint = None
9+ archive_dependencies = list(build.archive.dependencies)
10+ if build.snap_base is not None:
11+ archive_dependencies.extend(build.snap_base.dependencies)
12 args["archives"], args["trusted_keys"] = (
13 yield get_sources_list_for_building(
14 build, build.distro_arch_series, None,
15+ archive_dependencies=archive_dependencies,
16 tools_source=tools_source, tools_fingerprint=tools_fingerprint,
17 logger=logger))
18 if build.snap.branch is not None:
19diff --git a/lib/lp/snappy/tests/test_snapbuildbehaviour.py b/lib/lp/snappy/tests/test_snapbuildbehaviour.py
20index 4cc91ac..c64749d 100644
21--- a/lib/lp/snappy/tests/test_snapbuildbehaviour.py
22+++ b/lib/lp/snappy/tests/test_snapbuildbehaviour.py
23@@ -101,6 +101,7 @@ from lp.soyuz.adapters.archivedependencies import (
24 )
25 from lp.soyuz.enums import PackagePublishingStatus
26 from lp.soyuz.interfaces.archive import ArchiveDisabled
27+from lp.soyuz.interfaces.component import IComponentSet
28 from lp.soyuz.tests.soyuz import Base64KeyMatches
29 from lp.testing import (
30 TestCase,
31@@ -797,6 +798,93 @@ class TestAsyncSnapBuildBehaviour(StatsMixin, TestSnapBuildBehaviourBase):
32 self.assertEqual(expected_archives, extra_args["archives"])
33
34 @defer.inlineCallbacks
35+ def test_extraBuildArgs_snap_base_with_archive_dependencies(self):
36+ # If the build is using a snap base that has archive dependencies,
37+ # extraBuildArgs sends them.
38+ snap_base = self.factory.makeSnapBase()
39+ job = self.makeJob(snap_base=snap_base)
40+ dependency = self.factory.makeArchive(
41+ distribution=job.archive.distribution)
42+ snap_base.addArchiveDependency(
43+ dependency, PackagePublishingPocket.RELEASE,
44+ getUtility(IComponentSet)["main"])
45+ self.factory.makeBinaryPackagePublishingHistory(
46+ archive=dependency, distroarchseries=job.build.distro_arch_series,
47+ pocket=PackagePublishingPocket.RELEASE,
48+ status=PackagePublishingStatus.PUBLISHED)
49+ expected_archives = [
50+ "deb %s %s main" % (
51+ dependency.archive_url, job.build.distro_series.name),
52+ "deb %s %s main universe" % (
53+ job.archive.archive_url, job.build.distro_series.name),
54+ "deb %s %s-security main universe" % (
55+ job.archive.archive_url, job.build.distro_series.name),
56+ "deb %s %s-updates main universe" % (
57+ job.archive.archive_url, job.build.distro_series.name),
58+ ]
59+ with dbuser(config.builddmaster.dbuser):
60+ args = yield job.extraBuildArgs()
61+ self.assertEqual(expected_archives, args["archives"])
62+
63+ @defer.inlineCallbacks
64+ def test_extraBuildArgs_ppa_and_snap_base_with_archive_dependencies(self):
65+ # If the build is using a PPA and a snap base that both have archive
66+ # dependencies, extraBuildArgs sends them all.
67+ snap_base = self.factory.makeSnapBase()
68+ upper_archive = self.factory.makeArchive()
69+ lower_archive = self.factory.makeArchive(
70+ distribution=upper_archive.distribution)
71+ snap_base_archive = self.factory.makeArchive(
72+ distribution=upper_archive.distribution)
73+ job = self.makeJob(archive=upper_archive, snap_base=snap_base)
74+ primary = job.build.distribution.main_archive
75+ for archive in (upper_archive, lower_archive, snap_base_archive):
76+ self.factory.makeBinaryPackagePublishingHistory(
77+ archive=archive, distroarchseries=job.build.distro_arch_series,
78+ pocket=PackagePublishingPocket.RELEASE,
79+ status=PackagePublishingStatus.PUBLISHED)
80+ upper_archive.addArchiveDependency(
81+ lower_archive, PackagePublishingPocket.RELEASE)
82+ snap_base.addArchiveDependency(
83+ snap_base_archive, PackagePublishingPocket.RELEASE,
84+ getUtility(IComponentSet)["main"])
85+ expected_archives = [
86+ "deb %s %s main" % (
87+ upper_archive.archive_url, job.build.distro_series.name),
88+ "deb %s %s main" % (
89+ lower_archive.archive_url, job.build.distro_series.name),
90+ "deb %s %s main" % (
91+ snap_base_archive.archive_url, job.build.distro_series.name),
92+ "deb %s %s main universe" % (
93+ primary.archive_url, job.build.distro_series.name),
94+ "deb %s %s-security main universe" % (
95+ primary.archive_url, job.build.distro_series.name),
96+ "deb %s %s-updates main universe" % (
97+ primary.archive_url, job.build.distro_series.name),
98+ ]
99+ with dbuser(config.builddmaster.dbuser):
100+ args = yield job.extraBuildArgs()
101+ self.assertEqual(expected_archives, args["archives"])
102+
103+ @defer.inlineCallbacks
104+ def test_extraBuildArgs_snap_base_without_archive_dependencies(self):
105+ # If the build is using a snap base that does not have archive
106+ # dependencies, extraBuildArgs only sends the base archive.
107+ snap_base = self.factory.makeSnapBase()
108+ job = self.makeJob(snap_base=snap_base)
109+ expected_archives = [
110+ "deb %s %s main universe" % (
111+ job.archive.archive_url, job.build.distro_series.name),
112+ "deb %s %s-security main universe" % (
113+ job.archive.archive_url, job.build.distro_series.name),
114+ "deb %s %s-updates main universe" % (
115+ job.archive.archive_url, job.build.distro_series.name),
116+ ]
117+ with dbuser(config.builddmaster.dbuser):
118+ args = yield job.extraBuildArgs()
119+ self.assertEqual(expected_archives, args["archives"])
120+
121+ @defer.inlineCallbacks
122 def test_extraBuildArgs_disallow_internet(self):
123 # If external network access is not allowed for the snap,
124 # extraBuildArgs does not dispatch a proxy token.
125diff --git a/lib/lp/soyuz/adapters/archivedependencies.py b/lib/lp/soyuz/adapters/archivedependencies.py
126index b80e0fe..c005651 100644
127--- a/lib/lp/soyuz/adapters/archivedependencies.py
128+++ b/lib/lp/soyuz/adapters/archivedependencies.py
129@@ -153,8 +153,9 @@ def get_primary_current_component(archive, distroseries, sourcepackagename):
130
131
132 def expand_dependencies(archive, distro_arch_series, pocket, component,
133- source_package_name, tools_source=None,
134- tools_fingerprint=None, logger=None):
135+ source_package_name, archive_dependencies,
136+ tools_source=None, tools_fingerprint=None,
137+ logger=None):
138 """Return the set of dependency archives, pockets and components.
139
140 :param archive: the context `IArchive`.
141@@ -162,6 +163,8 @@ def expand_dependencies(archive, distro_arch_series, pocket, component,
142 :param pocket: the context `PackagePublishingPocket`.
143 :param component: the context `IComponent`.
144 :param source_package_name: A source package name (as text)
145+ :param archive_dependencies: a sequence of `IArchiveDependency` objects
146+ to use as additional user-selected archive dependencies.
147 :param tools_source: if not None, a sources.list entry to use as an
148 additional dependency for build tools, just before the default
149 primary archive.
150@@ -185,7 +188,7 @@ def expand_dependencies(archive, distro_arch_series, pocket, component,
151 primary_component = get_primary_current_component(
152 archive, distro_series, source_package_name)
153 # Consider user-selected archive dependencies.
154- for archive_dependency in archive.dependencies:
155+ for archive_dependency in archive_dependencies:
156 # When the dependency component is undefined, we should use
157 # the component where the source is published in the primary
158 # archive.
159@@ -216,8 +219,9 @@ def expand_dependencies(archive, distro_arch_series, pocket, component,
160
161 # Consider primary archive dependency override. Add the default
162 # primary archive dependencies if it's not present.
163- if archive.getArchiveDependency(
164- archive.distribution.main_archive) is None:
165+ if not any(
166+ archive_dependency.dependency == archive.distribution.main_archive
167+ for archive_dependency in archive_dependencies):
168 primary_dependencies = _get_default_primary_dependencies(
169 archive, distro_arch_series, component, pocket)
170 deps.extend(primary_dependencies)
171@@ -247,6 +251,7 @@ def expand_dependencies(archive, distro_arch_series, pocket, component,
172
173 @defer.inlineCallbacks
174 def get_sources_list_for_building(build, distroarchseries, sourcepackagename,
175+ archive_dependencies=None,
176 tools_source=None, tools_fingerprint=None,
177 logger=None):
178 """Return sources.list entries and keys required to build the given item.
179@@ -262,6 +267,9 @@ def get_sources_list_for_building(build, distroarchseries, sourcepackagename,
180 :param build: a context `IBuild`.
181 :param distroarchseries: A `IDistroArchSeries`
182 :param sourcepackagename: A source package name (as text)
183+ :param archive_dependencies: a sequence of `IArchiveDependency` objects
184+ to use as additional user-selected archive dependencies. If None,
185+ use the dependencies of the build's archive.
186 :param tools_source: if not None, a sources.list entry to use as an
187 additional dependency for build tools, just before the default
188 primary archive.
189@@ -272,9 +280,11 @@ def get_sources_list_for_building(build, distroarchseries, sourcepackagename,
190 sources.list entries (lines) and a list of base64-encoded public
191 keys.
192 """
193+ if archive_dependencies is None:
194+ archive_dependencies = build.archive.dependencies
195 deps = expand_dependencies(
196 build.archive, distroarchseries, build.pocket,
197- build.current_component, sourcepackagename,
198+ build.current_component, sourcepackagename, archive_dependencies,
199 tools_source=tools_source, tools_fingerprint=tools_fingerprint,
200 logger=logger)
201 sources_list_lines, trusted_keys = (
202diff --git a/lib/lp/soyuz/model/archive.py b/lib/lp/soyuz/model/archive.py
203index c3cbaa1..f6ae7b7 100644
204--- a/lib/lp/soyuz/model/archive.py
205+++ b/lib/lp/soyuz/model/archive.py
206@@ -1100,7 +1100,8 @@ class Archive(SQLBase):
207 source_package_name, dep_name):
208 """See `IArchive`."""
209 deps = expand_dependencies(
210- self, distro_arch_series, pocket, component, source_package_name)
211+ self, distro_arch_series, pocket, component, source_package_name,
212+ self.dependencies)
213 archive_clause = Or([And(
214 BinaryPackagePublishingHistory.archiveID == archive.id,
215 BinaryPackagePublishingHistory.pocket == pocket,

Subscribers

People subscribed via source and target branches

to status/vote changes: