From be3d2044d8269330202f84aba9a0bee6ea210fd8 Mon Sep 17 00:00:00 2001 From: Selvasundaram Date: Thu, 30 Jun 2011 20:11:01 +0530 Subject: Migrate task and UI updates --- .../management/client/GlusterDataModelManager.java | 20 +++++- .../storage/management/client/TasksClient.java | 8 ++- .../storage/management/core/model/Cluster.java | 4 ++ .../storage/management/core/model/Status.java | 1 + .../storage/management/core/model/TaskStatus.java | 2 +- src/com.gluster.storage.management.gui/plugin.xml | 16 +++++ .../management/gui/TasksTableLabelProvider.java | 4 +- .../management/gui/actions/ClearTaskAction.java | 2 +- .../management/gui/actions/CommitTaskAction.java | 54 +++++++++++++++ .../management/gui/actions/PauseTaskAction.java | 7 +- .../management/gui/actions/ResumeTaskAction.java | 7 +- .../management/gui/actions/StopTaskAction.java | 6 +- .../management/gui/views/pages/TasksPage.java | 1 + .../management/server/resources/TasksResource.java | 6 +- .../server/resources/VolumesResource.java | 8 ++- .../management/server/tasks/MigrateDiskTask.java | 80 +++++++++++++++------- .../storage/management/server/tasks/Task.java | 9 +-- 17 files changed, 181 insertions(+), 54 deletions(-) create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java index 87fbed31..9705501a 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -362,14 +362,28 @@ public class GlusterDataModelManager { } } - public void updateTaskStatus(TaskInfo taskInfo, Status newStatus) { - taskInfo.getStatus().setCode(newStatus.getCode()); - taskInfo.getStatus().setMessage(newStatus.getMessage()); + public void addTask(TaskInfo taskInfo) { + Cluster cluster = model.getCluster(); + cluster.addTaskInfo(taskInfo); + for (ClusterListener listener : listeners) { + listener.taskAdded(taskInfo); + } + } + + // Updating the Task + public void updateTask(TaskInfo taskInfo) { for (ClusterListener listener : listeners) { listener.taskUpdated(taskInfo); } } + public void removeTask(TaskInfo taskInfo) { + Cluster cluster = model.getCluster(); + cluster.removeTaskInfo(taskInfo); + for (ClusterListener listener : listeners) { + listener.taskAdded(taskInfo); + } + } public List getVolumeOptionsDefaults() { return volumeOptionsDefaults; 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 deaeee64..46077371 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 @@ -25,7 +25,6 @@ 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.model.TaskInfo; import com.gluster.storage.management.core.response.TaskInfoListResponse; @@ -76,6 +75,13 @@ public class TasksClient extends AbstractClient { putRequest(taskId, form); } + + public void commitTask(String taskId) { + Form form = new Form(); + form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_COMMIT); + + putRequest(taskId, form); + } public void getTaskStatus(String taskId) { Form form = new Form(); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java index 0c094e99..d6757cba 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java @@ -115,6 +115,10 @@ public class Cluster extends Entity { public void addTaskInfo(TaskInfo taskInfo) { this.taskInfoList.add(taskInfo); } + + public void removeTaskInfo(TaskInfo taskInfo) { + this.taskInfoList.remove(taskInfo); + } public List getAlerts() { return alerts; diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java index 95075f78..701fe426 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java @@ -31,6 +31,7 @@ public class Status { public static final int STATUS_CODE_RUNNING = 3; public static final int STATUS_CODE_PAUSE = 4; public static final int STATUS_CODE_WARNING = 5; + public static final int STATUS_CODE_COMMIT_PENDING = 6; public static final Status STATUS_SUCCESS = new Status(STATUS_CODE_SUCCESS, "Success"); public static final Status STATUS_FAILURE = new Status(STATUS_CODE_FAILURE, "Failure"); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskStatus.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskStatus.java index 46dc7b31..c1205c0e 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskStatus.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskStatus.java @@ -22,7 +22,7 @@ package com.gluster.storage.management.core.model; public class TaskStatus extends Status { - private boolean isPercentageSupported; + private boolean isPercentageSupported = false; private float percentCompleted; private String description; diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml index c5c25c33..0addb428 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -683,6 +683,22 @@ toolbarPath="Normal" tooltip="To clear selected task from task list"> + + { private static final String[] TASK_TABLE_COLUMN_NAMES = new String[] { "Task", "Status"}; + @SuppressWarnings("unchecked") public TasksPage(IWorkbenchSite site, Composite parent, int style, Object taskInfo) { super(site, parent, style, false, false, taskInfo); this.taskInfoList = (List) taskInfo; 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 834033d0..53122f11 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 @@ -126,12 +126,10 @@ public class TasksResource extends AbstractResource { task.pause(); } else if (taskOperation.equals(RESTConstants.TASK_STOP)) { task.stop(); - } else if(taskOperation.equals(RESTConstants.TASK_COMMIT)) { + } else if (taskOperation.equals(RESTConstants.TASK_COMMIT)) { task.commit(); } - // updateTask(taskId, taskOperation); - return (Response) acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" - + RESOURCE_TASKS + "/" + taskId); + return (Response) noContentResponse(); } 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 107d4fb2..3e89b8ca 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 @@ -950,7 +950,7 @@ public class VolumesResource extends AbstractResource { migrateDiskTask.setAutoCommit(autoCommit); migrateDiskTask.start(); taskResource.addTask(migrateDiskTask); - return migrateDiskTask.getId(); + return migrateDiskTask.getTaskInfo().getName(); // Return Task ID } private String rebalanceStart(String clusterName, String volumeName, Boolean isFixLayout, Boolean isMigrateData, @@ -1005,6 +1005,10 @@ public class VolumesResource extends AbstractResource { // System.out.println("Code : " + status.getCode()); // System.out.println("Message " + status.getMessage()); - vr.removeBricks("testCluster", "test", "192.168.1.210:sdb", true); + // vr.removeBricks("testCluster", "test", "192.168.1.210:sdb", true); + + String taskId = vr.migrateBrickStart("myGluster", "students", "devserver1:/export/sdc/students", + "devserver2:/export/sdb/students", true); + } } 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 9a31d468..9bdc9c94 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 @@ -22,7 +22,6 @@ 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.TaskInfo; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; @@ -30,6 +29,7 @@ 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; +import com.sun.jersey.core.util.Base64; public class MigrateDiskTask extends Task { @@ -68,6 +68,7 @@ public class MigrateDiskTask extends Task { + volumeName + "] from [" + fromBrick + "] to [" + toBrick + "]", true, true, true); setFromBrick(fromBrick); setToBrick(toBrick); + taskInfo.setName(getId()); } public MigrateDiskTask(ClusterService clusterService, String clusterName, TaskInfo info) { @@ -76,7 +77,7 @@ public class MigrateDiskTask extends Task { @Override public String getId() { - return taskInfo.getType() + "-" + taskInfo.getReference() + "-" + fromBrick + "-" + toBrick; + return new String( Base64.encode( taskInfo.getType() + "-" + taskInfo.getReference() + "-" + fromBrick + "-" + toBrick )); } @Override @@ -93,13 +94,9 @@ public class MigrateDiskTask extends Task { String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " start"; 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$")) { - getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput().trim()))); return; } } @@ -125,16 +122,16 @@ public class MigrateDiskTask extends Task { ProcessResult processResult = sshUtil.executeRemote(onlineServer, command); TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { - if (processResult.getOutput().matches("*pause")) { + if (processResult.getOutput().matches("*pause")) { //TODO replace correct pattern to identify the pause status taskStatus.setCode(Status.STATUS_CODE_PAUSE); - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); + taskStatus.setMessage(processResult.getOutput()); + getTaskInfo().setStatus(taskStatus); + return; } - } 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()); } @@ -145,7 +142,12 @@ public class MigrateDiskTask extends Task { @Override public void commit() { - // TODO Auto-generated method stub + try { + commitMigration(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one. + commitMigration(getNewOnlineServer().getName()); + } } @Override @@ -167,14 +169,14 @@ public class MigrateDiskTask extends Task { if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches(".*aborted successfully$")) { 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); + taskStatus.setMessage(processResult.getOutput()); + getTaskInfo().setStatus(taskStatus); + return; + } + } + + // if we reach here, it means rebalance start failed. + throw new GlusterRuntimeException(processResult.toString()); } @@ -187,6 +189,27 @@ public class MigrateDiskTask extends Task { return checkMigrationStatus(getNewOnlineServer().getName()); } } + + + public void commitMigration(String serverName) { + String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + + getToBrick() + " commit"; + + ProcessResult processResult = sshUtil.executeRemote(serverName, command); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + if (processResult.getOutput().trim().matches(".*commit successful$")) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + taskStatus.setMessage(processResult.getOutput()); // Common + getTaskInfo().setStatus(taskStatus); + return; + } + } + + // if we reach here, it means rebalance start failed. + throw new GlusterRuntimeException(processResult.toString()); + } + private TaskStatus checkMigrationStatus(String serverName) { String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " @@ -195,7 +218,10 @@ public class MigrateDiskTask extends Task { TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches("^Number of files migrated.*Migration complete$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + taskStatus.setCode(Status.STATUS_CODE_COMMIT_PENDING); + if (autoCommit) { + commitMigration(serverName); + } } else if ( processResult.getOutput().trim().matches("^Number of files migrated.*Current file=.*")) { taskStatus.setCode(Status.STATUS_CODE_RUNNING); } else { @@ -204,7 +230,9 @@ public class MigrateDiskTask extends Task { } else { taskStatus.setCode(Status.STATUS_CODE_FAILURE); } - taskStatus.setMessage(processResult.getOutput()); // Common + + taskStatus.setMessage(processResult.getOutput()); // common + taskInfo.setStatus(taskStatus); // Update the task status return taskStatus; } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java index cdc56400..49cd0b8b 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java @@ -20,11 +20,10 @@ */ 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.core.model.TaskStatus; import com.gluster.storage.management.server.services.ClusterService; public abstract class Task { @@ -39,10 +38,12 @@ public abstract class Task { taskInfo.setType(type); taskInfo.setReference(reference); taskInfo.setDescription(desc); + taskInfo.setCanPause(canPause); + taskInfo.setCanStop(canStop); + taskInfo.setCanCommit(canCommit); - // IMPORTANT. This call must be in the end since getId may need to use the values set in above statements - taskInfo.setName(getId()); init(clusterService, clusterName, taskInfo); + } public Task(ClusterService clusterService, String clusterName, TaskInfo taskInfo) { -- cgit