def attached(self, slave, commands): """This is invoked by the BuildSlave when the self.slavename bot registers their builder. @type slave: L{buildbot.buildslave.BuildSlave} @param slave: the BuildSlave that represents the buildslave as a whole @type commands: dict: string -> string, or None @param commands: provides the slave's version of each RemoteCommand @rtype: L{twisted.internet.defer.Deferred} @return: a Deferred that fires (with 'self') when the slave-side builder is fully attached and ready to accept commands. """ for s in self.attaching_slaves + self.slaves: if s.slave == slave: # already attached to them. This is fairly common, since # attached() gets called each time we receive the builder # list from the slave, and we ask for it each time we add or # remove a builder. So if the slave is hosting builders # A,B,C, and the config file changes A, we'll remove A and # re-add it, triggering two builder-list requests, getting # two redundant calls to attached() for B, and another two # for C. # # Therefore, when we see that we're already attached, we can # just ignore it. return defer.succeed(self) sb = slavebuilder.SlaveBuilder() sb.setBuilder(self) self.attaching_slaves.append(sb) d = sb.attached(slave, commands) d.addCallback(self._attached) d.addErrback(self._not_attached, slave) return d
def setUp(self): self.master = fakemaster.make_master(testcase=self, wantData=True, wantMq=True, wantDb=True) self.master.db.insertTestData([ fakedb.Builder(id=80, name='test'), ]) self.builder = builder.Builder('test', _addServices=False) self.builder._builderid = 80 self.builder.master = self.master yield self.builder.startService() self.factory = factory.BuildFactory() # will have steps added later new_config = config.MasterConfig() new_config.builders.append( config.BuilderConfig(name='test', slavename='testsl', factory=self.factory)) yield self.builder.reconfigServiceWithBuildbotConfig(new_config) self.slave = BuildSlave('bsl', 'pass') self.slave.sendBuilderList = lambda: defer.succeed(None) self.slave.parent = mock.Mock() self.slave.master.botmaster = mock.Mock() self.slave.botmaster.maybeStartBuildsForSlave = lambda sl: None self.slave.botmaster.getBuildersForSlave = lambda sl: [] self.slave.parent = self.master self.slave.startService() self.conn = fakeprotocol.FakeConnection(self.master, self.slave) yield self.slave.attached(self.conn) sb = self.slavebuilder = slavebuilder.SlaveBuilder() sb.setBuilder(self.builder) yield sb.attached(self.slave, {}) # add the buildset/request self.bsid, brids = yield self.master.db.buildsets.addBuildset( sourcestamps=[{}], reason=u'x', properties={}, builderids=[80], waited_for=False) self.brdict = \ yield self.master.db.buildrequests.getBuildRequest(brids[80]) self.buildrequest = \ yield buildrequest.BuildRequest.fromBrdict(self.master, self.brdict)
def setUp(self): self.master = fakemaster.make_master(testcase=self, wantDb=True) self.builder = builder.Builder('test', _addServices=False) self.builder.master = self.master yield self.builder.startService() self.factory = factory.BuildFactory() # will have steps added later new_config = config.MasterConfig() new_config.builders.append( config.BuilderConfig(name='test', slavename='testsl', factory=self.factory)) yield self.builder.reconfigService(new_config) self.slave = BuildSlave('bsl', 'pass') self.slave.sendBuilderList = lambda: defer.succeed(None) self.slave.botmaster = mock.Mock() self.slave.botmaster.maybeStartBuildsForSlave = lambda sl: None self.slave.master = self.master self.slave.startService() self.remote = FakeBot() yield self.slave.attached(self.remote) sb = self.slavebuilder = slavebuilder.SlaveBuilder() sb.setBuilder(self.builder) yield sb.attached(self.slave, self.remote, {}) # add the buildset/request sssid = yield self.master.db.sourcestampsets.addSourceStampSet() yield self.master.db.sourcestamps.addSourceStamp( branch='br', revision='1', repository='r://', project='', sourcestampsetid=sssid) self.bsid, brids = yield self.master.db.buildsets.addBuildset( sourcestampsetid=sssid, reason=u'x', properties={}, builderNames=['test']) self.brdict = \ yield self.master.db.buildrequests.getBuildRequest(brids['test']) self.buildrequest = \ yield buildrequest.BuildRequest.fromBrdict(self.master, self.brdict)