package org.ovirt.engine.core.bll.scheduling.policyunits;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.common.scheduling.AffinityGroup;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.compat.Guid;
@RunWith(MockitoJUnitRunner.class)
public class VmToHostAffinityWeightPolicyUnitTest extends VmToHostAffinityPolicyUnitBaseTest {
@InjectMocks
VmToHostAffinityWeightPolicyUnit unit =
new VmToHostAffinityWeightPolicyUnit(null, null);
@Test
public void testNoAffinityViolationScore() {
hosts = Arrays.asList(host_positive_enforcing, host_negative_enforcing, host_not_in_affinity_group);
List<AffinityGroup> affinityGroups = new ArrayList<>();
doReturn(affinityGroups).when(affinityGroupDao).getAllAffinityGroupsByVmId(any());
Map<Guid, Integer> results = getScoreResults();
assertEquals(1, (long) results.get(host_positive_enforcing.getId()));
assertEquals(1, (long) results.get(host_negative_enforcing.getId()));
assertEquals(1, (long) results.get(host_not_in_affinity_group.getId()));
}
@Test
public void testPositiveAffinityViolationScore() throws Exception {
hosts = Arrays.asList(host_positive_enforcing, host_not_in_affinity_group);
positive_enforcing_group.setVdsEnforcing(false);
List<AffinityGroup> affinityGroups = Arrays.asList(positive_enforcing_group);
doReturn(affinityGroups).when(affinityGroupDao).getAllAffinityGroupsByVmId(any());
Map<Guid, Integer> results = getScoreResults();
assertEquals(1, (long) results.get(host_positive_enforcing.getId()));
assertEquals(2, (long) results.get(host_not_in_affinity_group.getId()));
}
@Test
public void testNegativeAffinityViolationScore() throws Exception {
hosts = Arrays.asList(host_negative_enforcing, host_not_in_affinity_group);
negative_enforcing_group.setVdsEnforcing(false);
List<AffinityGroup> affinityGroups = Arrays.asList(negative_enforcing_group);
doReturn(affinityGroups).when(affinityGroupDao).getAllAffinityGroupsByVmId(any());
Map<Guid, Integer> results = getScoreResults();
assertEquals(2, (long) results.get(host_negative_enforcing.getId()));
assertEquals(1, (long) results.get(host_not_in_affinity_group.getId()));
}
@Test
public void testNegativeAndPositiveAffinityViolationScore() throws Exception {
hosts = Arrays.asList(host_positive_enforcing, host_negative_enforcing, host_not_in_affinity_group);
positive_enforcing_group.setVdsEnforcing(false);
negative_enforcing_group.setVdsEnforcing(false);
List<AffinityGroup> affinityGroups = Arrays.asList(positive_enforcing_group, negative_enforcing_group);
doReturn(affinityGroups).when(affinityGroupDao).getAllAffinityGroupsByVmId(any());
Map<Guid, Integer> results = getScoreResults();
assertEquals(3, (long) results.get(host_negative_enforcing.getId()));
assertEquals(2, (long) results.get(host_not_in_affinity_group.getId()));
}
private Map<Guid, Integer> getScoreResults() {
List<Pair<Guid, Integer>> weights = unit.score(cluster, hosts, vm, new HashMap<>());
Map<Guid, Integer> results = weights.stream().collect(Collectors.toMap(Pair::getFirst, Pair::getSecond));
return results;
}
}