diff options
19 files changed, 382 insertions, 363 deletions
diff --git a/src/com.gluster.storage.management.client/.classpath b/src/com.gluster.storage.management.client/.classpath index d216a8fe..218503d5 100644 --- a/src/com.gluster.storage.management.client/.classpath +++ b/src/com.gluster.storage.management.client/.classpath @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry exported="true" kind="lib" path="keystore/"/> - <classpathentry exported="true" kind="lib" path="lib/jersey-1.5/jersey-client-1.5.jar" sourcepath="/data/downloads/sun/jersey/sources/jersey-client-1.5-sources.jar"/> - <classpathentry exported="true" kind="lib" path="lib/jersey-1.5/jersey-core-1.5.jar" sourcepath="/data/downloads/sun/jersey/sources/jersey-core-1.5-sources.jar"/> + <classpathentry exported="true" kind="lib" path="lib/jersey-1.5/jersey-client-1.5.jar" sourcepath="/home/selvam/sources/jersey/jersey-client-1.5-sources.jar"/> + <classpathentry exported="true" kind="lib" path="lib/jersey-1.5/jersey-core-1.5.jar" sourcepath="/home/selvam/sources/jersey/jersey-core-1.5-sources.jar"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry excluding="keystore/" kind="src" path="src"/> diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java index 14539b87..6f4ba050 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java @@ -22,6 +22,7 @@ import javax.ws.rs.core.MultivaluedMap; import com.gluster.storage.management.client.utils.ClientUtil;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
+import com.gluster.storage.management.core.model.TaskInfo;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.UniformInterfaceException;
@@ -41,6 +42,7 @@ public abstract class AbstractClient { protected WebResource resource;
private String securityToken;
private String authHeader;
+ private Client client;
/**
* This constructor will work only after the data model manager has been initialized.
@@ -61,11 +63,16 @@ public abstract class AbstractClient { this.clusterName = clusterName;
setSecurityToken(securityToken);
- SSLContext context = initializeSSLContext();
- DefaultClientConfig config = createClientConfig(context);
+ createClient();
// this must be after setting clusterName as sub-classes may refer to cluster name in the getResourcePath method
- resource = Client.create(config).resource(ClientUtil.getServerBaseURI()).path(getResourcePath());
+ resource = client.resource(ClientUtil.getServerBaseURI()).path(getResourcePath());
+ }
+
+ private void createClient() {
+ SSLContext context = initializeSSLContext();
+ DefaultClientConfig config = createClientConfig(context);
+ client = Client.create(config);
}
private DefaultClientConfig createClientConfig(SSLContext context) {
@@ -123,7 +130,7 @@ public abstract class AbstractClient { * @return Object of responseClass received as a result of the GET request
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
- private Object fetchResource(WebResource res, MultivaluedMap<String, String> queryParams, Class responseClass) {
+ private <T> T fetchResource(WebResource res, MultivaluedMap<String, String> queryParams, Class<T> responseClass) {
try {
return res.queryParams(queryParams)
.header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.APPLICATION_XML).get(responseClass);
@@ -267,7 +274,11 @@ public abstract class AbstractClient { private ClientResponse putRequest(WebResource resource, Form form) {
try {
- return prepareFormRequestBuilder(resource).put(ClientResponse.class, form);
+ ClientResponse response = prepareFormRequestBuilder(resource).put(ClientResponse.class, form);
+ if(response.getStatus() >= 300) {
+ throw new GlusterRuntimeException(response.getEntity(String.class));
+ }
+ return response;
} catch (UniformInterfaceException e) {
throw new GlusterRuntimeException(e.getResponse().getEntity(String.class));
}
@@ -292,7 +303,8 @@ public abstract class AbstractClient { protected URI putRequestURI(String subResourceName, Form form) {
- return putRequest(resource.path(subResourceName), form).getLocation();
+ ClientResponse response = putRequest(resource.path(subResourceName), form);
+ return response.getLocation();
}
/**
@@ -361,4 +373,13 @@ public abstract class AbstractClient { this.securityToken = securityToken;
authHeader = "Basic " + securityToken;
}
+
+ /**
+ * @param uri The URI to be fetched using GET API
+ * @param responseClass Expected type of response object
+ * @return Object of the given class
+ */
+ protected <T> T fetchResource(URI uri, Class<T> responseClass) {
+ return fetchResource(client.resource(uri), NO_PARAMS, responseClass);
+ }
}
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java index aff4f5d2..deaeee64 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java @@ -20,12 +20,13 @@ */ package com.gluster.storage.management.client; +import java.net.URI; import java.util.List; import javax.ws.rs.core.MultivaluedMap; +import com.gluster.storage.management.client.utils.ClientUtil; import com.gluster.storage.management.core.constants.RESTConstants; -import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.response.TaskInfoListResponse; import com.sun.jersey.api.representation.Form; @@ -86,7 +87,11 @@ public class TasksClient extends AbstractClient { public void deleteTask(String taskId) { MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); queryParams.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_DELETE); - + deleteSubResource(taskId, queryParams); } + + public TaskInfo getTaskInfo(URI uri) { + return ((TaskInfo) fetchResource(uri, TaskInfo.class)); + } } diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java index 522b87c1..c839a15a 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java @@ -80,18 +80,20 @@ public class UsersClient extends AbstractClient { } public static void main(String[] args) { - UsersClient authClient = new UsersClient(); - - // authenticate user - authClient.authenticate("gluster", "gluster"); - - // change password to gluster1 - authClient.changePassword("gluster", "gluster", "gluster1"); - - // change it back to gluster - authClient.changePassword("gluster", "gluster1", "gluster"); - - System.out.println("success"); +// UsersClient authClient = new UsersClient(); +// +// // authenticate user +// authClient.authenticate("gluster", "gluster"); +// +// // change password to gluster1 +// authClient.changePassword("gluster", "gluster", "gluster1"); +// +// // change it back to gluster +// authClient.changePassword("gluster", "gluster1", "gluster"); +// +// System.out.println("success"); + System.out.println(new String(Base64.encode("abcdefghijklmnopqrstuvwxyz"))); + System.out.println(new String(Base64.decode("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo="))); } /* diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java index 6be67e65..b5d2711a 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java @@ -40,6 +40,7 @@ import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.constants.GlusterConstants; import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.model.Brick; +import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.VolumeLogMessage; import com.gluster.storage.management.core.model.VolumeOptionInfo; @@ -222,16 +223,13 @@ public class VolumesClient extends AbstractClient { return queryParams; } - public void startMigration(String volumeName, String brickFrom, String brickTo, Boolean autoCommit) { + public URI startMigration(String volumeName, String brickFrom, String brickTo, Boolean autoCommit) { Form form = new Form(); form.add(RESTConstants.FORM_PARAM_SOURCE, brickFrom); form.add(RESTConstants.FORM_PARAM_TARGET, brickTo); form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_START); form.add(RESTConstants.FORM_PARAM_AUTO_COMMIT, autoCommit); - - // putRequest(volumeName + "/" + RESTConstants.RESOURCE_BRICKS, form); - URI uri = putRequestURI(volumeName + "/" + RESTConstants.RESOURCE_BRICKS, form); - System.out.println(uri.getRawPath()); + return putRequestURI(volumeName + "/" + RESTConstants.RESOURCE_BRICKS, form); } public void rebalanceStart(String volumeName, Boolean fixLayout, Boolean migrateData, Boolean forcedDataMigrate) { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java index 514f805e..2d65a869 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java @@ -18,12 +18,16 @@ *******************************************************************************/ package com.gluster.storage.management.gui.dialogs; +import java.net.URI; + import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.Wizard; +import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Brick; -import com.gluster.storage.management.core.model.Disk; +import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.Volume; public class MigrateDiskWizard extends Wizard { @@ -53,10 +57,15 @@ public class MigrateDiskWizard extends Wizard { VolumesClient volumesClient = new VolumesClient(); try { - volumesClient.startMigration(volume.getName(), sourceDir, targetDir, autoCommit); - MessageDialog.openInformation(getShell(), "Brick migration", - "Brick migration is initiated, Please check the status..."); - //TODO Add the task to model + URI uri = volumesClient.startMigration(volume.getName(), sourceDir, targetDir, autoCommit); + + // To get the object + TasksClient taskClient = new TasksClient(); + TaskInfo taskInfo = taskClient.getTaskInfo(uri); + if (taskInfo != null && taskInfo instanceof TaskInfo) { + GlusterDataModelManager.getInstance().getModel().getCluster().addTaskInfo(taskInfo); + } + MessageDialog.openInformation(getShell(), "Brick migration", "Brick migration started successfully"); } catch (Exception e) { MessageDialog.openError(getShell(), "Error: Migrate brick", e.getMessage()); } 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 6bc394c3..feef8b3e 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 @@ -65,12 +65,12 @@ 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 + * @param locationURI + * URI 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(); + protected Response acceptedResponse(String locationURI) { + return Response.status(Status.ACCEPTED).location(createAbsoluteURI(locationURI)).build(); } /** @@ -86,11 +86,11 @@ public class AbstractResource { /** * 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 + * @param uriString URI String to be appended to the base URI * @return newly created URI */ - private URI createAbsoluteURI(Object[] uriElements) { - return uriInfo.getBaseUriBuilder().build(uriElements); + private URI createAbsoluteURI(String uriString) { + return uriInfo.getBaseUriBuilder().path(uriString).build(); } /** diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java index 0bc0f061..dd6e2804 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java @@ -20,9 +20,6 @@ */ package com.gluster.storage.management.server.resources; -import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; -import com.gluster.storage.management.core.model.Server; -import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.ServerUtil; import com.sun.jersey.api.core.InjectParam; @@ -37,19 +34,5 @@ public class AbstractServersResource extends AbstractResource { @InjectParam protected GlusterUtil glusterUtil; - /** - * Fetch details of the given server. The server name must be populated in the object before calling this method. - * - * @param server - * Server whose details are to be fetched - */ - protected void fetchServerDetails(Server server) { - // fetch standard server details like cpu, disk, memory details - Object response = serverUtil.executeOnServer(true, server.getName(), "get_server_details.py --only-data-disks", Server.class); - if (response instanceof Status) { - // TODO: check if this happened because the server is not reachable, and if yes, set it's status as offline - throw new GlusterRuntimeException(((Status)response).getMessage()); - } - server.copyFrom((Server) response); // Update the details in <Server> object - } + // TODO: Remove this class! } 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 ee9d3600..283ab147 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 @@ -130,7 +130,7 @@ public class DiscoveredServersResource extends AbstractServersResource { private Server getDiscoveredServer(String serverName) { Server server = new Server(serverName); - fetchServerDetails(server); + serverUtil.fetchServerDetails(server); return server; } 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 0a77a8ab..a9ef7fbb 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 @@ -22,10 +22,10 @@ import static com.gluster.storage.management.core.constants.RESTConstants.FORM_P 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; +import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_DISKS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_SERVERS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_TASKS; -import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_DISKS; import java.util.ArrayList; import java.util.List; @@ -50,11 +50,7 @@ import com.gluster.storage.management.core.exceptions.ConnectionException; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; -import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.response.GlusterServerListResponse; -import com.gluster.storage.management.core.response.TaskResponse; -import com.gluster.storage.management.core.utils.LRUCache; import com.gluster.storage.management.server.data.ClusterInfo; import com.gluster.storage.management.server.data.ServerInfo; import com.gluster.storage.management.server.services.ClusterService; @@ -70,7 +66,6 @@ import com.sun.jersey.spi.resource.Singleton; public class GlusterServersResource extends AbstractServersResource { public static final String HOSTNAMETAG = "hostname:"; - private LRUCache<String, GlusterServer> clusterServerCache = new LRUCache<String, GlusterServer>(3); @InjectParam private DiscoveredServersResource discoveredServersResource; @@ -87,50 +82,12 @@ public class GlusterServersResource extends AbstractServersResource { protected void fetchServerDetails(GlusterServer server) { try { server.setStatus(SERVER_STATUS.ONLINE); - super.fetchServerDetails(server); + serverUtil.fetchServerDetails(server); } catch (ConnectionException e) { server.setStatus(SERVER_STATUS.OFFLINE); } } - public GlusterServer getOnlineServer(String clusterName) { - return getOnlineServer(clusterName, ""); - } - - // uses cache - public GlusterServer getOnlineServer(String clusterName, String exceptServerName) { - GlusterServer server = clusterServerCache.get(clusterName); - if (server != null && !server.getName().equals(exceptServerName)) { - return server; - } - - return getNewOnlineServer(clusterName, exceptServerName); - } - - public GlusterServer getNewOnlineServer(String clusterName) { - return getNewOnlineServer(clusterName, ""); - } - - // Doesn't use cache - public GlusterServer getNewOnlineServer(String clusterName, String exceptServerName) { - ClusterInfo cluster = clusterService.getCluster(clusterName); - if (cluster == null) { - return null; - } - - for (ServerInfo serverInfo : cluster.getServers()) { - GlusterServer server = new GlusterServer(serverInfo.getName()); - fetchServerDetails(server); - if (server.isOnline() && !server.getName().equals(exceptServerName)) { - // server is online. add it to cache and return - clusterServerCache.put(clusterName, server); - return server; - } - } - - // no online server found. - return null; - } @GET @Produces(MediaType.APPLICATION_JSON) @@ -160,7 +117,7 @@ public class GlusterServersResource extends AbstractServersResource { return okResponse(new GlusterServerListResponse(glusterServers), mediaType); } - GlusterServer onlineServer = getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -169,7 +126,7 @@ public class GlusterServersResource extends AbstractServersResource { glusterServers = getGlusterServers(clusterName, onlineServer); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -211,7 +168,7 @@ public class GlusterServersResource extends AbstractServersResource { glusterServers = glusterUtil.getGlusterServers(onlineServer); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { throw new GlusterRuntimeException("No online servers found in cluster [" + clusterName + "]"); } @@ -259,7 +216,7 @@ public class GlusterServersResource extends AbstractServersResource { throw new GlusterRuntimeException("Cluster [" + clusterName + "] not found!"); } - GlusterServer onlineServer = getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { throw new GlusterRuntimeException("No online servers found in cluster [" + clusterName + "]"); } @@ -269,7 +226,7 @@ public class GlusterServersResource extends AbstractServersResource { server = glusterUtil.getGlusterServer(onlineServer, serverName); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { throw new GlusterRuntimeException("No online servers found in cluster [" + clusterName + "]"); } @@ -283,7 +240,7 @@ public class GlusterServersResource extends AbstractServersResource { } private void performAddServer(String clusterName, String serverName) { - GlusterServer onlineServer = getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { throw new GlusterRuntimeException("No online server found in cluster [" + clusterName + "]"); } @@ -292,7 +249,7 @@ public class GlusterServersResource extends AbstractServersResource { glusterUtil.addServer(onlineServer.getName(), serverName); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { throw new GlusterRuntimeException("No online server found in cluster [" + clusterName + "]"); } @@ -388,7 +345,7 @@ public class GlusterServersResource extends AbstractServersResource { 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); + clusterService.removeOnlineServer(clusterName); } else { try { removeServerFromCluster(clusterName, serverName); @@ -402,7 +359,7 @@ public class GlusterServersResource extends AbstractServersResource { 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); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName, serverName); if (onlineServer == null) { throw new GlusterRuntimeException("No online server found in cluster [" + clusterName + "]"); } @@ -411,7 +368,7 @@ public class GlusterServersResource extends AbstractServersResource { glusterUtil.removeServer(onlineServer.getName(), serverName); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = getNewOnlineServer(clusterName, serverName); + onlineServer = clusterService.getNewOnlineServer(clusterName, serverName); if (onlineServer == null) { throw new GlusterRuntimeException("No online server found in cluster [" + clusterName + "]"); } @@ -420,7 +377,7 @@ public class GlusterServersResource extends AbstractServersResource { if (onlineServer.getName().equals(serverName)) { // since the cached server has been removed from the cluster, remove it from the cache - clusterServerCache.remove(clusterName); + clusterService.removeOnlineServer(clusterName); } clusterService.unmapServerFromCluster(clusterName, serverName); @@ -457,12 +414,12 @@ public class GlusterServersResource extends AbstractServersResource { return badRequestResponse("Disk name must not be empty!"); } - InitializeDiskTask initializeTask = new InitializeDiskTask(diskName, serverName); + InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, diskName, serverName); try { initializeTask.start(); taskResource.addTask(initializeTask); - return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, - initializeTask.getId()); + return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_TASKS + + "/" + initializeTask.getId()); } catch (ConnectionException e) { return errorResponse(e.getMessage()); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java index 44d86b1b..834033d0 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java @@ -45,9 +45,9 @@ import javax.ws.rs.core.Response; import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.exceptions.GlusterValidationException; -import com.gluster.storage.management.core.model.Task; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.response.TaskInfoListResponse; +import com.gluster.storage.management.server.tasks.Task; import com.sun.jersey.spi.resource.Singleton; @Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_TASKS) @@ -130,8 +130,8 @@ public class TasksResource extends AbstractResource { task.commit(); } // updateTask(taskId, taskOperation); - return (Response) acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, - taskId); + return (Response) acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + + RESOURCE_TASKS + "/" + taskId); } catch(GlusterValidationException ve) { return badRequestResponse(ve.getMessage()); } catch (GlusterRuntimeException e) { 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 0f3fbb95..107d4fb2 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 @@ -23,6 +23,9 @@ package com.gluster.storage.management.server.resources; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_ACCESS_PROTOCOLS; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_AUTO_COMMIT; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_BRICKS; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FIX_LAYOUT; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FORCED_DATA_MIGRATE; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_MIGRATE_DATA; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_OPERATION; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_OPTION_KEY; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_OPTION_VALUE; @@ -54,9 +57,6 @@ import static com.gluster.storage.management.core.constants.RESTConstants.RESOUR import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_VOLUMES; import static com.gluster.storage.management.core.constants.RESTConstants.TASK_START; import static com.gluster.storage.management.core.constants.RESTConstants.TASK_STOP; -import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FIX_LAYOUT; -import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_MIGRATE_DATA; -import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FORCED_DATA_MIGRATE; import java.io.File; import java.io.IOException; @@ -89,6 +89,7 @@ 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.Status; +import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; import com.gluster.storage.management.core.model.VolumeLogMessage; @@ -101,6 +102,8 @@ import com.gluster.storage.management.core.utils.FileUtil; import com.gluster.storage.management.core.utils.ProcessUtil; import com.gluster.storage.management.server.constants.VolumeOptionsDefaults; import com.gluster.storage.management.server.services.ClusterService; +import com.gluster.storage.management.server.tasks.MigrateDiskTask; +import com.gluster.storage.management.server.tasks.RebalanceVolumeTask; import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.ServerUtil; import com.sun.jersey.api.core.InjectParam; @@ -109,14 +112,10 @@ import com.sun.jersey.spi.resource.Singleton; @Singleton @Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_VOLUMES) public class VolumesResource extends AbstractResource { - private static final String PREPARE_BRICK_SCRIPT = "create_volume_directory.py"; private static final String VOLUME_DIRECTORY_CLEANUP_SCRIPT = "clear_volume_directory.py"; private static final String VOLUME_BRICK_LOG_SCRIPT = "get_volume_brick_log.py"; @InjectParam - private GlusterServersResource glusterServersResource; - - @InjectParam private ServerUtil serverUtil; @InjectParam @@ -128,6 +127,9 @@ public class VolumesResource extends AbstractResource { @InjectParam private VolumeOptionsDefaults volumeOptionsDefaults; + @InjectParam + private TasksResource taskResource; + @GET @Produces({MediaType.APPLICATION_XML}) public Response getVolumesXML(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName) { @@ -153,7 +155,7 @@ public class VolumesResource extends AbstractResource { } public VolumeListResponse getVolumes(String clusterName) { - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { return new VolumeListResponse(new ArrayList<Volume>()); } @@ -162,7 +164,7 @@ public class VolumesResource extends AbstractResource { return new VolumeListResponse(glusterUtil.getAllVolumes(onlineServer.getName())); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { return new VolumeListResponse(new ArrayList<Volume>()); } @@ -199,7 +201,7 @@ public class VolumesResource extends AbstractResource { return badRequestResponse("Stripe count must be a positive integer"); } - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -209,7 +211,7 @@ public class VolumesResource extends AbstractResource { return createdResponse(volumeName); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -287,7 +289,7 @@ public class VolumesResource extends AbstractResource { private Volume getVolume(String clusterName, String volumeName) { Volume volume; - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { throw new GlusterRuntimeException("No online servers found in cluster [" + clusterName + "]"); } @@ -296,7 +298,7 @@ public class VolumesResource extends AbstractResource { volume = glusterUtil.getVolume(volumeName, onlineServer.getName()); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { throw new GlusterRuntimeException("No online servers found in cluster [" + clusterName + "]"); } @@ -325,36 +327,35 @@ public class VolumesResource extends AbstractResource { return notFoundResponse("Cluster [" + clusterName + "] not found!"); } - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); - if (onlineServer == null) { - return errorResponse("No online servers found in cluster [" + clusterName + "]"); - } - - if (operation.equals(RESTConstants.TASK_REBALANCE_START)) { - return rebalanceStart(clusterName, volumeName, isFixLayout, isMigrateData, isForcedDataMigrate); - } else if (operation.equals(RESTConstants.TASK_REBALANCE_STATUS)) { - return rebalanceStatus(clusterName, volumeName); - } else if (operation.equals(RESTConstants.TASK_REBALANCE_STOP)) { - return rebalanceStop(clusterName, volumeName); + try { + if (operation.equals(RESTConstants.TASK_REBALANCE_START)) { + String taskId = rebalanceStart(clusterName, volumeName, isFixLayout, isMigrateData, isForcedDataMigrate); + return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_TASKS + + "/" + taskId); + } else if (operation.equals(RESTConstants.TASK_REBALANCE_STOP)) { + rebalanceStop(clusterName, volumeName); + } else { + performVolumeOperation(clusterName, volumeName, operation); + } + return noContentResponse(); + } catch(Exception e) { + return errorResponse(e.getMessage()); } - + } + + private void performVolumeOperation(String clusterName, String volumeName, String operation) { + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); try { - performOperation(volumeName, operation, onlineServer); - } catch (ConnectionException e) { - // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); if (onlineServer == null) { - return errorResponse("No online servers found in cluster [" + clusterName + "]"); - } - - try { - performOperation(volumeName, operation, onlineServer); - } catch(Exception e1) { - // TODO: Log the exception - return errorResponse(e1.getMessage()); + throw new GlusterRuntimeException("No online servers found in cluster [" + clusterName + "]"); } + + performOperation(volumeName, operation, onlineServer); + } catch (ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = clusterService.getNewOnlineServer(clusterName); + performOperation(volumeName, operation, onlineServer); } - return noContentResponse(); } private Status performOperation(String volumeName, String operation, GlusterServer onlineServer) { @@ -397,7 +398,7 @@ public class VolumesResource extends AbstractResource { } List<Brick> bricks = volume.getBricks(); - Status status = glusterUtil.deleteVolume(volumeName, glusterServersResource.getOnlineServer(clusterName) + Status status = glusterUtil.deleteVolume(volumeName, clusterService.getOnlineServer(clusterName) .getName()); if(!status.isSuccess()) { return errorResponse("Couldn't delete volume [" + volumeName + "]. Error: " + status); @@ -441,7 +442,7 @@ public class VolumesResource extends AbstractResource { deleteFlag = false; } - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -467,7 +468,7 @@ public class VolumesResource extends AbstractResource { glusterUtil.removeBricks(volumeName, brickList, onlineServer.getName()); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { throw new GlusterRuntimeException("No online servers found in cluster [" + clusterName + "]"); } @@ -544,7 +545,7 @@ public class VolumesResource extends AbstractResource { return notFoundResponse("Cluster [" + clusterName + "] not found!"); } - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -553,7 +554,7 @@ public class VolumesResource extends AbstractResource { glusterUtil.setOption(volumeName, key, value, onlineServer.getName()); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -586,7 +587,7 @@ public class VolumesResource extends AbstractResource { return notFoundResponse("Cluster [" + clusterName + "] not found!"); } - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -595,7 +596,7 @@ public class VolumesResource extends AbstractResource { glusterUtil.resetOptions(volumeName, onlineServer.getName()); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -869,7 +870,7 @@ public class VolumesResource extends AbstractResource { return notFoundResponse("Cluster [" + clusterName + "] not found!"); } - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -879,7 +880,7 @@ public class VolumesResource extends AbstractResource { glusterUtil.addBricks(volumeName, brickList, onlineServer.getName()); } catch (ConnectionException e) { // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + onlineServer = clusterService.getNewOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -922,7 +923,7 @@ public class VolumesResource extends AbstractResource { return notFoundResponse("Cluster [" + clusterName + "] not found!"); } - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + GlusterServer onlineServer = clusterService.getOnlineServer(clusterName); if (onlineServer == null) { return errorResponse("No online servers found in cluster [" + clusterName + "]"); } @@ -933,109 +934,54 @@ public class VolumesResource extends AbstractResource { String taskId = null; try { - taskId = glusterUtil.migrateBrickStart(volumeName, fromBrick, toBrick, autoCommit, onlineServer.getName()); - } catch (ConnectionException e) { - // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); - - try { - taskId = glusterUtil.migrateBrickStart(volumeName, fromBrick, toBrick, autoCommit, onlineServer.getName()); - } catch(Exception e1) { - return errorResponse(e1.getMessage()); - } - } catch(Exception e1) { - return errorResponse(e1.getMessage()); + taskId = migrateBrickStart(clusterName, volumeName, fromBrick, toBrick, autoCommit); + }catch(Exception e) { + return errorResponse(e.getMessage()); } - return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId); + return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_TASKS + "/" + + taskId); + } + + private String migrateBrickStart(String clusterName, String volumeName, String fromBrick, String toBrick, + Boolean autoCommit) { + MigrateDiskTask migrateDiskTask = new MigrateDiskTask(clusterService, clusterName, volumeName, fromBrick, + toBrick); + migrateDiskTask.setAutoCommit(autoCommit); + migrateDiskTask.start(); + taskResource.addTask(migrateDiskTask); + return migrateDiskTask.getId(); } - private Response rebalanceStart(String clusterName, String volumeName, Boolean isFixLayout, Boolean isMigrateData, + private String rebalanceStart(String clusterName, String volumeName, Boolean isFixLayout, Boolean isMigrateData, Boolean isForcedDataMigrate) { - - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); - if (onlineServer == null) { - return notFoundResponse("No online servers found in cluster [" + clusterName + "]"); - } - String layout = ""; - String taskId = null; if (isForcedDataMigrate) { - layout = "forced-data-migrate = true"; + layout = "forced-data-migrate"; } else if (isMigrateData) { - layout = "migrate-data = true"; + layout = "migrate-data"; } else if (isFixLayout) { - layout = "fix-layout = true"; + layout = "fix-layout"; } - try { - taskId = glusterUtil.rebalanceStart(volumeName, layout, onlineServer.getName()); - } catch (ConnectionException e) { - // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); - - try { - taskId = glusterUtil.rebalanceStart(volumeName, layout, onlineServer.getName()); - } catch(Exception e1) { - return errorResponse(e1.getMessage()); - } - } catch(Exception e1) { - return errorResponse(e1.getMessage()); - } - - return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId); + return rebalanceStart(clusterName, volumeName, layout); } - private Response rebalanceStatus(String clusterName, String volumeName) { - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); - if (onlineServer == null) { - return notFoundResponse("No online servers found in cluster [" + clusterName + "]"); - } - - String taskId = null; - try { - taskId = glusterUtil.rebalanceStatus(volumeName, onlineServer.getName()); - } catch (ConnectionException e) { - // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); - - try { - taskId = glusterUtil.rebalanceStatus(volumeName, onlineServer.getName()); - } catch (Exception e1) { - return errorResponse(e1.getMessage()); - } - } catch(Exception e1) { - return errorResponse(e1.getMessage()); - } - - return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId); + public String rebalanceStart(String clusterName, String volumeName, String layout) { + RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(clusterService, clusterName, volumeName); + rebalanceTask.setLayout(layout); + rebalanceTask.start(); + taskResource.addTask(rebalanceTask); + return rebalanceTask.getId(); } - private Response rebalanceStop(String clusterName, String volumeName) { - GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); - if (onlineServer == null) { - return notFoundResponse("No online servers found in cluster [" + clusterName + "]"); - } + public void rebalanceStop(String clusterName, String volumeName) { + // TODO: arrive at the task id and fetch it + String taskId = ""; - String taskId = null; - try { - taskId = glusterUtil.rebalanceStop(volumeName, onlineServer.getName()); - } catch (ConnectionException e) { - // online server has gone offline! try with a different one. - onlineServer = glusterServersResource.getNewOnlineServer(clusterName); - - try { - taskId = glusterUtil.rebalanceStop(volumeName, onlineServer.getName()); - } catch (Exception e1) { - return errorResponse(e1.getMessage()); - } - } catch(Exception e1) { - return errorResponse(e1.getMessage()); - } - - return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId); + taskResource.getTask(taskId).stop(); } - + public static void main(String[] args) throws ClassNotFoundException { VolumesResource vr = new VolumesResource(); // VolumeListResponse response = vr.getAllVolumes(); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ClusterService.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ClusterService.java index bb379de6..42bfc736 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ClusterService.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ClusterService.java @@ -35,13 +35,13 @@ import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.utils.LRUCache; 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.gluster.storage.management.server.utils.ServerUtil; import com.gluster.storage.management.server.utils.SshUtil; -import com.sun.jersey.api.core.InjectParam; /** * Service class for functionality related to clusters @@ -60,6 +60,58 @@ public class ClusterService { @Autowired private SshUtil sshUtil; + @Autowired + private ServerUtil serverUtil; + + private LRUCache<String, GlusterServer> onlineServerCache = new LRUCache<String, GlusterServer>(3); + + public void addOnlineServer(String clusterName, GlusterServer server) { + onlineServerCache.put(clusterName, server); + } + + public void removeOnlineServer(String clusterName) { + onlineServerCache.remove(clusterName); + } + + // uses cache + public GlusterServer getOnlineServer(String clusterName, String exceptServerName) { + GlusterServer server = getOnlineServer(clusterName); + if (server != null && !server.getName().equals(exceptServerName)) { + return server; + } + + return getNewOnlineServer(clusterName, exceptServerName); + } + + public GlusterServer getNewOnlineServer(String clusterName) { + return getNewOnlineServer(clusterName, ""); + } + + public GlusterServer getOnlineServer(String clusterName) { + return getOnlineServer(clusterName, ""); + } + + // Doesn't use cache + public GlusterServer getNewOnlineServer(String clusterName, String exceptServerName) { + ClusterInfo cluster = getCluster(clusterName); + if (cluster == null) { + throw new GlusterRuntimeException("Cluster [" + clusterName + "] is not found!"); + } + + for (ServerInfo serverInfo : cluster.getServers()) { + GlusterServer server = new GlusterServer(serverInfo.getName()); + serverUtil.fetchServerDetails(server); + if (server.isOnline() && !server.getName().equals(exceptServerName)) { + // server is online. add it to cache and return + addOnlineServer(clusterName, server); + return server; + } + } + + // no online server found. + throw new GlusterRuntimeException("No online server found in cluster [" + clusterName + "]"); + } + public List<ClusterInfo> getAllClusters() { return clusterDao.findAll(); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java index 018cd301..5f3f8e30 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java @@ -21,10 +21,10 @@ package com.gluster.storage.management.server.tasks; import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.model.Task; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.TaskStatus; +import com.gluster.storage.management.server.services.ClusterService; import com.gluster.storage.management.server.utils.SshUtil; public class InitializeDiskTask extends Task { @@ -36,15 +36,16 @@ public class InitializeDiskTask extends Task { private String diskName; private SshUtil sshUtil = new SshUtil(); - public InitializeDiskTask( String serverName, String diskName) { - super(TASK_TYPE.DISK_FORMAT, diskName, "Initialize disk " + serverName + ":" + diskName, false, false, false); + public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName) { + super(clusterService, clusterName, TASK_TYPE.DISK_FORMAT, diskName, "Initialize disk " + serverName + ":" + + diskName, false, false, false); setServerName(serverName); setDiskName(diskName); } - public InitializeDiskTask(TaskInfo info) { - super(info); + public InitializeDiskTask(ClusterService clusterService, String clusterName, TaskInfo info) { + super(clusterService, clusterName, info); } @Override diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java index 0b1b67e4..9a31d468 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java @@ -20,13 +20,15 @@ */ package com.gluster.storage.management.server.tasks; +import com.gluster.storage.management.core.exceptions.ConnectionException; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; +import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.model.Task; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.utils.ProcessResult; +import com.gluster.storage.management.server.services.ClusterService; import com.gluster.storage.management.server.utils.SshUtil; public class MigrateDiskTask extends Task { @@ -61,15 +63,15 @@ public class MigrateDiskTask extends Task { this.autoCommit = autoCommit; } - public MigrateDiskTask(String volumeName, String fromBrick, String toBrick) { - super(TASK_TYPE.BRICK_MIGRATE, volumeName, "Brick Migration on volume [" + volumeName + "] from [" + fromBrick - + "] to [" + toBrick + "]", true, true, true); + public MigrateDiskTask(ClusterService clusterService, String clusterName, String volumeName, String fromBrick, String toBrick) { + super(clusterService, clusterName, TASK_TYPE.BRICK_MIGRATE, volumeName, "Brick Migration on volume [" + + volumeName + "] from [" + fromBrick + "] to [" + toBrick + "]", true, true, true); setFromBrick(fromBrick); setToBrick(toBrick); } - public MigrateDiskTask(TaskInfo info) { - super(info); + public MigrateDiskTask(ClusterService clusterService, String clusterName, TaskInfo info) { + super(clusterService, clusterName, info); } @Override @@ -79,31 +81,48 @@ public class MigrateDiskTask extends Task { @Override public void start() { + try { + startMigration(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one. + startMigration(getNewOnlineServer().getName()); + } + } + + private void startMigration(String onlineServerName) { String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " start"; - ProcessResult processResult = sshUtil.executeRemote(serverName, command); - TaskStatus taskStatus = new TaskStatus(); + ProcessResult processResult = sshUtil.executeRemote(onlineServerName, command); + + System.out.println(command); + System.out.println("[" + processResult.getExitValue() + "] " + processResult.getOutput() ); + if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches(".*started successfully$")) { - taskStatus.setCode(Status.STATUS_CODE_RUNNING); - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + return; } - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); } - taskStatus.setMessage(processResult.getOutput()); // Common - getTaskInfo().setStatus(taskStatus); + + // if we come here, it means task couldn't be started successfully. + throw new GlusterRuntimeException(processResult.toString()); } - - @Override public void pause() { + try { + pauseMigration(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one. + pauseMigration(getNewOnlineServer().getName()); + } + } + + private void pauseMigration(String onlineServer) { String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " pause"; - ProcessResult processResult = sshUtil.executeRemote(serverName, command); + ProcessResult processResult = sshUtil.executeRemote(onlineServer, command); TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { if (processResult.getOutput().matches("*pause")) { @@ -131,6 +150,15 @@ public class MigrateDiskTask extends Task { @Override public void stop() { + try { + stopMigration(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one. + stopMigration(getNewOnlineServer().getName()); + } + } + + private void stopMigration(String serverName) { String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " abort"; @@ -152,6 +180,15 @@ public class MigrateDiskTask extends Task { @Override public TaskStatus checkStatus() { + try { + return checkMigrationStatus(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one. + return checkMigrationStatus(getNewOnlineServer().getName()); + } + } + + private TaskStatus checkMigrationStatus(String serverName) { String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " status"; ProcessResult processResult = sshUtil.executeRemote(serverName, command); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java index f696a823..7f9fb6bf 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java @@ -20,12 +20,14 @@ */ package com.gluster.storage.management.server.tasks; +import com.gluster.storage.management.core.exceptions.ConnectionException; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.model.Task; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.utils.ProcessResult; +import com.gluster.storage.management.server.services.ClusterService; import com.gluster.storage.management.server.utils.SshUtil; public class RebalanceVolumeTask extends Task { @@ -33,12 +35,12 @@ public class RebalanceVolumeTask extends Task { private String layout; private SshUtil sshUtil = new SshUtil(); - public RebalanceVolumeTask(TaskInfo taskInfo) { - super(taskInfo); + public RebalanceVolumeTask(ClusterService clusterService, String clusterName, TaskInfo taskInfo) { + super(clusterService, clusterName, taskInfo); } - public RebalanceVolumeTask(String volumeName) { - super(TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume rebalance running on " + volumeName, false, true, false); + public RebalanceVolumeTask(ClusterService clusterService, String clusterName, String volumeName) { + super(clusterService, clusterName, TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume rebalance running on " + volumeName, false, true, false); } @Override @@ -48,20 +50,25 @@ public class RebalanceVolumeTask extends Task { @Override public void start() { + try { + startRebalance(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one + startRebalance(getNewOnlineServer().getName()); + } + } + + private void startRebalance(String serverName) { String command = "gluster volume rebalance " + getTaskInfo().getReference() + " " + getLayout() + " start"; ProcessResult processResult = sshUtil.executeRemote(serverName, command); - TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches(".*has been successful$")) { - taskStatus.setCode(Status.STATUS_CODE_RUNNING); - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); } - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); } - taskStatus.setMessage(processResult.getOutput()); // Common - getTaskInfo().setStatus(taskStatus); + + // if we reach here, it means rebalance start failed. + throw new GlusterRuntimeException(processResult.toString()); } @Override @@ -72,6 +79,15 @@ public class RebalanceVolumeTask extends Task { @Override public void stop() { + try { + stopRebalance(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one + stopRebalance(getNewOnlineServer().getName()); + } + } + + private void stopRebalance(String serverName) { String command = "gluster volume rebalance " + getTaskInfo().getReference() + " stop"; ProcessResult processResult = sshUtil.executeRemote(serverName, command); TaskStatus taskStatus = new TaskStatus(); @@ -96,6 +112,16 @@ public class RebalanceVolumeTask extends Task { @Override public TaskStatus checkStatus() { + try { + return checkRebalanceStatus(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one. + return checkRebalanceStatus(getNewOnlineServer().getName()); + } + } + + // TODO: This method should move to glusterUtil + private TaskStatus checkRebalanceStatus(String serverName) { String command = "gluster volume rebalance " + getTaskInfo().getReference() + " status"; ProcessResult processResult = sshUtil.executeRemote(serverName, command); TaskStatus taskStatus = new TaskStatus(); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Task.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java index b7823c4b..cdc56400 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Task.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java @@ -18,30 +18,54 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. */ -package com.gluster.storage.management.core.model; +package com.gluster.storage.management.server.tasks; +import com.gluster.storage.management.core.exceptions.ConnectionException; +import com.gluster.storage.management.core.model.GlusterServer; +import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; +import com.gluster.storage.management.server.services.ClusterService; public abstract class Task { public String[] TASK_TYPE_STR = { "Format Disk", "Migrate Brick", "Volume Rebalance" }; - protected TaskInfo taskInfo; + protected TaskInfo taskInfo; + protected String clusterName; + private ClusterService clusterService; - protected String serverName; - - public Task(TASK_TYPE type, String reference, String desc, boolean canPause, boolean canStop, boolean canCommit) { - taskInfo = new TaskInfo(); + public Task(ClusterService clusterService, String clusterName, TASK_TYPE type, String reference, String desc, boolean canPause, boolean canStop, boolean canCommit) { + TaskInfo taskInfo = new TaskInfo(); taskInfo.setType(type); taskInfo.setReference(reference); taskInfo.setDescription(desc); // IMPORTANT. This call must be in the end since getId may need to use the values set in above statements - taskInfo.setName(getId()); + taskInfo.setName(getId()); + init(clusterService, clusterName, taskInfo); + } + + public Task(ClusterService clusterService, String clusterName, TaskInfo taskInfo) { + init(clusterService, clusterName, taskInfo); } - public Task(TaskInfo taskInfo) { + private void init(ClusterService clusterService, String clusterName, TaskInfo taskInfo) { + this.clusterService = clusterService; + setClusterName(clusterName); setTaskInfo(taskInfo); } + + protected GlusterServer getOnlineServer() { + return clusterService.getOnlineServer(clusterName); + } + + protected GlusterServer getNewOnlineServer() { + return clusterService.getNewOnlineServer(clusterName); + } + + protected GlusterServer getNewOnlineServer(String exceptServerName) { + return clusterService.getNewOnlineServer(clusterName, exceptServerName); + } public String getTypeStr() { return TASK_TYPE_STR[taskInfo.getType().ordinal()]; @@ -51,12 +75,12 @@ public abstract class Task { return getTaskInfo().getType(); } - public String getOnlineServer() { - return serverName; + public String getClusterName() { + return clusterName; } - public void setOnlineServer(String serverName) { - this.serverName = serverName; + public void setClusterName(String clusterName) { + this.clusterName = clusterName; } public TaskInfo getTaskInfo() { 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 c2da8d6c..788e3eab 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 @@ -536,65 +536,6 @@ public class GlusterUtil { return logFileName; } - - public String migrateBrickStart(String volumeName, String fromBrick, String toBrick, Boolean autoCommit, - String knownServer) { - MigrateDiskTask migrateDiskTask = new MigrateDiskTask(volumeName, fromBrick, toBrick); - migrateDiskTask.setOnlineServer(knownServer); - migrateDiskTask.setAutoCommit(autoCommit); - migrateDiskTask.start(); - int status = migrateDiskTask.getTaskInfo().getStatus().getCode(); - if (status != Status.STATUS_CODE_FAILURE ) { - TasksResource tasksResource = new TasksResource(); - taskResource.addTask(migrateDiskTask); - } else { - throw new GlusterRuntimeException( migrateDiskTask.getTaskInfo().getStatus().getMessage()); - } - return migrateDiskTask.getId(); - } - - public String rebalanceStart(String volumeName, String layout, String knownServer) { - - RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(volumeName); - rebalanceTask.setOnlineServer(knownServer); - rebalanceTask.setLayout(layout); - rebalanceTask.start(); - int status = rebalanceTask.getTaskInfo().getStatus().getCode(); - - if(status != Status.STATUS_CODE_FAILURE) { - taskResource.addTask(rebalanceTask); - } else { - throw new GlusterRuntimeException( rebalanceTask.getTaskInfo().getStatus().getMessage()); - } - return rebalanceTask.getId(); - } - - public String rebalanceStatus(String volumeName, String knownServer) { - RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(volumeName); - rebalanceTask.setOnlineServer(knownServer); - - rebalanceTask.checkStatus(); - int status = rebalanceTask.getTaskInfo().getStatus().getCode(); - - if (status == Status.STATUS_CODE_FAILURE) { - throw new GlusterRuntimeException(rebalanceTask.getTaskInfo().getStatus().getMessage()); - } - return rebalanceTask.getId(); - } - - public String rebalanceStop(String volumeName, String knownServer) { - RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(volumeName); - rebalanceTask.setOnlineServer(knownServer); - - rebalanceTask.stop(); - int status = rebalanceTask.getTaskInfo().getStatus().getCode(); - - if (status == Status.STATUS_CODE_FAILURE) { - throw new GlusterRuntimeException(rebalanceTask.getTaskInfo().getStatus().getMessage()); - } - return rebalanceTask.getId(); - } - public Status removeBricks(String volumeName, List<String> bricks, String knownServer) { StringBuilder command = new StringBuilder("gluster --mode=script volume remove-brick " + volumeName); for (String brickDir : bricks) { 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 ed1aea75..3524d35d 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 @@ -42,6 +42,7 @@ import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.exceptions.ConnectionException; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; +import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.utils.ProcessResult; @@ -76,6 +77,22 @@ public class ServerUtil { String scriptPath = servletContext.getRealPath(SCRIPT_DIR) + CoreConstants.FILE_SEPARATOR + scriptName; return scriptPath; } + + /** + * Fetch details of the given server. The server name must be populated in the object before calling this method. + * + * @param server + * Server whose details are to be fetched + */ + public void fetchServerDetails(Server server) { + // fetch standard server details like cpu, disk, memory details + Object response = executeOnServer(true, server.getName(), "get_server_details.py --only-data-disks", Server.class); + if (response instanceof Status) { + // TODO: check if this happened because the server is not reachable, and if yes, set it's status as offline + throw new GlusterRuntimeException(((Status)response).getMessage()); + } + server.copyFrom((Server) response); // Update the details in <Server> object + } /** * Executes given command on given server |
