package org.ovirt.engine.core.bll.gluster; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.inject.Inject; import javax.naming.AuthenticationException; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.queries.gluster.GlusterServersQueryParameters; import org.ovirt.engine.core.dao.VdsStaticDao; /** * Query to fetch list of gluster servers via ssh using the given serverName and password. * * This query will be invoked from Import Gluster Cluster dialog. In the dialog the user will provide the servername, * password and fingerprint of any one of the server in the cluster. This Query will validate if the given server is * already part of the cluster by checking with the database. If exists the query will return the error message. * * Since, the importing cluster haven't been bootstrapped yet, we are running the gluster peer status command via ssh. * */ public class GetGlusterServersForImportQuery<P extends GlusterServersQueryParameters> extends GlusterQueriesCommandBase<P> { // Currently we use only root user to authenticate with host private static final String USER = "root"; @Inject private VdsStaticDao vdsStaticDao; public GetGlusterServersForImportQuery(P parameters) { super(parameters); } @Override protected void executeQueryCommand() { // Check whether the given server is already part of the cluster if (vdsStaticDao.getByHostName(getParameters().getServerName()) != null || vdsStaticDao.getAllWithIpAddress(getParameters().getServerName()).size() > 0) { throw new RuntimeException(EngineMessage.SERVER_ALREADY_EXISTS_IN_ANOTHER_CLUSTER.toString()); } try { Map<String, String> serverFingerPrintMap = glusterUtil.getPeers(getParameters().getServerName(), USER, getParameters().getPassword(), getParameters().getFingerprint()); // Keep server details in the map only for the servers which are reachable Iterator<Map.Entry<String, String>> iterator = serverFingerPrintMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); if (entry.getValue() == null) { iterator.remove(); } } // Check if any of the server in the map is already part of some other cluster. if (!validateServers(serverFingerPrintMap.keySet())) { throw new RuntimeException(EngineMessage.SERVER_ALREADY_EXISTS_IN_ANOTHER_CLUSTER.toString()); } // Add the given server with it's fingerprint serverFingerPrintMap.put(getParameters().getServerName(), getParameters().getFingerprint()); getQueryReturnValue().setReturnValue(serverFingerPrintMap); } catch (AuthenticationException ae) { throw new RuntimeException(EngineMessage.SSH_AUTHENTICATION_FAILED.toString()); } catch (RuntimeException re) { throw re; } catch (Exception e) { throw new RuntimeException(e); } } /* * The method will return false, if the given server is already part of the existing cluster, otherwise true. */ private boolean validateServers(Set<String> serverNames) { for (String serverName : serverNames) { if (vdsStaticDao.getByHostName(serverName) != null || vdsStaticDao.getAllWithIpAddress(serverName).size() > 0) { return false; } } return true; } }