package org.ovirt.engine.core.bll.scheduling;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.ovirt.engine.core.bll.scheduling.policyunits.CPUPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.CompatibilityVersionFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.CpuLevelFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.CpuOverloadPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.CpuPinningPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.EmulatedMachineFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.EvenDistributionBalancePolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.EvenDistributionCPUWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.EvenDistributionMemoryWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.EvenGuestDistributionBalancePolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.EvenGuestDistributionWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.HaReservationWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.HostDeviceFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.HostedEngineHAClusterFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.HostedEngineHAClusterWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.HostedEngineMemoryReservationFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.InClusterUpgradeFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.InClusterUpgradeWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.LabelFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.MemoryPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.MigrationPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.NetworkPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.NoneBalancePolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.PinToHostPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.PowerSavingBalancePolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.PowerSavingCPUWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.PowerSavingMemoryWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.PreferredHostsWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.SwapFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.VmAffinityFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.VmAffinityWeightPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.VmToHostAffinityFilterPolicyUnit;
import org.ovirt.engine.core.bll.scheduling.policyunits.VmToHostAffinityWeightPolicyUnit;
import org.ovirt.engine.core.common.scheduling.ClusterPolicy;
import org.ovirt.engine.core.common.scheduling.PolicyUnitType;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.compat.Guid;
public class InternalClusterPolicies {
private static final Map<Guid, ClusterPolicy> clusterPolicies = new HashMap<>();
static {
createBuilder("b4ed2332-a7ac-4d5f-9596-99a439cb2812")
.name("none")
.isDefault()
.setBalancer(NoneBalancePolicyUnit.class)
.addFilters(PinToHostPolicyUnit.class)
.addFilters(LabelFilterPolicyUnit.class)
.addFilters(CPUPolicyUnit.class)
.addFilters(CpuLevelFilterPolicyUnit.class)
.addFilters(CpuOverloadPolicyUnit.class)
.addFilters(EmulatedMachineFilterPolicyUnit.class)
.addFilters(HostDeviceFilterPolicyUnit.class)
.addFilters(HostedEngineHAClusterFilterPolicyUnit.class)
.addFilters(SwapFilterPolicyUnit.class)
.addFilters(MemoryPolicyUnit.class)
.addFilters(MigrationPolicyUnit.class)
.addFilters(VmAffinityFilterPolicyUnit.class)
.addFilters(VmToHostAffinityFilterPolicyUnit.class)
.addFilters(NetworkPolicyUnit.class)
.addFilters(CpuPinningPolicyUnit.class)
.addFilters(CompatibilityVersionFilterPolicyUnit.class)
.addFilters(HostedEngineMemoryReservationFilterPolicyUnit.class)
.addFunction(2, EvenDistributionCPUWeightPolicyUnit.class)
.addFunction(1, EvenDistributionMemoryWeightPolicyUnit.class)
.addFunction(99, PreferredHostsWeightPolicyUnit.class)
.addFunction(1, HostedEngineHAClusterWeightPolicyUnit.class)
.addFunction(1, HaReservationWeightPolicyUnit.class)
.addFunction(1, VmAffinityWeightPolicyUnit.class)
.addFunction(10, VmToHostAffinityWeightPolicyUnit.class)
.set(PolicyUnitParameter.CPU_OVERCOMMIT_DURATION_MINUTES, "2")
.set(PolicyUnitParameter.HIGH_UTILIZATION, "80")
.register();
createBuilder("20d25257-b4bd-4589-92a6-c4c5c5d3fd1a")
.name("evenly_distributed")
.setBalancer(EvenDistributionBalancePolicyUnit.class)
.addFilters(PinToHostPolicyUnit.class)
.addFilters(LabelFilterPolicyUnit.class)
.addFilters(CPUPolicyUnit.class)
.addFilters(CpuLevelFilterPolicyUnit.class)
.addFilters(CpuOverloadPolicyUnit.class)
.addFilters(EmulatedMachineFilterPolicyUnit.class)
.addFilters(HostDeviceFilterPolicyUnit.class)
.addFilters(HostedEngineHAClusterFilterPolicyUnit.class)
.addFilters(SwapFilterPolicyUnit.class)
.addFilters(MemoryPolicyUnit.class)
.addFilters(MigrationPolicyUnit.class)
.addFilters(VmAffinityFilterPolicyUnit.class)
.addFilters(VmToHostAffinityFilterPolicyUnit.class)
.addFilters(NetworkPolicyUnit.class)
.addFilters(CpuPinningPolicyUnit.class)
.addFilters(CompatibilityVersionFilterPolicyUnit.class)
.addFilters(HostedEngineMemoryReservationFilterPolicyUnit.class)
.addFunction(2, EvenDistributionCPUWeightPolicyUnit.class)
.addFunction(1, EvenDistributionMemoryWeightPolicyUnit.class)
.addFunction(99, PreferredHostsWeightPolicyUnit.class)
.addFunction(1, HostedEngineHAClusterWeightPolicyUnit.class)
.addFunction(1, HaReservationWeightPolicyUnit.class)
.addFunction(1, VmAffinityWeightPolicyUnit.class)
.addFunction(10, VmToHostAffinityWeightPolicyUnit.class)
.set(PolicyUnitParameter.HE_SPARES_COUNT, "0")
.set(PolicyUnitParameter.CPU_OVERCOMMIT_DURATION_MINUTES, "2")
.set(PolicyUnitParameter.HIGH_UTILIZATION, "80")
.register();
createBuilder("5a2b0939-7d46-4b73-a469-e9c2c7fc6a53")
.name("power_saving")
.setBalancer(PowerSavingBalancePolicyUnit.class)
.addFilters(PinToHostPolicyUnit.class)
.addFilters(LabelFilterPolicyUnit.class)
.addFilters(CPUPolicyUnit.class)
.addFilters(CpuLevelFilterPolicyUnit.class)
.addFilters(CpuOverloadPolicyUnit.class)
.addFilters(EmulatedMachineFilterPolicyUnit.class)
.addFilters(HostDeviceFilterPolicyUnit.class)
.addFilters(HostedEngineHAClusterFilterPolicyUnit.class)
.addFilters(SwapFilterPolicyUnit.class)
.addFilters(MemoryPolicyUnit.class)
.addFilters(MigrationPolicyUnit.class)
.addFilters(VmAffinityFilterPolicyUnit.class)
.addFilters(VmToHostAffinityFilterPolicyUnit.class)
.addFilters(NetworkPolicyUnit.class)
.addFilters(CpuPinningPolicyUnit.class)
.addFilters(CompatibilityVersionFilterPolicyUnit.class)
.addFilters(HostedEngineMemoryReservationFilterPolicyUnit.class)
.addFunction(2, PowerSavingCPUWeightPolicyUnit.class)
.addFunction(1, PowerSavingMemoryWeightPolicyUnit.class)
.addFunction(99, PreferredHostsWeightPolicyUnit.class)
.addFunction(1, HostedEngineHAClusterWeightPolicyUnit.class)
.addFunction(1, HaReservationWeightPolicyUnit.class)
.addFunction(1, VmAffinityWeightPolicyUnit.class)
.addFunction(10, VmToHostAffinityWeightPolicyUnit.class)
.set(PolicyUnitParameter.HE_SPARES_COUNT, "0")
.set(PolicyUnitParameter.CPU_OVERCOMMIT_DURATION_MINUTES, "2")
.set(PolicyUnitParameter.HIGH_UTILIZATION, "80")
.set(PolicyUnitParameter.LOW_UTILIZATION, "20")
.register();
createBuilder("8d5d7bec-68de-4a67-b53e-0ac54686d579")
.name("vm_evenly_distributed")
.setBalancer(EvenGuestDistributionBalancePolicyUnit.class)
.addFilters(PinToHostPolicyUnit.class)
.addFilters(LabelFilterPolicyUnit.class)
.addFilters(CPUPolicyUnit.class)
.addFilters(CpuLevelFilterPolicyUnit.class)
.addFilters(CpuOverloadPolicyUnit.class)
.addFilters(EmulatedMachineFilterPolicyUnit.class)
.addFilters(HostDeviceFilterPolicyUnit.class)
.addFilters(HostedEngineHAClusterFilterPolicyUnit.class)
.addFilters(SwapFilterPolicyUnit.class)
.addFilters(MemoryPolicyUnit.class)
.addFilters(MigrationPolicyUnit.class)
.addFilters(VmAffinityFilterPolicyUnit.class)
.addFilters(VmToHostAffinityFilterPolicyUnit.class)
.addFilters(NetworkPolicyUnit.class)
.addFilters(CpuPinningPolicyUnit.class)
.addFilters(CompatibilityVersionFilterPolicyUnit.class)
.addFilters(HostedEngineMemoryReservationFilterPolicyUnit.class)
.addFunction(2, EvenGuestDistributionWeightPolicyUnit.class)
.addFunction(99, PreferredHostsWeightPolicyUnit.class)
.addFunction(1, HostedEngineHAClusterWeightPolicyUnit.class)
.addFunction(1, HaReservationWeightPolicyUnit.class)
.addFunction(1, VmAffinityWeightPolicyUnit.class)
.addFunction(10, VmToHostAffinityWeightPolicyUnit.class)
.set(PolicyUnitParameter.HE_SPARES_COUNT, "0")
.set(PolicyUnitParameter.CPU_OVERCOMMIT_DURATION_MINUTES, "2")
.set(PolicyUnitParameter.HIGH_UTILIZATION, "80")
.set(PolicyUnitParameter.HIGH_VM_COUNT, "10")
.set(PolicyUnitParameter.MIGRATION_THRESHOLD, "5")
.set(PolicyUnitParameter.SPM_VM_GRACE, "5")
.register();
createBuilder("8d5d7bec-68de-4a67-b53e-0ac54686d586")
.name("InClusterUpgrade")
.setBalancer(NoneBalancePolicyUnit.class)
.addFilters(EmulatedMachineFilterPolicyUnit.class)
.addFilters(NetworkPolicyUnit.class)
.addFilters(MigrationPolicyUnit.class)
.addFilters(SwapFilterPolicyUnit.class)
.addFilters(MemoryPolicyUnit.class)
.addFilters(CPUPolicyUnit.class)
.addFilters(CpuLevelFilterPolicyUnit.class)
.addFilters(InClusterUpgradeFilterPolicyUnit.class)
.addFunction(1, InClusterUpgradeWeightPolicyUnit.class)
.register();
}
public static Map<Guid, ClusterPolicy> getClusterPolicies() {
return Collections.unmodifiableMap(clusterPolicies);
}
protected static PolicyBuilder createBuilder(String guid) {
final Guid realGuid = Guid.createGuidFromString(guid);
final PolicyBuilder builder = new PolicyBuilder(realGuid);
return builder;
}
protected static final class PolicyBuilder {
final ClusterPolicy policy;
private PolicyBuilder(Guid id) {
policy = new ClusterPolicy();
policy.setId(id);
policy.setFilters(new ArrayList<>());
policy.setFilterPositionMap(new HashMap<>());
policy.setFunctions(new ArrayList<>());
policy.setParameterMap(new HashMap<>());
policy.setLocked(true);
}
public final ClusterPolicy getPolicy() {
return policy;
}
public final PolicyBuilder name(String name) {
policy.setName(name);
return this;
}
public final PolicyBuilder description(String description) {
policy.setDescription(description);
return this;
}
public final PolicyBuilder isDefault() {
policy.setDefaultPolicy(true);
return this;
}
public final PolicyBuilder set(PolicyUnitParameter parameter, String value) {
// This is only executed during application startup (class loading in fact)
// and should never fail or we have a bug in the static initializer of this
// class.
assert parameter.validValue(value);
policy.getParameterMap().put(parameter.getDbName(), value);
return this;
}
@SafeVarargs
public final PolicyBuilder addFilters(Class<? extends PolicyUnitImpl>... filters) {
for (Class<? extends PolicyUnitImpl> filter: filters) {
Guid guid = getGuidAndValidateType(filter, PolicyUnitType.FILTER);
// Previously last item, but do not touch the first one
if (policy.getFilters().size() >= 2) {
Guid last = policy.getFilters().get(policy.getFilters().size() - 1);
policy.getFilterPositionMap().put(last, 0);
}
// Mark first added item as first and any other as last
if (policy.getFilters().isEmpty()) {
policy.getFilterPositionMap().put(guid, -1);
} else {
policy.getFilterPositionMap().put(guid, 1);
}
policy.getFilters().add(guid);
}
return this;
}
@SafeVarargs
public final PolicyBuilder addFunction(Integer factor, Class<? extends PolicyUnitImpl>... functions) {
for (Class<? extends PolicyUnitImpl> function: functions) {
Guid guid = getGuidAndValidateType(function, PolicyUnitType.WEIGHT);
policy.getFunctions().add(new Pair<>(guid, factor));
}
return this;
}
public final PolicyBuilder setBalancer(Class<? extends PolicyUnitImpl> balancer) {
policy.setBalance(getGuidAndValidateType(balancer, PolicyUnitType.LOAD_BALANCING));
return this;
}
public final PolicyBuilder setSelector(Class<? extends PolicyUnitImpl> selector) {
policy.setSelector(getGuidAndValidateType(selector, PolicyUnitType.SELECTOR));
return this;
}
private Guid getGuidAndValidateType(Class<? extends PolicyUnitImpl> unit, PolicyUnitType expectedType) {
SchedulingUnit guid = unit.getAnnotation(SchedulingUnit.class);
// This is only executed during application startup (class loading in fact)
// and should never fail or we have a bug in the static initializer of this
// class.
if (guid == null) {
throw new IllegalArgumentException(unit.getName()
+ " is missing the required SchedulingUnit annotation metadata.");
}
if (expectedType != guid.type()) {
throw new IllegalArgumentException("Type " + expectedType.name() + " expected, but unit "
+ unit.getName() + " is of type " + guid.type().name());
}
if (!InternalPolicyUnits.getList().contains(unit)) {
throw new IllegalArgumentException("Policy unit " + unit.getName() + " is not present"
+ " in the list of enabled internal policy units.");
}
return Guid.createGuidFromString(guid.guid());
}
private PolicyBuilder register() {
clusterPolicies.put(policy.getId(), policy);
return this;
}
}
}