Esempio n. 1
0
    def selectWorkersFromHostPool(builder, workersForBuilders, buildRequest):
        """
        Returns availble workersForBuilders on a host with the least tasks running
        :param builder: Builder for this task
        :param workersForBuilders: List of workerForBuilders
        :param buildRequest: build request
        :return: List of workersForBuilders for a specific host
        """
        # Proceed directly to worker assignment if host is specified
        if buildRequest.properties.getProperty("host"):
            return assignWorker(buildRequest, workersForBuilders, buildRequest)

        workerToHostMap = workers.workerToHostMap()
        hostToWorkersMap = {}
        for name, host in workerToHostMap.items():
            if host in hostPool or not hostPool:
                hostToWorkersMap[host] = hostToWorkersMap.get(host,
                                                              []) + [name]
        workersForBuilders = list(
            filter(
                lambda wfb: workerToHostMap[wfb.worker.workername] in
                hostToWorkersMap, workersForBuilders))
        availableWFB = collectAvailableWorkers(workersForBuilders,
                                               workerToHostMap,
                                               hostToWorkersMap)
        return assignWorker(builder, availableWFB, buildRequest)
Esempio n. 2
0
def assignWorker(_builder, workerForBuilderList, buildRequest):
    """
    Returns available worker for a builder
    filtered by the scheduler which triggered build and by the giver task-host mapping
    See 'nextWorker' at http://docs.buildbot.net/current/manual/configuration/builders.html
    """
    workerNames = workers.workersOnHosts(
        buildRequest.properties.getProperty("host", default=""),
        *buildRequest.properties.getProperty("buildHosts", default=[]))
    for workerForBuilder in workerForBuilderList:
        workerName = workerForBuilder.worker.workername
        if workerForBuilder.isAvailable() and workerName in workerNames:
            buildRequest.properties.setProperty(
                "host",
                workers.workerToHostMap()[workerName], "Assign worker")
            return workerForBuilder
Esempio n. 3
0
def assignBuildRequest(builder, buildRequestQueue):
    """
    Chooses first request from the build request queue that can be run on any available worker
    :param builder: Builder of the requested build
    :param buildRequestQueue: List of pending build requests
    :return: Build request that can start a build
    """
    workerToHostMap = workers.workerToHostMap()
    availableWorkers = defaultdict(list)
    for wfb in builder.workers:
        if wfb.isAvailable():
            availableWorkers[workerToHostMap[wfb.worker.workername]].append(
                wfb.worker.workername)

    for buildRequest in buildRequestQueue:
        host = buildRequest.properties.getProperty("host")
        if availableWorkers.get(host) or not host:
            return buildRequest