package org.ovirt.engine.core.bll.scheduling;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.Version;
public class SlaValidatorTest {
private VDS makeTestVds(Guid vdsId) {
VDS newVdsData = new VDS();
newVdsData.setHostName("BUZZ");
newVdsData.setVdsName("BAR");
newVdsData.setClusterCompatibilityVersion(new Version("1.2.3"));
newVdsData.setClusterId(Guid.newGuid());
newVdsData.setId(vdsId);
return newVdsData;
}
VDS vds;
VM vm;
@Before
public void prepateTest() {
vds = basicHost();
vm = basicVm();
}
// VM start tests - the host has to have enough physical memory to call malloc
@Test
public void validateVmMemoryCanStartOnVds() {
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 0);
assertTrue(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCantStartOnVdsBecauseOfPending() {
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 65);
assertFalse(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCanStartOnVdsBecauseOfLowGuestOverhead() {
vds.setGuestOverhead(0);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 65);
assertTrue(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCantStartOnVdsBecauseOfGuestOverhead() {
vds.setGuestOverhead(256);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 0);
assertFalse(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCantStartOnVdsVmTooBig() {
vm.setMinAllocatedMem(8865);
vm.setVmMemSizeMb(8865);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 0);
assertFalse(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCanStartOnVdsVmTooBigButLowOverhead() {
vm.setMinAllocatedMem(8865);
vm.setVmMemSizeMb(8865);
vds.setGuestOverhead(0);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 0);
assertTrue(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCantStartOnVdsHostTooSmall() {
vds.setMemFree(8835L);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 0);
assertFalse(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCanStartOnVdsHostTooSmallButLowOverhead() {
vds.setMemFree(8835L);
vds.setGuestOverhead(0);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 0);
assertTrue(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCanStartOnVdsHighPendingButSwapHelps() {
vds.setSwapFree(80L);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 65);
assertTrue(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCantStartOnVdsHighPendingSwapSmall() {
vds.setSwapFree(60L);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasPhysMemoryToRunVM(vds, vm, 65);
assertTrue(vmPassedMemoryRequirement);
}
// Test overcommit rules for VM to host assignments
@Test
public void validateVmMemoryCanRunOnVds() {
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasOvercommitMemoryToRunVM(vds, vm);
assertTrue(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCantRunOnVdsNotEnoughMem() {
vm.setMinAllocatedMem(10000);
vm.setVmMemSizeMb(10000);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasOvercommitMemoryToRunVM(vds, vm);
assertFalse(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCanRunOnVdsHighMem() {
vm.setMinAllocatedMem(10000);
vm.setVmMemSizeMb(10000);
vds.setPhysicalMemMb(15000);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasOvercommitMemoryToRunVM(vds, vm);
assertTrue(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCantRunOnVdsSmallHost() {
vds.setPhysicalMemMb(5000);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasOvercommitMemoryToRunVM(vds, vm);
assertFalse(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCantRunOnVdsHighOverhead() {
vds.setGuestOverhead(1024);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasOvercommitMemoryToRunVM(vds, vm);
assertFalse(vmPassedMemoryRequirement);
}
@Test
public void validateVmMemoryCanRunOnVdsHighMemLowOverhead() {
vm.setMinAllocatedMem(10000);
vm.setVmMemSizeMb(10000);
vds.setGuestOverhead(-1200);
boolean vmPassedMemoryRequirement = SlaValidator.getInstance().hasOvercommitMemoryToRunVM(vds, vm);
assertTrue(vmPassedMemoryRequirement);
}
private VM basicVm() {
VM vm = new VM();
vm.setId(Guid.newGuid());
vm.setMinAllocatedMem(8800);
vm.setVmMemSizeMb(8800);
return vm;
}
private VDS basicHost() {
Guid guid = Guid.newGuid();
VDS vds = makeTestVds(guid);
// HW info and configuration
vds.setPhysicalMemMb(10000);
vds.setReservedMem(256);
vds.setGuestOverhead(65);
vds.setVmCount(1);
// One other VM is already running on the host
vds.setMemCommited(10000);
vds.setVmCount(2);
vds.setPendingVmemSize(0);
// dynamic memory info related to host status and VM starts
vds.setMemFree(8900L);
// 200% mem overcommit meaning total of 20GB of maximum VM memory can be assigned to vds
vds.setMaxVdsMemoryOverCommit(200);
return vds;
}
}