From 22b57d78822b4b88eff18858ec708630ee261ed2 Mon Sep 17 00:00:00 2001 From: warner Date: Fri, 24 Nov 2006 12:54:31 +0100 Subject: [PATCH] finally remove forceBuild --- ChangeLog | 9 +++++++++ buildbot/interfaces.py | 20 ------------------- buildbot/master.py | 19 ++---------------- buildbot/process/builder.py | 46 ------------------------------------------- buildbot/slave/bot.py | 4 ---- buildbot/test/test_control.py | 41 +++++++++++--------------------------- buildbot/test/test_run.py | 31 +++++++++++++---------------- 7 files changed, 37 insertions(+), 133 deletions(-) diff --git a/ChangeLog b/ChangeLog index fcf14c6..36aecbe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2006-11-24 Brian Warner + * buildbot/interfaces.py (IBuilderControl.forceBuild): remove this + method, it has been deprecated for a long time. Use + IBuilderControl.requestBuild instead. + * buildbot/process/builder.py (BuilderControl.forceBuild): remove + * buildbot/master.py (BotPerspective.perspective_forceBuild): same + * buildbot/slave/bot.py (Bot.debug_forceBuild): same + * buildbot/test/test_control.py (Force.testForce): same + * buildbot/test/test_run.py: use requestBuild instead + * buildbot/clients/debug.py: replace 'Force Build' button with 'Request Build' (which just adds one to the queue), add Ping Builder, add branch/revision fields to Request Build. diff --git a/buildbot/interfaces.py b/buildbot/interfaces.py index 22c196b..fc91adb 100644 --- a/buildbot/interfaces.py +++ b/buildbot/interfaces.py @@ -826,26 +826,6 @@ class IControl(Interface): """Retrieve the IBuilderControl object for the given Builder.""" class IBuilderControl(Interface): - def forceBuild(who, reason): - """DEPRECATED, please use L{requestBuild} instead. - - Start a build of the latest sources. If 'who' is not None, it is - string with the name of the user who is responsible for starting the - build: they will be added to the 'interested users' list (so they may - be notified via email or another Status object when it finishes). - 'reason' is a string describing why this user requested the build. - - The results of forced builds are always sent to the Interested Users, - even if the Status object would normally only send results upon - failures. - - forceBuild() may raise L{NoSlaveError} or L{BuilderInUseError} if it - cannot start the build. - - forceBuild() returns a Deferred which fires with an L{IBuildControl} - object that can be used to further control the new build, or from - which an L{IBuildStatus} object can be obtained.""" - def requestBuild(request): """Queue a L{buildbot.process.base.BuildRequest} object for later building.""" diff --git a/buildbot/master.py b/buildbot/master.py index a618afc..f0caa5d 100644 --- a/buildbot/master.py +++ b/buildbot/master.py @@ -229,21 +229,6 @@ class BotPerspective(NewCredPerspective): d.addCallbacks(_sent, _set_failed) return d - def perspective_forceBuild(self, name, who=None): - # slave admins are allowed to force any of their own builds - for b in self.builders: - if name == b.name: - try: - b.forceBuild(who, "slave requested build") - return "ok, starting build" - except interfaces.BuilderInUseError: - return "sorry, builder was in use" - except interfaces.NoSlaveError: - return "sorry, there is no slave to run the build" - else: - log.msg("slave requested build for unknown builder '%s'" % name) - return "sorry, invalid builder name" - def perspective_keepalive(self): pass @@ -1035,6 +1020,6 @@ class Control: components.registerAdapter(Control, BuildMaster, interfaces.IControl) -# so anybody who can get a handle on the BuildMaster can force a build with: -# IControl(master).getBuilder("full-2.3").forceBuild("me", "boredom") +# so anybody who can get a handle on the BuildMaster can cause a build with: +# IControl(master).getBuilder("full-2.3").requestBuild(buildrequest) diff --git a/buildbot/process/builder.py b/buildbot/process/builder.py index 4ec51f2..03d342c 100644 --- a/buildbot/process/builder.py +++ b/buildbot/process/builder.py @@ -643,52 +643,6 @@ class BuilderControl(components.Adapter): else: __implements__ = interfaces.IBuilderControl, - def forceBuild(self, who, reason): - """This is a shortcut for building the current HEAD. - - (false: You get back a BuildRequest, just as if you'd asked politely. - To get control of the resulting build, you'll need use - req.subscribe() .) - - (true: You get back a Deferred that fires with an IBuildControl) - - This shortcut peeks into the Builder and raises an exception if there - is no slave available, to make backwards-compatibility a little - easier. - """ - - warnings.warn("Please use BuilderControl.requestBuildSoon instead", - category=DeprecationWarning, stacklevel=1) - - # see if there is an idle slave, so we can emit an appropriate error - # message - for sb in self.original.slaves: - if sb.isAvailable(): - break - else: - if self.original.building: - raise interfaces.BuilderInUseError("All slaves are in use") - raise interfaces.NoSlaveError("There are no slaves connected") - - req = base.BuildRequest(reason, sourcestamp.SourceStamp()) - self.requestBuild(req) - # this is a hack that fires the Deferred for the first build and - # ignores any others - class Watcher: - def __init__(self, req): - self.req = req - def wait(self): - self.d = d = defer.Deferred() - req.subscribe(self.started) - return d - def started(self, bs): - if self.d: - self.req.unsubscribe(self.started) - self.d.callback(bs) - self.d = None - w = Watcher(req) - return w.wait() - def requestBuild(self, req): """Submit a BuildRequest to this Builder.""" self.original.submitBuildRequest(req) diff --git a/buildbot/slave/bot.py b/buildbot/slave/bot.py index 74ee6d9..6cb29f6 100644 --- a/buildbot/slave/bot.py +++ b/buildbot/slave/bot.py @@ -335,10 +335,6 @@ class Bot(pb.Referenceable, service.MultiService): files[f] = open(filename, "r").read() return files - def debug_forceBuild(self, name): - d = self.perspective.callRemote("forceBuild", name) - d.addCallbacks(log.msg, log.err) - class BotFactory(ReconnectingPBClientFactory): # 'keepaliveInterval' serves two purposes. The first is to keep the # connection alive: it guarantees that there will be at least some diff --git a/buildbot/test/test_control.py b/buildbot/test/test_control.py index dcbfd0b..a78d4ce 100644 --- a/buildbot/test/test_control.py +++ b/buildbot/test/test_control.py @@ -72,51 +72,34 @@ class Force(unittest.TestCase): dl.append(defer.maybeDeferred(self.master.stopService)) return maybeWait(defer.DeferredList(dl)) - def testForce(self): - # TODO: since BuilderControl.forceBuild has been deprecated, this - # test is scheduled to be removed soon + def testRequest(self): m = self.master m.loadConfig(config) m.startService() d = self.connectSlave() - d.addCallback(self._testForce_1) + d.addCallback(self._testRequest_1) return maybeWait(d) - - def _testForce_1(self, res): + def _testRequest_1(self, res): c = interfaces.IControl(self.master) + req = base.BuildRequest("I was bored", SourceStamp()) builder_control = c.getBuilder("force") - d = builder_control.forceBuild("bob", "I was bored") - d.addCallback(self._testForce_2) + d = defer.Deferred() + req.subscribe(d.callback) + builder_control.requestBuild(req) + d.addCallback(self._testRequest_2) + # we use the same check-the-results code as testForce return d - def _testForce_2(self, build_control): + def _testRequest_2(self, build_control): self.failUnless(providedBy(build_control, interfaces.IBuildControl)) d = build_control.getStatus().waitUntilFinished() - d.addCallback(self._testForce_3) + d.addCallback(self._testRequest_3) return d - def _testForce_3(self, bs): + def _testRequest_3(self, bs): self.failUnless(providedBy(bs, interfaces.IBuildStatus)) self.failUnless(bs.isFinished()) self.failUnlessEqual(bs.getResults(), SUCCESS) #self.failUnlessEqual(bs.getResponsibleUsers(), ["bob"]) # TODO self.failUnlessEqual(bs.getChanges(), []) #self.failUnlessEqual(bs.getReason(), "forced") # TODO - - def testRequest(self): - m = self.master - m.loadConfig(config) - m.startService() - d = self.connectSlave() - d.addCallback(self._testRequest_1) - return maybeWait(d) - def _testRequest_1(self, res): - c = interfaces.IControl(self.master) - req = base.BuildRequest("I was bored", SourceStamp()) - builder_control = c.getBuilder("force") - d = defer.Deferred() - req.subscribe(d.callback) - builder_control.requestBuild(req) - d.addCallback(self._testForce_2) - # we use the same check-the-results code as testForce - return d diff --git a/buildbot/test/test_run.py b/buildbot/test/test_run.py index e532416..b78f155 100644 --- a/buildbot/test/test_run.py +++ b/buildbot/test/test_run.py @@ -174,19 +174,16 @@ class Disconnect(RunMixin, unittest.TestCase): self.failUnlessEqual(bs.getResults(), builder.FAILURE) - - def testIdle1(self): - # disconnect the slave before the build starts - d = self.shutdownAllSlaves() # dies before it gets started - d.addCallback(self._testIdle1_1) + def submitBuild(self): + ss = SourceStamp() + br = BuildRequest("forced build", ss, "dummy") + self.control.getBuilder("dummy").requestBuild(br) + d = defer.Deferred() + def _started(bc): + br.unsubscribe(_started) + d.callback(bc) + br.subscribe(_started) return d - def _testIdle1_1(self, res): - # trying to force a build now will cause an error. Regular builds - # just wait for the slave to re-appear, but forced builds that - # cannot be run right away trigger NoSlaveErrors - fb = self.control.getBuilder("dummy").forceBuild - self.failUnlessRaises(interfaces.NoSlaveError, - fb, None, "forced build") def testIdle2(self): # now suppose the slave goes missing @@ -220,7 +217,7 @@ class Disconnect(RunMixin, unittest.TestCase): # least 3 seconds to complete, and this batch of commands must # complete within that time. # - d = self.control.getBuilder("dummy").forceBuild(None, "forced build") + d = self.submitBuild() d.addCallback(self._testBuild1_1) return maybeWait(d) @@ -249,7 +246,7 @@ class Disconnect(RunMixin, unittest.TestCase): def testBuild2(self): # this next sequence is timing-dependent - d = self.control.getBuilder("dummy").forceBuild(None, "forced build") + d = self.submitBuild() d.addCallback(self._testBuild1_1) return maybeWait(d, 30) testBuild2.timeout = 30 @@ -279,7 +276,7 @@ class Disconnect(RunMixin, unittest.TestCase): def testBuild3(self): # this next sequence is timing-dependent - d = self.control.getBuilder("dummy").forceBuild(None, "forced build") + d = self.submitBuild() d.addCallback(self._testBuild3_1) return maybeWait(d, 30) testBuild3.timeout = 30 @@ -306,7 +303,7 @@ class Disconnect(RunMixin, unittest.TestCase): def testBuild4(self): # this next sequence is timing-dependent - d = self.control.getBuilder("dummy").forceBuild(None, "forced build") + d = self.submitBuild() d.addCallback(self._testBuild4_1) return maybeWait(d, 30) testBuild4.timeout = 30 @@ -331,7 +328,7 @@ class Disconnect(RunMixin, unittest.TestCase): def testInterrupt(self): # this next sequence is timing-dependent - d = self.control.getBuilder("dummy").forceBuild(None, "forced build") + d = self.submitBuild() d.addCallback(self._testInterrupt_1) return maybeWait(d, 30) testInterrupt.timeout = 30 -- 2.11.4.GIT