Merge ~cjwatson/launchpad:dispatch-builder-constraints into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 944c380393349dde80fdc1384d4ef9a8e498ee67
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:dispatch-builder-constraints
Merge into: launchpad:master
Diff against target: 255 lines (+39/-1)
10 files modified
lib/lp/buildmaster/interfaces/buildfarmjobbehaviour.py (+3/-1)
lib/lp/buildmaster/model/buildfarmjobbehaviour.py (+4/-0)
lib/lp/charms/tests/test_charmrecipebuildbehaviour.py (+2/-0)
lib/lp/code/model/tests/test_cibuildbehaviour.py (+15/-0)
lib/lp/code/model/tests/test_recipebuilder.py (+3/-0)
lib/lp/oci/tests/test_ocirecipebuildbehaviour.py (+3/-0)
lib/lp/snappy/tests/test_snapbuildbehaviour.py (+6/-0)
lib/lp/soyuz/tests/test_binarypackagebuildbehaviour.py (+1/-0)
lib/lp/soyuz/tests/test_livefsbuildbehaviour.py (+1/-0)
lib/lp/translations/tests/test_translationtemplatesbuildbehaviour.py (+1/-0)
Reviewer Review Type Date Requested Status
Jürgen Gmach Approve
Review via email: mp+434712@code.launchpad.net

Commit message

Dispatch builder constraints to builders

Description of the change

It seems reasonable to tell the builder which constraints the build has requested. There are some concrete GPU-related situations where this will be useful, since we'll need to set up LXD containers in particular ways.

