package org.ovirt.engine.core.bll.scheduling.policyunits; import java.util.ArrayList; import java.util.HashMap; 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.PerHostMessages; 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 = "84e6ddee-ab0d-42dd-82f0-c297779db567", name = "VmAffinityGroups", description = "Enables Affinity Groups soft enforcement for VMs; VMs in group are most likely to run either" + " on the same hypervisor host (positive) or on independent hypervisor hosts (negative)", type = PolicyUnitType.WEIGHT ) public class VmAffinityWeightPolicyUnit extends PolicyUnitImpl { private static final int DEFAULT_SCORE = 1; public VmAffinityWeightPolicyUnit(PolicyUnit policyUnit, PendingResourceManager pendingResourceManager) { super(policyUnit, pendingResourceManager); } @Override public List<Pair<Guid, Integer>> score(Cluster cluster, List<VDS> hosts, VM vm, Map<String, String> parameters) { // reuse filter functionality with soft constraint List<VDS> acceptableHostsList = VmAffinityFilterPolicyUnit.getAcceptableHosts(false, hosts, vm, new PerHostMessages(), getPendingResourceManager()); Map<Guid, VDS> acceptableHostsMap = new HashMap<>(); if (acceptableHostsList != null) { for (VDS acceptableHost : acceptableHostsList) { acceptableHostsMap.put(acceptableHost.getId(), acceptableHost); } } List<Pair<Guid, Integer>> retList = new ArrayList<>(); int score; for (VDS host : hosts) { score = DEFAULT_SCORE; if (!acceptableHostsMap.containsKey(host.getId())) { score = MaxSchedulerWeight; } retList.add(new Pair<>(host.getId(), score)); } return retList; } }