package org.ovirt.engine.core.bll.gluster; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; 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.Arrays; import java.util.List; import org.junit.ClassRule; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.ovirt.engine.core.bll.BaseCommandTest; import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.bll.utils.GlusterUtil; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.gluster.GlusterServiceParameters; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.gluster.GlusterServerService; import org.ovirt.engine.core.common.businessentities.gluster.GlusterService; import org.ovirt.engine.core.common.businessentities.gluster.GlusterServiceStatus; import org.ovirt.engine.core.common.businessentities.gluster.ServiceType; import org.ovirt.engine.core.common.constants.gluster.GlusterConstants; import org.ovirt.engine.core.common.errors.EngineError; import org.ovirt.engine.core.common.errors.VDSError; import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.common.vdscommands.gluster.GlusterServiceVDSParameters; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.gluster.GlusterServerServiceDao; import org.ovirt.engine.core.dao.gluster.GlusterServiceDao; import org.ovirt.engine.core.utils.MockConfigRule; public class ManageGlusterServiceCommandTest extends BaseCommandTest { @Spy @InjectMocks ManageGlusterServiceCommand cmd = new ManageGlusterServiceCommand(new GlusterServiceParameters(), null); @Mock GlusterServerServiceDao serverServiceDao; @Mock GlusterServiceDao serviceDao; @Mock protected BackendInternal backend; @Mock protected VDSBrokerFrontend vdsBrokerFrontend; @Mock GlusterUtil glusterUtils; @ClassRule public static MockConfigRule mcr = new MockConfigRule(); private final Guid startedServiceId1 = Guid.newGuid(); private final Guid startedServiceId2 = Guid.newGuid(); private final Guid stoppedServiceId1 = Guid.newGuid(); private final Guid stoppedServiceId2 = Guid.newGuid(); private void prepareMocks() { doReturn(getUpServers()).when(glusterUtils).getAllUpServers(any(Guid.class)); } private List<VDS> getUpServers() { final VDS vds1 = new VDS(); vds1.setId(Guid.newGuid()); vds1.setVdsName("gfs1"); vds1.setClusterId(Guid.newGuid()); vds1.setStatus(VDSStatus.Up); final VDS vds2 = new VDS(); vds2.setId(Guid.newGuid()); vds2.setVdsName("gfs2"); vds2.setClusterId(Guid.newGuid()); vds2.setStatus(VDSStatus.Up); return Arrays.asList(vds1, vds2); } private void mockBackend(boolean succeeded, EngineError errorCode, GlusterServiceStatus status) { VDSReturnValue vdsReturnValue = new VDSReturnValue(); vdsReturnValue.setSucceeded(succeeded); if (!succeeded) { vdsReturnValue.setVdsError(new VDSError(errorCode, "")); } else { if (status == GlusterServiceStatus.STOPPED) { vdsReturnValue.setReturnValue(getGlusterServerServicesByServerIdAndServiceType(Guid.newGuid(), ServiceType.GLUSTER_SWIFT, status)); } else { // Adding one additional service for the case of stop so that save mechanism can be tested out Guid serverId = Guid.newGuid(); List<GlusterServerService> serverServiceList = getGlusterServerServicesByServerIdAndServiceType(serverId, ServiceType.GLUSTER_SWIFT, status); GlusterServerService srvc3 = new GlusterServerService(); srvc3.setMessage("test-msg3"); srvc3.setPid(10000); srvc3.setPort(20000); srvc3.setServerId(serverId); srvc3.setServiceId(Guid.newGuid()); srvc3.setServiceName("srvc3"); srvc3.setServiceType(ServiceType.GLUSTER_SWIFT); srvc3.setStatus(status); serverServiceList.add(srvc3); vdsReturnValue.setReturnValue(serverServiceList); } } when(vdsBrokerFrontend.runVdsCommand(eq(VDSCommandType.ManageGlusterService), any(GlusterServiceVDSParameters.class))).thenReturn(vdsReturnValue); } private List<GlusterServerService> getGlusterServerServicesByServerIdAndServiceType(Guid serverId, ServiceType serviceType, GlusterServiceStatus status) { List<GlusterServerService> serviceList = new ArrayList<>(); GlusterServerService srvc1 = new GlusterServerService(); srvc1.setMessage("test-msg1"); srvc1.setPid(10000); srvc1.setPort(20000); srvc1.setServerId(serverId); srvc1.setServiceId((status == GlusterServiceStatus.RUNNING) ? startedServiceId1 : stoppedServiceId1); srvc1.setServiceName("srvc1"); srvc1.setServiceType(serviceType); srvc1.setStatus(status); serviceList.add(srvc1); GlusterServerService srvc2 = new GlusterServerService(); srvc2.setMessage("test-msg2"); srvc2.setPid(30000); srvc2.setPort(40000); srvc2.setServerId(serverId); srvc2.setServiceId((status == GlusterServiceStatus.RUNNING) ? startedServiceId2 : stoppedServiceId2); srvc2.setServiceName("srvc2"); srvc2.setServiceType(serviceType); srvc2.setStatus(status); serviceList.add(srvc2); return serviceList; } private List<GlusterService> getGlusterServiceListByServiceType(ServiceType serviceType, GlusterServiceStatus status) { List<GlusterService> serviceList = new ArrayList<>(); GlusterService srvc1 = new GlusterService(); srvc1.setId((status == GlusterServiceStatus.RUNNING) ? startedServiceId1 : stoppedServiceId1); srvc1.setServiceName("srvc1"); srvc1.setServiceType(serviceType); serviceList.add(srvc1); GlusterService srvc2 = new GlusterService(); srvc2.setId((status == GlusterServiceStatus.RUNNING) ? startedServiceId2 : stoppedServiceId2); srvc2.setServiceName("srvc2"); srvc2.setServiceType(serviceType); serviceList.add(srvc2); return serviceList; } @Test public void validateFails() { cmd.getParameters().setActionType("InvalidActionType"); assertFalse(cmd.validate()); } @Test public void validateSucceedsWithStartActionType() { cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_START); prepareMocks(); assertFalse(cmd.validate()); } @Test public void validateSucceedsWithStopActionType() { cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_STOP); prepareMocks(); assertFalse(cmd.validate()); } @Test public void validateSucceedsWithStopActionTypeAndClusterId() { cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_STOP); cmd.getParameters().setClusterId(Guid.newGuid()); cmd.setClusterId(cmd.getParameters().getClusterId()); prepareMocks(); assertTrue(cmd.validate()); } @Test public void validateSucceedsWithStopActionTypeAndClusterIdAndServerId() { cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_STOP); cmd.getParameters().setClusterId(Guid.newGuid()); cmd.getParameters().setServerId(Guid.newGuid()); cmd.setClusterId(cmd.getParameters().getClusterId()); cmd.setVdsId(cmd.getParameters().getServerId()); prepareMocks(); assertTrue(cmd.validate()); } @Test public void validateFailsOnNull() { cmd.getParameters().setServiceType(ServiceType.NFS); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_START); prepareMocks(); assertFalse(cmd.validate()); } private void setUpMockUpForStart() { prepareMocks(); when(serviceDao.getByServiceType(any(ServiceType.class))).thenReturn(getGlusterServiceListByServiceType(ServiceType.GLUSTER_SWIFT, GlusterServiceStatus.STOPPED)); doReturn(getGlusterServerServicesByServerIdAndServiceType(Guid.newGuid(), ServiceType.GLUSTER_SWIFT, GlusterServiceStatus.STOPPED)).when(serverServiceDao) .getByServerIdAndServiceType(any(Guid.class), any(ServiceType.class)); } private void setUpMockUpForStop() { prepareMocks(); when(serviceDao.getByServiceType(any(ServiceType.class))).thenReturn(getGlusterServiceListByServiceType(ServiceType.GLUSTER_SWIFT, GlusterServiceStatus.RUNNING)); doReturn(getGlusterServerServicesByServerIdAndServiceType(Guid.newGuid(), ServiceType.GLUSTER_SWIFT, GlusterServiceStatus.RUNNING)).when(serverServiceDao) .getByServerIdAndServiceType(any(Guid.class), any(ServiceType.class)); } private void setUpMockUpForRestart() { prepareMocks(); when(serviceDao.getByServiceType(any(ServiceType.class))).thenReturn(getGlusterServiceListByServiceType(ServiceType.GLUSTER_SWIFT, GlusterServiceStatus.RUNNING)); doReturn(getGlusterServerServicesByServerIdAndServiceType(Guid.newGuid(), ServiceType.GLUSTER_SWIFT, GlusterServiceStatus.RUNNING)).when(serverServiceDao) .getByServerIdAndServiceType(any(Guid.class), any(ServiceType.class)); } @Test public void testExecuteCommandByClusterIdForStart() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_START); cmd.getParameters().setClusterId(Guid.newGuid()); cmd.setClusterId(cmd.getParameters().getClusterId()); setUpMockUpForStart(); mockBackend(true, null, GlusterServiceStatus.STOPPED); cmd.executeCommand(); verify(serverServiceDao, times(4)).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_STARTED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandByClusterIdForStop() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_STOP); cmd.getParameters().setClusterId(Guid.newGuid()); cmd.setClusterId(cmd.getParameters().getClusterId()); setUpMockUpForStop(); mockBackend(true, null, GlusterServiceStatus.RUNNING); cmd.executeCommand(); verify(serverServiceDao, times(4)).updateByServerIdAndServiceType(any(GlusterServerService.class)); verify(serverServiceDao, times(2)).save(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_STOPPED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandByClusterIdForRestart() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_RESTART); cmd.getParameters().setClusterId(Guid.newGuid()); cmd.setClusterId(cmd.getParameters().getClusterId()); setUpMockUpForRestart(); mockBackend(true, null, GlusterServiceStatus.RUNNING); cmd.executeCommand(); verify(serverServiceDao, times(4)).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_RESTARTED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandByServerIdForStart() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_START); cmd.getParameters().setServerId(Guid.newGuid()); cmd.setVdsId(cmd.getParameters().getServerId()); setUpMockUpForStart(); mockBackend(true, null, GlusterServiceStatus.STOPPED); cmd.executeCommand(); verify(serverServiceDao, times(2)).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_STARTED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandByServerIdForStop() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_STOP); cmd.getParameters().setServerId(Guid.newGuid()); cmd.setVdsId(cmd.getParameters().getServerId()); setUpMockUpForStop(); mockBackend(true, null, GlusterServiceStatus.RUNNING); cmd.executeCommand(); verify(serverServiceDao, times(2)).updateByServerIdAndServiceType(any(GlusterServerService.class)); verify(serverServiceDao, times(1)).save(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_STOPPED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandByServerIdForRestart() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_RESTART); cmd.getParameters().setServerId(Guid.newGuid()); cmd.setVdsId(cmd.getParameters().getServerId()); setUpMockUpForRestart(); mockBackend(true, null, GlusterServiceStatus.RUNNING); cmd.executeCommand(); verify(serverServiceDao, times(2)).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_RESTARTED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandFailsWithClusterIdForStart() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_START); cmd.getParameters().setClusterId(Guid.newGuid()); cmd.setClusterId(cmd.getParameters().getClusterId()); setUpMockUpForStart(); mockBackend(false, EngineError.GlusterServicesActionFailed, GlusterServiceStatus.STOPPED); cmd.executeCommand(); verify(serverServiceDao, never()).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_START_FAILED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandFailsWithClusterIdForStop() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_STOP); cmd.getParameters().setClusterId(Guid.newGuid()); cmd.setClusterId(cmd.getParameters().getClusterId()); setUpMockUpForStart(); mockBackend(false, EngineError.GlusterServicesActionFailed, GlusterServiceStatus.RUNNING); cmd.executeCommand(); verify(serverServiceDao, never()).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_STOP_FAILED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandFailsWithClusterIdForRestart() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_RESTART); cmd.getParameters().setClusterId(Guid.newGuid()); cmd.setClusterId(cmd.getParameters().getClusterId()); setUpMockUpForStart(); mockBackend(false, EngineError.GlusterServicesActionFailed, GlusterServiceStatus.RUNNING); cmd.executeCommand(); verify(serverServiceDao, never()).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_RESTART_FAILED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandFailsWithServerIdForStart() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_START); cmd.getParameters().setServerId(Guid.newGuid()); cmd.setVdsId(cmd.getParameters().getServerId()); setUpMockUpForStart(); mockBackend(false, EngineError.GlusterServicesActionFailed, GlusterServiceStatus.STOPPED); cmd.executeCommand(); verify(serverServiceDao, never()).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_START_FAILED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandFailsWithServerIdForStop() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_STOP); cmd.getParameters().setServerId(Guid.newGuid()); cmd.setVdsId(cmd.getParameters().getServerId()); setUpMockUpForStart(); mockBackend(false, EngineError.GlusterServicesActionFailed, GlusterServiceStatus.RUNNING); cmd.executeCommand(); verify(serverServiceDao, never()).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_STOP_FAILED, cmd.getAuditLogTypeValue()); } @Test public void testExecuteCommandFailsWithServerIdForRestart() { cmd.getParameters().setServiceType(ServiceType.GLUSTER_SWIFT); cmd.getParameters().setActionType(GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_RESTART); cmd.getParameters().setServerId(Guid.newGuid()); cmd.setVdsId(cmd.getParameters().getServerId()); setUpMockUpForStart(); mockBackend(false, EngineError.GlusterServicesActionFailed, GlusterServiceStatus.RUNNING); cmd.executeCommand(); verify(serverServiceDao, never()).updateByServerIdAndServiceType(any(GlusterServerService.class)); assertEquals(AuditLogType.GLUSTER_SERVICE_RESTART_FAILED, cmd.getAuditLogTypeValue()); } }