To post a comment you must log in.
Revision history for this message
Jürgen Gmach (jugmac00) :
review: Approve
Revision history for this message
Colin Watson (cjwatson) :
Revision history for this message
Colin Watson (cjwatson) :
Revision history for this message
Jürgen Gmach (jugmac00) :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/buildmaster/interfaces/buildfarmjobbehaviour.py b/lib/lp/buildmaster/interfaces/buildfarmjobbehaviour.py
2index 9f847a7..0ef7da0 100644
3--- a/lib/lp/buildmaster/interfaces/buildfarmjobbehaviour.py
4+++ b/lib/lp/buildmaster/interfaces/buildfarmjobbehaviour.py
5@@ -8,7 +8,7 @@ __all__ = [
6 "IBuildFarmJobBehaviour",
7 ]
8
9-from typing import Any, Dict, Generator, List, Union
10+from typing import Any, Dict, Generator, List, Tuple, Union
11
12 from typing_extensions import TypedDict
13 from zope.interface import Attribute, Interface
14@@ -71,6 +71,8 @@ BuildArgs = TypedDict(
15 "build_source_tarball": bool,
16 # The URL of this build.
17 "build_url": str,
18+ # Builder resource tags required by this build farm job.
19+ "builder_constraints": Tuple[str],
20 # Source snap channels to use for this build [charm, ci, snap].
21 "channels": Dict[str, str],
22 # The date stamp to set in the built image [livefs].
23diff --git a/lib/lp/buildmaster/model/buildfarmjobbehaviour.py b/lib/lp/buildmaster/model/buildfarmjobbehaviour.py
24index e2bc1d8..15b860e 100644
25--- a/lib/lp/buildmaster/model/buildfarmjobbehaviour.py
26+++ b/lib/lp/buildmaster/model/buildfarmjobbehaviour.py
27@@ -18,6 +18,7 @@ import transaction
28 from twisted.internet import defer
29 from twisted.web import xmlrpc
30 from zope.component import getUtility
31+from zope.security.proxy import removeSecurityProxy
32
33 from lp.buildmaster.enums import (
34 BuildBaseImageType,
35@@ -100,6 +101,9 @@ class BuildFarmJobBehaviourBase:
36 "arch_tag": self.distro_arch_series.architecturetag,
37 "archive_private": self.archive.private,
38 "build_url": canonical_url(self.build),
39+ "builder_constraints": removeSecurityProxy(
40+ self.build.builder_constraints
41+ ),
42 "fast_cleanup": self._builder.virtualized,
43 "series": self.distro_arch_series.distroseries.name,
44 }
45diff --git a/lib/lp/charms/tests/test_charmrecipebuildbehaviour.py b/lib/lp/charms/tests/test_charmrecipebuildbehaviour.py
46index 045b416..9f21dcf 100644
47--- a/lib/lp/charms/tests/test_charmrecipebuildbehaviour.py
48+++ b/lib/lp/charms/tests/test_charmrecipebuildbehaviour.py
49@@ -304,6 +304,7 @@ class TestAsyncCharmRecipeBuildBehaviour(
50 "archives": Equals(expected_archives),
51 "arch_tag": Equals("i386"),
52 "build_url": Equals(canonical_url(job.build)),
53+ "builder_constraints": Is(None),
54 "channels": Equals({}),
55 "fast_cleanup": Is(True),
56 "git_repository": Equals(ref.repository.git_https_url),
57@@ -345,6 +346,7 @@ class TestAsyncCharmRecipeBuildBehaviour(
58 "archives": Equals(expected_archives),
59 "arch_tag": Equals("i386"),
60 "build_url": Equals(canonical_url(job.build)),
61+ "builder_constraints": Is(None),
62 "channels": Equals({}),
63 "fast_cleanup": Is(True),
64 "git_repository": Equals(ref.repository.git_https_url),
65diff --git a/lib/lp/code/model/tests/test_cibuildbehaviour.py b/lib/lp/code/model/tests/test_cibuildbehaviour.py
66index 20c85c2..52b3139 100644
67--- a/lib/lp/code/model/tests/test_cibuildbehaviour.py
68+++ b/lib/lp/code/model/tests/test_cibuildbehaviour.py
69@@ -299,6 +299,7 @@ class TestAsyncCIBuildBehaviour(StatsMixin, TestCIBuildBehaviourBase):
70 "archives": Equals(expected_archives),
71 "arch_tag": Equals("i386"),
72 "build_url": Equals(canonical_url(job.build)),
73+ "builder_constraints": Is(None),
74 "fast_cleanup": Is(True),
75 "git_path": Equals(job.build.commit_sha1),
76 "git_repository": Equals(
77@@ -434,6 +435,7 @@ class TestAsyncCIBuildBehaviour(StatsMixin, TestCIBuildBehaviourBase):
78 "archives": Equals(expected_archives),
79 "arch_tag": Equals("i386"),
80 "build_url": Equals(canonical_url(job.build)),
81+ "builder_constraints": Is(None),
82 "fast_cleanup": Is(True),
83 "git_path": Equals(job.build.commit_sha1),
84 "git_repository": Equals(
85@@ -608,6 +610,7 @@ class TestAsyncCIBuildBehaviour(StatsMixin, TestCIBuildBehaviourBase):
86 "archives": Equals(expected_archives),
87 "arch_tag": Equals("i386"),
88 "build_url": Equals(canonical_url(job.build)),
89+ "builder_constraints": Is(None),
90 "fast_cleanup": Is(True),
91 "git_path": Equals(job.build.commit_sha1),
92 "git_repository": AfterPreprocessing(
93@@ -652,6 +655,18 @@ class TestAsyncCIBuildBehaviour(StatsMixin, TestCIBuildBehaviourBase):
94 )
95
96 @defer.inlineCallbacks
97+ def test_extraBuildArgs_builder_constraints(self):
98+ git_repository = self.factory.makeGitRepository(
99+ builder_constraints=["gpu"]
100+ )
101+ job = self.makeJob(
102+ stages=[[("test", 0)]], git_repository=git_repository
103+ )
104+ with dbuser(config.builddmaster.dbuser):
105+ args = yield job.extraBuildArgs()
106+ self.assertEqual(["gpu"], args["builder_constraints"])
107+
108+ @defer.inlineCallbacks
109 def test_composeBuildRequest_proxy_url_set(self):
110 job = self.makeJob()
111 build_request = yield job.composeBuildRequest(None)
112diff --git a/lib/lp/code/model/tests/test_recipebuilder.py b/lib/lp/code/model/tests/test_recipebuilder.py
113index 582443b..1fe01d9 100644
114--- a/lib/lp/code/model/tests/test_recipebuilder.py
115+++ b/lib/lp/code/model/tests/test_recipebuilder.py
116@@ -212,6 +212,7 @@ class TestAsyncRecipeBuilder(TestRecipeBuilderBase):
117 "author_email": "requester@ubuntu.com",
118 "author_name": "Joe User",
119 "build_url": canonical_url(job.build),
120+ "builder_constraints": None,
121 "distroseries_name": job.build.distroseries.name,
122 "fast_cleanup": True,
123 "ogrecomponent": "universe",
124@@ -314,6 +315,7 @@ class TestAsyncRecipeBuilder(TestRecipeBuilderBase):
125 "author_email": "requester@ubuntu.com",
126 "author_name": "Joe User",
127 "build_url": canonical_url(job.build),
128+ "builder_constraints": None,
129 "distroseries_name": job.build.distroseries.name,
130 "fast_cleanup": True,
131 "ogrecomponent": "universe",
132@@ -363,6 +365,7 @@ class TestAsyncRecipeBuilder(TestRecipeBuilderBase):
133 "author_email": "requester@ubuntu.com",
134 "author_name": "Joe User",
135 "build_url": canonical_url(job.build),
136+ "builder_constraints": None,
137 "distroseries_name": job.build.distroseries.name,
138 "fast_cleanup": True,
139 "git": True,
140diff --git a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
141index 2388df3..9897717 100644
142--- a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
143+++ b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
144@@ -498,6 +498,7 @@ class TestAsyncOCIRecipeBuildBehaviour(
145 ),
146 "build_path": Equals(job.build.recipe.build_path),
147 "build_url": Equals(canonical_url(job.build)),
148+ "builder_constraints": Is(None),
149 "fast_cleanup": Is(True),
150 "git_repository": Equals(ref.repository.git_https_url),
151 "git_path": Equals(ref.name),
152@@ -573,6 +574,7 @@ class TestAsyncOCIRecipeBuildBehaviour(
153 ),
154 "build_path": Equals(job.build.recipe.build_path),
155 "build_url": Equals(canonical_url(job.build)),
156+ "builder_constraints": Is(None),
157 "fast_cleanup": Is(True),
158 "git_repository": AfterPreprocessing(
159 urlsplit,
160@@ -660,6 +662,7 @@ class TestAsyncOCIRecipeBuildBehaviour(
161 ),
162 "build_path": Equals(job.build.recipe.build_path),
163 "build_url": Equals(canonical_url(job.build)),
164+ "builder_constraints": Is(None),
165 "fast_cleanup": Is(True),
166 "git_repository": Equals(ref.repository.git_https_url),
167 "name": Equals(job.build.recipe.name),
168diff --git a/lib/lp/snappy/tests/test_snapbuildbehaviour.py b/lib/lp/snappy/tests/test_snapbuildbehaviour.py
169index 5d76217..054df94 100644
170--- a/lib/lp/snappy/tests/test_snapbuildbehaviour.py
171+++ b/lib/lp/snappy/tests/test_snapbuildbehaviour.py
172@@ -404,6 +404,7 @@ class TestAsyncSnapBuildBehaviour(StatsMixin, TestSnapBuildBehaviourBase):
173 "branch": Equals(branch.bzr_identity),
174 "build_source_tarball": Is(False),
175 "build_url": Equals(canonical_url(job.build)),
176+ "builder_constraints": Is(None),
177 "fast_cleanup": Is(True),
178 "name": Equals("test-snap"),
179 "private": Is(False),
180@@ -454,6 +455,7 @@ class TestAsyncSnapBuildBehaviour(StatsMixin, TestSnapBuildBehaviourBase):
181 "arch_tag": Equals("i386"),
182 "build_source_tarball": Is(False),
183 "build_url": Equals(canonical_url(job.build)),
184+ "builder_constraints": Is(None),
185 "fast_cleanup": Is(True),
186 "git_repository": Equals(ref.repository.git_https_url),
187 "git_path": Equals(ref.name),
188@@ -496,6 +498,7 @@ class TestAsyncSnapBuildBehaviour(StatsMixin, TestSnapBuildBehaviourBase):
189 "arch_tag": Equals("i386"),
190 "build_source_tarball": Is(False),
191 "build_url": Equals(canonical_url(job.build)),
192+ "builder_constraints": Is(None),
193 "fast_cleanup": Is(True),
194 "git_repository": Equals(ref.repository.git_https_url),
195 "name": Equals("test-snap"),
196@@ -543,6 +546,7 @@ class TestAsyncSnapBuildBehaviour(StatsMixin, TestSnapBuildBehaviourBase):
197 "arch_tag": Equals("i386"),
198 "build_source_tarball": Is(False),
199 "build_url": Equals(canonical_url(job.build)),
200+ "builder_constraints": Is(None),
201 "fast_cleanup": Is(True),
202 "git_repository": AfterPreprocessing(
203 urlsplit,
204@@ -612,6 +616,7 @@ class TestAsyncSnapBuildBehaviour(StatsMixin, TestSnapBuildBehaviourBase):
205 "arch_tag": Equals("i386"),
206 "build_source_tarball": Is(False),
207 "build_url": Equals(canonical_url(job.build)),
208+ "builder_constraints": Is(None),
209 "fast_cleanup": Is(True),
210 "git_repository": Equals(url),
211 "git_path": Equals("master"),
212@@ -654,6 +659,7 @@ class TestAsyncSnapBuildBehaviour(StatsMixin, TestSnapBuildBehaviourBase):
213 "arch_tag": Equals("i386"),
214 "build_source_tarball": Is(False),
215 "build_url": Equals(canonical_url(job.build)),
216+ "builder_constraints": Is(None),
217 "fast_cleanup": Is(True),
218 "git_repository": Equals(url),
219 "name": Equals("test-snap"),
220diff --git a/lib/lp/soyuz/tests/test_binarypackagebuildbehaviour.py b/lib/lp/soyuz/tests/test_binarypackagebuildbehaviour.py
221index 8af763b..581b5b6 100644
222--- a/lib/lp/soyuz/tests/test_binarypackagebuildbehaviour.py
223+++ b/lib/lp/soyuz/tests/test_binarypackagebuildbehaviour.py
224@@ -167,6 +167,7 @@ class TestBinaryBuildPackageBehaviour(StatsMixin, TestCaseWithFactory):
225 "archives": archives,
226 "build_debug_symbols": archive.build_debug_symbols,
227 "build_url": canonical_url(build),
228+ "builder_constraints": None,
229 "distribution": das.distroseries.distribution.name,
230 "fast_cleanup": builder.virtualized,
231 "image_type": "chroot",
232diff --git a/lib/lp/soyuz/tests/test_livefsbuildbehaviour.py b/lib/lp/soyuz/tests/test_livefsbuildbehaviour.py
233index 25d759b..42e736b 100644
234--- a/lib/lp/soyuz/tests/test_livefsbuildbehaviour.py
235+++ b/lib/lp/soyuz/tests/test_livefsbuildbehaviour.py
236@@ -208,6 +208,7 @@ class TestAsyncLiveFSBuildBehaviour(TestLiveFSBuildBehaviourBase):
237 "archives": expected_archives,
238 "arch_tag": "i386",
239 "build_url": canonical_url(job.build),
240+ "builder_constraints": None,
241 "datestamp": "20140425-103800",
242 "fast_cleanup": True,
243 "pocket": "release",
244diff --git a/lib/lp/translations/tests/test_translationtemplatesbuildbehaviour.py b/lib/lp/translations/tests/test_translationtemplatesbuildbehaviour.py
245index ef9d543..be9c1cd 100644
246--- a/lib/lp/translations/tests/test_translationtemplatesbuildbehaviour.py
247+++ b/lib/lp/translations/tests/test_translationtemplatesbuildbehaviour.py
248@@ -113,6 +113,7 @@ class TestTranslationTemplatesBuildBehaviour(
249 "archive_private": False,
250 "branch_url": behaviour.build.branch.composePublicURL(),
251 "build_url": canonical_url(behaviour.build),
252+ "builder_constraints": None,
253 "fast_cleanup": True,
254 "series": das.distroseries.name,
255 },

Subscribers

People subscribed via source and target branches

to status/vote changes: