package org.ovirt.engine.core.bll.gluster; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import org.junit.ClassRule; 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.ClusterUtils; import org.ovirt.engine.core.bll.utils.GlusterUtil; import org.ovirt.engine.core.common.action.gluster.GlusterHookParameters; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.gluster.GlusterHookEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterHookStatus; import org.ovirt.engine.core.common.businessentities.gluster.GlusterServerHook; 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.VDSParametersBase; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.ClusterDao; import org.ovirt.engine.core.dao.gluster.GlusterHooksDao; import org.ovirt.engine.core.utils.MockConfigRule; public abstract class GlusterHookCommandTest<T extends GlusterHookCommandBase<? extends GlusterHookParameters>> extends BaseCommandTest { protected static final Guid[] GUIDS = {new Guid("afce7a39-8e8c-4819-ba9c-796d316592e6"), new Guid("afce7a39-8e8c-4819-ba9c-796d316592e7"), new Guid("23f6d691-5dfb-472b-86dc-9e1d2d3c18f3"), new Guid("2001751e-549b-4e7a-aff6-32d36856c125")}; protected static final Guid CLUSTER_ID = new Guid("b399944a-81ab-4ec5-8266-e19ba7c3c9d1"); protected static final Guid HOOK_ID = new Guid("d2cb2f73-fab3-4a42-93f0-d5e4c069a43e"); @ClassRule public static MockConfigRule mcr = new MockConfigRule(); @Mock protected GlusterHooksDao hooksDao; @Mock private ClusterDao clusterDao; @Mock protected BackendInternal backend; @Mock protected VDSBrokerFrontend vdsBrokerFrontend; @Mock private GlusterUtil glusterUtils; @Mock private ClusterUtils clusterUtils; protected abstract T createCommand(); @Spy @InjectMocks protected T cmd = createCommand(); public void setupMocks() { setupMocks(true); } public void setupMocks(boolean hookFound) { setupMocks(hookFound, getHookEntity()); } public void setupMocks(boolean hookFound, GlusterHookEntity hookEntity) { when(glusterUtils.getAllUpServers(CLUSTER_ID)).thenReturn(getGlusterServers()); doReturn(clusterUtils).when(cmd).getClusterUtils(); if (hookFound) { when(hooksDao.getById(HOOK_ID)).thenReturn(hookEntity); when(hooksDao.getById(HOOK_ID, true)).thenReturn(hookEntity); } when(clusterDao.get(CLUSTER_ID)).thenReturn(getCluster()); doReturn(getGlusterServers().get(0)).when(cmd).getUpServer(); } protected void mockBackendStatusChange(boolean succeeded) { mockBackendStatusChange(succeeded, EngineError.GlusterHookEnableFailed); } protected void mockBackendStatusChange(boolean succeeded, EngineError errorCode) { VDSReturnValue vdsReturnValue = new VDSReturnValue(); vdsReturnValue.setReturnValue(succeeded); vdsReturnValue.setSucceeded(succeeded); if (!succeeded) { vdsReturnValue.setVdsError(new VDSError(errorCode, "")); } when(vdsBrokerFrontend.runVdsCommand(any(VDSCommandType.class), any(VDSParametersBase.class))).thenReturn(vdsReturnValue); } protected GlusterHookEntity getHookEntity() { GlusterHookEntity hook = new GlusterHookEntity(); hook.setClusterId(CLUSTER_ID); hook.setId(HOOK_ID); hook.setServerHooks(getGlusterServerHooks()); return hook; } private List<VDS> getGlusterServers() { List<VDS> servers = new ArrayList<>(); servers.add(getServer(GUIDS[0], "gfs1", CLUSTER_ID)); servers.add(getServer(GUIDS[1], "gfs2", CLUSTER_ID)); servers.add(getServer(GUIDS[2], "gfs3", CLUSTER_ID)); servers.add(getServer(GUIDS[3], "gfs4", CLUSTER_ID)); return servers; } private List<GlusterServerHook> getGlusterServerHooks() { List<GlusterServerHook> serverHooks = new ArrayList<>(); serverHooks.add(getGlusterServerHook(0, GlusterHookStatus.ENABLED)); serverHooks.add(getGlusterServerHook(1, GlusterHookStatus.ENABLED)); serverHooks.add(getGlusterServerHook(2, GlusterHookStatus.ENABLED)); return serverHooks; } protected VDS getServer(Guid id, String name, Guid clusterId) { return getServer(id, name, clusterId, VDSStatus.Up); } protected VDS getServer(Guid id, String name, Guid clusterId, VDSStatus status) { VDS server = new VDS(); server.setId(id); server.setVdsName(name); server.setStatus(status); server.setClusterId(clusterId); return server; } private Cluster getCluster() { Cluster cluster = new Cluster(); cluster.setId(CLUSTER_ID); cluster.setName("TestCluster"); return cluster; } protected GlusterServerHook getGlusterServerHook(int index, GlusterHookStatus status) { GlusterServerHook serverHook = new GlusterServerHook(); serverHook.setServerId(GUIDS[index]); serverHook.setStatus(status); serverHook.setChecksum("CHECKSUM"); return serverHook; } }