Search in sources :

Example 1 with SelectorInstance

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());
}
Also used : SelectorInstance(org.ovirt.engine.core.bll.scheduling.selector.SelectorInstance) VDS(org.ovirt.engine.core.common.businessentities.VDS) Guid(org.ovirt.engine.core.compat.Guid) LinkedList(java.util.LinkedList) Pair(org.ovirt.engine.core.common.utils.Pair)

Aggregations

LinkedList (java.util.LinkedList)1 SelectorInstance (org.ovirt.engine.core.bll.scheduling.selector.SelectorInstance)1 VDS (org.ovirt.engine.core.common.businessentities.VDS)1 Pair (org.ovirt.engine.core.common.utils.Pair)1 Guid (org.ovirt.engine.core.compat.Guid)1