From 9f9a2c2850f4b2d1b5ac2ad44750e0b82282e4b2 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 --- .../server/resources/GlusterServersResource.java | 48 +++++++++++++++++----- 1 file changed, 38 insertions(+), 10 deletions(-) (limited to 'src') 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 15992608..562b630f 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 @@ -240,26 +240,45 @@ public class GlusterServersResource extends AbstractServersResource { try { addServerToCluster(clusterName, serverName); - } catch (Exception e){ - return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, - "Exception while trying to save cluster-server mapping [" + clusterName + "][" + serverName - + "]: [" + e.getMessage() + "]"), serverResponse.getGlusterServer()); + } catch (Exception e) { + return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()), + serverResponse.getGlusterServer()); } return serverResponse; } private void addServerToCluster(String clusterName, String serverName) { - ClusterInfo cluster; EntityTransaction txn = clusterDao.startTransaction(); - // Inside a transaction, we must fetch the ClusterInfo object again. - cluster = getCluster(clusterName); + ClusterInfo cluster = getCluster(clusterName); cluster.addServer(new ServerInfo(serverName)); try { + clusterDao.update(cluster); txn.commit(); } catch (Exception e) { txn.rollback(); - throw new GlusterRuntimeException("Couldn't commit transaction! Error: " + e.getMessage(), e); + throw new GlusterRuntimeException("Couldn't create cluster-server mapping [" + clusterName + "][" + + serverName + "]! Error: " + e.getMessage(), e); + } + } + + private void removeServerFromCluster(String clusterName, String serverName) { + EntityTransaction txn = clusterDao.startTransaction(); + ClusterInfo cluster = getCluster(clusterName); + List servers = cluster.getServers(); + for(ServerInfo server : servers) { + if(server.getName().equals(serverName)) { + servers.remove(server); + break; + } + } + try { + clusterDao.update(cluster); + txn.commit(); + } catch(Exception e) { + txn.rollback(); + throw new GlusterRuntimeException("Couldn't unmap server [" + serverName + "] from cluster [" + clusterName + + "]! Error: " + e.getMessage(), e); } } @@ -274,6 +293,7 @@ public class GlusterServersResource extends AbstractServersResource { @DELETE @Produces(MediaType.TEXT_XML) + @Path("{" + PATH_PARAM_SERVER_NAME + "}") public Status removeServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_SERVER_NAME) String serverName) { GlusterServer onlineServer = getOnlineServer(clusterName); @@ -291,10 +311,18 @@ public class GlusterServersResource extends AbstractServersResource { return new Status(Status.STATUS_CODE_FAILURE, "No online server found in cluster [" + clusterName + "]"); } - return glusterUtil.removeServer(onlineServer.getName(), serverName); + status = glusterUtil.removeServer(onlineServer.getName(), serverName); + } + + if (status.isSuccess()) { + try { + removeServerFromCluster(clusterName, serverName); + } catch (Exception e) { + return new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()); + } } - // TODO: Remove the server from cluster-server mapping + return status; } private void setGlusterUtil(GlusterUtil glusterUtil) { -- cgit From ad437a67712efb0f03db71914363b09c65e4a952 Mon Sep 17 00:00:00 2001 From: selvam Date: Thu, 2 Jun 2011 19:51:31 +0530 Subject: Remove server REST path issue fix Removed server comes to Discovered list (UI) if it is online. --- .../management/client/GlusterDataModelManager.java | 18 ++++++++++++++++++ .../management/client/GlusterServersClient.java | 4 +--- .../management/gui/actions/RemoveServerAction.java | 6 ++++++ .../storage/management/server/utils/GlusterUtil.java | 2 +- 4 files changed, 26 insertions(+), 4 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 7566850a..37230d08 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 @@ -290,6 +290,15 @@ public class GlusterDataModelManager { listener.serverAdded(server); } } + + public void addDiscoveredServer(Server server) { + Cluster cluster = model.getCluster(); + cluster.addDiscoveredServer(server); + + for (ClusterListener listener : listeners) { + listener.discoveredServerAdded(server);; + } + } public void removeDiscoveredServer(Server server) { Cluster cluster = model.getCluster(); @@ -299,6 +308,15 @@ public class GlusterDataModelManager { listener.discoveredServerRemoved(server); } } + + public void removeGlusterServer(GlusterServer server) { + Cluster cluster = model.getCluster(); + cluster.removeServer(server); + + for (ClusterListener listener : listeners) { + listener.serverRemoved(server); + } + } public void deleteVolume(Volume volume) { Cluster cluster = model.getCluster(); 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 f5609584..4eba0ca9 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 @@ -75,9 +75,7 @@ public class GlusterServersClient extends AbstractClient { } public Status removeServer(String serverName) { - MultivaluedMap queryParams = new MultivaluedMapImpl(); - queryParams.add(RESTConstants.QUERY_PARAM_SERVER_NAME, serverName); - return (Status) deleteResource(Status.class, queryParams); + return (Status) deleteSubResource(serverName, Status.class); } public static void main(String[] args) { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java index 93f28e11..060b3c38 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java @@ -27,6 +27,7 @@ import org.eclipse.jface.viewers.ISelection; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.model.Cluster; +import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Volume; @@ -61,6 +62,11 @@ public class RemoveServerAction extends AbstractActionDelegate { if (status.isSuccess()) { showInfoDialog(actionDesc, "Server removed successfully"); + GlusterServer glusterServer = (GlusterServer) server; + GlusterDataModelManager.getInstance().removeGlusterServer(glusterServer); + if (glusterServer.isOnline()) { + GlusterDataModelManager.getInstance().addDiscoveredServer(server); + } } else { showErrorDialog(actionDesc, "Server could not be removed. Error: [" + status + "]"); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java index 6005f6dd..77549add 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java @@ -506,7 +506,7 @@ System.out.println(brickDir); } public Status removeServer(String existingServer, String serverName) { - return new Status(sshUtil.executeRemote(existingServer, "gluster peer detach " + serverName)); + return new Status(sshUtil.executeRemote(existingServer, "gluster --mode=script peer detach " + serverName)); } public static void main(String args[]) { -- cgit 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