Merge lp:~cjwatson/launchpad-buildd/rename-slave-classes into lp:launchpad-buildd
- rename-slave-classes
- Merge into trunk
Proposed by
Colin Watson
Status: | Merged |
---|---|
Merged at revision: | 366 |
Proposed branch: | lp:~cjwatson/launchpad-buildd/rename-slave-classes |
Merge into: | lp:launchpad-buildd |
Prerequisite: | lp:~cjwatson/launchpad-buildd/rename-register-builder |
Diff against target: |
914 lines (+144/-146) 10 files modified
debian/changelog (+1/-0) lpbuildd/binarypackage.py (+8/-8) lpbuildd/buildd-slave.tac (+19/-20) lpbuildd/builder.py (+66/-66) lpbuildd/debian.py (+22/-25) lpbuildd/livefs.py (+2/-2) lpbuildd/snap.py (+7/-7) lpbuildd/sourcepackagerecipe.py (+8/-8) lpbuildd/tests/harness.py (+3/-3) lpbuildd/translationtemplates.py (+8/-7) |
To merge this branch: | bzr merge lp:~cjwatson/launchpad-buildd/rename-slave-classes |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
William Grant | code | Approve | |
Review via email: mp+363046@code.launchpad.net |
Commit message
Rename BuildDSlave to Builder and XMLRPCBuildDSlave to XMLRPCBuilder.
Description of the change
To post a comment you must log in.
Revision history for this message
William Grant (wgrant) : | # |
review:
Approve
(code)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'debian/changelog' |
2 | --- debian/changelog 2019-02-11 12:22:42 +0000 |
3 | +++ debian/changelog 2019-02-12 10:36:12 +0000 |
4 | @@ -6,6 +6,7 @@ |
5 | for core16 and core18. |
6 | * Move /usr/share/launchpad-buildd/slavebin to |
7 | /usr/share/launchpad-buildd/bin. |
8 | + * Rename BuildDSlave to Builder and XMLRPCBuildDSlave to XMLRPCBuilder. |
9 | |
10 | -- Colin Watson <cjwatson@ubuntu.com> Fri, 08 Feb 2019 15:09:35 +0000 |
11 | |
12 | |
13 | === modified file 'lpbuildd/binarypackage.py' |
14 | --- lpbuildd/binarypackage.py 2019-02-11 12:22:42 +0000 |
15 | +++ lpbuildd/binarypackage.py 2019-02-12 10:36:12 +0000 |
16 | @@ -92,8 +92,8 @@ |
17 | |
18 | initial_build_state = BinaryPackageBuildState.SBUILD |
19 | |
20 | - def __init__(self, slave, buildid, **kwargs): |
21 | - DebianBuildManager.__init__(self, slave, buildid, **kwargs) |
22 | + def __init__(self, builder, buildid, **kwargs): |
23 | + DebianBuildManager.__init__(self, builder, buildid, **kwargs) |
24 | self._sbuildpath = os.path.join(self._bin, "sbuild-package") |
25 | |
26 | @property |
27 | @@ -334,9 +334,9 @@ |
28 | unsat_deps.append(or_dep) |
29 | return self.stripDependencies(unsat_deps) |
30 | except Exception: |
31 | - self._slave.log("Failed to analyse dep-wait:\n") |
32 | + self._builder.log("Failed to analyse dep-wait:\n") |
33 | for line in traceback.format_exc().splitlines(True): |
34 | - self._slave.log(line) |
35 | + self._builder.log(line) |
36 | return None |
37 | |
38 | def iterate_SBUILD(self, success): |
39 | @@ -400,17 +400,17 @@ |
40 | if missing_dep is not None: |
41 | print("Returning build status: DEPFAIL") |
42 | print("Dependencies: " + missing_dep) |
43 | - self._slave.depFail(missing_dep) |
44 | + self._builder.depFail(missing_dep) |
45 | elif success == SBuildExitCodes.GIVENBACK: |
46 | print("Returning build status: GIVENBACK") |
47 | - self._slave.giveBack() |
48 | + self._builder.giveBack() |
49 | elif success == SBuildExitCodes.FAILED: |
50 | print("Returning build status: PACKAGEFAIL") |
51 | - self._slave.buildFail() |
52 | + self._builder.buildFail() |
53 | elif success >= SBuildExitCodes.BUILDERFAIL: |
54 | # anything else is assumed to be a buildd failure |
55 | print("Returning build status: BUILDERFAIL") |
56 | - self._slave.builderFail() |
57 | + self._builder.builderFail() |
58 | self.alreadyfailed = True |
59 | self.doReapProcesses(self._state) |
60 | |
61 | |
62 | === modified file 'lpbuildd/buildd-slave.tac' |
63 | --- lpbuildd/buildd-slave.tac 2019-02-12 10:36:11 +0000 |
64 | +++ lpbuildd/buildd-slave.tac 2019-02-12 10:36:12 +0000 |
65 | @@ -1,8 +1,7 @@ |
66 | # Copyright 2009-2011 Canonical Ltd. This software is licensed under the |
67 | # GNU Affero General Public License version 3 (see the file LICENSE). |
68 | |
69 | -# Buildd Slave implementation |
70 | -# XXX: dsilvers: 2005/01/21: Currently everything logged in the slave gets |
71 | +# XXX: dsilvers: 2005/01/21: Currently everything logged in the builder gets |
72 | # passed through to the twistd log too. this could get dangerous/big |
73 | |
74 | try: |
75 | @@ -23,9 +22,9 @@ |
76 | ) |
77 | |
78 | from lpbuildd.binarypackage import BinaryPackageBuildManager |
79 | +from lpbuildd.builder import XMLRPCBuilder |
80 | from lpbuildd.livefs import LiveFilesystemBuildManager |
81 | from lpbuildd.log import RotatableFileLogObserver |
82 | -from lpbuildd.slave import XMLRPCBuildDSlave |
83 | from lpbuildd.snap import SnapBuildManager |
84 | from lpbuildd.sourcepackagerecipe import SourcePackageRecipeBuildManager |
85 | from lpbuildd.translationtemplates import TranslationTemplatesBuildManager |
86 | @@ -38,31 +37,31 @@ |
87 | |
88 | conf = SafeConfigParser() |
89 | conf.read(conffile) |
90 | -slave = XMLRPCBuildDSlave(conf) |
91 | +builder = XMLRPCBuilder(conf) |
92 | |
93 | -slave.registerManager(BinaryPackageBuildManager, "binarypackage") |
94 | -slave.registerManager(SourcePackageRecipeBuildManager, "sourcepackagerecipe") |
95 | -slave.registerManager( |
96 | +builder.registerManager(BinaryPackageBuildManager, "binarypackage") |
97 | +builder.registerManager(SourcePackageRecipeBuildManager, "sourcepackagerecipe") |
98 | +builder.registerManager( |
99 | TranslationTemplatesBuildManager, 'translation-templates') |
100 | -slave.registerManager(LiveFilesystemBuildManager, "livefs") |
101 | -slave.registerManager(SnapBuildManager, "snap") |
102 | +builder.registerManager(LiveFilesystemBuildManager, "livefs") |
103 | +builder.registerManager(SnapBuildManager, "snap") |
104 | |
105 | -application = service.Application('BuildDSlave') |
106 | +application = service.Application('Builder') |
107 | application.addComponent( |
108 | RotatableFileLogObserver(options.get('logfile')), ignoreClass=1) |
109 | -builddslaveService = service.IServiceCollection(application) |
110 | -slave.slave.service = builddslaveService |
111 | +builderService = service.IServiceCollection(application) |
112 | +builder.builder.service = builderService |
113 | |
114 | root = resource.Resource() |
115 | -root.putChild('rpc', slave) |
116 | +root.putChild('rpc', builder) |
117 | root.putChild('filecache', static.File(conf.get('slave', 'filecache'))) |
118 | -slavesite = server.Site(root) |
119 | - |
120 | -strports.service("tcp:%s" % slave.slave._config.get("slave", "bindport"), |
121 | - slavesite).setServiceParent(builddslaveService) |
122 | - |
123 | -# You can interact with a running slave like this: |
124 | -# (assuming the slave is on localhost:8221) |
125 | +buildersite = server.Site(root) |
126 | + |
127 | +strports.service("tcp:%s" % builder.builder._config.get("slave", "bindport"), |
128 | + buildersite).setServiceParent(builderService) |
129 | + |
130 | +# You can interact with a running builder like this: |
131 | +# (assuming the builder is on localhost:8221) |
132 | # |
133 | # python3 |
134 | # from xmlrpc.client import ServerProxy |
135 | |
136 | === renamed file 'lpbuildd/slave.py' => 'lpbuildd/builder.py' |
137 | --- lpbuildd/slave.py 2019-02-12 10:36:11 +0000 |
138 | +++ lpbuildd/builder.py 2019-02-12 10:36:12 +0000 |
139 | @@ -75,10 +75,10 @@ |
140 | # |
141 | # when we start using Twisted 2.0. |
142 | class RunCapture(protocol.ProcessProtocol): |
143 | - """Run a command and capture its output to a slave's log""" |
144 | + """Run a command and capture its output to a builder's log.""" |
145 | |
146 | - def __init__(self, slave, callback, stdin=None): |
147 | - self.slave = slave |
148 | + def __init__(self, builder, callback, stdin=None): |
149 | + self.builder = builder |
150 | self.notify = callback |
151 | self.stdin = stdin |
152 | self.builderFailCall = None |
153 | @@ -92,13 +92,13 @@ |
154 | |
155 | def outReceived(self, data): |
156 | """Pass on stdout data to the log.""" |
157 | - self.slave.log(data) |
158 | + self.builder.log(data) |
159 | |
160 | def errReceived(self, data): |
161 | """Pass on stderr data to the log. |
162 | |
163 | With a bit of luck we won't interleave horribly.""" |
164 | - self.slave.log(data) |
165 | + self.builder.log(data) |
166 | |
167 | def processEnded(self, statusobject): |
168 | """This method is called when a child process got terminated. |
169 | @@ -115,29 +115,29 @@ |
170 | if self.builderFailCall and self.builderFailCall.active(): |
171 | self.builderFailCall.cancel() |
172 | |
173 | - # notify the slave, it'll perform the required actions |
174 | + # notify the builder, it'll perform the required actions |
175 | if self.notify is not None: |
176 | self.notify(statusobject.value.exitCode) |
177 | |
178 | |
179 | class BuildManager(object): |
180 | - """Build Daemon slave build manager abstract parent""" |
181 | + """Build manager abstract parent.""" |
182 | |
183 | backend_name = "chroot" |
184 | |
185 | - def __init__(self, slave, buildid, reactor=None): |
186 | + def __init__(self, builder, buildid, reactor=None): |
187 | """Create a BuildManager. |
188 | |
189 | - :param slave: A `BuildDSlave`. |
190 | + :param builder: A `Builder`. |
191 | :param buildid: Identifying string for this build. |
192 | """ |
193 | object.__init__(self) |
194 | self._buildid = buildid |
195 | - self._slave = slave |
196 | + self._builder = builder |
197 | if reactor is None: |
198 | reactor = default_reactor |
199 | self._reactor = reactor |
200 | - self._sharepath = slave._config.get("slave", "sharepath") |
201 | + self._sharepath = builder._config.get("slave", "sharepath") |
202 | self._bin = os.path.join(self._sharepath, "bin") |
203 | self._preppath = os.path.join(self._bin, "builder-prep") |
204 | self._intargetpath = os.path.join(self._bin, "in-target") |
205 | @@ -155,8 +155,8 @@ |
206 | """Run a subprocess capturing the results in the log.""" |
207 | if iterate is None: |
208 | iterate = self.iterate |
209 | - self._subprocess = RunCapture(self._slave, iterate, stdin=stdin) |
210 | - self._slave.log("RUN: %s %s\n" % ( |
211 | + self._subprocess = RunCapture(self._builder, iterate, stdin=stdin) |
212 | + self._builder.log("RUN: %s %s\n" % ( |
213 | command, " ".join(shell_escape(arg) for arg in args[1:]))) |
214 | childfds = { |
215 | 0: devnull.fileno() if stdin is None else "w", |
216 | @@ -191,7 +191,7 @@ |
217 | if state is not None and state in self._reaped_states: |
218 | # We've already reaped this state. To avoid a loop, proceed |
219 | # immediately to the next iterator. |
220 | - self._slave.log("Already reaped from state %s...\n" % state) |
221 | + self._builder.log("Already reaped from state %s...\n" % state) |
222 | if notify: |
223 | self.iterateReap(state, 0) |
224 | else: |
225 | @@ -211,7 +211,7 @@ |
226 | # Sanitize the URLs in the buildlog file if this is a build |
227 | # in a private archive. |
228 | if self.needs_sanitized_logs: |
229 | - self._slave.sanitizeBuildlog(self._slave.cachePath("buildlog")) |
230 | + self._builder.sanitizeBuildlog(self._builder.cachePath("buildlog")) |
231 | |
232 | if self.fast_cleanup: |
233 | self.iterate(0, quiet=True) |
234 | @@ -235,18 +235,18 @@ |
235 | evaluates to True the build at hand is for a private archive. |
236 | """ |
237 | if 'build_url' in extra_args: |
238 | - self._slave.log("%s\n" % extra_args['build_url']) |
239 | + self._builder.log("%s\n" % extra_args['build_url']) |
240 | |
241 | os.mkdir("%s/build-%s" % (self.home, self._buildid)) |
242 | for f in files: |
243 | - os.symlink( self._slave.cachePath(files[f]), |
244 | + os.symlink( self._builder.cachePath(files[f]), |
245 | "%s/build-%s/%s" % (self.home, |
246 | self._buildid, f)) |
247 | - self._chroottarfile = self._slave.cachePath(chroot) |
248 | + self._chroottarfile = self._builder.cachePath(chroot) |
249 | |
250 | self.image_type = extra_args.get('image_type', 'chroot') |
251 | self.series = extra_args['series'] |
252 | - self.arch_tag = extra_args.get('arch_tag', self._slave.getArch()) |
253 | + self.arch_tag = extra_args.get('arch_tag', self._builder.getArch()) |
254 | self.fast_cleanup = extra_args.get('fast_cleanup', False) |
255 | |
256 | # Check whether this is a build in a private archive and |
257 | @@ -271,7 +271,7 @@ |
258 | return {} |
259 | |
260 | def iterate(self, success, quiet=False): |
261 | - """Perform an iteration of the slave. |
262 | + """Perform an iteration of the builder. |
263 | |
264 | The BuildManager tends to work by invoking several |
265 | subprocesses in order. the iterate method is called by the |
266 | @@ -282,7 +282,7 @@ |
267 | "used") |
268 | |
269 | def iterateReap(self, state, success): |
270 | - """Perform an iteration of the slave following subprocess reaping. |
271 | + """Perform an iteration of the builder following subprocess reaping. |
272 | |
273 | Subprocess reaping is special, typically occurring at several |
274 | positions in a build manager's state machine. We therefore keep |
275 | @@ -321,9 +321,9 @@ |
276 | |
277 | def builderFail(self, reason, primary_subprocess): |
278 | """Mark the builder as failed.""" |
279 | - self._slave.log("ABORTING: %s\n" % reason) |
280 | + self._builder.log("ABORTING: %s\n" % reason) |
281 | self._subprocess.builderFailCall = None |
282 | - self._slave.builderFail() |
283 | + self._builder.builderFail() |
284 | self.alreadyfailed = True |
285 | # If we failed to kill all processes in the chroot, then the primary |
286 | # subprocess (i.e. the one running immediately before |
287 | @@ -332,7 +332,7 @@ |
288 | try: |
289 | primary_subprocess.transport.signalProcess('KILL') |
290 | except process.ProcessExitedAlready: |
291 | - self._slave.log("ABORTING: Process Exited Already\n") |
292 | + self._builder.log("ABORTING: Process Exited Already\n") |
293 | primary_subprocess.transport.loseConnection() |
294 | # Leave the reaper running, but disconnect it from our state |
295 | # machine. Perhaps an admin can make something of it, and in any |
296 | @@ -346,7 +346,7 @@ |
297 | try: |
298 | fetched_path = os.path.join(fetched_dir, os.path.basename(path)) |
299 | self.backend.copy_out(path, fetched_path) |
300 | - self._slave.addWaitingFile(fetched_path) |
301 | + self._builder.addWaitingFile(fetched_path) |
302 | finally: |
303 | shutil.rmtree(fetched_dir) |
304 | |
305 | @@ -375,10 +375,8 @@ |
306 | ABORTED = "BuildStatus.ABORTED" |
307 | |
308 | |
309 | -class BuildDSlave(object): |
310 | - """Build Daemon slave. Implementation of most needed functions |
311 | - for a Build-Slave device. |
312 | - """ |
313 | +class Builder(object): |
314 | + """The core of a builder.""" |
315 | |
316 | def __init__(self, config): |
317 | object.__init__(self) |
318 | @@ -395,7 +393,7 @@ |
319 | raise ValueError("FileCache path is not a dir") |
320 | |
321 | def getArch(self): |
322 | - """Return the Architecture tag for the slave.""" |
323 | + """Return the Architecture tag for the builder.""" |
324 | return self._config.get("slave","architecturetag") |
325 | |
326 | def cachePath(self, file): |
327 | @@ -423,7 +421,7 @@ |
328 | """Ensure we have the file with the checksum specified. |
329 | |
330 | Optionally you can provide the librarian URL and |
331 | - the build slave will fetch the file if it doesn't have it. |
332 | + the builder will fetch the file if it doesn't have it. |
333 | Return a tuple containing: (<present>, <info>) |
334 | """ |
335 | extra_info = 'No URL' |
336 | @@ -497,19 +495,19 @@ |
337 | if self.builderstatus == BuilderStatus.ABORTING: |
338 | # This might happen if the master side restarts in the middle of |
339 | # an abort cycle. |
340 | - self.log("Slave already ABORTING when asked to abort") |
341 | + self.log("Builder already ABORTING when asked to abort") |
342 | return |
343 | if self.builderstatus != BuilderStatus.BUILDING: |
344 | # XXX: Should raise a known Fault so that the client can make |
345 | # useful decisions about the error! |
346 | - raise ValueError("Slave is not BUILDING when asked to abort") |
347 | + raise ValueError("Builder is not BUILDING when asked to abort") |
348 | self.manager.abort() |
349 | self.builderstatus = BuilderStatus.ABORTING |
350 | |
351 | def clean(self): |
352 | """Clean up pending files and reset the internal build state.""" |
353 | if self.builderstatus != BuilderStatus.WAITING: |
354 | - raise ValueError('Slave is not WAITING when asked to clean') |
355 | + raise ValueError('Builder is not WAITING when asked to clean') |
356 | for f in set(self.waitingfiles.values()): |
357 | os.remove(self.cachePath(f)) |
358 | self.builderstatus = BuilderStatus.IDLE |
359 | @@ -587,7 +585,8 @@ |
360 | def startBuild(self, manager): |
361 | """Start a build with the provided BuildManager instance.""" |
362 | if self.builderstatus != BuilderStatus.IDLE: |
363 | - raise ValueError("Slave is not IDLE when asked to start building") |
364 | + raise ValueError( |
365 | + "Builder is not IDLE when asked to start building") |
366 | self.manager = manager |
367 | self.builderstatus = BuilderStatus.BUILDING |
368 | self.emptyLog() |
369 | @@ -602,8 +601,8 @@ |
370 | """Cease building because the builder has a problem.""" |
371 | if self.builderstatus not in (BuilderStatus.BUILDING, |
372 | BuilderStatus.ABORTING): |
373 | - raise ValueError("Slave is not BUILDING|ABORTING when set to " |
374 | - "BUILDERFAIL") |
375 | + raise ValueError( |
376 | + "Builder is not BUILDING|ABORTING when set to BUILDERFAIL") |
377 | self.buildstatus = BuildStatus.BUILDERFAIL |
378 | |
379 | def chrootFail(self): |
380 | @@ -613,38 +612,38 @@ |
381 | package. |
382 | """ |
383 | if self.builderstatus != BuilderStatus.BUILDING: |
384 | - raise ValueError("Slave is not BUILDING when set to CHROOTFAIL") |
385 | + raise ValueError("Builder is not BUILDING when set to CHROOTFAIL") |
386 | self.buildstatus = BuildStatus.CHROOTFAIL |
387 | |
388 | def buildFail(self): |
389 | """Cease building because the package failed to build.""" |
390 | if self.builderstatus != BuilderStatus.BUILDING: |
391 | - raise ValueError("Slave is not BUILDING when set to PACKAGEFAIL") |
392 | + raise ValueError("Builder is not BUILDING when set to PACKAGEFAIL") |
393 | self.buildstatus = BuildStatus.PACKAGEFAIL |
394 | |
395 | def buildOK(self): |
396 | """Having passed all possible failure states, mark a build as OK.""" |
397 | if self.builderstatus != BuilderStatus.BUILDING: |
398 | - raise ValueError("Slave is not BUILDING when set to OK") |
399 | + raise ValueError("Builder is not BUILDING when set to OK") |
400 | self.buildstatus = BuildStatus.OK |
401 | |
402 | def depFail(self, dependencies): |
403 | """Cease building due to a dependency issue.""" |
404 | if self.builderstatus != BuilderStatus.BUILDING: |
405 | - raise ValueError("Slave is not BUILDING when set to DEPFAIL") |
406 | + raise ValueError("Builder is not BUILDING when set to DEPFAIL") |
407 | self.buildstatus = BuildStatus.DEPFAIL |
408 | self.builddependencies = dependencies |
409 | |
410 | def giveBack(self): |
411 | """Give-back package due to a transient buildd/archive issue.""" |
412 | if self.builderstatus != BuilderStatus.BUILDING: |
413 | - raise ValueError("Slave is not BUILDING when set to GIVENBACK") |
414 | + raise ValueError("Builder is not BUILDING when set to GIVENBACK") |
415 | self.buildstatus = BuildStatus.GIVENBACK |
416 | |
417 | def buildAborted(self): |
418 | """Mark a build as aborted.""" |
419 | if self.builderstatus != BuilderStatus.ABORTING: |
420 | - raise ValueError("Slave is not ABORTING when set to ABORTED") |
421 | + raise ValueError("Builder is not ABORTING when set to ABORTED") |
422 | if self.buildstatus != BuildStatus.BUILDERFAIL: |
423 | self.buildstatus = BuildStatus.ABORTED |
424 | |
425 | @@ -658,8 +657,8 @@ |
426 | self.buildAborted() |
427 | self.builderstatus = BuilderStatus.WAITING |
428 | else: |
429 | - raise ValueError("Slave is not BUILDING|ABORTING when told build " |
430 | - "is complete") |
431 | + raise ValueError( |
432 | + "Builder is not BUILDING|ABORTING when told build is complete") |
433 | |
434 | def sanitizeBuildlog(self, log_path): |
435 | """Removes passwords from buildlog URLs. |
436 | @@ -699,8 +698,8 @@ |
437 | sanitized_file.close() |
438 | |
439 | |
440 | -class XMLRPCBuildDSlave(xmlrpc.XMLRPC): |
441 | - """XMLRPC build daemon slave management interface""" |
442 | +class XMLRPCBuilder(xmlrpc.XMLRPC): |
443 | + """XMLRPC builder management interface.""" |
444 | |
445 | def __init__(self, config): |
446 | xmlrpc.XMLRPC.__init__(self, allowNone=True) |
447 | @@ -709,7 +708,7 @@ |
448 | # implying the presence of /filecache/ /filecache/buildlog and |
449 | # the reduced and optimised XMLRPC interface. |
450 | self.protocolversion = '1.0' |
451 | - self.slave = BuildDSlave(config) |
452 | + self.builder = Builder(config) |
453 | self._managers = {} |
454 | cache = apt.Cache() |
455 | try: |
456 | @@ -728,7 +727,7 @@ |
457 | |
458 | def xmlrpc_info(self): |
459 | """Return the protocol version and the manager methods supported.""" |
460 | - return (self.protocolversion, self.slave.getArch(), |
461 | + return (self.protocolversion, self.builder.getArch(), |
462 | list(self._managers)) |
463 | |
464 | def xmlrpc_status(self): |
465 | @@ -737,7 +736,7 @@ |
466 | Depending on the builder status we return differing amounts of data, |
467 | but this always includes the builder status itself. |
468 | """ |
469 | - status = self.slave.builderstatus |
470 | + status = self.builder.builderstatus |
471 | statusname = status.split('.')[-1] |
472 | func = getattr(self, "status_" + statusname, None) |
473 | if func is None: |
474 | @@ -746,8 +745,8 @@ |
475 | if self._version is not None: |
476 | ret["builder_version"] = self._version |
477 | ret.update(func()) |
478 | - if self.slave.manager is not None: |
479 | - ret.update(self.slave.manager.status()) |
480 | + if self.builder.manager is not None: |
481 | + ret.update(self.builder.manager.status()) |
482 | return ret |
483 | |
484 | def status_IDLE(self): |
485 | @@ -759,7 +758,7 @@ |
486 | |
487 | Returns the build id and up to one kilobyte of log tail. |
488 | """ |
489 | - tail = self.slave.getLogTail() |
490 | + tail = self.builder.getLogTail() |
491 | return {"build_id": self.buildid, "logtail": Binary(tail)} |
492 | |
493 | def status_WAITING(self): |
494 | @@ -770,13 +769,13 @@ |
495 | and the build id but no file set. |
496 | """ |
497 | ret = { |
498 | - "build_status": self.slave.buildstatus, |
499 | + "build_status": self.builder.buildstatus, |
500 | "build_id": self.buildid, |
501 | } |
502 | - if self.slave.buildstatus in (BuildStatus.OK, BuildStatus.PACKAGEFAIL, |
503 | - BuildStatus.DEPFAIL): |
504 | - ret["filemap"] = self.slave.waitingfiles |
505 | - ret["dependencies"] = self.slave.builddependencies |
506 | + if self.builder.buildstatus in ( |
507 | + BuildStatus.OK, BuildStatus.PACKAGEFAIL, BuildStatus.DEPFAIL): |
508 | + ret["filemap"] = self.builder.waitingfiles |
509 | + ret["dependencies"] = self.builder.builddependencies |
510 | return ret |
511 | |
512 | def status_ABORTING(self): |
513 | @@ -790,16 +789,16 @@ |
514 | |
515 | def xmlrpc_ensurepresent(self, sha1sum, url, username, password): |
516 | """Attempt to ensure the given file is present.""" |
517 | - return self.slave.ensurePresent(sha1sum, url, username, password) |
518 | + return self.builder.ensurePresent(sha1sum, url, username, password) |
519 | |
520 | def xmlrpc_abort(self): |
521 | """Abort the current build.""" |
522 | - self.slave.abort() |
523 | + self.builder.abort() |
524 | return BuilderStatus.ABORTING |
525 | |
526 | def xmlrpc_clean(self): |
527 | - """Clean up the waiting files and reset the slave's internal state.""" |
528 | - self.slave.clean() |
529 | + """Clean up the waiting files and reset the builder's state.""" |
530 | + self.builder.clean() |
531 | return BuilderStatus.IDLE |
532 | |
533 | def xmlrpc_build(self, buildid, managertag, chrootsum, filemap, args): |
534 | @@ -813,7 +812,7 @@ |
535 | extra_info = "%s not in %r" % (managertag, list(self._managers)) |
536 | return (BuilderStatus.UNKNOWNBUILDER, extra_info) |
537 | # check requested chroot availability |
538 | - chroot_present, info = self.slave.ensurePresent(chrootsum) |
539 | + chroot_present, info = self.builder.ensurePresent(chrootsum) |
540 | if not chroot_present: |
541 | extra_info = """CHROOTSUM -> %s |
542 | ***** INFO ***** |
543 | @@ -823,7 +822,7 @@ |
544 | return (BuilderStatus.UNKNOWNSUM, extra_info) |
545 | # check requested files availability |
546 | for filesum in filemap.values(): |
547 | - file_present, info = self.slave.ensurePresent(filesum) |
548 | + file_present, info = self.builder.ensurePresent(filesum) |
549 | if not file_present: |
550 | extra_info = """FILESUM -> %s |
551 | ***** INFO ***** |
552 | @@ -838,6 +837,7 @@ |
553 | # builder is available, buildd is non empty, |
554 | # filelist is consistent, chrootsum is available, let's initiate... |
555 | self.buildid = buildid |
556 | - self.slave.startBuild(self._managers[managertag](self.slave, buildid)) |
557 | - self.slave.manager.initiate(filemap, chrootsum, args) |
558 | + self.builder.startBuild( |
559 | + self._managers[managertag](self.builder, buildid)) |
560 | + self.builder.manager.initiate(filemap, chrootsum, args) |
561 | return (BuilderStatus.BUILDING, buildid) |
562 | |
563 | === modified file 'lpbuildd/debian.py' |
564 | --- lpbuildd/debian.py 2018-10-19 06:41:14 +0000 |
565 | +++ lpbuildd/debian.py 2019-02-12 10:36:12 +0000 |
566 | @@ -4,8 +4,6 @@ |
567 | # Authors: Daniel Silverstone <daniel.silverstone@canonical.com> |
568 | # and Adam Conrad <adam.conrad@canonical.com> |
569 | |
570 | -# Buildd Slave sbuild manager implementation |
571 | - |
572 | __metaclass__ = type |
573 | |
574 | import base64 |
575 | @@ -19,9 +17,7 @@ |
576 | ) |
577 | from twisted.python import log |
578 | |
579 | -from lpbuildd.slave import ( |
580 | - BuildManager, |
581 | - ) |
582 | +from lpbuildd.builder import BuildManager |
583 | |
584 | |
585 | class DebianBuildState: |
586 | @@ -39,11 +35,11 @@ |
587 | class DebianBuildManager(BuildManager): |
588 | """Base behaviour for Debian chrooted builds.""" |
589 | |
590 | - def __init__(self, slave, buildid, **kwargs): |
591 | - BuildManager.__init__(self, slave, buildid, **kwargs) |
592 | - self._cachepath = slave._config.get("slave", "filecache") |
593 | + def __init__(self, builder, buildid, **kwargs): |
594 | + BuildManager.__init__(self, builder, buildid, **kwargs) |
595 | + self._cachepath = builder._config.get("slave", "filecache") |
596 | self._state = DebianBuildState.INIT |
597 | - slave.emptyLog() |
598 | + builder.emptyLog() |
599 | self.alreadyfailed = False |
600 | self._iterator = None |
601 | |
602 | @@ -110,12 +106,12 @@ |
603 | The primary file we care about is the .changes file. We key from there. |
604 | """ |
605 | path = self.getChangesFilename() |
606 | - self._slave.addWaitingFile(path) |
607 | + self._builder.addWaitingFile(path) |
608 | |
609 | chfile = open(path, "r") |
610 | try: |
611 | for fn in self._parseChangesFile(chfile): |
612 | - self._slave.addWaitingFile( |
613 | + self._builder.addWaitingFile( |
614 | get_build_path(self.home, self._buildid, fn)) |
615 | finally: |
616 | chfile.close() |
617 | @@ -127,11 +123,12 @@ |
618 | def failed_to_gather(failure): |
619 | if failure.check(defer.CancelledError): |
620 | if not self.alreadyfailed: |
621 | - self._slave.log("Build cancelled unexpectedly!") |
622 | - self._slave.buildFail() |
623 | + self._builder.log("Build cancelled unexpectedly!") |
624 | + self._builder.buildFail() |
625 | else: |
626 | - self._slave.log("Failed to gather results: %s" % failure.value) |
627 | - self._slave.buildFail() |
628 | + self._builder.log( |
629 | + "Failed to gather results: %s" % failure.value) |
630 | + self._builder.buildFail() |
631 | self.alreadyfailed = True |
632 | |
633 | def reap(ignored): |
634 | @@ -173,7 +170,7 @@ |
635 | if success != 0: |
636 | if not self.alreadyfailed: |
637 | # The init failed, can't fathom why that would be... |
638 | - self._slave.builderFail() |
639 | + self._builder.builderFail() |
640 | self.alreadyfailed = True |
641 | self._state = DebianBuildState.CLEANUP |
642 | self.doCleanup() |
643 | @@ -186,7 +183,7 @@ |
644 | if success != 0: |
645 | if not self.alreadyfailed: |
646 | # The unpack failed for some reason... |
647 | - self._slave.chrootFail() |
648 | + self._builder.chrootFail() |
649 | self.alreadyfailed = True |
650 | self._state = DebianBuildState.CLEANUP |
651 | self.doCleanup() |
652 | @@ -198,7 +195,7 @@ |
653 | """Just finished doing the mounts.""" |
654 | if success != 0: |
655 | if not self.alreadyfailed: |
656 | - self._slave.chrootFail() |
657 | + self._builder.chrootFail() |
658 | self.alreadyfailed = True |
659 | self._state = DebianBuildState.UMOUNT |
660 | self.doUnmounting() |
661 | @@ -258,7 +255,7 @@ |
662 | """Just finished overwriting sources.list.""" |
663 | if success != 0: |
664 | if not self.alreadyfailed: |
665 | - self._slave.chrootFail() |
666 | + self._builder.chrootFail() |
667 | self.alreadyfailed = True |
668 | self.doReapProcesses(self._state) |
669 | elif self.trusted_keys: |
670 | @@ -277,7 +274,7 @@ |
671 | """Just finished adding trusted keys.""" |
672 | if success != 0: |
673 | if not self.alreadyfailed: |
674 | - self._slave.chrootFail() |
675 | + self._builder.chrootFail() |
676 | self.alreadyfailed = True |
677 | self.doReapProcesses(self._state) |
678 | else: |
679 | @@ -293,7 +290,7 @@ |
680 | """Just finished updating the chroot.""" |
681 | if success != 0: |
682 | if not self.alreadyfailed: |
683 | - self._slave.chrootFail() |
684 | + self._builder.chrootFail() |
685 | self.alreadyfailed = True |
686 | self.doReapProcesses(self._state) |
687 | else: |
688 | @@ -309,7 +306,7 @@ |
689 | """Just finished doing the unmounting.""" |
690 | if success != 0: |
691 | if not self.alreadyfailed: |
692 | - self._slave.builderFail() |
693 | + self._builder.builderFail() |
694 | self.alreadyfailed = True |
695 | self._state = DebianBuildState.CLEANUP |
696 | self.doCleanup() |
697 | @@ -318,13 +315,13 @@ |
698 | """Just finished the cleanup.""" |
699 | if success != 0: |
700 | if not self.alreadyfailed: |
701 | - self._slave.builderFail() |
702 | + self._builder.builderFail() |
703 | self.alreadyfailed = True |
704 | else: |
705 | # Successful clean |
706 | if not self.alreadyfailed: |
707 | - self._slave.buildOK() |
708 | - self._slave.buildComplete() |
709 | + self._builder.buildOK() |
710 | + self._builder.buildComplete() |
711 | |
712 | def abortReap(self): |
713 | """Abort by killing all processes in the chroot, as hard as we can. |
714 | |
715 | === modified file 'lpbuildd/livefs.py' |
716 | --- lpbuildd/livefs.py 2019-01-28 13:07:53 +0000 |
717 | +++ lpbuildd/livefs.py 2019-02-12 10:36:12 +0000 |
718 | @@ -83,12 +83,12 @@ |
719 | elif (retcode >= RETCODE_FAILURE_INSTALL and |
720 | retcode <= RETCODE_FAILURE_BUILD): |
721 | if not self.alreadyfailed: |
722 | - self._slave.buildFail() |
723 | + self._builder.buildFail() |
724 | print("Returning build status: Build failed.") |
725 | self.alreadyfailed = True |
726 | else: |
727 | if not self.alreadyfailed: |
728 | - self._slave.builderFail() |
729 | + self._builder.builderFail() |
730 | print("Returning build status: Builder failed.") |
731 | self.alreadyfailed = True |
732 | self.doReapProcesses(self._state) |
733 | |
734 | === modified file 'lpbuildd/snap.py' |
735 | --- lpbuildd/snap.py 2019-02-07 11:52:09 +0000 |
736 | +++ lpbuildd/snap.py 2019-02-12 10:36:12 +0000 |
737 | @@ -237,7 +237,7 @@ |
738 | 'referrer': referrer, |
739 | 'agent': agent, |
740 | }) |
741 | - self.manager._slave.log(line.encode("UTF-8")) |
742 | + self.manager._builder.log(line.encode("UTF-8")) |
743 | |
744 | |
745 | class SnapBuildState(DebianBuildState): |
746 | @@ -274,10 +274,10 @@ |
747 | """Start the local snap proxy, if necessary.""" |
748 | if not self.proxy_url: |
749 | return [] |
750 | - proxy_port = self._slave._config.get("snapmanager", "proxyport") |
751 | + proxy_port = self._builder._config.get("snapmanager", "proxyport") |
752 | proxy_factory = SnapProxyFactory(self, self.proxy_url, timeout=60) |
753 | self.proxy_service = strports.service(proxy_port, proxy_factory) |
754 | - self.proxy_service.setServiceParent(self._slave.service) |
755 | + self.proxy_service.setServiceParent(self._builder.service) |
756 | if self.backend_name == "lxd": |
757 | proxy_host = self.backend.ipv4_network.ip |
758 | else: |
759 | @@ -295,7 +295,7 @@ |
760 | """Revoke builder proxy token.""" |
761 | if not self.revocation_endpoint: |
762 | return |
763 | - self._slave.log("Revoking proxy token...\n") |
764 | + self._builder.log("Revoking proxy token...\n") |
765 | url = urlparse(self.proxy_url) |
766 | auth = "{}:{}".format(url.username, url.password) |
767 | headers = { |
768 | @@ -306,7 +306,7 @@ |
769 | try: |
770 | urlopen(req) |
771 | except (HTTPError, URLError) as e: |
772 | - self._slave.log( |
773 | + self._builder.log( |
774 | "Unable to revoke token for %s: %s" % (url.username, e)) |
775 | |
776 | def status(self): |
777 | @@ -362,12 +362,12 @@ |
778 | elif (retcode >= RETCODE_FAILURE_INSTALL and |
779 | retcode <= RETCODE_FAILURE_BUILD): |
780 | if not self.alreadyfailed: |
781 | - self._slave.buildFail() |
782 | + self._builder.buildFail() |
783 | print("Returning build status: Build failed.") |
784 | self.alreadyfailed = True |
785 | else: |
786 | if not self.alreadyfailed: |
787 | - self._slave.builderFail() |
788 | + self._builder.builderFail() |
789 | print("Returning build status: Builder failed.") |
790 | self.alreadyfailed = True |
791 | self.doReapProcesses(self._state) |
792 | |
793 | === modified file 'lpbuildd/sourcepackagerecipe.py' |
794 | --- lpbuildd/sourcepackagerecipe.py 2019-02-11 12:22:42 +0000 |
795 | +++ lpbuildd/sourcepackagerecipe.py 2019-02-12 10:36:12 +0000 |
796 | @@ -55,13 +55,13 @@ |
797 | |
798 | initial_build_state = SourcePackageRecipeBuildState.BUILD_RECIPE |
799 | |
800 | - def __init__(self, slave, buildid): |
801 | + def __init__(self, builder, buildid): |
802 | """Constructor. |
803 | |
804 | - :param slave: A build slave device. |
805 | + :param builder: A builder. |
806 | :param buildid: The id of the build (a str). |
807 | """ |
808 | - DebianBuildManager.__init__(self, slave, buildid) |
809 | + DebianBuildManager.__init__(self, builder, buildid) |
810 | self.build_recipe_path = os.path.join(self._bin, "buildrecipe") |
811 | |
812 | def initiate(self, files, chroot, extra_args): |
813 | @@ -109,24 +109,24 @@ |
814 | '.*: Depends: ([^ ]*( \([^)]*\))?)') |
815 | _, mo = self.searchLogContents([[rx, re.M]]) |
816 | if mo: |
817 | - self._slave.depFail(mo.group(1)) |
818 | + self._builder.depFail(mo.group(1)) |
819 | print("Returning build status: DEPFAIL") |
820 | print("Dependencies: " + mo.group(1)) |
821 | else: |
822 | print("Returning build status: Build failed") |
823 | - self._slave.buildFail() |
824 | + self._builder.buildFail() |
825 | self.alreadyfailed = True |
826 | elif ( |
827 | retcode >= RETCODE_FAILURE_INSTALL and |
828 | retcode <= RETCODE_FAILURE_BUILD_SOURCE_PACKAGE): |
829 | # XXX AaronBentley 2009-01-13: We should handle depwait separately |
830 | if not self.alreadyfailed: |
831 | - self._slave.buildFail() |
832 | + self._builder.buildFail() |
833 | print("Returning build status: Build failed.") |
834 | self.alreadyfailed = True |
835 | else: |
836 | if not self.alreadyfailed: |
837 | - self._slave.builderFail() |
838 | + self._builder.builderFail() |
839 | print("Returning build status: Builder failed.") |
840 | self.alreadyfailed = True |
841 | self.doReapProcesses(self._state) |
842 | @@ -150,5 +150,5 @@ |
843 | The manifest is also a useful record. |
844 | """ |
845 | DebianBuildManager.gatherResults(self) |
846 | - self._slave.addWaitingFile(get_build_path( |
847 | + self._builder.addWaitingFile(get_build_path( |
848 | self.home, self._buildid, 'manifest')) |
849 | |
850 | === modified file 'lpbuildd/tests/harness.py' |
851 | --- lpbuildd/tests/harness.py 2017-11-22 15:25:33 +0000 |
852 | +++ lpbuildd/tests/harness.py 2019-02-12 10:36:12 +0000 |
853 | @@ -18,7 +18,7 @@ |
854 | from fixtures import EnvironmentVariable |
855 | from txfixtures.tachandler import TacTestFixture |
856 | |
857 | -from lpbuildd.slave import BuildDSlave |
858 | +from lpbuildd.builder import Builder |
859 | |
860 | |
861 | test_conffile = os.path.join( |
862 | @@ -41,12 +41,12 @@ |
863 | """Unit tests for logtail mechanisms.""" |
864 | |
865 | def setUp(self): |
866 | - """Setup a BuildDSlave using the test config.""" |
867 | + """Setup a Builder using the test config.""" |
868 | conf = SafeConfigParser() |
869 | conf.read(test_conffile) |
870 | conf.set("slave", "filecache", tempfile.mkdtemp()) |
871 | |
872 | - self.slave = BuildDSlave(conf) |
873 | + self.slave = Builder(conf) |
874 | self.slave._log = True |
875 | self.slave.manager = MockBuildManager() |
876 | |
877 | |
878 | === modified file 'lpbuildd/translationtemplates.py' |
879 | --- lpbuildd/translationtemplates.py 2018-10-19 06:41:14 +0000 |
880 | +++ lpbuildd/translationtemplates.py 2019-02-12 10:36:12 +0000 |
881 | @@ -24,14 +24,15 @@ |
882 | |
883 | This is the implementation of `TranslationTemplatesBuildJob`. The |
884 | latter runs on the master server; TranslationTemplatesBuildManager |
885 | - runs on the build slave. |
886 | + runs on the builder. |
887 | """ |
888 | |
889 | initial_build_state = TranslationTemplatesBuildState.GENERATE |
890 | |
891 | - def __init__(self, slave, buildid): |
892 | - super(TranslationTemplatesBuildManager, self).__init__(slave, buildid) |
893 | - self._resultname = slave._config.get( |
894 | + def __init__(self, builder, buildid): |
895 | + super(TranslationTemplatesBuildManager, self).__init__( |
896 | + builder, buildid) |
897 | + self._resultname = builder._config.get( |
898 | "translationtemplatesmanager", "resultarchive") |
899 | |
900 | def initiate(self, files, chroot, extra_args): |
901 | @@ -67,11 +68,11 @@ |
902 | else: |
903 | if not self.alreadyfailed: |
904 | if retcode == RETCODE_FAILURE_INSTALL: |
905 | - self._slave.chrootFail() |
906 | + self._builder.chrootFail() |
907 | elif retcode == RETCODE_FAILURE_BUILD: |
908 | - self._slave.buildFail() |
909 | + self._builder.buildFail() |
910 | else: |
911 | - self._slave.builderFail() |
912 | + self._builder.builderFail() |
913 | self.alreadyfailed = True |
914 | self.doReapProcesses(self._state) |
915 |