buildbot service architecture

1\

#####
## twiste Service
## setServiceParent  will call addService
#####
twisted_10_2/twisted/application/service.py

  1. class Service: 
  2.     ...... 
  3.     def setServiceParent(self, parent): 
  4.         if self.parent is not None: 
  5.             self.disownServiceParent() 
  6.         parent = IServiceCollection(parent, parent) 
  7.         self.parent = parent 
  8.         self.parent.addService(self) 


2\
#####
## .tac file
#####
masters/master.**/buildbot.tac

  1. application = service.Application('buildmaster') 
  2. BuildMaster(basedir, configfile).setServiceParent(application) 


3\
#####
## buildbot config
## and buildbot architecture
#####
/masters/master.**/master.cfg

 

  1. c = BuildmasterConfig = {} 
  2. c['slavePortnum']  = ActiveMaster.slave_port 
  3. c['change_source'] = [devel_branch_poller] 
  4. c['schedulers'] = [s_devel_branch] 
  5. c['builders']   = [b_devel_linux] 
  6. c['slaves'] = master_utils.AutoSetupSlaves(c['builders'], 
  7.                                            config.Master.GetBotPassword()) 


buildbot_8_4p1/buildbot/master.py

  1. class BuildMaster(service.MultiService): 
  2.  
  3.     def loadConfig(self, f, checkOnly=False): 
  4.       ...... 
  5.       def do_load(_): 
  6.         ......//read the config 
  7.         try: 
  8.             config = localDict['BuildmasterConfig'] 
  9.         
  10.         ......//load the config 
  11.         try:  
  12.             schedulers = config['schedulers'] 
  13.             builders = config['builders'] 
  14.             slavePortnum = config['slavePortnum'] 
  15.             slaves = config.get('slaves', []) 
  16.             change_source = config.get('change_source', []) 
  17.  
  18.         ...... 
  19.         # Set up the database 
  20.         d.addCallback(lambda res: 
  21.                       self.loadConfig_Database(db_url, db_poll_interval)) 
  22.  
  23.         # set up slaves 
  24.         d.addCallback(lambda res: self.loadConfig_Slaves(slaves)) 
  25.  
  26.         # add/remove self.botmaster.builders to match builders. The 
  27.         # botmaster will handle startup/shutdown issues. 
  28.         d.addCallback(lambda res: self.loadConfig_Builders(builders)) 
  29.  
  30.         d.addCallback(lambda res: self.loadConfig_Status(status)) 
  31.  
  32.         # Schedulers are added after Builders in case they start right away 
  33.         d.addCallback(lambda _: self.loadConfig_Schedulers(schedulers)) 
  34.  
  35.         # and Sources go after Schedulers for the same reason 
  36.         d.addCallback(lambda res: self.loadConfig_Sources(change_sources)) 
  37.  
  38.         # debug client 
  39.         d.addCallback(lambda res: self.loadConfig_DebugClient(debugPassword)) 
  40.  
  41.  
  42.     def loadConfig_Schedulers(self, schedulers): 
  43.         ......// SchedulerManager object 
  44.         timer = metrics.Timer("BuildMaster.loadConfig_Schedulers()") 
  45.         timer.start() 
  46.         d = self.scheduler_manager.updateSchedulers(schedulers) 


4\
#####
## buildbot service architecture
#####

  1. class BuildMaster(service.MultiService): 
  2.     def __init__(self, basedir, configFileName="master.cfg"): 
  3.         ...... 
  4.         self.pbmanager.setServiceParent(self) 
  5.         self.change_svc.setServiceParent(self) 
  6.         self.botmaster.setServiceParent(self) 
  7.         self.scheduler_manager.setServiceParent(self) 
  8.  
  9.     def loadDatabase(self, db_url, db_poll_interval=None): 
  10.         ...... 
  11.         self.db.setServiceParent(self) 
  12.  
  13.  
  14. class SchedulerManager(service.MultiService): 
  15.     ...... 
  16.     def updateSchedulers(self, newschedulers): 
  17.         def startScheduler(sch): 
  18.             class_name = '%s.%s' % (sch.__class__.__module__, 
  19.                                     sch.__class__.__name__) 
  20.             class_name = new_class_names.get(class_name, class_name) 
  21.             d = self.master.db.schedulers.getSchedulerId(sch.name, class_name) 
  22.             d.addCallback(lambda schedulerid : 
  23.                     sch._setUpScheduler(schedulerid, self.master, self)) 
  24.             d.addCallback(lambda _ : 
  25.                     sch.setServiceParent(self)) 
  26.             return d 
  27.         d.addCallback(lambda _ : 
  28.             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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章