package org.ovirt.engine.core.bll.scheduling.policyunits; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import java.lang.reflect.InvocationTargetException; import java.text.ParseException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import org.ovirt.engine.core.bll.scheduling.external.BalanceResult; 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.compat.Guid; import org.ovirt.engine.core.dao.ClusterDao; import org.ovirt.engine.core.dao.VdsDao; import org.ovirt.engine.core.dao.VmDao; import org.ovirt.engine.core.dao.VmStatisticsDao; public class CpuAndMemoryBalancingPolicyUnitTest extends AbstractPolicyUnitTest { protected <T extends CpuAndMemoryBalancingPolicyUnit> T mockUnit( Class<T> unitType, Cluster cluster, Map<Guid, VDS> hosts, Map<Guid, VM> vms) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ParseException { T unit = spy(unitType.getConstructor(PolicyUnit.class, PendingResourceManager.class) .newInstance(null, null)); // mock current time doReturn(TIME_FORMAT.parse("2015-01-01 12:00:00")).when(unit).getTime(); // mock cluster Dao ClusterDao clusterDao = mock(ClusterDao.class); doReturn(clusterDao).when(unit).getClusterDao(); doReturn(cluster).when(clusterDao).get(any(Guid.class)); // mock host Dao VdsDao vdsDao = mock(VdsDao.class); doReturn(vdsDao).when(unit).getVdsDao(); doReturn(new ArrayList<>(hosts.values())).when(vdsDao).getAllForCluster(any(Guid.class)); // mock VM Dao VmDao vmDao = mock(VmDao.class); doReturn(vmDao).when(unit).getVmDao(); for (Guid guid: hosts.keySet()) { doReturn(vmsOnAHost(vms.values(), guid)).when(vmDao).getAllRunningForVds(guid); } for (Map.Entry<Guid, VM> vm: vms.entrySet()) { doReturn(vm.getValue()).when(vmDao).get(vm.getKey()); } VmStatisticsDao vmStatisticsDao = mock(VmStatisticsDao.class); doReturn(vmStatisticsDao).when(unit).getVmStatisticsDao(); for (Map.Entry<Guid, VM> entry : vms.entrySet()) { doReturn(entry.getValue().getStatisticsData()).when(vmStatisticsDao).get(entry.getKey()); } return unit; } private List<VM> vmsOnAHost(Collection<VM> vms, Guid host) { List<VM> result = new ArrayList<>(); for (VM vm: vms) { if (vm.getRunOnVds().equals(host)) { result.add(vm); } } return result; } protected List<Guid> validMigrationTargets(CpuAndMemoryBalancingPolicyUnit unit, Optional<BalanceResult> result) { VM vm = unit.getVmDao().get(result.get().getVmToMigrate()); return result.get().getCandidateHosts() .stream() .filter(h -> !h.equals(vm.getRunOnVds())) .collect(Collectors.toList()); } }