def test_reconfigService_db_url_changed(self): old = self.master.config = MasterConfig() old.db['db_url'] = 'aaaa' yield self.master.reconfigServiceWithBuildbotConfig(old) new = MasterConfig() new.db['db_url'] = 'bbbb' with self.assertRaises(config.ConfigErrors): self.master.reconfigServiceWithBuildbotConfig(new)
def test_does_not_reconfig_identical(self): yield self.makeBuilder(description="Old", tags=["OldTag"]) new_builder_config = config.BuilderConfig(**self.config_args) mastercfg = MasterConfig() mastercfg.builders = [new_builder_config] builder_updates = [] self.master.data.updates.updateBuilderInfo = \ lambda builderid, desc, tags: builder_updates.append((builderid, desc, tags)) yield self.bldr.reconfigServiceWithBuildbotConfig(mastercfg) self.assertEqual(builder_updates, [])
def test_reconfig_changed(self, name, new_desc, new_tags): yield self.makeBuilder(description="Old", tags=["OldTag"]) new_builder_config = config.BuilderConfig(**self.config_args) new_builder_config.description = new_desc new_builder_config.tags = new_tags mastercfg = MasterConfig() mastercfg.builders = [new_builder_config] builder_updates = [] self.master.data.updates.updateBuilderInfo = \ lambda builderid, desc, tags: builder_updates.append((builderid, desc, tags)) yield self.bldr.reconfigServiceWithBuildbotConfig(mastercfg) self.assertEqual(builder_updates, [(1, new_desc, new_tags)])
def test_reconfig(self): yield self.makeBuilder(description="Old", tags=["OldTag"]) new_builder_config = config.BuilderConfig(**self.config_args) new_builder_config.description = "New" new_builder_config.tags = ["NewTag"] mastercfg = MasterConfig() mastercfg.builders = [new_builder_config] yield self.bldr.reconfigServiceWithBuildbotConfig(mastercfg) # check that the reconfig grabbed a builderid self.assertIsNotNone(self.bldr._builderid) builder_dict = yield self.master.data.get( ('builders', self.bldr._builderid)) self.assertEqual(builder_dict['description'], 'New') self.assertEqual(builder_dict['tags'], ['NewTag']) self.assertIdentical(self.bldr.config, new_builder_config)
def makeBuilder(self, name="bldr", patch_random=False, noReconfig=False, **config_kwargs): """Set up C{self.bldr}""" # only include the necessary required config, plus user-requested self.config_args = { 'name': name, 'workername': 'wrk', 'builddir': 'bdir', 'workerbuilddir': "wbdir", 'factory': self.factory } self.config_args.update(config_kwargs) self.builder_config = config.BuilderConfig(**self.config_args) self.bldr = builder.Builder(self.builder_config.name) self.bldr.master = self.master self.bldr.botmaster = self.master.botmaster # patch into the _startBuildsFor method self.builds_started = [] def _startBuildFor(workerforbuilder, buildrequests): self.builds_started.append((workerforbuilder, buildrequests)) return defer.succeed(True) self.bldr._startBuildFor = _startBuildFor if patch_random: # patch 'random.choice' to always take the worker that sorts # last, based on its name self.patch(random, "choice", lambda lst: sorted(lst, key=lambda m: m.name)[-1]) self.bldr.startService() mastercfg = MasterConfig() mastercfg.builders = [self.builder_config] if not noReconfig: return self.bldr.reconfigServiceWithBuildbotConfig(mastercfg)
def setUp(self): self.setup_test_reactor() yield self.setUpRealDatabase(table_names=[ 'changes', 'change_properties', 'change_files', 'patches', 'sourcestamps', 'buildset_properties', 'buildsets', 'sourcestampsets', 'builds', 'builders', 'masters', 'buildrequests', 'workers' ]) self.master = fakemaster.make_master(self) self.master.config = MasterConfig() self.db = connector.DBConnector(os.path.abspath('basedir')) yield self.db.setServiceParent(self.master)
def makeScheduler(self, name='testsched', builderNames=None, **kw): if builderNames is None: builderNames = ['a', 'b'] sched = self.attachScheduler( ForceScheduler(name=name, builderNames=builderNames, **kw), self.OBJECTID, self.SCHEDULERID, overrideBuildsetMethods=True, createBuilderDB=True) sched.master.config = MasterConfig() self.assertEqual(sched.name, name) return sched
def setUp(self): self.setup_test_reactor() self.master = mock.Mock(name='master') self.config = MasterConfig()
def loadConfig(self): return MasterConfig.loadFromDict(self.config_dict, '<dict>')
def loadConfig(self): return MasterConfig()
def __init__(self, BuildmasterConfig, basedir, name="config"): self.db_url = MasterConfig.getDbUrlFromConfig(BuildmasterConfig, throwErrors=False) self.basedir = basedir self.name = name
def setUp(self): self.master = mock.Mock() self.umm = manager.UserManagerManager(self.master) self.umm.startService() self.config = MasterConfig()
def __init__(self, basedir, configFileName=None, umask=None, reactor=None, config_loader=None): super().__init__() if reactor is None: from twisted.internet import reactor self.reactor = reactor self.setName("buildmaster") self.umask = umask self.basedir = basedir if basedir is not None: # None is used in tests assert os.path.isdir(self.basedir) if config_loader is not None and configFileName is not None: raise config.ConfigErrors([ "Can't specify both `config_loader` and `configFilename`.", ]) if config_loader is None: if configFileName is None: configFileName = 'master.cfg' config_loader = FileLoader(self.basedir, configFileName) self.config_loader = config_loader self.configFileName = configFileName # flag so we don't try to do fancy things before the master is ready self._master_initialized = False self.initLock = defer.DeferredLock() # set up child services self._services_d = self.create_child_services() # db configured values self.configured_db_url = None # configuration / reconfiguration handling self.config = MasterConfig() self.config_version = 0 # increased by one on each reconfig self.reconfig_active = False self.reconfig_requested = False self.reconfig_notifier = None # this stores parameters used in the tac file, and is accessed by the # WebStatus to duplicate those values. self.log_rotation = LogRotation() # local cache for this master's object ID self._object_id = None # Check environment is sensible check_functional_environment(self.config) # figure out local hostname try: self.hostname = os.uname()[1] # only on unix except AttributeError: self.hostname = socket.getfqdn() # public attributes self.name = (f"{self.hostname}:{os.path.abspath(self.basedir or '.')}") if isinstance(self.name, bytes): self.name = self.name.decode('ascii', 'replace') self.masterid = None