From 6042cff10e50796df2d0e87e86f6aa76ea8c6e12 Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Wed, 1 Jun 2011 21:01:28 +0530 Subject: Design changes - introducing cluster-server mapping on gateway --- .../management/client/GlusterDataModelManager.java | 1 + .../management/client/GlusterServersClient.java | 2 +- .../management/server/data/PersistenceDao.java | 7 +++- .../storage/management/server/data/ServerInfo.java | 3 ++ .../resources/DiscoveredServersResource.java | 3 ++ .../server/resources/GlusterServersResource.java | 42 ++++++++++++---------- .../management/server/utils/ServerUtil.java | 7 ++-- .../storage/management/server/utils/SshUtil.java | 13 +++++-- 8 files changed, 51 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java index 37230d08..98071128 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -84,6 +84,7 @@ public class GlusterDataModelManager { public void initializeModelWithNewCluster(String securityToken, String clusterName) { model = new GlusterDataModel("Gluster Data Model"); setSecurityToken(securityToken); + setClusterName(clusterName); Cluster cluster = new Cluster(clusterName, model); diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java index 4eba0ca9..6c75b7c5 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java @@ -70,7 +70,7 @@ public class GlusterServersClient extends AbstractClient { public GlusterServerResponse addServer(Server discoveredServer) { Form form = new Form(); - form.add("serverName", discoveredServer.getName()); + form.add(RESTConstants.FORM_PARAM_SERVER_NAME, discoveredServer.getName()); return (GlusterServerResponse)postRequest(GlusterServerResponse.class, form); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java index 6fd7ecdc..1534e78c 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java @@ -73,6 +73,11 @@ public class PersistenceDao { public Object getSingleResultFromSQL(String sqlQuery) { return getEntityManager().createNativeQuery(sqlQuery).getSingleResult(); } + + @SuppressWarnings("rawtypes") + public List findBySQL(String sqlQuery) { + return getEntityManager().createNativeQuery(sqlQuery).getResultList(); + } public T findById(int id) { return getEntityManager().find(type, id); @@ -94,7 +99,7 @@ public class PersistenceDao { return createQuery("select t from " + type.getName() + " t where " + whereClause, params).getResultList(); } - public void save(T obj) { + public void save(Object obj) { getEntityManager().persist(obj); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java index 3564692c..72818200 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java @@ -39,6 +39,9 @@ public class ServerInfo { @JoinColumn(name="cluster_id") private ClusterInfo cluster; + public ServerInfo() { + } + public ServerInfo(String name) { setName(name); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java index eba06bf5..90692634 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java @@ -28,6 +28,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; @@ -37,6 +38,8 @@ import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.response.ServerListResponse; import com.gluster.storage.management.core.response.StringListResponse; +import com.gluster.storage.management.server.data.ClusterInfo; +import com.gluster.storage.management.server.data.PersistenceDao; import com.gluster.storage.management.server.utils.ServerUtil; import com.sun.jersey.api.core.InjectParam; import com.sun.jersey.spi.resource.Singleton; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java index 562b630f..2650b226 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.server.resources; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_SERVER_NAME; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SERVER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_SERVERS; @@ -161,7 +162,7 @@ public class GlusterServersResource extends AbstractServersResource { @Produces(MediaType.TEXT_XML) public GlusterServerResponse getGlusterServer( @PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @PathParam("serverName") String serverName) { + @PathParam(PATH_PARAM_SERVER_NAME) String serverName) { GlusterServer server = glusterUtil.getGlusterServer(getOnlineServer(clusterName), serverName); Status status = Status.STATUS_SUCCESS; if(server.isOnline()) { @@ -199,7 +200,7 @@ public class GlusterServersResource extends AbstractServersResource { @POST @Produces(MediaType.TEXT_XML) public GlusterServerResponse addServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @FormParam("serverName") String serverName) { + @FormParam(FORM_PARAM_SERVER_NAME) String serverName) { ClusterInfo cluster = getCluster(clusterName); if(cluster == null) { return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, "Cluster [" + clusterName @@ -216,7 +217,8 @@ public class GlusterServersResource extends AbstractServersResource { + "Please reset it back to the standard default password and try again."), null); } - if(!cluster.getServers().isEmpty()) { + List servers = cluster.getServers(); + if(servers != null && !servers.isEmpty()) { Status status = performAddServer(clusterName, serverName); if(!status.isSuccess()) { return new GlusterServerResponse(status, null); @@ -226,23 +228,24 @@ public class GlusterServersResource extends AbstractServersResource { // gluster CLI operation required. just add it to the cluster-server mapping } - // fetch server details - GlusterServerResponse serverResponse = getGlusterServer(clusterName, serverName); - - try { - // install public key (this will also disable password based ssh login) - sshUtil.installPublicKey(serverName); - } catch(Exception e) { - return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, - "Public key could not be installed! Error: [" + e.getMessage() - + "]"), serverResponse.getGlusterServer()); - } - try { addServerToCluster(clusterName, serverName); } catch (Exception e) { - return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()), - serverResponse.getGlusterServer()); + return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()), null); + } + + // fetch server details + GlusterServerResponse serverResponse = getGlusterServer(clusterName, serverName); + + if (!publicKeyInstalled) { + try { + // install public key (this will also disable password based ssh login) + sshUtil.installPublicKey(serverName); + } catch (Exception e) { + return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, + "Public key could not be installed! Error: [" + e.getMessage() + "]"), + serverResponse.getGlusterServer()); + } } return serverResponse; @@ -251,8 +254,11 @@ public class GlusterServersResource extends AbstractServersResource { private void addServerToCluster(String clusterName, String serverName) { EntityTransaction txn = clusterDao.startTransaction(); ClusterInfo cluster = getCluster(clusterName); - cluster.addServer(new ServerInfo(serverName)); + ServerInfo server = new ServerInfo(serverName); + server.setCluster(cluster); try { + clusterDao.save(server); + cluster.addServer(server); clusterDao.update(cluster); txn.commit(); } catch (Exception e) { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java index 4a72ebce..2a055ee8 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java @@ -63,10 +63,6 @@ public class ServerUtil { this.sshUtil = sshUtil; } - public SshUtil getSshUtil() { - return sshUtil; - } - public ProcessResult executeGlusterScript(boolean runInForeground, String scriptName, List arguments) { List command = new ArrayList(); @@ -119,7 +115,8 @@ public class ServerUtil { } private String executeOnServer(String serverName, String commandWithArgs) { - ProcessResult result = getSshUtil().executeRemote(serverName, commandWithArgs); + ProcessResult result = sshUtil.executeRemote(serverName, commandWithArgs); + if (!result.isSuccess()) { throw new GlusterRuntimeException("Command [" + commandWithArgs + "] failed on [" + serverName + "] with error [" + result.getExitValue() + "][" + result.getOutput() + "]"); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java index 04639ba9..c0dd4a96 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java @@ -291,7 +291,11 @@ public class SshUtil { public ProcessResult executeRemoteWithPassword(String serverName, String command) { return executeCommand(getConnectionWithPassword(serverName), command); } - + + private ProcessResult executeRemoteWithPubKey(String serverName, String command) { + return executeCommand(getConnection(serverName), command); + } + /** * Executes given command on remote machine using public key authentication * @@ -300,7 +304,12 @@ public class SshUtil { * @return Result of remote execution */ public ProcessResult executeRemote(String serverName, String command) { - return executeCommand(getConnection(serverName), command); + try { + return executeRemoteWithPubKey(serverName, command); + } catch(ConnectionException e) { + // Couldn't connect with public key. Try with default password. + return executeRemoteWithPassword(serverName, command); + } } /** -- cgit