diff options
| author | Dhandapani <dhandapani@gluster.com> | 2011-06-03 11:13:56 +0530 |
|---|---|---|
| committer | Dhandapani <dhandapani@gluster.com> | 2011-06-03 11:13:56 +0530 |
| commit | adc697295d9aff3f66ff2a77de5395dee37a5ad0 (patch) | |
| tree | 3ab2b1692bd85365b352ea5624f97e1232496bff /src | |
| parent | f67bcfbb79f2654781c62e59908ca84d1813b7e2 (diff) | |
| parent | 6042cff10e50796df2d0e87e86f6aa76ea8c6e12 (diff) | |
Merge branch 'master' of git@github.com:gluster/console
Diffstat (limited to 'src')
10 files changed, 112 insertions, 38 deletions
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..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); @@ -290,6 +291,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 +309,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..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,14 +70,12 @@ 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); } public Status removeServer(String serverName) { - MultivaluedMap<String, String> 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/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<T> { 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<T> { 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 15992608..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<ServerInfo> servers = cluster.getServers(); + if(servers != null && !servers.isEmpty()) { Status status = performAddServer(clusterName, serverName); if(!status.isSuccess()) { return new GlusterServerResponse(status, null); @@ -226,40 +228,63 @@ 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()); + addServerToCluster(clusterName, serverName); + } catch (Exception e) { + return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()), null); } - 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()); + // 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; } 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); - cluster.addServer(new ServerInfo(serverName)); + ClusterInfo cluster = getCluster(clusterName); + ServerInfo server = new ServerInfo(serverName); + server.setCluster(cluster); try { + clusterDao.save(server); + cluster.addServer(server); + 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<ServerInfo> 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 +299,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 +317,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) { 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[]) { 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<String> arguments) { List<String> command = new ArrayList<String>(); @@ -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); + } } /** |
