package org.ovirt.engine.core.bll.scheduling.policyunits; import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.hasSize; import static org.mockito.Mockito.mock; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; 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.compat.Guid; import org.ovirt.engine.core.utils.MockConfigRule; public class CpuPinningPolicyUnitTest { @ClassRule public static MockConfigRule configRule = new MockConfigRule(); private VDS hostWithCpus; private VDS hostWithoutCpus; private VM vm; private final CpuPinningPolicyUnit policyUnit = new CpuPinningPolicyUnit(null, null); private PerHostMessages perHostMessages; private Cluster cluster; @Before public void setUp() { hostWithCpus = new VDS(); hostWithCpus.setId(Guid.newGuid()); hostWithCpus.setOnlineCpus("0, 1, 2,3, 5"); hostWithoutCpus = new VDS(); hostWithoutCpus.setId(Guid.newGuid()); hostWithoutCpus.setOnlineCpus(null); perHostMessages = new PerHostMessages(); vm = new VM(); vm.setId(Guid.newGuid()); cluster = new Cluster(); } @Test public void shouldHandleEmptyHostList() { final List<VDS> filteredHost = policyUnit.filter(cluster, new ArrayList<>(), vm, null, mock(PerHostMessages.class)); assertThat(filteredHost, is(empty())); assertThat(messages(), is(empty())); } /** * No online CPU is equivalent to no information available */ @Test public void shouldConsiderHostsWithNoOnlineCpus(){ hostWithoutCpus.setOnlineCpus(""); assertThat(filter(), hasItem(hostWithoutCpus)); assertThat(messages(), is(empty())); } /** * No information about online cpus is available */ @Test public void shouldConsiderHostWithNoCpuData(){ hostWithoutCpus.setOnlineCpus(null); assertThat(filter(), hasItem(hostWithoutCpus)); assertThat(messages(), is(empty())); } @Test public void shouldReturnAllHostWithoutPinningRequirements() { assertThat(filter(), containsInAnyOrder(hostWithCpus, hostWithoutCpus)); assertThat(messages(), is(empty())); } @Test public void shouldDetectOfflineCpu() { vm.setCpuPinning("1#0_2#4"); assertThat(filter(), not(hasItem(hostWithCpus))); assertThat(messages(), hasSize(2)); } @Test public void shouldExcludeHostWithoutCpuInformation(){ vm.setCpuPinning("1#0_2#4"); assertThat(filter(), not(hasItem(hostWithoutCpus))); } @Test public void shouldHandleExcludedCpu(){ vm.setCpuPinning("1#3-5,^4"); assertThat(filter(), hasItem(hostWithCpus)); assertThat(messages(), hasSize(1)); } @Test public void shouldDetectNonExistentCpu() { vm.setCpuPinning("1#6"); assertThat(filter(), not(hasItem(hostWithCpus))); assertThat(messages(), hasSize(2)); } @Test public void shouldFindSuitableHost() { vm.setCpuPinning("1#0_2#3"); assertThat(filter(), hasItem(hostWithCpus)); assertThat(messages(), hasSize(1)); } private List<VDS> filter() { return policyUnit.filter(cluster, Arrays.asList(hostWithCpus, hostWithoutCpus), vm, null, perHostMessages); } private Collection<List<String>> messages() { return perHostMessages.getMessages().values(); } }