package org.ovirt.engine.core.bll; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Collections; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner.Strict; import org.ovirt.engine.core.common.action.AddVmParameters; import org.ovirt.engine.core.common.businessentities.ArchitectureType; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.osinfo.OsRepository; import org.ovirt.engine.core.common.utils.SimpleDependencyInjector; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.utils.MockConfigRule; @RunWith(Strict.class) public class AddVmFromTemplateCommandTest extends AddVmCommandTestBase<AddVmFromTemplateCommand<AddVmParameters>> { private static final int MAX_PCI_SLOTS = 26; @Rule public MockConfigRule mcr = new MockConfigRule(); @Override protected AddVmFromTemplateCommand<AddVmParameters> createCommand() { initVM(); return new AddVmFromTemplateCommand<>(new AddVmParameters(vm), null); } @Override public void setUp() { super.setUp(); doNothing().when(cmd).initTemplateDisks(); doReturn(true).when(cmd).checkNumberOfMonitors(); doReturn(true).when(cmd).validateCustomProperties(any(VmStatic.class), anyList()); initCommandMethods(); initDestSDs(); generateStorageToDisksMap(); cmd.init(); } @Test public void validateSpaceAndThreshold() { mockGetAllSnapshots(); assertTrue(cmd.validateSpaceRequirements()); verify(storageDomainValidator, times(TOTAL_NUM_DOMAINS)).hasSpaceForClonedDisks(anyList()); verify(storageDomainValidator, never()).hasSpaceForNewDisks(anyList()); } @Test public void validateSpaceNotEnough() throws Exception { doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)). when(storageDomainValidator).hasSpaceForClonedDisks(anyList()); mockGetAllSnapshots(); assertFalse(cmd.validateSpaceRequirements()); //The following is mocked to fail, should happen only once. verify(storageDomainValidator).hasSpaceForClonedDisks(anyList()); verify(storageDomainValidator, never()).hasSpaceForNewDisks(anyList()); } @Test public void validateSpaceNotWithinThreshold() throws Exception { doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)). when(storageDomainValidator).isDomainWithinThresholds(); assertFalse(cmd.validateSpaceRequirements()); } @Test public void create10GBVmWith11GbAvailableAndA5GbBuffer() throws Exception { doReturn(true).when(cmd).areParametersLegal(anyList()); doReturn(Collections.emptyList()).when(cmd).getVmInterfaces(); doReturn(Collections.emptyList()).when(cmd).getDiskVmElements(); mockMaxPciSlots(); mockStorageDomainDaoGetAllForStoragePool(); mockGetAllSnapshots(); doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)). when(storageDomainValidator).hasSpaceForClonedDisks(anyList()); ValidateTestUtils.runAndAssertValidateFailure (cmd, EngineMessage.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN); } @Test public void canAddVmWithVirtioScsiControllerNotSupportedOs() { when(cpuFlagsManagerHandler.getCpuId(anyString(), any(Version.class))).thenReturn(CPU_ID); when(osRepository.isCpuSupported(anyInt(), any(Version.class), anyString())).thenReturn(true); doReturn(true).when(cmd).areParametersLegal(anyList()); doReturn(Collections.emptyList()).when(cmd).getVmInterfaces(); doReturn(Collections.emptyList()).when(cmd).getDiskVmElements(); mockStorageDomainDaoGetAllForStoragePool(); mockMaxPciSlots(); mockStorageDomainDaoGetAllForStoragePool(); cmd.getParameters().setVirtioScsiEnabled(true); when(osRepository.isSoundDeviceEnabled(anyInt(), any(Version.class))).thenReturn(true); when(osRepository.getArchitectureFromOS(anyInt())).thenReturn(ArchitectureType.x86_64); when(osRepository.getDiskInterfaces(anyInt(), any(Version.class))).thenReturn( new ArrayList<>(Collections.singletonList("VirtIO"))); mockGetAllSnapshots(); cmd.initEffectiveCompatibilityVersion(); ValidateTestUtils.runAndAssertValidateFailure(cmd, EngineMessage.ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_DOES_NOT_SUPPORT_VIRTIO_SCSI); } @Test public void testUnsupportedCpus() { when(cpuFlagsManagerHandler.getCpuId(anyString(), any(Version.class))).thenReturn(CPU_ID); doReturn(true).when(cmd).areParametersLegal(anyList()); doReturn(Collections.emptyList()).when(cmd).getVmInterfaces(); doReturn(Collections.emptyList()).when(cmd).getDiskVmElements(); vm.setVmOs(OsRepository.DEFAULT_X86_OS); mockMaxPciSlots(); mockStorageDomainDaoGetAllForStoragePool(); mockGetAllSnapshots(); when(osRepository.getArchitectureFromOS(0)).thenReturn(ArchitectureType.x86_64); doReturn(storagePool).when(cmd).getStoragePool(); when(osRepository.isCpuSupported(vm.getVmOsId(), cluster.getCompatibilityVersion(), CPU_ID)).thenReturn(false); ValidateTestUtils.runAndAssertValidateFailure(cmd, EngineMessage.CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS); } private void mockMaxPciSlots() { SimpleDependencyInjector.getInstance().bind(OsRepository.class, osRepository); doReturn(MAX_PCI_SLOTS).when(osRepository).getMaxPciDevices(anyInt(), any(Version.class)); } }