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)
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
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