1\
#####
## twiste Service
## setServiceParent will call addService
#####
twisted_10_2/twisted/application/service.py
- class Service:
- ......
- def setServiceParent(self, parent):
- if self.parent is not None:
- self.disownServiceParent()
- parent = IServiceCollection(parent, parent)
- self.parent = parent
- self.parent.addService(self)
2\
#####
## .tac file
#####
masters/master.**/buildbot.tac
- application = service.Application('buildmaster')
- BuildMaster(basedir, configfile).setServiceParent(application)
3\
#####
## buildbot config
## and buildbot architecture
#####
/masters/master.**/master.cfg
- c = BuildmasterConfig = {}
- c['slavePortnum'] = ActiveMaster.slave_port
- c['change_source'] = [devel_branch_poller]
- c['schedulers'] = [s_devel_branch]
- c['builders'] = [b_devel_linux]
- c['slaves'] = master_utils.AutoSetupSlaves(c['builders'],
- config.Master.GetBotPassword())
buildbot_8_4p1/buildbot/master.py
- class BuildMaster(service.MultiService):
- def loadConfig(self, f, checkOnly=False):
- ......
- def do_load(_):
- ......//read the config
- try:
- config = localDict['BuildmasterConfig']
- ......//load the config
- try:
- schedulers = config['schedulers']
- builders = config['builders']
- slavePortnum = config['slavePortnum']
- slaves = config.get('slaves', [])
- change_source = config.get('change_source', [])
- ......
- # Set up the database
- d.addCallback(lambda res:
- self.loadConfig_Database(db_url, db_poll_interval))
- # set up slaves
- d.addCallback(lambda res: self.loadConfig_Slaves(slaves))
- # add/remove self.botmaster.builders to match builders. The
- # botmaster will handle startup/shutdown issues.
- d.addCallback(lambda res: self.loadConfig_Builders(builders))
- d.addCallback(lambda res: self.loadConfig_Status(status))
- # Schedulers are added after Builders in case they start right away
- d.addCallback(lambda _: self.loadConfig_Schedulers(schedulers))
- # and Sources go after Schedulers for the same reason
- d.addCallback(lambda res: self.loadConfig_Sources(change_sources))
- # debug client
- d.addCallback(lambda res: self.loadConfig_DebugClient(debugPassword))
- def loadConfig_Schedulers(self, schedulers):
- ......// SchedulerManager object
- timer = metrics.Timer("BuildMaster.loadConfig_Schedulers()")
- timer.start()
- d = self.scheduler_manager.updateSchedulers(schedulers)
4\
#####
## buildbot service architecture
#####
- class BuildMaster(service.MultiService):
- def __init__(self, basedir, configFileName="master.cfg"):
- ......
- self.pbmanager.setServiceParent(self)
- self.change_svc.setServiceParent(self)
- self.botmaster.setServiceParent(self)
- self.scheduler_manager.setServiceParent(self)
- def loadDatabase(self, db_url, db_poll_interval=None):
- ......
- self.db.setServiceParent(self)
- class SchedulerManager(service.MultiService):
- ......
- def updateSchedulers(self, newschedulers):
- def startScheduler(sch):
- class_name = '%s.%s' % (sch.__class__.__module__,
- sch.__class__.__name__)
- class_name = new_class_names.get(class_name, class_name)
- d = self.master.db.schedulers.getSchedulerId(sch.name, class_name)
- d.addCallback(lambda schedulerid :
- sch._setUpScheduler(schedulerid, self.master, self))
- d.addCallback(lambda _ :
- sch.setServiceParent(self))
- return d
- d.addCallback(lambda _ :
- defer.gatherResults([startScheduler(new[n]) for n in added_names]))
summary=================================================
1\ buildbot的結構爲樹狀,MultiService包含多個MultiService,子MultiService還能包含其他的service.
2\ SchedulerManager BuildMaster.loadConfig()讀配置文件,
service 見
http://twistedmatrix.com/documents/current/core/howto/tutorial/protocol.html