def do_test_old_slave_absent_timeout(self, callRemoteException=None): clock = task.Clock() PING_TIMEOUT = botmaster.DuplicateSlaveArbitrator.PING_TIMEOUT old_remote = FakeRemoteBuildSlave("old", reactor=clock, callRemoteHang=PING_TIMEOUT + 1, callRemoteException=callRemoteException) new_remote = FakeRemoteBuildSlave("new") buildslave = FakeAbstractBuildSlave(old_remote, name="testslave", reactor=clock) arb = botmaster.DuplicateSlaveArbitrator(buildslave) arb._reactor = clock d = arb.getPerspective(new_remote, "testslave") def got_persp(bs): self.assertIdentical(bs, buildslave) d.addCallback(got_persp) # show the passage of time for 2s more than the PING_TIMEOUT, to allow # the old callRemote to return eventually clock.pump([.1] * 10 * (PING_TIMEOUT + 4)) # check that the timed-out call eventually returned (and was ignored, # even if there was an exception) self.failUnless(old_remote.callRemote_d.called) return d
def test_old_slave_absent_connlost_failure(self): old_remote = FakeRemoteBuildSlave("old", callRemoteFailure=self.makePBConnectionLostFailure) new_remote = FakeRemoteBuildSlave("new") buildslave = FakeAbstractBuildSlave(old_remote, name="testslave") arb = botmaster.DuplicateSlaveArbitrator(buildslave) d = arb.getPerspective(new_remote, "testslave") def got_persp(bs): self.assertIdentical(bs, buildslave) d.addCallback(got_persp) return d
def test_old_slave_absent_deadref_exc(self): old_remote = FakeRemoteBuildSlave("old", callRemoteException=self.makeDeadReferenceError) new_remote = FakeRemoteBuildSlave("new") buildslave = FakeAbstractBuildSlave(old_remote, name="testslave") arb = botmaster.DuplicateSlaveArbitrator(buildslave) d = arb.getPerspective(new_remote, "testslave") def got_persp(bs): self.assertIdentical(bs, buildslave) d.addCallback(got_persp) return d
def test_old_slave_present(self): old_remote = FakeRemoteBuildSlave("old") new_remote = FakeRemoteBuildSlave("new") buildslave = FakeAbstractBuildSlave(old_remote, name="testslave") arb = botmaster.DuplicateSlaveArbitrator(buildslave) d = arb.getPerspective(new_remote, "testslave") def got_persp(bs): self.fail("shouldn't get here") def failed(f): f.trap(RuntimeError) # expected error d.addCallbacks(got_persp, failed) return d
def test_old_slave_absent_unexpected_exc(self): old_remote = FakeRemoteBuildSlave("old", callRemoteException=self.makeRuntimeError) new_remote = FakeRemoteBuildSlave("new") buildslave = FakeAbstractBuildSlave(old_remote, name="testslave") arb = botmaster.DuplicateSlaveArbitrator(buildslave) d = arb.getPerspective(new_remote, "testslave") def got_persp(bs): # getPerspective has returned successfully: self.assertIdentical(bs, buildslave) # and the unexpected RuntimeError was logged: self.assertEqual(len(self.flushLoggedErrors(RuntimeError)), 1) d.addCallback(got_persp) return d
def getPerspective(self, mind, slavename): assert slavename == self.slavename metrics.MetricCountEvent.log("attached_slaves", 1) # record when this connection attempt occurred if self.slave_status: self.slave_status.recordConnectTime() if self.isConnected(): # duplicate slave - send it to arbitration arb = botmaster.DuplicateSlaveArbitrator(self) return arb.getPerspective(mind, slavename) else: log.msg("slave '%s' attaching from %s" % (slavename, mind.broker.transport.getPeer())) return self