package org.ovirt.engine.core.bll.scheduling.policyunits;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VM;
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 = "98e92667-6161-41fb-b3fa-34f820ccbc4b",
name = "HA",
description = "Weights hosts according to their HA score",
type = PolicyUnitType.WEIGHT
)
public class HostedEngineHAClusterWeightPolicyUnit extends PolicyUnitImpl {
private static int DEFAULT_WEIGHT = 1;
private static int MAXIMUM_HA_SCORE = 2400;
public HostedEngineHAClusterWeightPolicyUnit(PolicyUnit policyUnit,
PendingResourceManager pendingResourceManager) {
super(policyUnit, pendingResourceManager);
}
void fillDefaultScores(List<VDS> hosts, List<Pair<Guid, Integer>> scores) {
for (VDS host : hosts) {
scores.add(new Pair<>(host.getId(), DEFAULT_WEIGHT));
}
}
@Override
public List<Pair<Guid, Integer>> score(Cluster cluster, List<VDS> hosts, VM vm, Map<String, String> parameters) {
List<Pair<Guid, Integer>> scores = new ArrayList<>();
boolean isHostedEngine = vm.isHostedEngine();
if (isHostedEngine) {
// If the max HA score is higher than the max weight, then we normalize. Otherwise the ratio is 1, keeping the value as is
float ratio = MAXIMUM_HA_SCORE > MaxSchedulerWeight ? ((float) MaxSchedulerWeight / MAXIMUM_HA_SCORE) : 1;
for (VDS host : hosts) {
scores.add(new Pair<>(host.getId(), MaxSchedulerWeight - Math.round(host.getHighlyAvailableScore() * ratio)));
}
} else {
fillDefaultScores(hosts, scores);
}
return scores;
}
}