package org.ovirt.engine.core.bll.scheduling.policyunits; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.spy; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; import org.ovirt.engine.core.bll.scheduling.pending.PendingResourceManager; import org.ovirt.engine.core.common.businessentities.BusinessEntity; 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.utils.Pair; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.utils.MockConfigRule; @RunWith(MockitoJUnitRunner.class) public class EvenDistributionWeightPolicyUnitTest extends AbstractPolicyUnitTest { private static final Guid DESTINATION_HOST = new Guid("087fc691-de02-11e4-8830-0800200c9a66"); @ClassRule public static MockConfigRule configRule = new MockConfigRule(); @Test public void testScoreForCpuLoad() throws Exception { EvenDistributionCPUWeightPolicyUnit unit = mockPolicyUnit(EvenDistributionCPUWeightPolicyUnit.class); Map<Guid, BusinessEntity<Guid>> cache = newCache(); final Map<Guid, VDS> hosts = loadHosts("basic_power_saving_hosts_cpu_load.csv", cache); final Map<Guid, VM> vms = loadVMs("basic_power_saving_vms.csv", cache); testScore(unit, hosts, vms, DESTINATION_HOST); } @Test public void testScoreForMemoryLoad() throws Exception { EvenDistributionMemoryWeightPolicyUnit unit = mockPolicyUnit(EvenDistributionMemoryWeightPolicyUnit.class); Map<Guid, BusinessEntity<Guid>> cache = newCache(); final Map<Guid, VDS> hosts = loadHosts("basic_power_saving_hosts_mem_load.csv", cache); final Map<Guid, VM> vms = loadVMs("basic_power_saving_vms.csv", cache); testScore(unit, hosts, vms, DESTINATION_HOST); } protected <T extends EvenDistributionWeightPolicyUnit> void testScore(T unit, Map<Guid, VDS> hosts, Map<Guid, VM> vms, Guid destinationHost) { Cluster cluster = new Cluster(); ArrayList<String> messages = new ArrayList<>(); for (VM vm : vms.values()) { Guid hostId = selectedBestHost(unit, vm, new ArrayList<VDS>(hosts.values())); assertNotNull(hostId); assertEquals(destinationHost, hostId); } } protected <T extends EvenDistributionWeightPolicyUnit> T mockPolicyUnit(Class<T> unitType) throws Exception { return spy(unitType.getConstructor(PolicyUnit.class, PendingResourceManager.class) .newInstance(null, new PendingResourceManager())); } protected <T extends EvenDistributionWeightPolicyUnit> Guid selectedBestHost(T unit, VM vm, ArrayList<VDS> hosts) { List<Pair<Guid, Integer>> scores = unit.score(new Cluster(), hosts, vm, null); scores.sort(Comparator.comparing(Pair::getSecond)); return scores.get(0).getFirst(); } }