use of org.ovirt.engine.core.bll.scheduling.selector.SelectorInstance in project ovirt-engine by oVirt.
the class SchedulingManager method selectBestHost.
/**
* @param destHostIdList - used for RunAt preselection, overrides the ordering in vdsList
* @param availableVdsList - presorted list of hosts (better hosts first) that are available
*/
private Optional<Guid> selectBestHost(Cluster cluster, VM vm, List<Guid> destHostIdList, List<VDS> availableVdsList, ClusterPolicy policy, Map<String, String> parameters) {
// in case a default destination host was specified and
// it passed filters, return the first found
List<VDS> runnableHosts = new LinkedList<>();
if (destHostIdList.size() > 0) {
// intersect dedicated hosts list with available list
for (VDS vds : availableVdsList) {
for (Guid destHostId : destHostIdList) {
if (destHostId.equals(vds.getId())) {
runnableHosts.add(vds);
}
}
}
}
if (runnableHosts.isEmpty()) {
// no dedicated hosts found
runnableHosts = availableVdsList;
}
switch(runnableHosts.size()) {
case 0:
// no runnable hosts found, nothing found
return Optional.empty();
case 1:
// found single available host, in available list return it
return Optional.of(runnableHosts.get(0).getId());
default:
// select best runnable host with scoring functions (from policy)
List<Pair<Guid, Integer>> functions = policy.getFunctions();
Guid selector = Optional.of(policy).map(ClusterPolicy::getSelector).orElse(defaultSelectorGuid);
PolicyUnitImpl selectorUnit = policyUnits.get(selector);
SelectorInstance selectorInstance = selectorUnit.selector(parameters);
List<Guid> runnableGuids = runnableHosts.stream().map(VDS::getId).collect(Collectors.toList());
selectorInstance.init(functions, runnableGuids);
if (!functions.isEmpty() && shouldWeighClusterHosts(cluster, runnableHosts)) {
Optional<Guid> bestHostByFunctions = runFunctions(selectorInstance, functions, cluster, runnableHosts, vm, parameters);
if (bestHostByFunctions.isPresent()) {
return bestHostByFunctions;
}
}
}
// failed select best runnable host using scoring functions, return the first
return Optional.of(runnableHosts.get(0).getId());
}
Aggregations