summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.server
diff options
context:
space:
mode:
authorSelvasundaram <selvam@gluster.com>2011-06-22 18:36:51 +0530
committerSelvasundaram <selvam@gluster.com>2011-06-27 21:05:03 +0530
commit4ef7f5b73e733528d818d2bb6987a56cc3b097ce (patch)
tree78d65f4830bb379aff8963a6f75b61f490666f40 /src/com.gluster.storage.management.server
parent8c59a588c903cc1a70ea769e78e0414c69006b35 (diff)
Task progress view UI
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/GlusterServersResource.java14
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java121
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java39
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java118
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java17
5 files changed, 182 insertions, 127 deletions
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 1999762a..e824fee7 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
@@ -457,21 +457,15 @@ public class GlusterServersResource extends AbstractServersResource {
return badRequestResponse("Disk name must not be empty!");
}
- TaskResponse taskResponse = new TaskResponse();
InitializeDiskTask initializeTask = new InitializeDiskTask(diskName, serverName);
- String taskId = null;
try {
- TaskInfo taskInfo = initializeTask.start();
- taskId = taskInfo.getId();
- if (taskInfo.isSuccess()) {
- taskResource.addTask(initializeTask);
- }
- taskResponse.setData(taskInfo);
- taskResponse.setStatus(new Status(Status.STATUS_CODE_SUCCESS, ""));
+ initializeTask.start();
+ taskResource.addTask(initializeTask);
+ return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS,
+ initializeTask.getId());
} catch (ConnectionException e) {
return errorResponse(e.getMessage());
}
- return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId);
}
private void setGlusterUtil(GlusterUtil glusterUtil) {
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 4bf1c0cf..d86cede2 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
@@ -20,9 +20,9 @@
*/
package com.gluster.storage.management.server.resources;
+import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_OPERATION;
import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME;
import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_TASK_ID;
-import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_OPERATION;
import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS;
import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_TASKS;
@@ -40,26 +40,24 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
+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.model.Status;
+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.TaskListResponse;
-import com.gluster.storage.management.core.response.TaskResponse;
import com.sun.jersey.spi.resource.Singleton;
@Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_TASKS)
@Singleton
-public class TasksResource {
+public class TasksResource extends AbstractResource {
private Map<String, Task> tasksMap = new HashMap<String, Task>();
public TasksResource() {
}
-
- public void addTask(Task task) { // task should be one of MuigrateDiskTask, FormatDiskTask, etc
+ public void addTask(Task task) {
tasksMap.put(task.getId(), task);
}
@@ -70,18 +68,11 @@ public class TasksResource {
public List<TaskInfo> getAllTasksInfo() {
List<TaskInfo> allTasksInfo = new ArrayList<TaskInfo>();
for (Map.Entry<String, Task> entry : tasksMap.entrySet()) {
- allTasksInfo.add(entry.getValue().getTaskInfo());
+ checkTaskStatus(entry.getKey());
+ allTasksInfo.add(entry.getValue().getTaskInfo()); // TaskInfo with latest status
}
return allTasksInfo;
}
-
- public List<Task> getAllTasks() {
- List<Task> allTasks = new ArrayList<Task>();
- for (Map.Entry<String, Task> entry : tasksMap.entrySet()) {
- allTasks.add(entry.getValue());
- }
- return allTasks;
- }
public Task getTask(String taskId) {
for (Map.Entry<String, Task> entry : tasksMap.entrySet()) {
@@ -91,63 +82,95 @@ public class TasksResource {
}
return null;
}
-
+
@GET
@Produces(MediaType.APPLICATION_XML)
- public TaskListResponse getTasks() {
- TaskListResponse taskListResponse = new TaskListResponse();
+ public Response getTasks() {
+ try {
+ return okResponse(getAllTasksInfo(), MediaType.APPLICATION_XML);
+ } catch (GlusterRuntimeException e) {
+ return errorResponse(e.getMessage());
+ }
+ }
+
+ @GET
+ @Path("/{" + PATH_PARAM_TASK_ID + "}")
+ @Produces(MediaType.APPLICATION_XML)
+ public Response getTaskStatus( @PathParam(PATH_PARAM_TASK_ID) String taskId) {
try {
- taskListResponse.setData(getAllTasksInfo());
- taskListResponse.setStatus(new Status(Status.STATUS_CODE_SUCCESS, ""));
+ Task task = checkTaskStatus(taskId);
+ return okResponse(task.getTaskInfo(), MediaType.APPLICATION_XML);
} catch (GlusterRuntimeException e) {
- taskListResponse.setStatus(new Status(e));
+ return errorResponse(e.getMessage());
}
- return taskListResponse;
+ }
+
+ private Task checkTaskStatus(String taskId) {
+ Task task = getTask(taskId);
+ task.getTaskInfo().setStatus(task.checkStatus());
+ return task;
}
@PUT
@Path("/{" + PATH_PARAM_TASK_ID + "}")
@Produces(MediaType.APPLICATION_XML)
- public TaskResponse performTask(@PathParam(PATH_PARAM_TASK_ID) String taskId,
- @FormParam(FORM_PARAM_OPERATION) String taskOperation) {
+ public Response performTask(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(PATH_PARAM_TASK_ID) String taskId, @FormParam(FORM_PARAM_OPERATION) String taskOperation) {
Task task = getTask(taskId);
- TaskInfo taskInfo = null;
- TaskResponse taskResponse = new TaskResponse();
-
+
try {
if (taskOperation.equals(RESTConstants.TASK_RESUME)) {
- taskInfo = task.resume();
- }
- if (taskOperation.equals(RESTConstants.TASK_PAUSE)) {
- taskInfo = task.pause();
+ task.resume();
+ } else if (taskOperation.equals(RESTConstants.TASK_PAUSE)) {
+ task.pause();
+ } else if (taskOperation.equals(RESTConstants.TASK_STOP)) {
+ task.stop();
+ } else if(taskOperation.equals(RESTConstants.TASK_COMMIT)) {
+ task.commit();
}
- if (taskOperation.equals(RESTConstants.TASK_STOP)) {
- taskInfo = task.stop();
- }
- taskResponse.setData(taskInfo);
- taskResponse.setStatus(new Status(Status.STATUS_CODE_SUCCESS, ""));
+ // updateTask(taskId, taskOperation);
+ return (Response) acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS,
+ taskId);
+ } catch(GlusterValidationException ve) {
+ return badRequestResponse(ve.getMessage());
} catch (GlusterRuntimeException e) {
- taskResponse.setStatus(new Status(e));
+ return errorResponse(e.getMessage());
}
- return taskResponse;
}
@DELETE
@Path("/{" + PATH_PARAM_TASK_ID + "}")
@Produces(MediaType.APPLICATION_XML)
- public TaskResponse deleteTask(@PathParam(PATH_PARAM_TASK_ID) String taskId,
+ public Response deleteTask(@PathParam(PATH_PARAM_TASK_ID) String taskId,
@QueryParam(FORM_PARAM_OPERATION) String taskOperation) {
- TaskResponse taskResponse = new TaskResponse();
Task task = getTask(taskId);
if (task == null) {
- taskResponse.setStatus( new Status(Status.STATUS_CODE_FAILURE, "No such task " + taskId + "is found "));
+ return notFoundResponse("Task [" + taskId + "] not found!");
}
- if (taskOperation.equals("delete")) {
- removeTask(task);
- taskResponse.setStatus(new Status(Status.STATUS_CODE_SUCCESS, "Task [" + taskId
- + "] removed successfully"));
- }
- return null;
- }
+
+ if(taskOperation == null || taskOperation.isEmpty()) {
+ return badRequestResponse("Parameter [" + FORM_PARAM_OPERATION + "] is missing in request!");
+ }
+
+ if(!taskOperation.equals(RESTConstants.TASK_STOP) && !taskOperation.equals(RESTConstants.TASK_DELETE)) {
+ return badRequestResponse("Invalid value [" + taskOperation + "] for parameter [" + FORM_PARAM_OPERATION
+ + "]");
+ }
+
+ try {
+ if (taskOperation.equals(RESTConstants.TASK_STOP)) {
+ task.stop();
+ // On successfully stopping the task, we can delete (forget) it as it is no more useful
+ taskOperation = RESTConstants.TASK_DELETE;
+ }
+ if (taskOperation.equals(RESTConstants.TASK_DELETE)) {
+ removeTask(task);
+ }
+
+ return noContentResponse();
+ } catch (Exception e) {
+ return errorResponse(e.getMessage());
+ }
+ }
}
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 d29d859b..018cd301 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
@@ -23,6 +23,7 @@ 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.utils.SshUtil;
@@ -36,13 +37,10 @@ public class InitializeDiskTask extends Task {
private SshUtil sshUtil = new SshUtil();
public InitializeDiskTask( String serverName, String diskName) {
- super(TASK_TYPE.DISK_FORMAT, diskName);
+ super(TASK_TYPE.DISK_FORMAT, diskName, "Initialize disk " + serverName + ":" + diskName, false, false, false);
- getTaskInfo().setCanPause(false);
- getTaskInfo().setCanStop(false);
setServerName(serverName);
setDiskName(diskName);
- setTaskDescription();
}
public InitializeDiskTask(TaskInfo info) {
@@ -51,25 +49,27 @@ public class InitializeDiskTask extends Task {
@Override
public String getId() {
- return getTaskInfo().getId();
+ return taskInfo.getType() + "-" + serverName + ":" + diskName;
}
@Override
- public TaskInfo resume() {
+ public void resume() {
getTaskInfo().setStatus( new TaskStatus( new Status(Status.STATUS_CODE_FAILURE, "Can not resume disk initialization")));
- return getTaskInfo();
}
@Override
- public TaskInfo stop() {
+ public void stop() {
getTaskInfo().setStatus( new TaskStatus( new Status(Status.STATUS_CODE_FAILURE, "Can not stop disk initialization")));
- return getTaskInfo();
}
@Override
- public TaskInfo pause() {
+ public void pause() {
getTaskInfo().setStatus( new TaskStatus( new Status(Status.STATUS_CODE_FAILURE, "Can not suspend disk initialization")));
- return getTaskInfo();
+ }
+
+ @Override
+ public void commit() {
+ // TODO Auto-generated method stub
}
@Override
@@ -83,25 +83,16 @@ public class InitializeDiskTask extends Task {
}
@Override
- public TaskInfo start() {
+ public void start() {
getTaskInfo().setStatus(
new TaskStatus(new Status(sshUtil.executeRemote(getServerName(), INITIALIZE_DISK_SCRIPT + " "
+ getDiskName()))));
- return getTaskInfo();
- }
-
- @Override
- public TaskInfo status() {
- getTaskInfo().setStatus(
-
- new TaskStatus(new Status(sshUtil.executeRemote(getServerName(), INITIALIZE_DISK_STATUS_SCRIPT + " "
- + getDiskName()))));
- return getTaskInfo();
}
@Override
- public void setTaskDescription() {
- getTaskInfo().setDescription("Formating disk of " + getServerName() + ":" + getDiskName());
+ public TaskStatus checkStatus() {
+ return new TaskStatus(new Status(sshUtil.executeRemote(getServerName(), INITIALIZE_DISK_STATUS_SCRIPT + " "
+ + getDiskName())));
}
public void setDiskName(String diskName) {
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 df637ab1..1f044d77 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,12 +20,12 @@
*/
package com.gluster.storage.management.server.tasks;
-import org.springframework.beans.factory.annotation.Autowired;
-
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.utils.SshUtil;
public class MigrateDiskTask extends Task {
@@ -60,67 +60,111 @@ public class MigrateDiskTask extends Task {
this.autoCommit = autoCommit;
}
- public MigrateDiskTask(TASK_TYPE type, String volumeName, String fromBrick, String toBrick) {
- super(type, volumeName);
+ 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);
setFromBrick(fromBrick);
setToBrick(toBrick);
- setTaskDescription();
- getTaskInfo().setCanPause(true);
- getTaskInfo().setCanStop(true);
}
public MigrateDiskTask(TaskInfo info) {
super(info);
- setTaskDescription();
}
@Override
public String getId() {
- return getTaskInfo().getId();
+ return taskInfo.getType() + "-" + taskInfo.getReference() + "-" + fromBrick + "-" + toBrick;
}
@Override
- public TaskInfo start() {
- getTaskInfo().setStatus(
- new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume replace-brick "
- + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " start" ) )));
- return getTaskInfo();
+ public void start() {
+ String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " "
+ + getToBrick() + " start";
+ ProcessResult processResult = sshUtil.executeRemote(serverName, command);
+ TaskStatus taskStatus = new TaskStatus();
+ if (processResult.isSuccess()) {
+ if (processResult.getOutput().matches("*started successfully")) {
+ taskStatus.setCode(Status.STATUS_CODE_RUNNING);
+ } else {
+ taskStatus.setCode(Status.STATUS_CODE_FAILURE);
+ }
+ } else {
+ taskStatus.setCode(Status.STATUS_CODE_FAILURE);
+ }
+ taskStatus.setMessage(processResult.getOutput()); // Common
+ getTaskInfo().setStatus(taskStatus);
}
+
+
@Override
- public TaskInfo resume() {
- return start();
+ public void pause() {
+ String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick()
+ + " pause";
+
+ ProcessResult processResult = sshUtil.executeRemote(serverName, command);
+ TaskStatus taskStatus = new TaskStatus();
+ if (processResult.isSuccess()) {
+ if (processResult.getOutput().matches("*pause")) {
+ taskStatus.setCode(Status.STATUS_CODE_PAUSE);
+ } else {
+ taskStatus.setCode(Status.STATUS_CODE_FAILURE);
+ }
+ } else {
+ taskStatus.setCode(Status.STATUS_CODE_FAILURE);
+ }
+ taskStatus.setMessage(processResult.getOutput()); // Common
+ getTaskInfo().setStatus(taskStatus);
}
-
+
+
@Override
- public TaskInfo stop() {
- getTaskInfo().setStatus(
- new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume replace-brick "
- + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " abort" ) )));
- return getTaskInfo();
+ public void resume() {
+ start();
}
-
+
@Override
- public TaskInfo pause() {
- getTaskInfo().setStatus(
- new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume replace-brick "
- + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " pause" ) )));
- return getTaskInfo();
-
+ public void commit() {
+ // TODO Auto-generated method stub
}
-
@Override
- public void setTaskDescription() {
- TaskInfo taskInfo = getTaskInfo();
- getTaskInfo().setDescription(
- getTypeStr() + " on volume [" + taskInfo.getReference() + "] from [" + getFromBrick()
- + "] to [" + getToBrick() + "]");
+ public void stop() {
+ String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick()
+ + " abort";
+
+ ProcessResult processResult = sshUtil.executeRemote(serverName, command);
+ TaskStatus taskStatus = new TaskStatus();
+ if (processResult.isSuccess()) {
+ if (processResult.getOutput().matches("*abort")) {
+ taskStatus.setCode(Status.STATUS_CODE_SUCCESS);
+ } else {
+ taskStatus.setCode(Status.STATUS_CODE_FAILURE);
+ }
+ } else {
+ taskStatus.setCode(Status.STATUS_CODE_FAILURE);
+ }
+ taskStatus.setMessage(processResult.getOutput()); // Common
+ getTaskInfo().setStatus(taskStatus);
}
@Override
- public TaskInfo status() {
- return getTaskInfo();
+ public TaskStatus checkStatus() {
+ String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " "
+ + getToBrick() + " status";
+ ProcessResult processResult = sshUtil.executeRemote(serverName, command);
+ TaskStatus taskStatus = new TaskStatus();
+ if (processResult.isSuccess()) {
+ if (processResult.getOutput().matches("*Migration complete")) {
+ taskStatus.setCode(Status.STATUS_CODE_SUCCESS);
+ } else {
+ taskStatus.setCode(Status.STATUS_CODE_RUNNING);
+ }
+ } else {
+ taskStatus.setCode(Status.STATUS_CODE_FAILURE);
+ }
+ taskStatus.setMessage(processResult.getOutput()); // Common
+ return taskStatus;
}
}
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 670ffb5c..0a0892f0 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
@@ -36,8 +36,7 @@ import com.gluster.storage.management.core.model.Brick.BRICK_STATUS;
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.Task.TASK_TYPE;
-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.Volume;
import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE;
import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS;
@@ -539,17 +538,21 @@ public class GlusterUtil {
public String migrateBrickStart(String volumeName, String fromBrick, String toBrick, Boolean autoCommit,
String knownServer) {
- MigrateDiskTask migrateDiskTask = new MigrateDiskTask(TASK_TYPE.BRICK_MIGRATE, volumeName, fromBrick, toBrick);
+ MigrateDiskTask migrateDiskTask = new MigrateDiskTask(volumeName, fromBrick, toBrick);
migrateDiskTask.setOnlineServer(knownServer);
migrateDiskTask.setAutoCommit(autoCommit);
-
- TaskInfo taskInfo = migrateDiskTask.start();
- if (taskInfo.isSuccess()) {
+ 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 taskInfo.getId();
+ return migrateDiskTask.getId();
}
+
public Status removeBricks(String volumeName, List<String> bricks, String knownServer) {
StringBuilder command = new StringBuilder("gluster --mode=script volume remove-brick " + volumeName);