package org.ovirt.engine.core.bll.gluster;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.QueriesCommandBase;
import org.ovirt.engine.core.bll.utils.GlusterUtil;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterServerInfo;
import org.ovirt.engine.core.common.businessentities.gluster.PeerStatus;
import org.ovirt.engine.core.common.queries.ServerParameters;
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.VDSReturnValue;
import org.ovirt.engine.core.common.vdscommands.VdsIdVDSCommandParametersBase;
import org.ovirt.engine.core.dao.gluster.GlusterDBUtils;
/**
* Query to get Added Gluster Servers with/without server ssh key fingerprint
*/
public class GetAddedGlusterServersQuery<P extends AddedGlusterServersParameters> extends QueriesCommandBase<P> {
@Inject
private GlusterUtil glusterUtil;
@Inject
private GlusterDBUtils glusterDBUtils;
public GetAddedGlusterServersQuery(P params) {
super(params);
}
@Override
@SuppressWarnings("unchecked")
protected void executeQueryCommand() {
Map<String, String> glusterServers = new HashMap<>();
VDS upServer = glusterUtil.getUpServer(getParameters().getClusterId());
if(upServer != null ) {
VDSReturnValue returnValue = runVdsCommand(VDSCommandType.GlusterServersList,
new VdsIdVDSCommandParametersBase(upServer.getId()));
glusterServers = getAddedGlusterServers((List<GlusterServerInfo>) returnValue.getReturnValue());
}
getQueryReturnValue().setReturnValue(glusterServers);
}
private Map<String, String> getAddedGlusterServers(List<GlusterServerInfo> glusterServers) {
Map<String, String> serversAndFingerprint = new HashMap<>();
for (GlusterServerInfo server : glusterServers) {
if (server.getStatus() == PeerStatus.CONNECTED && !serverExists(server)) {
String fingerprint = null;
VdcQueryReturnValue returnValue;
if (getParameters().isServerKeyFingerprintRequired()) {
returnValue =
runInternalQuery(VdcQueryType.GetServerSSHKeyFingerprint,
new ServerParameters(server.getHostnameOrIp()));
if (returnValue != null && returnValue.getSucceeded() && returnValue.getReturnValue() != null) {
fingerprint = returnValue.getReturnValue().toString();
}
}
serversAndFingerprint.put(server.getHostnameOrIp(), fingerprint == null ? "" : fingerprint);
}
}
return serversAndFingerprint;
}
public boolean serverExists(GlusterServerInfo glusterServer) {
return glusterDBUtils.serverExists(glusterServer.getUuid());
}
}