From 562a55a68407ed0d65de75c9a491188e1292a2c3 Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Wed, 25 May 2011 18:12:48 +0530 Subject: Design changes - introducing cluster-server mapping on gateway --- .../server/resources/ClustersResource.java | 35 ++++++++ .../server/resources/GlusterServersResource.java | 12 +-- .../server/resources/VolumesResource.java | 92 +++++++++++++++------- .../management/server/utils/GlusterUtil.java | 35 +++----- 4 files changed, 117 insertions(+), 57 deletions(-) (limited to 'src/com.gluster.storage.management.server') diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java index f04941cf..18bece88 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.server.resources; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_CLUSTER_NAME; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SERVER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS; @@ -35,10 +36,14 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import com.gluster.storage.management.core.exceptions.ConnectionException; +import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Status; 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.data.ServerInfo; +import com.gluster.storage.management.server.utils.GlusterUtil; import com.sun.jersey.api.core.InjectParam; /** @@ -49,6 +54,12 @@ public class ClustersResource { @InjectParam private PersistenceDao clusterDao; + + @InjectParam + private GlusterServersResource glusterServersResource; + + @InjectParam + private GlusterUtil glusterUtil; public void setClusterDao(PersistenceDao clusterDao) { this.clusterDao = clusterDao; @@ -86,6 +97,30 @@ public class ClustersResource { + "]: [" + e.getMessage() + "]"); } } + + public Status registerCluster(@FormParam(FORM_PARAM_CLUSTER_NAME) String clusterName, + @FormParam(FORM_PARAM_SERVER_NAME) String knownServer) { + EntityTransaction txn = clusterDao.startTransaction(); + ClusterInfo cluster = new ClusterInfo(); + cluster.setName(clusterName); + + GlusterServer server = new GlusterServer(knownServer); + try { + List glusterServers = glusterUtil.getGlusterServers(server); + List servers = new ArrayList(); + for(GlusterServer glusterServer : glusterServers) { + ServerInfo serverInfo = new ServerInfo(); + serverInfo.setName(glusterServer.getName()); + serverInfo.setCluster(cluster); + servers.add(serverInfo); + } + cluster.setServers(servers); + clusterDao.save(cluster); + return Status.STATUS_SUCCESS; + } catch(Exception e) { + return new Status(e); + } + } @SuppressWarnings("unchecked") @Path("{" + PATH_PARAM_CLUSTER_NAME + "}") 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 58f72ffd..d020a35e 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 @@ -102,7 +102,10 @@ public class GlusterServersResource extends AbstractServersResource { return null; } - private GlusterServerListResponse getServerDetails(String clusterName) { + @GET + @Produces(MediaType.TEXT_XML) + public GlusterServerListResponse getGlusterServers( + @PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName) { GlusterServer onlineServer = getOnlineServer(clusterName); if(onlineServer == null) { return new GlusterServerListResponse(Status.STATUS_SUCCESS, new ArrayList()); @@ -145,13 +148,6 @@ public class GlusterServersResource extends AbstractServersResource { return new GlusterServerListResponse(status, glusterServers); } - @GET - @Produces(MediaType.TEXT_XML) - public GlusterServerListResponse getGlusterServers( - @PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName) { - return getServerDetails(clusterName); - } - @GET @Path("{serverName}") @Produces(MediaType.TEXT_XML) diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java index 3857f104..9a5ee0c5 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java @@ -20,9 +20,9 @@ */ package com.gluster.storage.management.server.resources; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_BRICKS; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_OPERATION; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SOURCE; -import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_BRICKS; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_TARGET; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_START; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_STOP; @@ -71,8 +71,10 @@ import javax.ws.rs.core.StreamingOutput; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.constants.RESTConstants; +import com.gluster.storage.management.core.exceptions.ConnectionException; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Brick; +import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.LogMessage; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Volume; @@ -98,14 +100,17 @@ public class VolumesResource { private static final String VOLUME_BRICK_LOG_SCRIPT = "get_volume_brick_log.py"; @InjectParam - private static ServerUtil serverUtil; + private GlusterServersResource glusterServersResource; + + @InjectParam + private ServerUtil serverUtil; @InjectParam - private static GlusterUtil glusterUtil; + private GlusterUtil glusterUtil; - private static final FileUtil fileUtil = new FileUtil(); + private FileUtil fileUtil = new FileUtil(); - private static GlusterCoreUtil glusterCoreUtil = new GlusterCoreUtil(); + private GlusterCoreUtil glusterCoreUtil = new GlusterCoreUtil(); @InjectParam private VolumeOptionsDefaults volumeOptionsDefaults; @@ -113,13 +118,21 @@ public class VolumesResource { @GET @Produces(MediaType.TEXT_XML) public VolumeListResponse getAllVolumes(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName) { + GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + if(onlineServer == null) { + return new VolumeListResponse(Status.STATUS_SUCCESS, new ArrayList()); + } + try { - // TODO: pass cluster name to getAllVolumes - return new VolumeListResponse(Status.STATUS_SUCCESS, glusterUtil.getAllVolumes()); - } catch (Exception e) { - // TODO: log the error - e.printStackTrace(); - return new VolumeListResponse(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()), null); + return new VolumeListResponse(Status.STATUS_SUCCESS, glusterUtil.getAllVolumes(onlineServer.getName())); + } catch(ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + if(onlineServer == null) { + return new VolumeListResponse(Status.STATUS_SUCCESS, new ArrayList()); + } + + return new VolumeListResponse(Status.STATUS_SUCCESS, glusterUtil.getAllVolumes(onlineServer.getName())); } } @@ -141,13 +154,28 @@ public class VolumesResource { return status; } + @SuppressWarnings("rawtypes") @GET @Path("{" + PATH_PARAM_VOLUME_NAME + "}") @Produces(MediaType.TEXT_XML) - public Volume getVolume(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, + public GenericResponse getVolume(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName) { - // TODO: Pass cluster name to getVolume - return glusterUtil.getVolume(volumeName); + GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + if(onlineServer == null) { + return new GenericResponse(new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + clusterName + "]"), null); + } + + try { + return new GenericResponse(Status.STATUS_SUCCESS, glusterUtil.getVolume(volumeName, onlineServer.getName())); + } catch(ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + if(onlineServer == null) { + return new GenericResponse(new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + clusterName + "]"), null); + } + + return new GenericResponse(Status.STATUS_SUCCESS, glusterUtil.getVolume(volumeName, onlineServer.getName())); + } } @PUT @@ -171,22 +199,32 @@ public class VolumesResource { public Status deleteVolume(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @QueryParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) { - // TODO: Delete volume on given cluster - Volume volume = glusterUtil.getVolume(volumeName); - Status status = glusterUtil.deleteVolume(volumeName); - - String deleteOption = ""; - if (deleteFlag) { - deleteOption = "-d"; + GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + if(onlineServer == null) { + return new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + clusterName + "]"); } + + Volume volume = null; + try { + volume = glusterUtil.getVolume(volumeName, onlineServer.getName()); + } catch(ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + if(onlineServer == null) { + return new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + clusterName + "]"); + } + volume = glusterUtil.getVolume(volumeName, onlineServer.getName()); + } + + Status status = glusterUtil.deleteVolume(volumeName, onlineServer.getName()); if (status.isSuccess()) { List disks = volume.getDisks(); - Status postDeleteStatus = postDelete(volumeName, disks, deleteOption); + Status postDeleteStatus = postDelete(volumeName, disks, deleteFlag); if (!postDeleteStatus.isSuccess()) { status.setCode(Status.STATUS_CODE_PART_SUCCESS); - status.setMessage("Error while post deletion operation: " + postDeleteStatus); + status.setMessage("Error in post-delete operation: " + postDeleteStatus); } } return status; @@ -218,7 +256,7 @@ public class VolumesResource { return status; } - private Status postDelete(String volumeName, List disks, String deleteFlag) { + private Status postDelete(String volumeName, List disks, boolean deleteFlag) { String serverName, diskName, diskInfo[]; Status result; for (int i = 0; i < disks.size(); i++) { @@ -226,7 +264,7 @@ public class VolumesResource { serverName = diskInfo[0]; diskName = diskInfo[1]; result = (Status) serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT + " " - + diskName + " " + volumeName + " " + deleteFlag, Status.class); + + diskName + " " + volumeName + (deleteFlag ? " -d" : ""), Status.class); if (!result.isSuccess()) { return result; } @@ -384,7 +422,7 @@ public class VolumesResource { @Override public void write(OutputStream output) throws IOException, WebApplicationException { - Volume volume = getVolume(clusterName, volumeName); + Volume volume = (Volume)getVolume(clusterName, volumeName).getData(); try { // TODO: pass clusterName to downloadLogs File archiveFile = new File(downloadLogs(volume)); @@ -435,7 +473,7 @@ public class VolumesResource { try { // TODO: Fetch logs from brick(s) of given cluster only - Volume volume = getVolume(clusterName, volumeName); + Volume volume = (Volume)getVolume(clusterName, volumeName).getData(); if (brickName == null || brickName.isEmpty() || brickName.equals(CoreConstants.ALL)) { logMessages = getLogsForAllBricks(volume, lineCount); } else { 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 64595e5f..7991cfb0 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 @@ -93,14 +93,6 @@ public class GlusterUtil { return null; } - private GlusterServer getKnownServer(String knownServer) { - GlusterServer server = new GlusterServer(knownServer); - server.setStatus(SERVER_STATUS.ONLINE); //TODO: If pingable - //NOTE: No UUID assumed, it can be fetch while getting server details - return server; - } - - public GlusterServer getGlusterServer(GlusterServer onlineServer, String serverName) { List servers = getGlusterServers(onlineServer); for(GlusterServer server : servers) { @@ -278,24 +270,23 @@ public class GlusterUtil { return new Status(processUtil.executeCommand(command)); } - public Status deleteVolume(String volumeName) { - return new Status(processUtil.executeCommand("gluster", "--mode=script", "volume", "delete", volumeName)); + public Status deleteVolume(String volumeName, String knownServer) { + return new Status(sshUtil.executeRemote(knownServer, "gluster --mode=script volume delete " + volumeName)); } - private String getVolumeInfo(String volumeName) { - ProcessResult result = new ProcessUtil().executeCommand("gluster", "volume", "info", volumeName); + private String getVolumeInfo(String volumeName, String knownServer) { + ProcessResult result = sshUtil.executeRemote(knownServer, "gluster volume info " + volumeName); if (!result.isSuccess()) { - throw new GlusterRuntimeException("Command [gluster volume info] failed with error: [" - + result.getExitValue() + "][" + result.getOutput() + "]"); + throw new GlusterRuntimeException("Command [gluster volume info] failed on [" + knownServer + + "] with error: " + result); } return result.getOutput(); } - private String getVolumeInfo() { - ProcessResult result = new ProcessUtil().executeCommand("gluster", "volume", "info"); + private String getVolumeInfo(String knownServer) { + ProcessResult result = sshUtil.executeRemote(knownServer, "gluster volume info "); if (!result.isSuccess()) { - throw new GlusterRuntimeException("Command [gluster volume info] failed with error: [" - + result.getExitValue() + "][" + result.getOutput() + "]"); + throw new GlusterRuntimeException("Command [gluster volume info] failed on [" + knownServer + "] with error: " + result); } return result.getOutput(); } @@ -399,16 +390,16 @@ public class GlusterUtil { return false; } - public Volume getVolume(String volumeName) { - List volumes = parseVolumeInfo(getVolumeInfo(volumeName)); + public Volume getVolume(String volumeName, String knownServer) { + List volumes = parseVolumeInfo(getVolumeInfo(volumeName, knownServer)); if (volumes.size() > 0) { return volumes.get(0); } return null; } - public List getAllVolumes() { - return parseVolumeInfo(getVolumeInfo()); + public List getAllVolumes(String knownServer) { + return parseVolumeInfo(getVolumeInfo(knownServer)); } private List parseVolumeInfo(String volumeInfoText) { -- cgit