diff options
| author | Dhandapani <dhandapani@gluster.com> | 2011-06-23 13:49:56 +0530 |
|---|---|---|
| committer | Dhandapani <dhandapani@gluster.com> | 2011-06-23 13:49:56 +0530 |
| commit | 760b15ceb93c8539bbfc822ae7270d4cb99c7b6c (patch) | |
| tree | acc5e6581acd58acf1c10143b72855d3d994e47c /src/com.gluster.storage.management.server | |
| parent | 0432430b57a7377b621daa5479ed1be07b26791c (diff) | |
| parent | 356b3102e5aa24ab1eaae6d1460401be4d546152 (diff) | |
Merge branch 'master' of git@github.com:gluster/console
Diffstat (limited to 'src/com.gluster.storage.management.server')
4 files changed, 266 insertions, 132 deletions
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java index d96ea5f5..ee65add0 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java @@ -50,7 +50,7 @@ public class AbstractResource { * @return the {@link Response} object */ protected Response createdResponse(String relativePath) { - return Response.created(createURI(relativePath)).build(); + return Response.created(createRelatriveURI(relativePath)).build(); } /** @@ -62,15 +62,41 @@ public class AbstractResource { } /** + * Creates a response with HTTP status code of 202 (accepted), also setting the location header to given location. + * This is typically done while triggering long running tasks + * + * @param uriElements + * URI Elements to be appended to the base URI + * @return the {@link Response} object + */ + protected Response acceptedResponse(Object...uriElements) { + return Response.status(Status.ACCEPTED).location(createAbsoluteURI(uriElements)).build(); + } + + /** + * Creates a new URI that is relative to the <b>base URI</b> of the application + * @param uriElements URI Elements to be appended to the base URI + * @return newly created URI + */ + private URI createAbsoluteURI(Object[] uriElements) { + return uriInfo.getBaseUriBuilder().build(uriElements); + } + + /** * Creates a response with HTTP status code of 204 (no content), also setting the location header to given location * @param location path of the location to be set relative to current path * @return the {@link Response} object */ protected Response noContentResponse(String location) { - return Response.noContent().location(createURI(location)).build(); + return Response.noContent().location(createRelatriveURI(location)).build(); } - protected URI createURI(String location) { + /** + * Creates a URI relative to current URI + * @param location path relative to current URI + * @return newly created URI + */ + protected URI createRelatriveURI(String location) { return uriInfo.getAbsolutePathBuilder().path(location).build(); } 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 81c6e53e..7ca1295e 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.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.FORM_PARAM_SOURCE; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_DISK_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_SERVER_NAME; @@ -149,7 +150,7 @@ public class GlusterServersResource extends AbstractServersResource { List<GlusterServer> glusterServers = new ArrayList<GlusterServer>(); if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); } ClusterInfo cluster = clusterService.getCluster(clusterName); @@ -168,11 +169,22 @@ public class GlusterServersResource extends AbstractServersResource { try { glusterServers = getGlusterServers(clusterName, onlineServer); + } catch(ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = getNewOnlineServer(clusterName); + if (onlineServer == null) { + return errorResponse("No online servers found in cluster [" + clusterName + "]"); + } + try { + glusterServers = getGlusterServers(clusterName, onlineServer); + } catch(Exception e1) { + return errorResponse(e1.getMessage()); + } } catch(Exception e) { return errorResponse(e.getMessage()); } - String errMsg = fetDetailsOfServers(glusterServers, onlineServer); + String errMsg = fetchDetailsOfServers(glusterServers, onlineServer); if(!errMsg.isEmpty()) { return errorResponse("Couldn't fetch details for server(s): " + errMsg); } @@ -180,7 +192,7 @@ public class GlusterServersResource extends AbstractServersResource { return okResponse(new GlusterServerListResponse(glusterServers), mediaType); } - public String fetDetailsOfServers(List<GlusterServer> glusterServers, GlusterServer onlineServer) { + public String fetchDetailsOfServers(List<GlusterServer> glusterServers, GlusterServer onlineServer) { String errMsg = ""; for (GlusterServer server : glusterServers) { @@ -214,82 +226,117 @@ public class GlusterServersResource extends AbstractServersResource { @GET @Path("{serverName}") @Produces(MediaType.APPLICATION_XML) - public GlusterServerResponse getGlusterServer( + public Response getGlusterServerXML( @PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_SERVER_NAME) String serverName) { - GlusterServer server = glusterUtil.getGlusterServer(getOnlineServer(clusterName), serverName); - Status status = Status.STATUS_SUCCESS; - if(server.isOnline()) { - try { - fetchServerDetails(server); - } catch (Exception e) { - status.setCode(Status.STATUS_CODE_FAILURE); + return getGlusterServerResponse(clusterName, serverName, MediaType.APPLICATION_XML); + } + + @GET + @Path("{serverName}") + @Produces(MediaType.APPLICATION_JSON) + public Response getGlusterServerJSON( + @PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, + @PathParam(PATH_PARAM_SERVER_NAME) String serverName) { + return getGlusterServerResponse(clusterName, serverName, MediaType.APPLICATION_JSON); + } + + private Response getGlusterServerResponse(String clusterName, String serverName, String mediaType) { + try { + return okResponse(getGlusterServer(clusterName, serverName), mediaType); + } catch(Exception e) { + return errorResponse(e.getMessage()); + } + } + + private GlusterServer getGlusterServer(String clusterName, String serverName) { + if (clusterName == null || clusterName.isEmpty()) { + throw new GlusterRuntimeException("Cluster name must not be empty!"); + } + + if (serverName == null || serverName.isEmpty()) { + throw new GlusterRuntimeException("Server name must not be empty!"); + } + + ClusterInfo cluster = clusterService.getCluster(clusterName); + if (cluster == null) { + throw new GlusterRuntimeException("Cluster [" + clusterName + "] not found!"); + } + + GlusterServer onlineServer = getOnlineServer(clusterName); + if (onlineServer == null) { + throw new GlusterRuntimeException("No online servers found in cluster [" + clusterName + "]"); + } + + GlusterServer server = null; + try { + server = glusterUtil.getGlusterServer(onlineServer, serverName); + } catch(ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = getNewOnlineServer(clusterName); + if (onlineServer == null) { + throw new GlusterRuntimeException("No online servers found in cluster [" + clusterName + "]"); } + server = glusterUtil.getGlusterServer(onlineServer, serverName); } - return new GlusterServerResponse(status, server); + + if(server.isOnline()) { + fetchServerDetails(server); + } + return server; } - private Status performAddServer(String clusterName, String serverName) { + private void performAddServer(String clusterName, String serverName) { GlusterServer onlineServer = getOnlineServer(clusterName); if(onlineServer == null) { - return new Status(Status.STATUS_CODE_FAILURE, - "No online server found in cluster [" + clusterName + "]"); + throw new GlusterRuntimeException("No online server found in cluster [" + clusterName + "]"); } - Status status; try { - status = glusterUtil.addServer(onlineServer.getName(), serverName); - if(status.isSuccess()) { - // other peer probe to ensure that host names appear in peer probe on both sides - status = glusterUtil.addServer(serverName, onlineServer.getName()); - } + glusterUtil.addServer(onlineServer.getName(), serverName); } catch(ConnectionException e) { + // online server has gone offline! try with a different one. onlineServer = getNewOnlineServer(clusterName); if(onlineServer == null) { - return new Status(Status.STATUS_CODE_FAILURE, - "No online server found in cluster [" + clusterName + "]"); + throw new GlusterRuntimeException("No online server found in cluster [" + clusterName + "]"); } - status = glusterUtil.addServer(serverName, onlineServer.getName()); + + glusterUtil.addServer(serverName, onlineServer.getName()); } - - return status; } @POST - @Produces(MediaType.APPLICATION_XML) - public GlusterServerResponse addServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, + public Response addServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @FormParam(FORM_PARAM_SERVER_NAME) String serverName) { - if(clusterName.isEmpty()) { - return new GlusterServerResponse( - new Status(Status.STATUS_CODE_FAILURE, "Cluster name should not be empty!"), null); + if(clusterName == null || clusterName.isEmpty()) { + return badRequestResponse("Cluster name must not be empty!"); } if(serverName == null || serverName.isEmpty()) { - return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, "Form parameter [" - + FORM_PARAM_SERVER_NAME + "] is mandatory!"), null); + return badRequestResponse("Parameter [" + FORM_PARAM_SERVER_NAME + "] is missing in request!"); } ClusterInfo cluster = clusterService.getCluster(clusterName); - if(cluster == null) { - return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, "Cluster [" + clusterName - + "] doesn't exist!"), null); + if (cluster == null) { + return badRequestResponse("Cluster [" + clusterName + "] not found!"); } boolean publicKeyInstalled = sshUtil.isPublicKeyInstalled(serverName); if(!publicKeyInstalled && !sshUtil.hasDefaultPassword(serverName)) { // public key not installed, default password doesn't work. return with error. - return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, - "Gluster Management Gateway uses the default password to set up keys on the server." - + CoreConstants.NEWLINE + "However it seems that the password on server [" + serverName - + "] has been changed manually." + CoreConstants.NEWLINE - + "Please reset it back to the standard default password and try again."), null); + return errorResponse("Gluster Management Gateway uses the default password to set up keys on the server." + + CoreConstants.NEWLINE + "However it seems that the password on server [" + serverName + + "] has been changed manually." + CoreConstants.NEWLINE + + "Please reset it back to the standard default password and try again."); } List<ServerInfo> servers = cluster.getServers(); if(servers != null && !servers.isEmpty()) { - Status status = performAddServer(clusterName, serverName); - if(!status.isSuccess()) { - return new GlusterServerResponse(status, null); + // cluster has at least one existing server, so that peer probe can be performed + try { + performAddServer(clusterName, serverName); + } catch(Exception e) { + return errorResponse(e.getMessage()); } } else { // this is the first server to be added to the cluster, which means no @@ -300,100 +347,101 @@ public class GlusterServersResource extends AbstractServersResource { // add the cluster-server mapping clusterService.mapServerToCluster(clusterName, serverName); } catch (Exception e) { - return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()), null); + return errorResponse(e.getMessage()); } // since the server is added to a cluster, it should not more be considered as a // discovered server available to other clusters discoveredServersResource.removeDiscoveredServer(serverName); - // 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 errorResponse("Public key could not be installed on [" + serverName + "]! Error: [" + + e.getMessage() + "]"); } } - return serverResponse; + return createdResponse(serverName); } @DELETE - @Produces(MediaType.APPLICATION_XML) @Path("{" + PATH_PARAM_SERVER_NAME + "}") - public Status removeServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, + public Response removeServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_SERVER_NAME) String serverName) { - if (clusterName.isEmpty()) { - return new Status(Status.STATUS_CODE_FAILURE, "Cluster name should not be empty!"); + if (clusterName == null || clusterName.isEmpty()) { + return badRequestResponse("Cluster name must not be empty!"); } if(serverName == null || serverName.isEmpty()) { - return new Status(Status.STATUS_CODE_FAILURE, "Form parameter [" + FORM_PARAM_SERVER_NAME - + "] is mandatory!"); + return badRequestResponse("Server name must not be empty!"); } ClusterInfo cluster = clusterService.getCluster(clusterName); if(cluster == null) { - return new Status(Status.STATUS_CODE_FAILURE, "Cluster [" + clusterName + "] doesn't exist!"); + return badRequestResponse("Cluster [" + clusterName + "] not found!"); } List<ServerInfo> servers = cluster.getServers(); - if(servers == null || servers.isEmpty()) { - return new Status(Status.STATUS_CODE_FAILURE, "Server [" + serverName + "] is not attached to cluster [" + if(servers == null || servers.isEmpty() || !containsServer(servers, serverName)) { + return badRequestResponse("Server [" + serverName + "] is not attached to cluster [" + clusterName + "]!"); } - Status status = Status.STATUS_SUCCESS; if(servers.size() == 1) { // Only one server mapped to the cluster, no "peer detach" required. // remove the cached online server for this cluster if present clusterServerCache.remove(clusterName); } else { - // get an online server that is not same as the server being removed - GlusterServer onlineServer = getOnlineServer(clusterName, serverName); - if (onlineServer == null) { - return new Status(Status.STATUS_CODE_FAILURE, "No online server found in cluster [" + clusterName + "]"); - } - try { - status = glusterUtil.removeServer(onlineServer.getName(), serverName); - } catch (ConnectionException e) { - // online server has gone offline! try with a different one. - onlineServer = getNewOnlineServer(clusterName, serverName); - if (onlineServer == null) { - return new Status(Status.STATUS_CODE_FAILURE, "No online server found in cluster [" + clusterName - + "]"); - } - status = glusterUtil.removeServer(onlineServer.getName(), serverName); - if(!status.isSuccess()) { - return status; - } + removeServerFromCluster(clusterName, serverName); + } catch(Exception e) { + return errorResponse(e.getMessage()); } - - if(onlineServer.getName().equals(serverName)) { - // since the cached server has been removed from the cluster, remove it from the cache - clusterServerCache.remove(clusterName); + } + + return noContentResponse(); + } + + private void removeServerFromCluster(String clusterName, String serverName) { + // get an online server that is not same as the server being removed + GlusterServer onlineServer = getOnlineServer(clusterName, serverName); + if (onlineServer == null) { + throw new GlusterRuntimeException("No online server found in cluster [" + clusterName + "]"); + } + + try { + glusterUtil.removeServer(onlineServer.getName(), serverName); + } catch (ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = getNewOnlineServer(clusterName, serverName); + if (onlineServer == null) { + throw new GlusterRuntimeException("No online server found in cluster [" + clusterName + "]"); } + glusterUtil.removeServer(onlineServer.getName(), serverName); } - - try { - clusterService.unmapServerFromCluster(clusterName, serverName); - } catch (Exception e) { - return new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()); + if(onlineServer.getName().equals(serverName)) { + // since the cached server has been removed from the cluster, remove it from the cache + clusterServerCache.remove(clusterName); } + clusterService.unmapServerFromCluster(clusterName, serverName); + // since the server is removed from the cluster, it is now available to be added to other clusters. // Hence add it back to the discovered servers list. - discoveredServersResource.addDiscoveredServer(serverName); - - return status; + discoveredServersResource.addDiscoveredServer(serverName); + } + + private boolean containsServer(List<ServerInfo> servers, String serverName) { + for(ServerInfo server : servers) { + if(server.getName().toUpperCase().equals(serverName.toUpperCase())) { + return true; + } + } + return false; } @PUT 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 369ef349..5d1f38e9 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 @@ -142,7 +142,7 @@ public class VolumesResource extends AbstractResource { public Response getVolumes(String clusterName, String mediaType) { if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); } if (clusterService.getCluster(clusterName) == null) { @@ -178,7 +178,11 @@ public class VolumesResource extends AbstractResource { @FormParam(FORM_PARAM_REPLICA_COUNT) Integer replicaCount, @FormParam(FORM_PARAM_STRIPE_COUNT) Integer stripeCount, @FormParam(FORM_PARAM_BRICKS) String bricks, @FormParam(FORM_PARAM_ACCESS_PROTOCOLS) String accessProtocols, @FormParam(FORM_PARAM_VOLUME_OPTIONS) String options) { - String missingParam = checkMissingParamsForCreateVolume(clusterName, volumeName, volumeType, transportType, replicaCount, stripeCount, bricks, accessProtocols, options); + if(clusterName == null || clusterName.isEmpty()) { + return badRequestResponse("Cluster name must not be empty!"); + } + + String missingParam = checkMissingParamsForCreateVolume(volumeName, volumeType, transportType, replicaCount, stripeCount, bricks, accessProtocols, options); if(missingParam != null) { return badRequestResponse("Parameter [" + missingParam + "] is missing in request!"); } @@ -221,7 +225,6 @@ public class VolumesResource extends AbstractResource { /** * Returns name of the missing parameter if any. If all parameters are present, - * @param clusterName * @param volumeName * @param volumeType * @param transportType @@ -232,12 +235,11 @@ public class VolumesResource extends AbstractResource { * @param options * @return */ - private String checkMissingParamsForCreateVolume(String clusterName, String volumeName, String volumeType, + private String checkMissingParamsForCreateVolume(String volumeName, String volumeType, String transportType, Integer replicaCount, Integer stripeCount, String bricks, String accessProtocols, String options) { - return (clusterName == null || clusterName.isEmpty()) ? FORM_PARAM_CLUSTER_NAME : - (volumeName == null || volumeName.isEmpty()) ? FORM_PARAM_VOLUME_NAME : + return (volumeName == null || volumeName.isEmpty()) ? FORM_PARAM_VOLUME_NAME : (volumeType == null || volumeType.isEmpty()) ? FORM_PARAM_VOLUME_TYPE : (transportType == null || transportType.isEmpty()) ? FORM_PARAM_TRANSPORT_TYPE : (replicaCount == null) ? FORM_PARAM_REPLICA_COUNT : @@ -268,7 +270,7 @@ public class VolumesResource extends AbstractResource { Volume volume = null; if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); } if (clusterService.getCluster(clusterName) == null) { @@ -309,7 +311,11 @@ public class VolumesResource extends AbstractResource { public Response performOperation(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_OPERATION) String operation) { if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); + } + + if (volumeName == null || volumeName.isEmpty()) { + return badRequestResponse("Volume name must not be empty!"); } if (clusterService.getCluster(clusterName) == null) { @@ -354,15 +360,23 @@ public class VolumesResource extends AbstractResource { @Path("{" + PATH_PARAM_VOLUME_NAME + "}") public Response deleteVolume(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, - @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) { + @QueryParam(QUERY_PARAM_DELETE_OPTION) Boolean deleteFlag) { if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty"); } + if (volumeName == null || volumeName.isEmpty()) { + return badRequestResponse("Volume name must not be empty"); + } + if (clusterService.getCluster(clusterName) == null) { return badRequestResponse("Cluster [" + clusterName + "] not found!"); } + if (deleteFlag == null) { + deleteFlag = false; + } + Volume volume = null; try { volume = getVolume(clusterName, volumeName); @@ -390,19 +404,31 @@ public class VolumesResource extends AbstractResource { } @DELETE - @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + RESOURCE_BRICKS) + @Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + RESOURCE_BRICKS) public Response removeBricks(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @QueryParam(QUERY_PARAM_BRICKS) String bricks, - @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) { + @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, @QueryParam(QUERY_PARAM_BRICKS) String bricks, + @QueryParam(QUERY_PARAM_DELETE_OPTION) Boolean deleteFlag) { List<String> brickList = Arrays.asList(bricks.split(",")); // Convert from comma separated string (query // parameter) if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); + } + + if (volumeName == null || volumeName.isEmpty()) { + return badRequestResponse("Volume name must not be empty!"); + } + + if (bricks == null || bricks.isEmpty()) { + return badRequestResponse("Parameter [" + QUERY_PARAM_BRICKS + "] is missing in request!"); } if (clusterService.getCluster(clusterName) == null) { return badRequestResponse("Cluster [" + clusterName + "] not found!"); } + + if(deleteFlag == null) { + deleteFlag = false; + } GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); if (onlineServer == null) { @@ -488,11 +514,11 @@ public class VolumesResource extends AbstractResource { @FormParam(RESTConstants.FORM_PARAM_OPTION_KEY) String key, @FormParam(RESTConstants.FORM_PARAM_OPTION_VALUE) String value) { if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); } if(volumeName == null || volumeName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_VOLUME_NAME + "] is missing in request!"); + return badRequestResponse("Volume name must not be empty!"); } if(key == null || key.isEmpty()) { @@ -530,7 +556,7 @@ public class VolumesResource extends AbstractResource { return errorResponse(e.getMessage()); } - return noContentResponse(); + return createdResponse(key); } @PUT @@ -538,11 +564,11 @@ public class VolumesResource extends AbstractResource { public Response resetOptions(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName) { if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); } if(volumeName == null || volumeName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_VOLUME_NAME + "] is missing in request!"); + return badRequestResponse("Volume name must not be empty!"); } if (clusterService.getCluster(clusterName) == null) { @@ -631,7 +657,11 @@ public class VolumesResource extends AbstractResource { public Response downloadLogs(@PathParam(PATH_PARAM_CLUSTER_NAME) final String clusterName, @PathParam(PATH_PARAM_VOLUME_NAME) final String volumeName) { if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); + } + + if (volumeName == null || volumeName.isEmpty()) { + return badRequestResponse("Volume name must not be empty!"); } if (clusterService.getCluster(clusterName) == null) { @@ -719,11 +749,11 @@ public class VolumesResource extends AbstractResource { public Response getLogs(String clusterName, String volumeName, String brickName, String severity, String fromTimestamp, String toTimestamp, Integer lineCount, String mediaType) { if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); } if (volumeName == null || volumeName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_VOLUME_NAME + "] is missing in request!"); + return badRequestResponse("Volume name must not be empty!"); } if (clusterService.getCluster(clusterName) == null) { @@ -816,15 +846,15 @@ public class VolumesResource extends AbstractResource { } @POST - @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + RESOURCE_BRICKS) + @Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + RESOURCE_BRICKS) public Response addBricks(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_BRICKS) String bricks) { + @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_BRICKS) String bricks) { if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); } if (volumeName == null || volumeName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_VOLUME_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); } if (bricks == null || bricks.isEmpty()) { @@ -840,8 +870,9 @@ public class VolumesResource extends AbstractResource { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } + List<String> brickList = Arrays.asList(bricks.split(",")); try { - glusterUtil.addBricks(volumeName, Arrays.asList(bricks.split(",")), onlineServer.getName()); + glusterUtil.addBricks(volumeName, brickList, onlineServer.getName()); } catch (ConnectionException e) { // online server has gone offline! try with a different one. onlineServer = glusterServersResource.getNewOnlineServer(clusterName); @@ -850,7 +881,7 @@ public class VolumesResource extends AbstractResource { } try { - glusterUtil.addBricks(volumeName, Arrays.asList(bricks.split(",")), onlineServer.getName()); + glusterUtil.addBricks(volumeName, brickList, onlineServer.getName()); } catch(Exception e1) { return errorResponse(e1.getMessage()); } @@ -858,7 +889,7 @@ public class VolumesResource extends AbstractResource { return errorResponse(e1.getMessage()); } - return noContentResponse(); + return createdResponse(""); } @PUT @@ -868,18 +899,34 @@ public class VolumesResource extends AbstractResource { @FormParam(FORM_PARAM_TARGET) String toBrick, @FormParam(FORM_PARAM_AUTO_COMMIT) Boolean autoCommit) { if (clusterName == null || clusterName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_CLUSTER_NAME + "] is missing in request!"); + return badRequestResponse("Cluster name must not be empty!"); } if (volumeName == null || volumeName.isEmpty()) { - return badRequestResponse("Parameter [" + FORM_PARAM_VOLUME_NAME + "] is missing in request!"); + return badRequestResponse("Volume name must not be empty!"); + } + + if (fromBrick == null || fromBrick.isEmpty()) { + return badRequestResponse("Parameter [" + FORM_PARAM_SOURCE + "] is missing in request!"); } + if (toBrick == null || toBrick.isEmpty()) { + return badRequestResponse("Parameter [" + FORM_PARAM_TARGET + "] is missing in request!"); + } + + if (clusterService.getCluster(clusterName) == null) { + return badRequestResponse("Cluster [" + clusterName + "] not found!"); + } + GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } + if(autoCommit == null) { + autoCommit = false; + } + String taskId = null; try { taskId = glusterUtil.migrateBrickStart(volumeName, fromBrick, toBrick, autoCommit, onlineServer.getName()); @@ -896,8 +943,7 @@ public class VolumesResource extends AbstractResource { return errorResponse(e1.getMessage()); } - return noContentResponse(uriInfo.getBaseUri() + "/" + RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName - + "/" + RESOURCE_TASKS + "/" + taskId); + return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId); } public static void main(String[] args) throws ClassNotFoundException { 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 f5ad63ab..670ffb5c 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 @@ -194,8 +194,19 @@ public class GlusterUtil { return output; } - public Status addServer(String existingServer, String newServer) { - return new Status(sshUtil.executeRemote(existingServer, "gluster peer probe " + newServer)); + public void addServer(String existingServer, String newServer) { + ProcessResult result = sshUtil.executeRemote(existingServer, "gluster peer probe " + newServer); + if(!result.isSuccess()) { + throw new GlusterRuntimeException("Couldn't probe server [" + newServer + "] from [" + existingServer + + "]. Error: " + result); + } + + // reverse peer probe to ensure that host names appear in peer status on both sides + result = sshUtil.executeRemote(newServer, "gluster peer probe " + existingServer); + if(!result.isSuccess()) { + throw new GlusterRuntimeException("Couldn't _reverse_ probe server [" + existingServer + "] from [" + + newServer + "]. Error: " + result); + } } public Status startVolume(String volumeName, String knownServer) { @@ -548,8 +559,11 @@ public class GlusterUtil { return new Status(sshUtil.executeRemote(knownServer, command.toString())); } - public Status removeServer(String existingServer, String serverName) { - return new Status(sshUtil.executeRemote(existingServer, "gluster --mode=script peer detach " + serverName)); + public void removeServer(String existingServer, String serverName) { + ProcessResult result = sshUtil.executeRemote(existingServer, "gluster --mode=script peer detach " + serverName); + if(!result.isSuccess()) { + throw new GlusterRuntimeException("Couldn't remove server [" + serverName + "]! Error: " + result); + } } public static void main(String args[]) { |
