Merge lp:~cjwatson/launchpad-buildd/rename-slave-classes into lp:launchpad-buildd

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
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.

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
=== modified file 'debian/changelog'
--- debian/changelog 2019-02-11 12:22:42 +0000
+++ debian/changelog 2019-02-12 10:36:12 +0000
@@ -6,6 +6,7 @@
6 for core16 and core18.6 for core16 and core18.
7 * Move /usr/share/launchpad-buildd/slavebin to7 * Move /usr/share/launchpad-buildd/slavebin to
8 /usr/share/launchpad-buildd/bin.8 /usr/share/launchpad-buildd/bin.
9 * Rename BuildDSlave to Builder and XMLRPCBuildDSlave to XMLRPCBuilder.
910
10 -- Colin Watson <cjwatson@ubuntu.com> Fri, 08 Feb 2019 15:09:35 +000011 -- Colin Watson <cjwatson@ubuntu.com> Fri, 08 Feb 2019 15:09:35 +0000
1112
1213
=== modified file 'lpbuildd/binarypackage.py'
--- lpbuildd/binarypackage.py 2019-02-11 12:22:42 +0000
+++ lpbuildd/binarypackage.py 2019-02-12 10:36:12 +0000
@@ -92,8 +92,8 @@
9292
93 initial_build_state = BinaryPackageBuildState.SBUILD93 initial_build_state = BinaryPackageBuildState.SBUILD
9494
95 def __init__(self, slave, buildid, **kwargs):95 def __init__(self, builder, buildid, **kwargs):
96 DebianBuildManager.__init__(self, slave, buildid, **kwargs)96 DebianBuildManager.__init__(self, builder, buildid, **kwargs)
97 self._sbuildpath = os.path.join(self._bin, "sbuild-package")97 self._sbuildpath = os.path.join(self._bin, "sbuild-package")
9898
99 @property99 @property
@@ -334,9 +334,9 @@
334 unsat_deps.append(or_dep)334 unsat_deps.append(or_dep)
335 return self.stripDependencies(unsat_deps)335 return self.stripDependencies(unsat_deps)
336 except Exception:336 except Exception:
337 self._slave.log("Failed to analyse dep-wait:\n")337 self._builder.log("Failed to analyse dep-wait:\n")
338 for line in traceback.format_exc().splitlines(True):338 for line in traceback.format_exc().splitlines(True):
339 self._slave.log(line)339 self._builder.log(line)
340 return None340 return None
341341
342 def iterate_SBUILD(self, success):342 def iterate_SBUILD(self, success):
@@ -400,17 +400,17 @@
400 if missing_dep is not None:400 if missing_dep is not None:
401 print("Returning build status: DEPFAIL")401 print("Returning build status: DEPFAIL")
402 print("Dependencies: " + missing_dep)402 print("Dependencies: " + missing_dep)
403 self._slave.depFail(missing_dep)403 self._builder.depFail(missing_dep)
404 elif success == SBuildExitCodes.GIVENBACK:404 elif success == SBuildExitCodes.GIVENBACK:
405 print("Returning build status: GIVENBACK")405 print("Returning build status: GIVENBACK")
406 self._slave.giveBack()406 self._builder.giveBack()
407 elif success == SBuildExitCodes.FAILED:407 elif success == SBuildExitCodes.FAILED:
408 print("Returning build status: PACKAGEFAIL")408 print("Returning build status: PACKAGEFAIL")
409 self._slave.buildFail()409 self._builder.buildFail()
410 elif success >= SBuildExitCodes.BUILDERFAIL:410 elif success >= SBuildExitCodes.BUILDERFAIL:
411 # anything else is assumed to be a buildd failure411 # anything else is assumed to be a buildd failure
412 print("Returning build status: BUILDERFAIL")412 print("Returning build status: BUILDERFAIL")
413 self._slave.builderFail()413 self._builder.builderFail()
414 self.alreadyfailed = True414 self.alreadyfailed = True
415 self.doReapProcesses(self._state)415 self.doReapProcesses(self._state)
416416
417417
=== modified file 'lpbuildd/buildd-slave.tac'
--- lpbuildd/buildd-slave.tac 2019-02-12 10:36:11 +0000
+++ lpbuildd/buildd-slave.tac 2019-02-12 10:36:12 +0000
@@ -1,8 +1,7 @@
1# Copyright 2009-2011 Canonical Ltd. This software is licensed under the1# Copyright 2009-2011 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# Buildd Slave implementation4# XXX: dsilvers: 2005/01/21: Currently everything logged in the builder gets
5# XXX: dsilvers: 2005/01/21: Currently everything logged in the slave gets
6# passed through to the twistd log too. this could get dangerous/big5# passed through to the twistd log too. this could get dangerous/big
76
8try:7try:
@@ -23,9 +22,9 @@
23 )22 )
2423
25from lpbuildd.binarypackage import BinaryPackageBuildManager24from lpbuildd.binarypackage import BinaryPackageBuildManager
25from lpbuildd.builder import XMLRPCBuilder
26from lpbuildd.livefs import LiveFilesystemBuildManager26from lpbuildd.livefs import LiveFilesystemBuildManager
27from lpbuildd.log import RotatableFileLogObserver27from lpbuildd.log import RotatableFileLogObserver
28from lpbuildd.slave import XMLRPCBuildDSlave
29from lpbuildd.snap import SnapBuildManager28from lpbuildd.snap import SnapBuildManager
30from lpbuildd.sourcepackagerecipe import SourcePackageRecipeBuildManager29from lpbuildd.sourcepackagerecipe import SourcePackageRecipeBuildManager
31from lpbuildd.translationtemplates import TranslationTemplatesBuildManager30from lpbuildd.translationtemplates import TranslationTemplatesBuildManager
@@ -38,31 +37,31 @@
3837
39conf = SafeConfigParser()38conf = SafeConfigParser()
40conf.read(conffile)39conf.read(conffile)
41slave = XMLRPCBuildDSlave(conf)40builder = XMLRPCBuilder(conf)
4241
43slave.registerManager(BinaryPackageBuildManager, "binarypackage")42builder.registerManager(BinaryPackageBuildManager, "binarypackage")
44slave.registerManager(SourcePackageRecipeBuildManager, "sourcepackagerecipe")43builder.registerManager(SourcePackageRecipeBuildManager, "sourcepackagerecipe")
45slave.registerManager(44builder.registerManager(
46 TranslationTemplatesBuildManager, 'translation-templates')45 TranslationTemplatesBuildManager, 'translation-templates')
47slave.registerManager(LiveFilesystemBuildManager, "livefs")46builder.registerManager(LiveFilesystemBuildManager, "livefs")
48slave.registerManager(SnapBuildManager, "snap")47builder.registerManager(SnapBuildManager, "snap")
4948
50application = service.Application('BuildDSlave')49application = service.Application('Builder')
51application.addComponent(50application.addComponent(
52 RotatableFileLogObserver(options.get('logfile')), ignoreClass=1)51 RotatableFileLogObserver(options.get('logfile')), ignoreClass=1)
53builddslaveService = service.IServiceCollection(application)52builderService = service.IServiceCollection(application)
54slave.slave.service = builddslaveService53builder.builder.service = builderService
5554
56root = resource.Resource()55root = resource.Resource()
57root.putChild('rpc', slave)56root.putChild('rpc', builder)
58root.putChild('filecache', static.File(conf.get('slave', 'filecache')))57root.putChild('filecache', static.File(conf.get('slave', 'filecache')))
59slavesite = server.Site(root)58buildersite = server.Site(root)
6059
61strports.service("tcp:%s" % slave.slave._config.get("slave", "bindport"),60strports.service("tcp:%s" % builder.builder._config.get("slave", "bindport"),
62 slavesite).setServiceParent(builddslaveService)61 buildersite).setServiceParent(builderService)
6362
64# You can interact with a running slave like this:63# You can interact with a running builder like this:
65# (assuming the slave is on localhost:8221)64# (assuming the builder is on localhost:8221)
66#65#
67# python366# python3
68# from xmlrpc.client import ServerProxy67# from xmlrpc.client import ServerProxy
6968
=== renamed file 'lpbuildd/slave.py' => 'lpbuildd/builder.py'
--- lpbuildd/slave.py 2019-02-12 10:36:11 +0000
+++ lpbuildd/builder.py 2019-02-12 10:36:12 +0000
@@ -75,10 +75,10 @@
75#75#
76# when we start using Twisted 2.0.76# when we start using Twisted 2.0.
77class RunCapture(protocol.ProcessProtocol):77class RunCapture(protocol.ProcessProtocol):
78 """Run a command and capture its output to a slave's log"""78 """Run a command and capture its output to a builder's log."""
7979
80 def __init__(self, slave, callback, stdin=None):80 def __init__(self, builder, callback, stdin=None):
81 self.slave = slave81 self.builder = builder
82 self.notify = callback82 self.notify = callback
83 self.stdin = stdin83 self.stdin = stdin
84 self.builderFailCall = None84 self.builderFailCall = None
@@ -92,13 +92,13 @@
9292
93 def outReceived(self, data):93 def outReceived(self, data):
94 """Pass on stdout data to the log."""94 """Pass on stdout data to the log."""
95 self.slave.log(data)95 self.builder.log(data)
9696
97 def errReceived(self, data):97 def errReceived(self, data):
98 """Pass on stderr data to the log.98 """Pass on stderr data to the log.
9999
100 With a bit of luck we won't interleave horribly."""100 With a bit of luck we won't interleave horribly."""
101 self.slave.log(data)101 self.builder.log(data)
102102
103 def processEnded(self, statusobject):103 def processEnded(self, statusobject):
104 """This method is called when a child process got terminated.104 """This method is called when a child process got terminated.
@@ -115,29 +115,29 @@
115 if self.builderFailCall and self.builderFailCall.active():115 if self.builderFailCall and self.builderFailCall.active():
116 self.builderFailCall.cancel()116 self.builderFailCall.cancel()
117117
118 # notify the slave, it'll perform the required actions118 # notify the builder, it'll perform the required actions
119 if self.notify is not None:119 if self.notify is not None:
120 self.notify(statusobject.value.exitCode)120 self.notify(statusobject.value.exitCode)
121121
122122
123class BuildManager(object):123class BuildManager(object):
124 """Build Daemon slave build manager abstract parent"""124 """Build manager abstract parent."""
125125
126 backend_name = "chroot"126 backend_name = "chroot"
127127
128 def __init__(self, slave, buildid, reactor=None):128 def __init__(self, builder, buildid, reactor=None):
129 """Create a BuildManager.129 """Create a BuildManager.
130130
131 :param slave: A `BuildDSlave`.131 :param builder: A `Builder`.
132 :param buildid: Identifying string for this build.132 :param buildid: Identifying string for this build.
133 """133 """
134 object.__init__(self)134 object.__init__(self)
135 self._buildid = buildid135 self._buildid = buildid
136 self._slave = slave136 self._builder = builder
137 if reactor is None:137 if reactor is None:
138 reactor = default_reactor138 reactor = default_reactor
139 self._reactor = reactor139 self._reactor = reactor
140 self._sharepath = slave._config.get("slave", "sharepath")140 self._sharepath = builder._config.get("slave", "sharepath")
141 self._bin = os.path.join(self._sharepath, "bin")141 self._bin = os.path.join(self._sharepath, "bin")
142 self._preppath = os.path.join(self._bin, "builder-prep")142 self._preppath = os.path.join(self._bin, "builder-prep")
143 self._intargetpath = os.path.join(self._bin, "in-target")143 self._intargetpath = os.path.join(self._bin, "in-target")
@@ -155,8 +155,8 @@
155 """Run a subprocess capturing the results in the log."""155 """Run a subprocess capturing the results in the log."""
156 if iterate is None:156 if iterate is None:
157 iterate = self.iterate157 iterate = self.iterate
158 self._subprocess = RunCapture(self._slave, iterate, stdin=stdin)158 self._subprocess = RunCapture(self._builder, iterate, stdin=stdin)
159 self._slave.log("RUN: %s %s\n" % (159 self._builder.log("RUN: %s %s\n" % (
160 command, " ".join(shell_escape(arg) for arg in args[1:])))160 command, " ".join(shell_escape(arg) for arg in args[1:])))
161 childfds = {161 childfds = {
162 0: devnull.fileno() if stdin is None else "w",162 0: devnull.fileno() if stdin is None else "w",
@@ -191,7 +191,7 @@
191 if state is not None and state in self._reaped_states:191 if state is not None and state in self._reaped_states:
192 # We've already reaped this state. To avoid a loop, proceed192 # We've already reaped this state. To avoid a loop, proceed
193 # immediately to the next iterator.193 # immediately to the next iterator.
194 self._slave.log("Already reaped from state %s...\n" % state)194 self._builder.log("Already reaped from state %s...\n" % state)
195 if notify:195 if notify:
196 self.iterateReap(state, 0)196 self.iterateReap(state, 0)
197 else:197 else:
@@ -211,7 +211,7 @@
211 # Sanitize the URLs in the buildlog file if this is a build211 # Sanitize the URLs in the buildlog file if this is a build
212 # in a private archive.212 # in a private archive.
213 if self.needs_sanitized_logs:213 if self.needs_sanitized_logs:
214 self._slave.sanitizeBuildlog(self._slave.cachePath("buildlog"))214 self._builder.sanitizeBuildlog(self._builder.cachePath("buildlog"))
215215
216 if self.fast_cleanup:216 if self.fast_cleanup:
217 self.iterate(0, quiet=True)217 self.iterate(0, quiet=True)
@@ -235,18 +235,18 @@
235 evaluates to True the build at hand is for a private archive.235 evaluates to True the build at hand is for a private archive.
236 """236 """
237 if 'build_url' in extra_args:237 if 'build_url' in extra_args:
238 self._slave.log("%s\n" % extra_args['build_url'])238 self._builder.log("%s\n" % extra_args['build_url'])
239239
240 os.mkdir("%s/build-%s" % (self.home, self._buildid))240 os.mkdir("%s/build-%s" % (self.home, self._buildid))
241 for f in files:241 for f in files:
242 os.symlink( self._slave.cachePath(files[f]),242 os.symlink( self._builder.cachePath(files[f]),
243 "%s/build-%s/%s" % (self.home,243 "%s/build-%s/%s" % (self.home,
244 self._buildid, f))244 self._buildid, f))
245 self._chroottarfile = self._slave.cachePath(chroot)245 self._chroottarfile = self._builder.cachePath(chroot)
246246
247 self.image_type = extra_args.get('image_type', 'chroot')247 self.image_type = extra_args.get('image_type', 'chroot')
248 self.series = extra_args['series']248 self.series = extra_args['series']
249 self.arch_tag = extra_args.get('arch_tag', self._slave.getArch())249 self.arch_tag = extra_args.get('arch_tag', self._builder.getArch())
250 self.fast_cleanup = extra_args.get('fast_cleanup', False)250 self.fast_cleanup = extra_args.get('fast_cleanup', False)
251251
252 # Check whether this is a build in a private archive and252 # Check whether this is a build in a private archive and
@@ -271,7 +271,7 @@
271 return {}271 return {}
272272
273 def iterate(self, success, quiet=False):273 def iterate(self, success, quiet=False):
274 """Perform an iteration of the slave.274 """Perform an iteration of the builder.
275275
276 The BuildManager tends to work by invoking several276 The BuildManager tends to work by invoking several
277 subprocesses in order. the iterate method is called by the277 subprocesses in order. the iterate method is called by the
@@ -282,7 +282,7 @@
282 "used")282 "used")
283283
284 def iterateReap(self, state, success):284 def iterateReap(self, state, success):
285 """Perform an iteration of the slave following subprocess reaping.285 """Perform an iteration of the builder following subprocess reaping.
286286
287 Subprocess reaping is special, typically occurring at several287 Subprocess reaping is special, typically occurring at several
288 positions in a build manager's state machine. We therefore keep288 positions in a build manager's state machine. We therefore keep
@@ -321,9 +321,9 @@
321321
322 def builderFail(self, reason, primary_subprocess):322 def builderFail(self, reason, primary_subprocess):
323 """Mark the builder as failed."""323 """Mark the builder as failed."""
324 self._slave.log("ABORTING: %s\n" % reason)324 self._builder.log("ABORTING: %s\n" % reason)
325 self._subprocess.builderFailCall = None325 self._subprocess.builderFailCall = None
326 self._slave.builderFail()326 self._builder.builderFail()
327 self.alreadyfailed = True327 self.alreadyfailed = True
328 # If we failed to kill all processes in the chroot, then the primary328 # If we failed to kill all processes in the chroot, then the primary
329 # subprocess (i.e. the one running immediately before329 # subprocess (i.e. the one running immediately before
@@ -332,7 +332,7 @@
332 try:332 try:
333 primary_subprocess.transport.signalProcess('KILL')333 primary_subprocess.transport.signalProcess('KILL')
334 except process.ProcessExitedAlready:334 except process.ProcessExitedAlready:
335 self._slave.log("ABORTING: Process Exited Already\n")335 self._builder.log("ABORTING: Process Exited Already\n")
336 primary_subprocess.transport.loseConnection()336 primary_subprocess.transport.loseConnection()
337 # Leave the reaper running, but disconnect it from our state337 # Leave the reaper running, but disconnect it from our state
338 # machine. Perhaps an admin can make something of it, and in any338 # machine. Perhaps an admin can make something of it, and in any
@@ -346,7 +346,7 @@
346 try:346 try:
347 fetched_path = os.path.join(fetched_dir, os.path.basename(path))347 fetched_path = os.path.join(fetched_dir, os.path.basename(path))
348 self.backend.copy_out(path, fetched_path)348 self.backend.copy_out(path, fetched_path)
349 self._slave.addWaitingFile(fetched_path)349 self._builder.addWaitingFile(fetched_path)
350 finally:350 finally:
351 shutil.rmtree(fetched_dir)351 shutil.rmtree(fetched_dir)
352352
@@ -375,10 +375,8 @@
375 ABORTED = "BuildStatus.ABORTED"375 ABORTED = "BuildStatus.ABORTED"
376376
377377
378class BuildDSlave(object):378class Builder(object):
379 """Build Daemon slave. Implementation of most needed functions379 """The core of a builder."""
380 for a Build-Slave device.
381 """
382380
383 def __init__(self, config):381 def __init__(self, config):
384 object.__init__(self)382 object.__init__(self)
@@ -395,7 +393,7 @@
395 raise ValueError("FileCache path is not a dir")393 raise ValueError("FileCache path is not a dir")
396394
397 def getArch(self):395 def getArch(self):
398 """Return the Architecture tag for the slave."""396 """Return the Architecture tag for the builder."""
399 return self._config.get("slave","architecturetag")397 return self._config.get("slave","architecturetag")
400398
401 def cachePath(self, file):399 def cachePath(self, file):
@@ -423,7 +421,7 @@
423 """Ensure we have the file with the checksum specified.421 """Ensure we have the file with the checksum specified.
424422
425 Optionally you can provide the librarian URL and423 Optionally you can provide the librarian URL and
426 the build slave will fetch the file if it doesn't have it.424 the builder will fetch the file if it doesn't have it.
427 Return a tuple containing: (<present>, <info>)425 Return a tuple containing: (<present>, <info>)
428 """426 """
429 extra_info = 'No URL'427 extra_info = 'No URL'
@@ -497,19 +495,19 @@
497 if self.builderstatus == BuilderStatus.ABORTING:495 if self.builderstatus == BuilderStatus.ABORTING:
498 # This might happen if the master side restarts in the middle of496 # This might happen if the master side restarts in the middle of
499 # an abort cycle.497 # an abort cycle.
500 self.log("Slave already ABORTING when asked to abort")498 self.log("Builder already ABORTING when asked to abort")
501 return499 return
502 if self.builderstatus != BuilderStatus.BUILDING:500 if self.builderstatus != BuilderStatus.BUILDING:
503 # XXX: Should raise a known Fault so that the client can make501 # XXX: Should raise a known Fault so that the client can make
504 # useful decisions about the error!502 # useful decisions about the error!
505 raise ValueError("Slave is not BUILDING when asked to abort")503 raise ValueError("Builder is not BUILDING when asked to abort")
506 self.manager.abort()504 self.manager.abort()
507 self.builderstatus = BuilderStatus.ABORTING505 self.builderstatus = BuilderStatus.ABORTING
508506
509 def clean(self):507 def clean(self):
510 """Clean up pending files and reset the internal build state."""508 """Clean up pending files and reset the internal build state."""
511 if self.builderstatus != BuilderStatus.WAITING:509 if self.builderstatus != BuilderStatus.WAITING:
512 raise ValueError('Slave is not WAITING when asked to clean')510 raise ValueError('Builder is not WAITING when asked to clean')
513 for f in set(self.waitingfiles.values()):511 for f in set(self.waitingfiles.values()):
514 os.remove(self.cachePath(f))512 os.remove(self.cachePath(f))
515 self.builderstatus = BuilderStatus.IDLE513 self.builderstatus = BuilderStatus.IDLE
@@ -587,7 +585,8 @@
587 def startBuild(self, manager):585 def startBuild(self, manager):
588 """Start a build with the provided BuildManager instance."""586 """Start a build with the provided BuildManager instance."""
589 if self.builderstatus != BuilderStatus.IDLE:587 if self.builderstatus != BuilderStatus.IDLE:
590 raise ValueError("Slave is not IDLE when asked to start building")588 raise ValueError(
589 "Builder is not IDLE when asked to start building")
591 self.manager = manager590 self.manager = manager
592 self.builderstatus = BuilderStatus.BUILDING591 self.builderstatus = BuilderStatus.BUILDING
593 self.emptyLog()592 self.emptyLog()
@@ -602,8 +601,8 @@
602 """Cease building because the builder has a problem."""601 """Cease building because the builder has a problem."""
603 if self.builderstatus not in (BuilderStatus.BUILDING,602 if self.builderstatus not in (BuilderStatus.BUILDING,
604 BuilderStatus.ABORTING):603 BuilderStatus.ABORTING):
605 raise ValueError("Slave is not BUILDING|ABORTING when set to "604 raise ValueError(
606 "BUILDERFAIL")605 "Builder is not BUILDING|ABORTING when set to BUILDERFAIL")
607 self.buildstatus = BuildStatus.BUILDERFAIL606 self.buildstatus = BuildStatus.BUILDERFAIL
608607
609 def chrootFail(self):608 def chrootFail(self):
@@ -613,38 +612,38 @@
613 package.612 package.
614 """613 """
615 if self.builderstatus != BuilderStatus.BUILDING:614 if self.builderstatus != BuilderStatus.BUILDING:
616 raise ValueError("Slave is not BUILDING when set to CHROOTFAIL")615 raise ValueError("Builder is not BUILDING when set to CHROOTFAIL")
617 self.buildstatus = BuildStatus.CHROOTFAIL616 self.buildstatus = BuildStatus.CHROOTFAIL
618617
619 def buildFail(self):618 def buildFail(self):
620 """Cease building because the package failed to build."""619 """Cease building because the package failed to build."""
621 if self.builderstatus != BuilderStatus.BUILDING:620 if self.builderstatus != BuilderStatus.BUILDING:
622 raise ValueError("Slave is not BUILDING when set to PACKAGEFAIL")621 raise ValueError("Builder is not BUILDING when set to PACKAGEFAIL")
623 self.buildstatus = BuildStatus.PACKAGEFAIL622 self.buildstatus = BuildStatus.PACKAGEFAIL
624623
625 def buildOK(self):624 def buildOK(self):
626 """Having passed all possible failure states, mark a build as OK."""625 """Having passed all possible failure states, mark a build as OK."""
627 if self.builderstatus != BuilderStatus.BUILDING:626 if self.builderstatus != BuilderStatus.BUILDING:
628 raise ValueError("Slave is not BUILDING when set to OK")627 raise ValueError("Builder is not BUILDING when set to OK")
629 self.buildstatus = BuildStatus.OK628 self.buildstatus = BuildStatus.OK
630629
631 def depFail(self, dependencies):630 def depFail(self, dependencies):
632 """Cease building due to a dependency issue."""631 """Cease building due to a dependency issue."""
633 if self.builderstatus != BuilderStatus.BUILDING:632 if self.builderstatus != BuilderStatus.BUILDING:
634 raise ValueError("Slave is not BUILDING when set to DEPFAIL")633 raise ValueError("Builder is not BUILDING when set to DEPFAIL")
635 self.buildstatus = BuildStatus.DEPFAIL634 self.buildstatus = BuildStatus.DEPFAIL
636 self.builddependencies = dependencies635 self.builddependencies = dependencies
637636
638 def giveBack(self):637 def giveBack(self):
639 """Give-back package due to a transient buildd/archive issue."""638 """Give-back package due to a transient buildd/archive issue."""
640 if self.builderstatus != BuilderStatus.BUILDING:639 if self.builderstatus != BuilderStatus.BUILDING:
641 raise ValueError("Slave is not BUILDING when set to GIVENBACK")640 raise ValueError("Builder is not BUILDING when set to GIVENBACK")
642 self.buildstatus = BuildStatus.GIVENBACK641 self.buildstatus = BuildStatus.GIVENBACK
643642
644 def buildAborted(self):643 def buildAborted(self):
645 """Mark a build as aborted."""644 """Mark a build as aborted."""
646 if self.builderstatus != BuilderStatus.ABORTING:645 if self.builderstatus != BuilderStatus.ABORTING:
647 raise ValueError("Slave is not ABORTING when set to ABORTED")646 raise ValueError("Builder is not ABORTING when set to ABORTED")
648 if self.buildstatus != BuildStatus.BUILDERFAIL:647 if self.buildstatus != BuildStatus.BUILDERFAIL:
649 self.buildstatus = BuildStatus.ABORTED648 self.buildstatus = BuildStatus.ABORTED
650649
@@ -658,8 +657,8 @@
658 self.buildAborted()657 self.buildAborted()
659 self.builderstatus = BuilderStatus.WAITING658 self.builderstatus = BuilderStatus.WAITING
660 else:659 else:
661 raise ValueError("Slave is not BUILDING|ABORTING when told build "660 raise ValueError(
662 "is complete")661 "Builder is not BUILDING|ABORTING when told build is complete")
663662
664 def sanitizeBuildlog(self, log_path):663 def sanitizeBuildlog(self, log_path):
665 """Removes passwords from buildlog URLs.664 """Removes passwords from buildlog URLs.
@@ -699,8 +698,8 @@
699 sanitized_file.close()698 sanitized_file.close()
700699
701700
702class XMLRPCBuildDSlave(xmlrpc.XMLRPC):701class XMLRPCBuilder(xmlrpc.XMLRPC):
703 """XMLRPC build daemon slave management interface"""702 """XMLRPC builder management interface."""
704703
705 def __init__(self, config):704 def __init__(self, config):
706 xmlrpc.XMLRPC.__init__(self, allowNone=True)705 xmlrpc.XMLRPC.__init__(self, allowNone=True)
@@ -709,7 +708,7 @@
709 # implying the presence of /filecache/ /filecache/buildlog and708 # implying the presence of /filecache/ /filecache/buildlog and
710 # the reduced and optimised XMLRPC interface.709 # the reduced and optimised XMLRPC interface.
711 self.protocolversion = '1.0'710 self.protocolversion = '1.0'
712 self.slave = BuildDSlave(config)711 self.builder = Builder(config)
713 self._managers = {}712 self._managers = {}
714 cache = apt.Cache()713 cache = apt.Cache()
715 try:714 try:
@@ -728,7 +727,7 @@
728727
729 def xmlrpc_info(self):728 def xmlrpc_info(self):
730 """Return the protocol version and the manager methods supported."""729 """Return the protocol version and the manager methods supported."""
731 return (self.protocolversion, self.slave.getArch(),730 return (self.protocolversion, self.builder.getArch(),
732 list(self._managers))731 list(self._managers))
733732
734 def xmlrpc_status(self):733 def xmlrpc_status(self):
@@ -737,7 +736,7 @@
737 Depending on the builder status we return differing amounts of data,736 Depending on the builder status we return differing amounts of data,
738 but this always includes the builder status itself.737 but this always includes the builder status itself.
739 """738 """
740 status = self.slave.builderstatus739 status = self.builder.builderstatus
741 statusname = status.split('.')[-1]740 statusname = status.split('.')[-1]
742 func = getattr(self, "status_" + statusname, None)741 func = getattr(self, "status_" + statusname, None)
743 if func is None:742 if func is None:
@@ -746,8 +745,8 @@
746 if self._version is not None:745 if self._version is not None:
747 ret["builder_version"] = self._version746 ret["builder_version"] = self._version
748 ret.update(func())747 ret.update(func())
749 if self.slave.manager is not None:748 if self.builder.manager is not None:
750 ret.update(self.slave.manager.status())749 ret.update(self.builder.manager.status())
751 return ret750 return ret
752751
753 def status_IDLE(self):752 def status_IDLE(self):
@@ -759,7 +758,7 @@
759758
760 Returns the build id and up to one kilobyte of log tail.759 Returns the build id and up to one kilobyte of log tail.
761 """760 """
762 tail = self.slave.getLogTail()761 tail = self.builder.getLogTail()
763 return {"build_id": self.buildid, "logtail": Binary(tail)}762 return {"build_id": self.buildid, "logtail": Binary(tail)}
764763
765 def status_WAITING(self):764 def status_WAITING(self):
@@ -770,13 +769,13 @@
770 and the build id but no file set.769 and the build id but no file set.
771 """770 """
772 ret = {771 ret = {
773 "build_status": self.slave.buildstatus,772 "build_status": self.builder.buildstatus,
774 "build_id": self.buildid,773 "build_id": self.buildid,
775 }774 }
776 if self.slave.buildstatus in (BuildStatus.OK, BuildStatus.PACKAGEFAIL,775 if self.builder.buildstatus in (
777 BuildStatus.DEPFAIL):776 BuildStatus.OK, BuildStatus.PACKAGEFAIL, BuildStatus.DEPFAIL):
778 ret["filemap"] = self.slave.waitingfiles777 ret["filemap"] = self.builder.waitingfiles
779 ret["dependencies"] = self.slave.builddependencies778 ret["dependencies"] = self.builder.builddependencies
780 return ret779 return ret
781780
782 def status_ABORTING(self):781 def status_ABORTING(self):
@@ -790,16 +789,16 @@
790789
791 def xmlrpc_ensurepresent(self, sha1sum, url, username, password):790 def xmlrpc_ensurepresent(self, sha1sum, url, username, password):
792 """Attempt to ensure the given file is present."""791 """Attempt to ensure the given file is present."""
793 return self.slave.ensurePresent(sha1sum, url, username, password)792 return self.builder.ensurePresent(sha1sum, url, username, password)
794793
795 def xmlrpc_abort(self):794 def xmlrpc_abort(self):
796 """Abort the current build."""795 """Abort the current build."""
797 self.slave.abort()796 self.builder.abort()
798 return BuilderStatus.ABORTING797 return BuilderStatus.ABORTING
799798
800 def xmlrpc_clean(self):799 def xmlrpc_clean(self):
801 """Clean up the waiting files and reset the slave's internal state."""800 """Clean up the waiting files and reset the builder's state."""
802 self.slave.clean()801 self.builder.clean()
803 return BuilderStatus.IDLE802 return BuilderStatus.IDLE
804803
805 def xmlrpc_build(self, buildid, managertag, chrootsum, filemap, args):804 def xmlrpc_build(self, buildid, managertag, chrootsum, filemap, args):
@@ -813,7 +812,7 @@
813 extra_info = "%s not in %r" % (managertag, list(self._managers))812 extra_info = "%s not in %r" % (managertag, list(self._managers))
814 return (BuilderStatus.UNKNOWNBUILDER, extra_info)813 return (BuilderStatus.UNKNOWNBUILDER, extra_info)
815 # check requested chroot availability814 # check requested chroot availability
816 chroot_present, info = self.slave.ensurePresent(chrootsum)815 chroot_present, info = self.builder.ensurePresent(chrootsum)
817 if not chroot_present:816 if not chroot_present:
818 extra_info = """CHROOTSUM -> %s817 extra_info = """CHROOTSUM -> %s
819 ***** INFO *****818 ***** INFO *****
@@ -823,7 +822,7 @@
823 return (BuilderStatus.UNKNOWNSUM, extra_info)822 return (BuilderStatus.UNKNOWNSUM, extra_info)
824 # check requested files availability823 # check requested files availability
825 for filesum in filemap.values():824 for filesum in filemap.values():
826 file_present, info = self.slave.ensurePresent(filesum)825 file_present, info = self.builder.ensurePresent(filesum)
827 if not file_present:826 if not file_present:
828 extra_info = """FILESUM -> %s827 extra_info = """FILESUM -> %s
829 ***** INFO *****828 ***** INFO *****
@@ -838,6 +837,7 @@
838 # builder is available, buildd is non empty,837 # builder is available, buildd is non empty,
839 # filelist is consistent, chrootsum is available, let's initiate...838 # filelist is consistent, chrootsum is available, let's initiate...
840 self.buildid = buildid839 self.buildid = buildid
841 self.slave.startBuild(self._managers[managertag](self.slave, buildid))840 self.builder.startBuild(
842 self.slave.manager.initiate(filemap, chrootsum, args)841 self._managers[managertag](self.builder, buildid))
842 self.builder.manager.initiate(filemap, chrootsum, args)
843 return (BuilderStatus.BUILDING, buildid)843 return (BuilderStatus.BUILDING, buildid)
844844
=== modified file 'lpbuildd/debian.py'
--- lpbuildd/debian.py 2018-10-19 06:41:14 +0000
+++ lpbuildd/debian.py 2019-02-12 10:36:12 +0000
@@ -4,8 +4,6 @@
4# Authors: Daniel Silverstone <daniel.silverstone@canonical.com>4# Authors: Daniel Silverstone <daniel.silverstone@canonical.com>
5# and Adam Conrad <adam.conrad@canonical.com>5# and Adam Conrad <adam.conrad@canonical.com>
66
7# Buildd Slave sbuild manager implementation
8
9__metaclass__ = type7__metaclass__ = type
108
11import base649import base64
@@ -19,9 +17,7 @@
19 )17 )
20from twisted.python import log18from twisted.python import log
2119
22from lpbuildd.slave import (20from lpbuildd.builder import BuildManager
23 BuildManager,
24 )
2521
2622
27class DebianBuildState:23class DebianBuildState:
@@ -39,11 +35,11 @@
39class DebianBuildManager(BuildManager):35class DebianBuildManager(BuildManager):
40 """Base behaviour for Debian chrooted builds."""36 """Base behaviour for Debian chrooted builds."""
4137
42 def __init__(self, slave, buildid, **kwargs):38 def __init__(self, builder, buildid, **kwargs):
43 BuildManager.__init__(self, slave, buildid, **kwargs)39 BuildManager.__init__(self, builder, buildid, **kwargs)
44 self._cachepath = slave._config.get("slave", "filecache")40 self._cachepath = builder._config.get("slave", "filecache")
45 self._state = DebianBuildState.INIT41 self._state = DebianBuildState.INIT
46 slave.emptyLog()42 builder.emptyLog()
47 self.alreadyfailed = False43 self.alreadyfailed = False
48 self._iterator = None44 self._iterator = None
4945
@@ -110,12 +106,12 @@
110 The primary file we care about is the .changes file. We key from there.106 The primary file we care about is the .changes file. We key from there.
111 """107 """
112 path = self.getChangesFilename()108 path = self.getChangesFilename()
113 self._slave.addWaitingFile(path)109 self._builder.addWaitingFile(path)
114110
115 chfile = open(path, "r")111 chfile = open(path, "r")
116 try:112 try:
117 for fn in self._parseChangesFile(chfile):113 for fn in self._parseChangesFile(chfile):
118 self._slave.addWaitingFile(114 self._builder.addWaitingFile(
119 get_build_path(self.home, self._buildid, fn))115 get_build_path(self.home, self._buildid, fn))
120 finally:116 finally:
121 chfile.close()117 chfile.close()
@@ -127,11 +123,12 @@
127 def failed_to_gather(failure):123 def failed_to_gather(failure):
128 if failure.check(defer.CancelledError):124 if failure.check(defer.CancelledError):
129 if not self.alreadyfailed:125 if not self.alreadyfailed:
130 self._slave.log("Build cancelled unexpectedly!")126 self._builder.log("Build cancelled unexpectedly!")
131 self._slave.buildFail()127 self._builder.buildFail()
132 else:128 else:
133 self._slave.log("Failed to gather results: %s" % failure.value)129 self._builder.log(
134 self._slave.buildFail()130 "Failed to gather results: %s" % failure.value)
131 self._builder.buildFail()
135 self.alreadyfailed = True132 self.alreadyfailed = True
136133
137 def reap(ignored):134 def reap(ignored):
@@ -173,7 +170,7 @@
173 if success != 0:170 if success != 0:
174 if not self.alreadyfailed:171 if not self.alreadyfailed:
175 # The init failed, can't fathom why that would be...172 # The init failed, can't fathom why that would be...
176 self._slave.builderFail()173 self._builder.builderFail()
177 self.alreadyfailed = True174 self.alreadyfailed = True
178 self._state = DebianBuildState.CLEANUP175 self._state = DebianBuildState.CLEANUP
179 self.doCleanup()176 self.doCleanup()
@@ -186,7 +183,7 @@
186 if success != 0:183 if success != 0:
187 if not self.alreadyfailed:184 if not self.alreadyfailed:
188 # The unpack failed for some reason...185 # The unpack failed for some reason...
189 self._slave.chrootFail()186 self._builder.chrootFail()
190 self.alreadyfailed = True187 self.alreadyfailed = True
191 self._state = DebianBuildState.CLEANUP188 self._state = DebianBuildState.CLEANUP
192 self.doCleanup()189 self.doCleanup()
@@ -198,7 +195,7 @@
198 """Just finished doing the mounts."""195 """Just finished doing the mounts."""
199 if success != 0:196 if success != 0:
200 if not self.alreadyfailed:197 if not self.alreadyfailed:
201 self._slave.chrootFail()198 self._builder.chrootFail()
202 self.alreadyfailed = True199 self.alreadyfailed = True
203 self._state = DebianBuildState.UMOUNT200 self._state = DebianBuildState.UMOUNT
204 self.doUnmounting()201 self.doUnmounting()
@@ -258,7 +255,7 @@
258 """Just finished overwriting sources.list."""255 """Just finished overwriting sources.list."""
259 if success != 0:256 if success != 0:
260 if not self.alreadyfailed:257 if not self.alreadyfailed:
261 self._slave.chrootFail()258 self._builder.chrootFail()
262 self.alreadyfailed = True259 self.alreadyfailed = True
263 self.doReapProcesses(self._state)260 self.doReapProcesses(self._state)
264 elif self.trusted_keys:261 elif self.trusted_keys:
@@ -277,7 +274,7 @@
277 """Just finished adding trusted keys."""274 """Just finished adding trusted keys."""
278 if success != 0:275 if success != 0:
279 if not self.alreadyfailed:276 if not self.alreadyfailed:
280 self._slave.chrootFail()277 self._builder.chrootFail()
281 self.alreadyfailed = True278 self.alreadyfailed = True
282 self.doReapProcesses(self._state)279 self.doReapProcesses(self._state)
283 else:280 else:
@@ -293,7 +290,7 @@
293 """Just finished updating the chroot."""290 """Just finished updating the chroot."""
294 if success != 0:291 if success != 0:
295 if not self.alreadyfailed:292 if not self.alreadyfailed:
296 self._slave.chrootFail()293 self._builder.chrootFail()
297 self.alreadyfailed = True294 self.alreadyfailed = True
298 self.doReapProcesses(self._state)295 self.doReapProcesses(self._state)
299 else:296 else:
@@ -309,7 +306,7 @@
309 """Just finished doing the unmounting."""306 """Just finished doing the unmounting."""
310 if success != 0:307 if success != 0:
311 if not self.alreadyfailed:308 if not self.alreadyfailed:
312 self._slave.builderFail()309 self._builder.builderFail()
313 self.alreadyfailed = True310 self.alreadyfailed = True
314 self._state = DebianBuildState.CLEANUP311 self._state = DebianBuildState.CLEANUP
315 self.doCleanup()312 self.doCleanup()
@@ -318,13 +315,13 @@
318 """Just finished the cleanup."""315 """Just finished the cleanup."""
319 if success != 0:316 if success != 0:
320 if not self.alreadyfailed:317 if not self.alreadyfailed:
321 self._slave.builderFail()318 self._builder.builderFail()
322 self.alreadyfailed = True319 self.alreadyfailed = True
323 else:320 else:
324 # Successful clean321 # Successful clean
325 if not self.alreadyfailed:322 if not self.alreadyfailed:
326 self._slave.buildOK()323 self._builder.buildOK()
327 self._slave.buildComplete()324 self._builder.buildComplete()
328325
329 def abortReap(self):326 def abortReap(self):
330 """Abort by killing all processes in the chroot, as hard as we can.327 """Abort by killing all processes in the chroot, as hard as we can.
331328
=== modified file 'lpbuildd/livefs.py'
--- lpbuildd/livefs.py 2019-01-28 13:07:53 +0000
+++ lpbuildd/livefs.py 2019-02-12 10:36:12 +0000
@@ -83,12 +83,12 @@
83 elif (retcode >= RETCODE_FAILURE_INSTALL and83 elif (retcode >= RETCODE_FAILURE_INSTALL and
84 retcode <= RETCODE_FAILURE_BUILD):84 retcode <= RETCODE_FAILURE_BUILD):
85 if not self.alreadyfailed:85 if not self.alreadyfailed:
86 self._slave.buildFail()86 self._builder.buildFail()
87 print("Returning build status: Build failed.")87 print("Returning build status: Build failed.")
88 self.alreadyfailed = True88 self.alreadyfailed = True
89 else:89 else:
90 if not self.alreadyfailed:90 if not self.alreadyfailed:
91 self._slave.builderFail()91 self._builder.builderFail()
92 print("Returning build status: Builder failed.")92 print("Returning build status: Builder failed.")
93 self.alreadyfailed = True93 self.alreadyfailed = True
94 self.doReapProcesses(self._state)94 self.doReapProcesses(self._state)
9595
=== modified file 'lpbuildd/snap.py'
--- lpbuildd/snap.py 2019-02-07 11:52:09 +0000
+++ lpbuildd/snap.py 2019-02-12 10:36:12 +0000
@@ -237,7 +237,7 @@
237 'referrer': referrer,237 'referrer': referrer,
238 'agent': agent,238 'agent': agent,
239 })239 })
240 self.manager._slave.log(line.encode("UTF-8"))240 self.manager._builder.log(line.encode("UTF-8"))
241241
242242
243class SnapBuildState(DebianBuildState):243class SnapBuildState(DebianBuildState):
@@ -274,10 +274,10 @@
274 """Start the local snap proxy, if necessary."""274 """Start the local snap proxy, if necessary."""
275 if not self.proxy_url:275 if not self.proxy_url:
276 return []276 return []
277 proxy_port = self._slave._config.get("snapmanager", "proxyport")277 proxy_port = self._builder._config.get("snapmanager", "proxyport")
278 proxy_factory = SnapProxyFactory(self, self.proxy_url, timeout=60)278 proxy_factory = SnapProxyFactory(self, self.proxy_url, timeout=60)
279 self.proxy_service = strports.service(proxy_port, proxy_factory)279 self.proxy_service = strports.service(proxy_port, proxy_factory)
280 self.proxy_service.setServiceParent(self._slave.service)280 self.proxy_service.setServiceParent(self._builder.service)
281 if self.backend_name == "lxd":281 if self.backend_name == "lxd":
282 proxy_host = self.backend.ipv4_network.ip282 proxy_host = self.backend.ipv4_network.ip
283 else:283 else:
@@ -295,7 +295,7 @@
295 """Revoke builder proxy token."""295 """Revoke builder proxy token."""
296 if not self.revocation_endpoint:296 if not self.revocation_endpoint:
297 return297 return
298 self._slave.log("Revoking proxy token...\n")298 self._builder.log("Revoking proxy token...\n")
299 url = urlparse(self.proxy_url)299 url = urlparse(self.proxy_url)
300 auth = "{}:{}".format(url.username, url.password)300 auth = "{}:{}".format(url.username, url.password)
301 headers = {301 headers = {
@@ -306,7 +306,7 @@
306 try:306 try:
307 urlopen(req)307 urlopen(req)
308 except (HTTPError, URLError) as e:308 except (HTTPError, URLError) as e:
309 self._slave.log(309 self._builder.log(
310 "Unable to revoke token for %s: %s" % (url.username, e))310 "Unable to revoke token for %s: %s" % (url.username, e))
311311
312 def status(self):312 def status(self):
@@ -362,12 +362,12 @@
362 elif (retcode >= RETCODE_FAILURE_INSTALL and362 elif (retcode >= RETCODE_FAILURE_INSTALL and
363 retcode <= RETCODE_FAILURE_BUILD):363 retcode <= RETCODE_FAILURE_BUILD):
364 if not self.alreadyfailed:364 if not self.alreadyfailed:
365 self._slave.buildFail()365 self._builder.buildFail()
366 print("Returning build status: Build failed.")366 print("Returning build status: Build failed.")
367 self.alreadyfailed = True367 self.alreadyfailed = True
368 else:368 else:
369 if not self.alreadyfailed:369 if not self.alreadyfailed:
370 self._slave.builderFail()370 self._builder.builderFail()
371 print("Returning build status: Builder failed.")371 print("Returning build status: Builder failed.")
372 self.alreadyfailed = True372 self.alreadyfailed = True
373 self.doReapProcesses(self._state)373 self.doReapProcesses(self._state)
374374
=== modified file 'lpbuildd/sourcepackagerecipe.py'
--- lpbuildd/sourcepackagerecipe.py 2019-02-11 12:22:42 +0000
+++ lpbuildd/sourcepackagerecipe.py 2019-02-12 10:36:12 +0000
@@ -55,13 +55,13 @@
5555
56 initial_build_state = SourcePackageRecipeBuildState.BUILD_RECIPE56 initial_build_state = SourcePackageRecipeBuildState.BUILD_RECIPE
5757
58 def __init__(self, slave, buildid):58 def __init__(self, builder, buildid):
59 """Constructor.59 """Constructor.
6060
61 :param slave: A build slave device.61 :param builder: A builder.
62 :param buildid: The id of the build (a str).62 :param buildid: The id of the build (a str).
63 """63 """
64 DebianBuildManager.__init__(self, slave, buildid)64 DebianBuildManager.__init__(self, builder, buildid)
65 self.build_recipe_path = os.path.join(self._bin, "buildrecipe")65 self.build_recipe_path = os.path.join(self._bin, "buildrecipe")
6666
67 def initiate(self, files, chroot, extra_args):67 def initiate(self, files, chroot, extra_args):
@@ -109,24 +109,24 @@
109 '.*: Depends: ([^ ]*( \([^)]*\))?)')109 '.*: Depends: ([^ ]*( \([^)]*\))?)')
110 _, mo = self.searchLogContents([[rx, re.M]])110 _, mo = self.searchLogContents([[rx, re.M]])
111 if mo:111 if mo:
112 self._slave.depFail(mo.group(1))112 self._builder.depFail(mo.group(1))
113 print("Returning build status: DEPFAIL")113 print("Returning build status: DEPFAIL")
114 print("Dependencies: " + mo.group(1))114 print("Dependencies: " + mo.group(1))
115 else:115 else:
116 print("Returning build status: Build failed")116 print("Returning build status: Build failed")
117 self._slave.buildFail()117 self._builder.buildFail()
118 self.alreadyfailed = True118 self.alreadyfailed = True
119 elif (119 elif (
120 retcode >= RETCODE_FAILURE_INSTALL and120 retcode >= RETCODE_FAILURE_INSTALL and
121 retcode <= RETCODE_FAILURE_BUILD_SOURCE_PACKAGE):121 retcode <= RETCODE_FAILURE_BUILD_SOURCE_PACKAGE):
122 # XXX AaronBentley 2009-01-13: We should handle depwait separately122 # XXX AaronBentley 2009-01-13: We should handle depwait separately
123 if not self.alreadyfailed:123 if not self.alreadyfailed:
124 self._slave.buildFail()124 self._builder.buildFail()
125 print("Returning build status: Build failed.")125 print("Returning build status: Build failed.")
126 self.alreadyfailed = True126 self.alreadyfailed = True
127 else:127 else:
128 if not self.alreadyfailed:128 if not self.alreadyfailed:
129 self._slave.builderFail()129 self._builder.builderFail()
130 print("Returning build status: Builder failed.")130 print("Returning build status: Builder failed.")
131 self.alreadyfailed = True131 self.alreadyfailed = True
132 self.doReapProcesses(self._state)132 self.doReapProcesses(self._state)
@@ -150,5 +150,5 @@
150 The manifest is also a useful record.150 The manifest is also a useful record.
151 """151 """
152 DebianBuildManager.gatherResults(self)152 DebianBuildManager.gatherResults(self)
153 self._slave.addWaitingFile(get_build_path(153 self._builder.addWaitingFile(get_build_path(
154 self.home, self._buildid, 'manifest'))154 self.home, self._buildid, 'manifest'))
155155
=== modified file 'lpbuildd/tests/harness.py'
--- lpbuildd/tests/harness.py 2017-11-22 15:25:33 +0000
+++ lpbuildd/tests/harness.py 2019-02-12 10:36:12 +0000
@@ -18,7 +18,7 @@
18from fixtures import EnvironmentVariable18from fixtures import EnvironmentVariable
19from txfixtures.tachandler import TacTestFixture19from txfixtures.tachandler import TacTestFixture
2020
21from lpbuildd.slave import BuildDSlave21from lpbuildd.builder import Builder
2222
2323
24test_conffile = os.path.join(24test_conffile = os.path.join(
@@ -41,12 +41,12 @@
41 """Unit tests for logtail mechanisms."""41 """Unit tests for logtail mechanisms."""
4242
43 def setUp(self):43 def setUp(self):
44 """Setup a BuildDSlave using the test config."""44 """Setup a Builder using the test config."""
45 conf = SafeConfigParser()45 conf = SafeConfigParser()
46 conf.read(test_conffile)46 conf.read(test_conffile)
47 conf.set("slave", "filecache", tempfile.mkdtemp())47 conf.set("slave", "filecache", tempfile.mkdtemp())
4848
49 self.slave = BuildDSlave(conf)49 self.slave = Builder(conf)
50 self.slave._log = True50 self.slave._log = True
51 self.slave.manager = MockBuildManager()51 self.slave.manager = MockBuildManager()
5252
5353
=== modified file 'lpbuildd/translationtemplates.py'
--- lpbuildd/translationtemplates.py 2018-10-19 06:41:14 +0000
+++ lpbuildd/translationtemplates.py 2019-02-12 10:36:12 +0000
@@ -24,14 +24,15 @@
2424
25 This is the implementation of `TranslationTemplatesBuildJob`. The25 This is the implementation of `TranslationTemplatesBuildJob`. The
26 latter runs on the master server; TranslationTemplatesBuildManager26 latter runs on the master server; TranslationTemplatesBuildManager
27 runs on the build slave.27 runs on the builder.
28 """28 """
2929
30 initial_build_state = TranslationTemplatesBuildState.GENERATE30 initial_build_state = TranslationTemplatesBuildState.GENERATE
3131
32 def __init__(self, slave, buildid):32 def __init__(self, builder, buildid):
33 super(TranslationTemplatesBuildManager, self).__init__(slave, buildid)33 super(TranslationTemplatesBuildManager, self).__init__(
34 self._resultname = slave._config.get(34 builder, buildid)
35 self._resultname = builder._config.get(
35 "translationtemplatesmanager", "resultarchive")36 "translationtemplatesmanager", "resultarchive")
3637
37 def initiate(self, files, chroot, extra_args):38 def initiate(self, files, chroot, extra_args):
@@ -67,11 +68,11 @@
67 else:68 else:
68 if not self.alreadyfailed:69 if not self.alreadyfailed:
69 if retcode == RETCODE_FAILURE_INSTALL:70 if retcode == RETCODE_FAILURE_INSTALL:
70 self._slave.chrootFail()71 self._builder.chrootFail()
71 elif retcode == RETCODE_FAILURE_BUILD:72 elif retcode == RETCODE_FAILURE_BUILD:
72 self._slave.buildFail()73 self._builder.buildFail()
73 else:74 else:
74 self._slave.builderFail()75 self._builder.builderFail()
75 self.alreadyfailed = True76 self.alreadyfailed = True
76 self.doReapProcesses(self._state)77 self.doReapProcesses(self._state)
7778

Subscribers

People subscribed via source and target branches

to all changes: