Changeset 653

Show
Ignore:
Timestamp:
06/01/08 09:34:09 (6 months ago)
Author:
dustin@v.igoro.us
Message:

#278:enhancedBuildSlavesPage-v2.diff
short patch by Ben Hearsum to make the /buildslaves WebStatus?? page
a little more useful. It does do things: 1) bolds the 'slave is NOT
connected' line to make it more visible 2) shows whether each slave
is busy (building) or not

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • buildbot/buildslave.py

    r632 r653  
    9696            return self.sendBuilderList() 
    9797        return defer.succeed(None) 
     98 
     99    def updateSlaveStatus(self, buildStarted=None, buildFinished=None): 
     100        if buildStarted: 
     101            self.slave_status.buildStarted(buildStarted) 
     102        if buildFinished: 
     103            self.slave_status.buildFinished(buildFinished) 
    98104 
    99105    def attached(self, bot): 
  • buildbot/process/base.py

    r635 r653  
    310310        self.setupProperties() 
    311311        self.setupSlaveBuilder(slavebuilder) 
     312        slavebuilder.slave.updateSlaveStatus(buildStarted=build_status) 
    312313 
    313314        # convert all locks into their real forms 
     
    319320        self.remote.notifyOnDisconnect(self.lostRemote) 
    320321        d = self.deferred = defer.Deferred() 
    321         def _release_slave(res): 
     322        def _release_slave(res, slave, bs): 
    322323            self.slavebuilder.buildFinished() 
     324            slave.updateSlaveStatus(buildFinished=bs) 
    323325            return res 
    324         d.addCallback(_release_slave
     326        d.addCallback(_release_slave, self.slavebuilder.slave, build_status
    325327 
    326328        try: 
  • buildbot/status/builder.py

    r652 r653  
    17441744        self.name = name 
    17451745        self._lastMessageReceived = 0 
     1746        self.runningBuilds = [] 
    17461747 
    17471748    def getName(self): 
     
    17551756    def lastMessageReceived(self): 
    17561757        return self._lastMessageReceived 
     1758    def getRunningBuilds(self): 
     1759        return self.runningBuilds 
    17571760 
    17581761    def setAdmin(self, admin): 
     
    17641767    def setLastMessageReceived(self, when): 
    17651768        self._lastMessageReceived = when 
     1769 
     1770    def buildStarted(self, build): 
     1771        self.runningBuilds.append(build) 
     1772    def buildFinished(self, build): 
     1773        self.runningBuilds.remove(build) 
    17661774 
    17671775class Status: 
  • buildbot/status/web/slaves.py

    r497 r653  
    2929        for name in s.getSlaveNames(): 
    3030            slave = s.getSlave(name) 
     31            slave_status = s.botmaster.slaves[name].slave_status 
     32            isBusy = len(slave_status.getRunningBuilds()) 
    3133            data += " <li>%s:\n" % name 
    3234            data += " <ul>\n" 
     
    5456                    data += '<font size="-1">(%s)</font>' % lt 
    5557                    data += "</li>\n" 
     58                    if isBusy: 
     59                        data += "<li>Slave is currently building.</li>" 
     60                    else: 
     61                        data += "<li>Slave is idle.</li>" 
    5662            else: 
    57                 data += "  <li>Slave is NOT currently connected</li>\n" 
     63                data += "  <li><b>Slave is NOT currently connected</b></li>\n" 
    5864 
    5965            data += " </ul>\n" 
  • buildbot/test/test_slaves.py

    r536 r653  
    2727f1 = factory.BuildFactory([s(dummy.RemoteDummy, timeout=1)]) 
    2828f2 = factory.BuildFactory([s(dummy.RemoteDummy, timeout=2)]) 
     29f3 = factory.BuildFactory([s(dummy.RemoteDummy, timeout=3)]) 
     30f4 = factory.BuildFactory([s(dummy.RemoteDummy, timeout=5)]) 
    2931 
    3032c['builders'] = [ 
     
    4143    ] 
    4244 
     45""" 
     46 
     47config_busyness = config_1 + """ 
     48c['builders'] = [ 
     49    {'name': 'b1', 'slavenames': ['bot1'], 
     50     'builddir': 'b1', 'factory': f3}, 
     51    {'name': 'b2', 'slavenames': ['bot1'], 
     52     'builddir': 'b2', 'factory': f4}, 
     53    ] 
    4354""" 
    4455 
     
    189200    def _testDontClaimPingingSlave_3(self, res): 
    190201        self.failUnlessEqual(res.getSlavename(), "bot1") 
     202 
     203 
     204class SlaveBusyness(RunMixin, unittest.TestCase): 
     205 
     206    def setUp(self): 
     207        RunMixin.setUp(self) 
     208        self.master.loadConfig(config_busyness) 
     209        self.master.startService() 
     210        d = self.connectSlave(["b1", "b2"]) 
     211        return d 
     212 
     213    def doBuild(self, buildername): 
     214        br = BuildRequest("forced", SourceStamp()) 
     215        d = br.waitUntilFinished() 
     216        self.control.getBuilder(buildername).requestBuild(br) 
     217        return d 
     218 
     219    def getRunningBuilds(self): 
     220        return len(self.status.getSlave("bot1").getRunningBuilds()) 
     221 
     222    def testSlaveNotBusy(self): 
     223        self.failUnlessEqual(self.getRunningBuilds(), 0) 
     224        # now kick a build, wait for it to finish, then check again 
     225        d = self.doBuild("b1") 
     226        d.addCallback(self._testSlaveNotBusy_1) 
     227        return d 
     228 
     229    def _testSlaveNotBusy_1(self, res): 
     230        self.failUnlessEqual(self.getRunningBuilds(), 0) 
     231 
     232    def testSlaveBusyOneBuild(self): 
     233        d1 = self.doBuild("b1") 
     234        d2 = defer.Deferred() 
     235        reactor.callLater(.5, d2.callback, None) 
     236        d2.addCallback(self._testSlaveBusyOneBuild_1) 
     237        d1.addCallback(self._testSlaveBusyOneBuild_finished_1) 
     238        return defer.DeferredList([d1,d2]) 
     239 
     240    def _testSlaveBusyOneBuild_1(self, res): 
     241        self.failUnlessEqual(self.getRunningBuilds(), 1) 
     242 
     243    def _testSlaveBusyOneBuild_finished_1(self, res): 
     244        self.failUnlessEqual(self.getRunningBuilds(), 0) 
     245 
     246    def testSlaveBusyTwoBuilds(self): 
     247        d1 = self.doBuild("b1") 
     248        d2 = self.doBuild("b2") 
     249        d3 = defer.Deferred() 
     250        reactor.callLater(.5, d3.callback, None) 
     251        d3.addCallback(self._testSlaveBusyTwoBuilds_1) 
     252        d1.addCallback(self._testSlaveBusyTwoBuilds_finished_1, d2) 
     253        return defer.DeferredList([d1,d3]) 
     254 
     255    def _testSlaveBusyTwoBuilds_1(self, res): 
     256        self.failUnlessEqual(self.getRunningBuilds(), 2) 
     257 
     258    def _testSlaveBusyTwoBuilds_finished_1(self, res, d2): 
     259        self.failUnlessEqual(self.getRunningBuilds(), 1) 
     260        d2.addCallback(self._testSlaveBusyTwoBuilds_finished_2) 
     261        return d2 
     262 
     263    def _testSlaveBusyTwoBuilds_finished_2(self, res): 
     264        self.failUnlessEqual(self.getRunningBuilds(), 0) 
     265 
     266    def testSlaveDisconnect(self): 
     267        d1 = self.doBuild("b1") 
     268        d2 = defer.Deferred() 
     269        reactor.callLater(.5, d2.callback, None) 
     270        d2.addCallback(self._testSlaveDisconnect_1) 
     271        d1.addCallback(self._testSlaveDisconnect_finished_1) 
     272        return defer.DeferredList([d1, d2]) 
     273 
     274    def _testSlaveDisconnect_1(self, res): 
     275        self.failUnlessEqual(self.getRunningBuilds(), 1) 
     276        return self.shutdownAllSlaves() 
     277 
     278    def _testSlaveDisconnect_finished_1(self, res): 
     279        self.failUnlessEqual(self.getRunningBuilds(), 0) 
    191280 
    192281config_3 = """