package org.ovirt.engine.core.bll.scheduling.policyunits;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl;
import org.ovirt.engine.core.bll.scheduling.SchedulingUnit;
import org.ovirt.engine.core.bll.scheduling.pending.PendingResourceManager;
import org.ovirt.engine.core.bll.scheduling.selector.SelectorInstance;
import org.ovirt.engine.core.common.scheduling.PolicyUnit;
import org.ovirt.engine.core.common.scheduling.PolicyUnitType;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.compat.Guid;
@SchedulingUnit(
guid = "0c89f215-9c4f-4bbb-8419-31a2d43ae7ea",
name = "BasicWeighting",
type = PolicyUnitType.SELECTOR,
description = "The host with lowest accumulated weight wins. No ranking or scaling is performed."
)
public class BasicWeightSelectorPolicyUnit extends PolicyUnitImpl {
public BasicWeightSelectorPolicyUnit(PolicyUnit policyUnit, PendingResourceManager pendingResourceManager) {
super(policyUnit, pendingResourceManager);
}
@Override
public SelectorInstance selector(Map<String, String> parameters) {
return new Selector();
}
public static class Selector implements SelectorInstance {
final Map<Guid, Integer> weightTable = new HashMap<>();
final Map<Guid, Integer> factorTable = new HashMap<>();
@Override
public void init(List<Pair<Guid, Integer>> policyUnits, List<Guid> hosts) {
for (Pair<Guid, Integer> pair: policyUnits) {
factorTable.put(pair.getFirst(), pair.getSecond());
}
}
@Override
public void record(Guid policyUnit, Guid host, Integer weight) {
weightTable.putIfAbsent(host, 0);
Integer acc = weightTable.get(host);
Integer factor = factorTable.getOrDefault(policyUnit, 1);
acc += factor * weight;
weightTable.put(host, acc);
}
@Override
public Optional<Guid> best() {
Optional<Guid> bestHostEntry = weightTable.entrySet().stream()
.min(Comparator.comparingInt(Entry::getValue))
.map(Map.Entry::getKey);
return bestHostEntry;
}
}
}