package org.ovirt.engine.core.bll.gluster;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.ovirt.engine.core.bll.AbstractQueryTest;
import org.ovirt.engine.core.bll.context.EngineContext;
import org.ovirt.engine.core.bll.interfaces.BackendInternal;
import org.ovirt.engine.core.bll.utils.GlusterUtil;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterServerInfo;
import org.ovirt.engine.core.common.businessentities.gluster.PeerStatus;
import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.common.queries.gluster.AddedGlusterServersParameters;
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.gluster.GlusterDBUtils;
public class GetAddedGlusterServersQueryTest extends AbstractQueryTest<AddedGlusterServersParameters, GetAddedGlusterServersQuery<AddedGlusterServersParameters>> {
private List<VDS> serversList;
private List<GlusterServerInfo> expectedServers;
private AddedGlusterServersParameters params;
private static final String CLUSTER_NAME = "default";
private static final String TEST_SERVER1 = "test_server1";
private static final String TEST_SERVER2 = "test_server2";
private static final String TEST_SERVER3 = "test_server3";
private static final Guid CLUSTER_ID = new Guid("b399944a-81ab-4ec5-8266-e19ba7c3c9d1");
private static final Guid server_id1 = new Guid("85c42b0d-c2b7-424a-ae72-5174c25da40b");
private static final Guid server_id2 = new Guid("6a697a38-cc82-4399-a6fb-0ec79c0ff1d5");
private static final Guid server_id3 = new Guid("7a797a38-cb32-4399-b6fb-21c79c03a1d6");
private static final String serverKeyFingerprint = "fingerprint";
@Mock
private VDSBrokerFrontend vdsBrokerFrontend;
@Mock
private BackendInternal backendInternal;
@Mock
private GlusterUtil glusterUtils;
@Mock
private GlusterDBUtils dbUtils;
private VDS getVds(VDSStatus status) {
VDS vds = new VDS();
vds.setId(Guid.newGuid());
vds.setVdsName("gfs1");
vds.setClusterId(CLUSTER_ID);
vds.setStatus(status);
return vds;
}
private void setupParams() {
params = new AddedGlusterServersParameters(CLUSTER_ID, true);
}
private void setupServersList() {
serversList = new ArrayList<>();
VDS server = new VDS();
server.setClusterId(CLUSTER_ID);
server.setClusterName(CLUSTER_NAME);
server.setId(server_id1);
server.setVdsName(TEST_SERVER1);
server.setHostName(TEST_SERVER1);
serversList.add(server);
server = new VDS();
server.setClusterId(CLUSTER_ID);
server.setClusterName(CLUSTER_NAME);
server.setId(server_id2);
server.setVdsName(TEST_SERVER2);
server.setHostName(TEST_SERVER2);
serversList.add(server);
}
private void setupExpectedGlusterServersInfo() {
expectedServers = new ArrayList<>();
GlusterServerInfo server = new GlusterServerInfo();
server.setUuid(server_id3);
server.setHostnameOrIp(TEST_SERVER3);
server.setStatus(PeerStatus.CONNECTED);
expectedServers.add(server);
}
private void setupMock() throws Exception {
doReturn(getVds(VDSStatus.Up)).when(glusterUtils).getUpServer(CLUSTER_ID);
VDSReturnValue returnValue = getVDSReturnValue();
when(vdsBrokerFrontend.runVdsCommand(eq(VDSCommandType.GlusterServersList),
any(VDSParametersBase.class))).thenReturn(returnValue);
VdcQueryReturnValue vdcReturnValue = getVdcReturnValue();
when(backendInternal.runInternalQuery(eq(VdcQueryType.GetServerSSHKeyFingerprint),
any(VdcQueryParametersBase.class), any(EngineContext.class))).thenReturn(vdcReturnValue);
doReturn(params.getClusterId()).when(getQueryParameters()).getClusterId();
doReturn(true).when(getQueryParameters()).isServerKeyFingerprintRequired();
}
private VdcQueryReturnValue getVdcReturnValue() {
VdcQueryReturnValue retValue = new VdcQueryReturnValue();
retValue.setSucceeded(true);
retValue.setReturnValue(serverKeyFingerprint);
return retValue;
}
private VDSReturnValue getVDSReturnValue() {
VDSReturnValue returnValue = new VDSReturnValue();
returnValue.setSucceeded(true);
returnValue.setReturnValue(expectedServers);
return returnValue;
}
private Map<String, String> getAddedServers() {
Map<String, String> servers = new HashMap<>();
servers.put(TEST_SERVER3, serverKeyFingerprint);
return servers;
}
@Before
@Override
public void setUp() throws Exception {
super.setUp();
setupParams();
setupServersList();
setupExpectedGlusterServersInfo();
setupMock();
}
@SuppressWarnings("unchecked")
@Test
public void testExecuteQueryCommand() throws IOException {
getQuery().executeQueryCommand();
Map<String, String> servers = getQuery().getQueryReturnValue().getReturnValue();
assertNotNull(servers);
assertEquals(getAddedServers(), servers);
}
}