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
Ejemplo n.º 6
0
    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