package org.ovirt.engine.core.vdsbroker.monitoring; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; 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.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner.Silent; import org.ovirt.engine.core.common.businessentities.storage.LUNs; import org.ovirt.engine.core.compat.Guid; @RunWith(Silent.class) public class LunDisksMonitoringTest { @Spy private LunDisksMonitoring lunDisksMonitoring; private static final Guid VM_ID_1 = new Guid("b7dfe5e6-5667-4e40-8ecb-6d97c8df504c"); private static final Guid VM_ID_2 = new Guid("b7dfe5e6-5667-4e40-8ecb-6d97c8df504d"); private static final String LUN_ID_1 = "lun1"; private static final String LUN_ID_2 = "lun2"; private static final String LUN_ID_3 = "lun3"; private static final String LUN_ID_4 = "lun4"; @Captor private ArgumentCaptor<List<LUNs>> lunsCaptor; @Captor private ArgumentCaptor<Integer> deviceSizeCaptor; @Mock private LUNs lun1FromDb; @Mock private LUNs lun2FromDb; @Mock private LUNs lun3FromDb; @Mock private LUNs lun4FromDb; @Mock private LUNs lun1FromVdsm; @Mock private LUNs lun2FromVdsm; @Mock private LUNs lun3FromVdsm; @Mock private LUNs lun4FromVdsm; @Before public void before() { when(lun1FromDb.getId()).thenReturn(LUN_ID_1); when(lun2FromDb.getId()).thenReturn(LUN_ID_2); when(lun3FromDb.getId()).thenReturn(LUN_ID_3); when(lun4FromDb.getId()).thenReturn(LUN_ID_4); doReturn(Arrays.asList(lun1FromDb, lun2FromDb)).when(lunDisksMonitoring).getVmPluggedLunsFromDb(VM_ID_1); doReturn(Arrays.asList(lun3FromDb, lun4FromDb)).when(lunDisksMonitoring).getVmPluggedLunsFromDb(VM_ID_2); doNothing().when(lunDisksMonitoring).saveVmLunDisks(any()); } @Test public void noVms() { lunDisksMonitoring.process(Collections.emptyMap()); verify(lunDisksMonitoring, never()).getVmLunDisksToSave(any(), any()); verify(lunDisksMonitoring, never()).saveVmLunDisks(any()); } @Test public void vmWithNoLuns() { lunDisksMonitoring.process(Collections.singletonMap(VM_ID_1, Collections.emptyMap())); verify(lunDisksMonitoring, never()).getVmPluggedLunsFromDb(any()); verify(lunDisksMonitoring, times(1)).saveVmLunDisks(lunsCaptor.capture()); assertTrue(lunsCaptor.getValue().isEmpty()); } @Test public void noLunChanged() { doReturn(0).when(lun1FromDb).getDeviceSize(); doReturn(0).when(lun1FromVdsm).getDeviceSize(); doReturn(20).when(lun2FromDb).getDeviceSize(); doReturn(20).when(lun2FromVdsm).getDeviceSize(); doReturn(30).when(lun3FromDb).getDeviceSize(); doReturn(30).when(lun3FromVdsm).getDeviceSize(); doReturn(40).when(lun4FromDb).getDeviceSize(); doReturn(0).when(lun4FromVdsm).getDeviceSize(); lunDisksMonitoring.process(initInputFromVdsm()); verify(lunDisksMonitoring, times(1)).saveVmLunDisks(lunsCaptor.capture()); assertTrue(lunsCaptor.getValue().isEmpty()); } @Test public void someLunsChanged() { doReturn(0).when(lun1FromDb).getDeviceSize(); doReturn(0).when(lun1FromVdsm).getDeviceSize(); doReturn(20).when(lun2FromDb).getDeviceSize(); doReturn(25).when(lun2FromVdsm).getDeviceSize(); doReturn(30).when(lun3FromDb).getDeviceSize(); doReturn(35).when(lun3FromVdsm).getDeviceSize(); doReturn(40).when(lun4FromDb).getDeviceSize(); doReturn(0).when(lun4FromVdsm).getDeviceSize(); lunDisksMonitoring.process(initInputFromVdsm()); verify(lunDisksMonitoring, times(1)).saveVmLunDisks(lunsCaptor.capture()); assertEquals(2, lunsCaptor.getValue().size()); assertNotNull(findLunById(LUN_ID_2, lunsCaptor.getValue())); verify(lun2FromDb, times(1)).setDeviceSize(deviceSizeCaptor.capture()); assertEquals(25, (int) deviceSizeCaptor.getValue()); assertNotNull(findLunById(LUN_ID_3, lunsCaptor.getValue())); verify(lun3FromDb, times(1)).setDeviceSize(deviceSizeCaptor.capture()); assertEquals(35, (int) deviceSizeCaptor.getValue()); } @Test public void allLunsChanged() { doReturn(10).when(lun1FromDb).getDeviceSize(); doReturn(15).when(lun1FromVdsm).getDeviceSize(); doReturn(20).when(lun2FromDb).getDeviceSize(); doReturn(25).when(lun2FromVdsm).getDeviceSize(); doReturn(30).when(lun3FromDb).getDeviceSize(); doReturn(35).when(lun3FromVdsm).getDeviceSize(); doReturn(40).when(lun4FromDb).getDeviceSize(); doReturn(45).when(lun4FromVdsm).getDeviceSize(); lunDisksMonitoring.process(initInputFromVdsm()); verify(lunDisksMonitoring, times(1)).saveVmLunDisks(lunsCaptor.capture()); assertEquals(4, lunsCaptor.getValue().size()); verify(lun1FromDb, times(1)).setDeviceSize(deviceSizeCaptor.capture()); assertEquals(15, (int) deviceSizeCaptor.getValue()); verify(lun2FromDb, times(1)).setDeviceSize(deviceSizeCaptor.capture()); assertEquals(25, (int) deviceSizeCaptor.getValue()); verify(lun3FromDb, times(1)).setDeviceSize(deviceSizeCaptor.capture()); assertEquals(35, (int) deviceSizeCaptor.getValue()); verify(lun4FromDb, times(1)).setDeviceSize(deviceSizeCaptor.capture()); assertEquals(45, (int) deviceSizeCaptor.getValue()); } private LUNs findLunById(String lunId, List<LUNs> luns) { return luns.stream().filter(lun -> lun.getId().equals(lunId)).findFirst().orElse(null); } @SuppressWarnings("serial") private Map<Guid, Map<String, LUNs>> initInputFromVdsm() { return new HashMap<Guid, Map<String, LUNs>>() {{ put(VM_ID_1, new HashMap<String, LUNs>() {{ put(LUN_ID_1, lun1FromVdsm); put(LUN_ID_2, lun2FromVdsm); }}); put(VM_ID_2, new HashMap<String, LUNs>() {{ put(LUN_ID_3, lun3FromVdsm); put(LUN_ID_4, lun4FromVdsm); }}); }}; } }