summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.server
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-06-23 13:31:12 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-06-23 13:31:12 +0530
commit356b3102e5aa24ab1eaae6d1460401be4d546152 (patch)
tree8e72991de0a8d91f811e93e2ab34e06187dbeaf5 /src/com.gluster.storage.management.server
parent18d81acc64bc166073f8772c748e2cb31fdd2b65 (diff)
parent152f199e2b953dd85c49752228f64f1be286a372 (diff)
REST API Enhancements
Conflicts: src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java
Diffstat (limited to 'src/com.gluster.storage.management.server')
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java32
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java232
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java112
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java22
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 03a927ab..6e15e106 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_SERVER_NAME;
import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS;
@@ -141,7 +142,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);
@@ -160,11 +161,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);
}
@@ -172,7 +184,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) {
@@ -206,82 +218,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
@@ -292,100 +339,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;
}
private void setGlusterUtil(GlusterUtil glusterUtil) {
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[]) {