package org.ovirt.engine.core.vdsbroker.builder.vminfo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.when; import static org.ovirt.engine.core.vdsbroker.vdsbroker.IoTuneUtils.MB_TO_BYTES; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.ovirt.engine.core.common.businessentities.ArchitectureType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType; import org.ovirt.engine.core.common.businessentities.VmDeviceId; import org.ovirt.engine.core.common.businessentities.network.NetworkFilter; import org.ovirt.engine.core.common.businessentities.network.VmNic; import org.ovirt.engine.core.common.businessentities.network.VmNicFilterParameter; import org.ovirt.engine.core.common.businessentities.network.VnicProfile; import org.ovirt.engine.core.common.businessentities.qos.StorageQos; import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskInterface; import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement; import org.ovirt.engine.core.common.businessentities.storage.LunDisk; import org.ovirt.engine.core.common.utils.VmDeviceType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dao.VmDeviceDao; import org.ovirt.engine.core.dao.network.NetworkClusterDao; import org.ovirt.engine.core.dao.network.NetworkDao; import org.ovirt.engine.core.dao.network.NetworkFilterDao; import org.ovirt.engine.core.dao.network.NetworkQoSDao; import org.ovirt.engine.core.dao.network.VmNicFilterParameterDao; import org.ovirt.engine.core.dao.network.VnicProfileDao; import org.ovirt.engine.core.dao.qos.StorageQosDao; import org.ovirt.engine.core.utils.MockConfigRule; import org.ovirt.engine.core.vdsbroker.vdsbroker.VdsProperties; @RunWith(MockitoJUnitRunner.class) public class VmInfoBuildUtilsTest { private static final Guid VNIC_PROFILE_ID = Guid.newGuid(); private static final Guid VM_NIC_ID = Guid.newGuid(); private static final Guid NETWORK_FILTER_ID = Guid.newGuid(); private static final String NETWORK_FILTER_NAME = "clean-traffic"; private static final Guid NETWORK_FILTER_PARAMETER_0_ID = Guid.newGuid(); private static final Guid NETWORK_FILTER_PARAMETER_1_ID = Guid.newGuid(); private static final String NETWORK_FILTER_PARAMETER_0_NAME = "IP"; private static final String NETWORK_FILTER_PARAMETER_0_VALUE = "10.0.0.1"; private static final String NETWORK_FILTER_PARAMETER_1_NAME = "IP"; private static final String NETWORK_FILTER_PARAMETER_1_VALUE = "10.0.0.2"; private static final Guid VM_ID = Guid.newGuid(); private static final Guid DISK_IMAGE_ID = Guid.newGuid(); private static final Guid LUN_DISK_ID = Guid.newGuid(); @ClassRule public static MockConfigRule mcr = new MockConfigRule(); @Mock private NetworkDao networkDao; @Mock private NetworkFilterDao networkFilterDao; @Mock private NetworkClusterDao networkClusterDao; @Mock private NetworkQoSDao networkQosDao; @Mock private StorageQosDao storageQosDao; @Mock private VmDeviceDao vmDeviceDao; @Mock private VnicProfileDao vnicProfileDao; @Mock private VmNicFilterParameterDao vmNicFilterParameterDao; @InjectMocks private VmInfoBuildUtils underTest; private StorageQos qos; private VmDevice vmDevice; private DiskImage diskImage = new DiskImage(); @Before public void setUp() { diskImage.setDiskProfileId(Guid.newGuid()); qos = new StorageQos(); qos.setId(Guid.newGuid()); vmDevice = new VmDevice(); VnicProfile vnicProfile = new VnicProfile(); vnicProfile.setNetworkFilterId(NETWORK_FILTER_ID); when(vnicProfileDao.get(VNIC_PROFILE_ID)).thenReturn(vnicProfile); NetworkFilter networkFilter = new NetworkFilter(); networkFilter.setName(NETWORK_FILTER_NAME); when(networkFilterDao.getNetworkFilterById(NETWORK_FILTER_ID)).thenReturn(networkFilter); when(vmNicFilterParameterDao.getAllForVmNic(VM_NIC_ID)).thenReturn(createVmNicFilterParameters()); } List<VmNicFilterParameter> createVmNicFilterParameters() { List<VmNicFilterParameter> vmNicFilterParameters = new ArrayList(); vmNicFilterParameters.add(new VmNicFilterParameter( NETWORK_FILTER_PARAMETER_0_ID, VM_NIC_ID, NETWORK_FILTER_PARAMETER_0_NAME, NETWORK_FILTER_PARAMETER_0_VALUE )); vmNicFilterParameters.add(new VmNicFilterParameter( NETWORK_FILTER_PARAMETER_1_ID, VM_NIC_ID, NETWORK_FILTER_PARAMETER_1_NAME, NETWORK_FILTER_PARAMETER_1_VALUE )); return vmNicFilterParameters; } void assertIoTune(Map<String, Long> ioTune, long totalBytesSec, long readBytesSec, long writeBytesSec, long totalIopsSec, long readIopsSec, long writeIopsSec) { assertEquals(ioTune.get(VdsProperties.TotalBytesSec).longValue(), totalBytesSec); assertEquals(ioTune.get(VdsProperties.ReadBytesSec).longValue(), readBytesSec); assertEquals(ioTune.get(VdsProperties.WriteBytesSec).longValue(), writeBytesSec); assertEquals(ioTune.get(VdsProperties.TotalIopsSec).longValue(), totalIopsSec); assertEquals(ioTune.get(VdsProperties.ReadIopsSec).longValue(), readIopsSec); assertEquals(ioTune.get(VdsProperties.WriteIopsSec).longValue(), writeIopsSec); } @Test public void testHandleIoTune() { when(storageQosDao.getQosByDiskProfileId(diskImage.getDiskProfileId())).thenReturn(qos); qos.setMaxThroughput(100); qos.setMaxIops(10000); underTest.handleIoTune(vmDevice, underTest.loadStorageQos(diskImage)); assertIoTune(getIoTune(vmDevice), 100L * MB_TO_BYTES, 0, 0, 10000, 0, 0); } @Test public void testNoStorageQuotaAssigned() { underTest.handleIoTune(vmDevice, underTest.loadStorageQos(diskImage)); assertNull(vmDevice.getSpecParams()); } @Test public void testNoCpuProfileAssigned() { diskImage.setDiskProfileId(null); underTest.handleIoTune(vmDevice, underTest.loadStorageQos(diskImage)); assertNull(vmDevice.getSpecParams()); } @SuppressWarnings("unchecked") private Map<String, Long> getIoTune(VmDevice vmDevice) { return (Map<String, Long>) vmDevice.getSpecParams().get(VdsProperties.Iotune); } @Test public void testAddNetworkFiltersToNic() { Map<String, Object> struct = new HashMap<>(); VmNic vmNic = new VmNic(); vmNic.setVnicProfileId(VNIC_PROFILE_ID); vmNic.setId(VM_NIC_ID); underTest.addNetworkFiltersToNic(struct, vmNic); List<Map<String, Object>> parametersList = (List<Map<String, Object>>) struct.get(VdsProperties.NETWORK_FILTER_PARAMETERS); assertNotNull(struct.get(VdsProperties.NW_FILTER)); assertEquals(struct.get(VdsProperties.NW_FILTER), NETWORK_FILTER_NAME); assertNotNull(parametersList); assertEquals(2, parametersList.size()); assertEquals(NETWORK_FILTER_PARAMETER_0_NAME, parametersList.get(0).get("name")); assertEquals(NETWORK_FILTER_PARAMETER_0_VALUE, parametersList.get(0).get("value")); assertEquals(NETWORK_FILTER_PARAMETER_1_NAME, parametersList.get(1).get("name")); assertEquals(NETWORK_FILTER_PARAMETER_1_VALUE, parametersList.get(1).get("value")); } private Map<Guid, Disk> mockUnsortedDisksMap(VmDevice lunDiskVmDevice, VmDevice diskImageVmDevice) { when(vmDeviceDao.get(lunDiskVmDevice.getId())).thenReturn(lunDiskVmDevice); when(vmDeviceDao.get(diskImageVmDevice.getId())).thenReturn(diskImageVmDevice); DiskVmElement nonBootDiskVmElement = new DiskVmElement(lunDiskVmDevice.getId()); nonBootDiskVmElement.setBoot(false); nonBootDiskVmElement.setDiskInterface(DiskInterface.VirtIO_SCSI); DiskVmElement bootDiskVmElement = new DiskVmElement(diskImageVmDevice.getId()); bootDiskVmElement.setBoot(true); bootDiskVmElement.setDiskInterface(DiskInterface.VirtIO_SCSI); LunDisk lunDisk = new LunDisk(); lunDisk.setId(LUN_DISK_ID); lunDisk.setDiskVmElements(Collections.singleton(nonBootDiskVmElement)); DiskImage diskImage = new DiskImage(); diskImage.setId(DISK_IMAGE_ID); diskImage.setDiskVmElements(Collections.singleton(bootDiskVmElement)); Map<Guid, Disk> map = new HashMap<>(); map.put(lunDisk.getId(), lunDisk); map.put(diskImage.getId(), diskImage); return map; } @Test public void testGetVmDeviceUnitMapForScsiDisks() { VmDevice lunDiskVmDevice = new VmDevice(new VmDeviceId(LUN_DISK_ID, VM_ID), VmDeviceGeneralType.DISK, VmDeviceType.DISK.getName(), "", null, true, true, null, "", null, null, null); VmDevice diskImageVmDevice = new VmDevice(new VmDeviceId(DISK_IMAGE_ID, VM_ID), VmDeviceGeneralType.DISK, VmDeviceType.DISK.getName(), "", null, true, true, null, "", null, null, null); VM vm = new VM(); vm.setId(VM_ID); vm.setDiskMap(mockUnsortedDisksMap(lunDiskVmDevice, diskImageVmDevice)); vm.setClusterArch(ArchitectureType.x86_64); vm.setClusterCompatibilityVersion(Version.v4_1); Map<Integer, Map<VmDevice, Integer>> vmDeviceUnitMap = underTest.getVmDeviceUnitMapForScsiDisks(vm, DiskInterface.VirtIO_SCSI, false); // Ensures that the boot disk unit is lower assertEquals(vmDeviceUnitMap.get(0).get(lunDiskVmDevice), (Integer) 1); assertEquals(vmDeviceUnitMap.get(0).get(diskImageVmDevice), (Integer) 0); } @Test public void testMakeDiskName() { assertEquals("hda", underTest.makeDiskName("ide", 0)); assertEquals("hda", underTest.makeDiskName("blabla", 0)); assertEquals("hdb", underTest.makeDiskName("blabla", 1)); assertEquals("hdc", underTest.makeDiskName("ide", 2)); assertEquals("sdd", underTest.makeDiskName("sata", 3)); assertEquals("sde", underTest.makeDiskName("scsi", 4)); assertEquals("fdf", underTest.makeDiskName("fdc", 5)); assertEquals("vdh", underTest.makeDiskName("virtio", 7)); } }