From 4c584cb025311cdb7b4b3fd1cbd0d0247e32fa4a Mon Sep 17 00:00:00 2001 From: Selvasundaram Date: Thu, 16 Jun 2011 18:47:23 +0530 Subject: Tasks and MigrateDiskTask resources --- .../management/core/constants/RESTConstants.java | 1 + .../storage/management/core/model/Task.java | 43 +++++++--- .../management/server/resources/TaskResource.java | 20 ++--- .../server/resources/VolumesResource.java | 42 +++++++++- .../management/server/tasks/MigrateDiskTask.java | 97 ++++++++++++++++++---- 5 files changed, 162 insertions(+), 41 deletions(-) diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java index 745e460b..40f13fbe 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java @@ -54,6 +54,7 @@ public class RESTConstants { public static final String FORM_PARAM_SOURCE = "source"; public static final String FORM_PARAM_TARGET = "target"; public static final String FORM_PARAM_BRICKS = "bricks"; + public static final String FROM_PARAM_AUTO_COMMIT = "autoCommit"; public static final String PATH_PARAM_VOLUME_NAME = "volumeName"; public static final String PATH_PARAM_CLUSTER_NAME = "clusterName"; diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Task.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Task.java index 9268d060..5143c2dd 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Task.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Task.java @@ -27,17 +27,20 @@ public abstract class Task { public String[] TASK_TYPE_STR = { "Format Disk", "Migrate Brick", "Volume Rebalance" }; - private TaskInfo info; + private TaskInfo taskInfo; - public Task(TASK_TYPE type, String reference, String description) { - info = new TaskInfo(); - info.setId(getTaskType(type) + "-" + reference); // construct id - info.setType(type); - info.setReference(reference); - info.setDescription(description); + protected String serverName; + + public Task(TASK_TYPE type, String reference) { + taskInfo = new TaskInfo(); + taskInfo.setId(getTaskType(type) + "-" + reference); // construct id + taskInfo.setType(type); + taskInfo.setReference(reference); + // info.setDescription("Migrating brick on volume [" + volu); } - public Task(TaskInfo info) { - setInfo(info); + + public Task(TaskInfo taskInfo) { + setTaskInfo(taskInfo); } public String getTaskType(TASK_TYPE type) { @@ -46,21 +49,35 @@ public abstract class Task { public abstract String getId(); + public abstract TaskInfo start(); + public abstract TaskInfo resume(); public abstract TaskInfo stop(); public abstract TaskInfo pause(); + + public abstract TaskInfo status(); public abstract TASK_TYPE getType(); public abstract TaskInfo getTaskInfo(); - public TaskInfo getInfo() { - return info; + public abstract void setTaskDescription(); + + public String getOnlineServer() { + return serverName; + } + + public void setOnlineServer(String serverName) { + this.serverName = serverName; + } + + protected TaskInfo getInfo() { + return taskInfo; } - public void setInfo(TaskInfo info) { - this.info = info; // TODO: review assigning reference and copy object + public void setTaskInfo(TaskInfo info) { + this.taskInfo = info; // TODO: review assigning reference and copy object } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TaskResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TaskResource.java index eeac6843..462733de 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TaskResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TaskResource.java @@ -56,12 +56,20 @@ public class TaskResource { public TaskResource() { } - public void addTask(Task task) { + public void setTasksMap(Map tasksMap) { + this.tasksMap = tasksMap; + } + + public Map getTasksMap() { + return tasksMap; + } + + public void addTask(Task task) { // task should be one of MuigrateDiskTask, FormatDiskTask, etc getTasksMap().put(task.getId(), task); } public void removeTask(Task task) { - getTasksMap().remove(task); + getTasksMap().remove(task.getId()); } public List getAllTasks() { @@ -143,12 +151,4 @@ public class TaskResource { return null; } - public void setTasksMap(Map tasksMap) { - this.tasksMap = tasksMap; - } - - public Map getTasksMap() { - return tasksMap; - } - } 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 aa23fe3c..f7d166f5 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 @@ -26,6 +26,7 @@ import static com.gluster.storage.management.core.constants.RESTConstants.FORM_P import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_TARGET; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_START; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_STOP; +import static com.gluster.storage.management.core.constants.RESTConstants.FROM_PARAM_AUTO_COMMIT; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_VOLUME_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_BRICKS; @@ -37,8 +38,8 @@ import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_ import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_LOG_SEVERITY; import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_TO_TIMESTAMP; import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_VOLUME_NAME; -import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_DEFAULT_OPTIONS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_BRICKS; +import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_DEFAULT_OPTIONS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_DOWNLOAD; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_LOGS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_OPTIONS; @@ -76,10 +77,13 @@ 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.Task.TASK_TYPE; +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.response.GenericResponse; import com.gluster.storage.management.core.response.LogMessageListResponse; +import com.gluster.storage.management.core.response.TaskResponse; import com.gluster.storage.management.core.response.VolumeListResponse; import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse; import com.gluster.storage.management.core.utils.DateUtil; @@ -89,6 +93,7 @@ import com.gluster.storage.management.core.utils.ProcessUtil; import com.gluster.storage.management.server.constants.VolumeOptionsDefaults; import com.gluster.storage.management.server.data.ClusterInfo; import com.gluster.storage.management.server.services.ClusterService; +import com.gluster.storage.management.server.tasks.MigrateDiskTask; import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.ServerUtil; import com.sun.jersey.api.core.InjectParam; @@ -626,7 +631,8 @@ public class VolumesResource { } try { - return glusterUtil.migrateDisk(volumeName, diskFrom, diskTo, operation, onlineServer.getName()); + + return glusterUtil.migrateDisk(volumeName, diskFrom, diskTo, "start", onlineServer.getName()); } catch (ConnectionException e) { // online server has gone offline! try with a different one. onlineServer = glusterServersResource.getNewOnlineServer(clusterName); @@ -637,6 +643,38 @@ public class VolumesResource { return glusterUtil.migrateDisk(volumeName, diskFrom, diskTo, operation, onlineServer.getName()); } } + + @PUT + @Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + RESOURCE_BRICKS) + public TaskResponse migrateBrick(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, + @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_SOURCE) String diskFrom, + @FormParam(FORM_PARAM_TARGET) String diskTo, @FormParam(FROM_PARAM_AUTO_COMMIT) Boolean autoCommit) { + + TaskResponse taskResponse = new TaskResponse(); + GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + if (onlineServer == null) { + taskResponse.setData(null); + taskResponse.setStatus(new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + + clusterName + "]")); + return taskResponse; + } + + try { + MigrateDiskTask migrateDiskTask = new MigrateDiskTask(TASK_TYPE.BRICK_MIGRATE, volumeName, diskFrom, diskTo); + migrateDiskTask.setAutoCommit(autoCommit); + TaskInfo taskInfo = migrateDiskTask.start(); + if (taskInfo.isSuccess()) { + TaskResource taskResource = new TaskResource(); + taskResource.addTask(migrateDiskTask); + } + taskResponse.setData(taskInfo); + taskResponse.setStatus(new Status(Status.STATUS_CODE_SUCCESS, "")); + return taskResponse; + } catch (ConnectionException e) { + //TODO online server has gone offline! try with a different one. + } + return null; + } public static void main(String[] args) throws ClassNotFoundException { VolumesResource vr = new VolumesResource(); 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 5d48d53f..68a4e1b4 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,53 +20,118 @@ */ 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.TaskStatus; +import com.gluster.storage.management.server.utils.SshUtil; public class MigrateDiskTask extends Task { - public MigrateDiskTask(TASK_TYPE type, String reference, String description ) { - super(type, reference, description ); + private String fromBrick; + private String toBrick; + private Boolean autoCommit; + + @Autowired + private SshUtil sshUtil; + + public String getFromBrick() { + return fromBrick; } - + + public void setFromBrick(String fromBrick) { + this.fromBrick = fromBrick; + } + + public String getToBrick() { + return toBrick; + } + + public void setToBrick(String toBrick) { + this.toBrick = toBrick; + } + + public Boolean getAutoCommit() { + return autoCommit; + } + + public void setAutoCommit(Boolean autoCommit) { + this.autoCommit = autoCommit; + } + + public MigrateDiskTask(TASK_TYPE type, String volumeName, String fromBrick, String toBrick) { + super(type, volumeName); + setFromBrick(fromBrick); + setToBrick(toBrick); + setTaskDescription(); + getInfo().setCanPause(true); + getInfo().setCanStop(true); + } + public MigrateDiskTask(TaskInfo info) { super(info); + setTaskDescription(); } - + @Override public String getId() { return getInfo().getId(); } - + + @Override + public TaskInfo start() { + getInfo().setStatus( + new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume replace-brick " + + getInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " start" ) ))); + return getInfo(); + } + @Override public TaskInfo resume() { - // To make a decision is the task has the ability to start the task - return null; + return start(); } - @Override public TaskInfo stop() { - // To make a decision is the task has the ability to stop the task - return null; + getInfo().setStatus( + new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume replace-brick " + + getInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " abort" ) ))); + return getInfo(); } - @Override public TaskInfo pause() { - // To make a decision is the task has the ability to pause the task - return null; + getInfo().setStatus( + new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume replace-brick " + + getInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " pause" ) ))); + return getInfo(); + } - @Override public TASK_TYPE getType() { - - return null; + return getTaskInfo().getType(); } @Override public TaskInfo getTaskInfo() { return getInfo(); } + + @Override + public void setTaskDescription() { + TaskInfo taskInfo = getTaskInfo(); + getTaskInfo().setDescription( + getTaskType(getType()) + " on volume [" + taskInfo.getReference() + "] from [" + getFromBrick() + + "] to [" + getToBrick() + "]"); + } + + + @Override + public TaskInfo status() { + // TODO Auto-generated method stub + return null; + } } -- cgit