예제 #1
0
    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)
예제 #2
0
    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, [])
예제 #3
0
    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)])
예제 #4
0
    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)
예제 #5
0
    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)
예제 #6
0
    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)
예제 #7
0
    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
예제 #8
0
 def setUp(self):
     self.setup_test_reactor()
     self.master = mock.Mock(name='master')
     self.config = MasterConfig()
예제 #9
0
 def loadConfig(self):
     return MasterConfig.loadFromDict(self.config_dict, '<dict>')
예제 #10
0
 def loadConfig(self):
     return MasterConfig()
예제 #11
0
 def __init__(self, BuildmasterConfig, basedir, name="config"):
     self.db_url = MasterConfig.getDbUrlFromConfig(BuildmasterConfig,
                                                   throwErrors=False)
     self.basedir = basedir
     self.name = name
예제 #12
0
    def setUp(self):
        self.master = mock.Mock()
        self.umm = manager.UserManagerManager(self.master)
        self.umm.startService()

        self.config = MasterConfig()
예제 #13
0
파일: master.py 프로젝트: pks-os/buildbot
    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