Changeset 653
- Timestamp:
- 06/01/08 09:34:09 (6 months ago)
- Files:
-
- buildbot/buildslave.py (modified) (1 diff)
- buildbot/process/base.py (modified) (2 diffs)
- buildbot/status/builder.py (modified) (3 diffs)
- buildbot/status/web/slaves.py (modified) (2 diffs)
- buildbot/test/test_slaves.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
buildbot/buildslave.py
r632 r653 96 96 return self.sendBuilderList() 97 97 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) 98 104 99 105 def attached(self, bot): buildbot/process/base.py
r635 r653 310 310 self.setupProperties() 311 311 self.setupSlaveBuilder(slavebuilder) 312 slavebuilder.slave.updateSlaveStatus(buildStarted=build_status) 312 313 313 314 # convert all locks into their real forms … … 319 320 self.remote.notifyOnDisconnect(self.lostRemote) 320 321 d = self.deferred = defer.Deferred() 321 def _release_slave(res ):322 def _release_slave(res, slave, bs): 322 323 self.slavebuilder.buildFinished() 324 slave.updateSlaveStatus(buildFinished=bs) 323 325 return res 324 d.addCallback(_release_slave )326 d.addCallback(_release_slave, self.slavebuilder.slave, build_status) 325 327 326 328 try: buildbot/status/builder.py
r652 r653 1744 1744 self.name = name 1745 1745 self._lastMessageReceived = 0 1746 self.runningBuilds = [] 1746 1747 1747 1748 def getName(self): … … 1755 1756 def lastMessageReceived(self): 1756 1757 return self._lastMessageReceived 1758 def getRunningBuilds(self): 1759 return self.runningBuilds 1757 1760 1758 1761 def setAdmin(self, admin): … … 1764 1767 def setLastMessageReceived(self, when): 1765 1768 self._lastMessageReceived = when 1769 1770 def buildStarted(self, build): 1771 self.runningBuilds.append(build) 1772 def buildFinished(self, build): 1773 self.runningBuilds.remove(build) 1766 1774 1767 1775 class Status: buildbot/status/web/slaves.py
r497 r653 29 29 for name in s.getSlaveNames(): 30 30 slave = s.getSlave(name) 31 slave_status = s.botmaster.slaves[name].slave_status 32 isBusy = len(slave_status.getRunningBuilds()) 31 33 data += " <li>%s:\n" % name 32 34 data += " <ul>\n" … … 54 56 data += '<font size="-1">(%s)</font>' % lt 55 57 data += "</li>\n" 58 if isBusy: 59 data += "<li>Slave is currently building.</li>" 60 else: 61 data += "<li>Slave is idle.</li>" 56 62 else: 57 data += " <li> Slave is NOT currently connected</li>\n"63 data += " <li><b>Slave is NOT currently connected</b></li>\n" 58 64 59 65 data += " </ul>\n" buildbot/test/test_slaves.py
r536 r653 27 27 f1 = factory.BuildFactory([s(dummy.RemoteDummy, timeout=1)]) 28 28 f2 = factory.BuildFactory([s(dummy.RemoteDummy, timeout=2)]) 29 f3 = factory.BuildFactory([s(dummy.RemoteDummy, timeout=3)]) 30 f4 = factory.BuildFactory([s(dummy.RemoteDummy, timeout=5)]) 29 31 30 32 c['builders'] = [ … … 41 43 ] 42 44 45 """ 46 47 config_busyness = config_1 + """ 48 c['builders'] = [ 49 {'name': 'b1', 'slavenames': ['bot1'], 50 'builddir': 'b1', 'factory': f3}, 51 {'name': 'b2', 'slavenames': ['bot1'], 52 'builddir': 'b2', 'factory': f4}, 53 ] 43 54 """ 44 55 … … 189 200 def _testDontClaimPingingSlave_3(self, res): 190 201 self.failUnlessEqual(res.getSlavename(), "bot1") 202 203 204 class 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) 191 280 192 281 config_3 = """
![[Buildbot Logo]](/trac/chrome/site/header-text-transparent.png)