diff options
| author | Selvasundaram <selvam@gluster.com> | 2011-06-16 18:48:19 +0530 |
|---|---|---|
| committer | Selvasundaram <selvam@gluster.com> | 2011-06-17 14:26:19 +0530 |
| commit | 4ef2a99d79ca8c5ce94cc6c2e7cb70a0aea44e8f (patch) | |
| tree | d4fe872d367a3db52e7c170db3362fae5989a2f7 | |
| parent | 2fff45c027063d1fe9a5151c19744728c320a36d (diff) | |
| parent | 4c584cb025311cdb7b4b3fd1cbd0d0247e32fa4a (diff) | |
Merge branch 'tasks'
| -rw-r--r-- | src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java | 1 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Task.java | 57 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java (renamed from src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TaskResource.java) | 23 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java | 55 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java | 92 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java | 54 |
6 files changed, 198 insertions, 84 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..45eb07ba 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,40 +27,57 @@ 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.setType(type); + taskInfo.setId(getTypeStr() + "-" + reference); // construct id + taskInfo.setReference(reference); } - public Task(TaskInfo info) { - setInfo(info); + + public Task(TaskInfo taskInfo) { + setTaskInfo(taskInfo); } - public String getTaskType(TASK_TYPE type) { - return TASK_TYPE_STR[type.ordinal()]; + public String getTypeStr() { + return TASK_TYPE_STR[taskInfo.getType().ordinal()]; + } + + public TASK_TYPE getType() { + return getTaskInfo().getType(); + } + + public String getOnlineServer() { + return serverName; + } + + public void setOnlineServer(String serverName) { + this.serverName = serverName; + } + + public TaskInfo getTaskInfo() { + return taskInfo; + } + + public void setTaskInfo(TaskInfo info) { + this.taskInfo = info; } public abstract String getId(); + public abstract TaskInfo start(); + public abstract TaskInfo resume(); public abstract TaskInfo stop(); public abstract TaskInfo pause(); - - public abstract TASK_TYPE getType(); - public abstract TaskInfo getTaskInfo(); + public abstract TaskInfo status(); - public TaskInfo getInfo() { - return info; - } + public abstract void setTaskDescription(); - public void setInfo(TaskInfo info) { - this.info = 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/TasksResource.java index eeac6843..0fc69623 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/TasksResource.java @@ -50,30 +50,31 @@ import com.sun.jersey.spi.resource.Singleton; @Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_TASKS) @Singleton -public class TaskResource { +public class TasksResource { private Map<String, Task> tasksMap = new HashMap<String, Task>(); - public TaskResource() { + public TasksResource() { } - public void addTask(Task task) { - getTasksMap().put(task.getId(), task); + + public void addTask(Task task) { // task should be one of MuigrateDiskTask, FormatDiskTask, etc + tasksMap.put(task.getId(), task); } public void removeTask(Task task) { - getTasksMap().remove(task); + tasksMap.remove(task.getId()); } public List<Task> getAllTasks() { List<Task> allTasks = new ArrayList<Task>(); - for (Map.Entry<String, Task> entry : getTasksMap().entrySet()) { + 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 : getTasksMap().entrySet()) { + for (Map.Entry<String, Task> entry : tasksMap.entrySet()) { if (entry.getValue().getId().equals(taskId)) { return entry.getValue(); } @@ -143,12 +144,4 @@ public class TaskResource { return null; } - public void setTasksMap(Map<String, Task> tasksMap) { - this.tasksMap = tasksMap; - } - - public Map<String, Task> 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..0d33e5b0 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; @@ -615,26 +620,50 @@ public class VolumesResource { } } +// @PUT +// @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + RESOURCE_BRICKS) +// public Status replaceBrick(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, +// @PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_SOURCE) String diskFrom, +// @FormParam(FORM_PARAM_TARGET) String diskTo, @FormParam(FORM_PARAM_OPERATION) String operation) { +// GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); +// if (onlineServer == null) { +// return new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + clusterName + "]"); +// } +// +// try { +// +// 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); +// if (onlineServer == null) { +// return new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + clusterName +// + "]"); +// } +// return glusterUtil.migrateDisk(volumeName, diskFrom, diskTo, operation, onlineServer.getName()); +// } +// } + @PUT - @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + RESOURCE_BRICKS) - public Status replaceBrick(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_SOURCE) String diskFrom, - @FormParam(FORM_PARAM_TARGET) String diskTo, @FormParam(FORM_PARAM_OPERATION) String operation) { + @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 fromBrick, + @FormParam(FORM_PARAM_TARGET) String toBrick, @FormParam(FROM_PARAM_AUTO_COMMIT) Boolean autoCommit) { + + TaskResponse taskResponse = new TaskResponse(); GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); if (onlineServer == null) { - return new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + clusterName + "]"); + taskResponse.setData(null); + taskResponse.setStatus(new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + + clusterName + "]")); + return taskResponse; } try { - return glusterUtil.migrateDisk(volumeName, diskFrom, diskTo, operation, onlineServer.getName()); + return glusterUtil.migrateBrick(volumeName, fromBrick, toBrick, "start", autoCommit, onlineServer.getName()); } catch (ConnectionException e) { - // online server has gone offline! try with a different one. onlineServer = glusterServersResource.getNewOnlineServer(clusterName); - if (onlineServer == null) { - return new Status(Status.STATUS_CODE_FAILURE, "No online servers found in cluster [" + clusterName - + "]"); - } - return glusterUtil.migrateDisk(volumeName, diskFrom, diskTo, operation, onlineServer.getName()); + return glusterUtil.migrateBrick(volumeName, fromBrick, toBrick, "start", autoCommit, onlineServer.getName()); } } 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..df637ab1 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,107 @@ */ 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; + + private SshUtil sshUtil = new 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(); + getTaskInfo().setCanPause(true); + getTaskInfo().setCanStop(true); + } + public MigrateDiskTask(TaskInfo info) { super(info); + setTaskDescription(); } - + @Override public String getId() { - return getInfo().getId(); + return getTaskInfo().getId(); } - + + @Override + public TaskInfo start() { + getTaskInfo().setStatus( + new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume replace-brick " + + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " start" ) ))); + return getTaskInfo(); + } + @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; + getTaskInfo().setStatus( + new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume replace-brick " + + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " abort" ) ))); + return getTaskInfo(); } - @Override public TaskInfo pause() { - // To make a decision is the task has the ability to pause the task - return null; + getTaskInfo().setStatus( + new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume replace-brick " + + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " pause" ) ))); + return getTaskInfo(); + } @Override - public TASK_TYPE getType() { - - return null; + public void setTaskDescription() { + TaskInfo taskInfo = getTaskInfo(); + getTaskInfo().setDescription( + getTypeStr() + " on volume [" + taskInfo.getReference() + "] from [" + getFromBrick() + + "] to [" + getToBrick() + "]"); } + @Override - public TaskInfo getTaskInfo() { - return getInfo(); + public TaskInfo status() { + return 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 cd6db294..6b4bdb35 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 @@ -35,12 +35,18 @@ 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.TaskInfo; import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.core.model.Task.TASK_TYPE; import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; import com.gluster.storage.management.core.model.VolumeOptions; +import com.gluster.storage.management.core.response.TaskResponse; import com.gluster.storage.management.core.utils.ProcessResult; +import com.gluster.storage.management.server.resources.TasksResource; +import com.gluster.storage.management.server.tasks.MigrateDiskTask; +import com.sun.jersey.api.core.InjectParam; @Component public class GlusterUtil { @@ -65,6 +71,9 @@ public class GlusterUtil { @Autowired private SshUtil sshUtil; + + @InjectParam + private TasksResource taskResource; public void setSshUtil(SshUtil sshUtil) { this.sshUtil = sshUtil; @@ -93,14 +102,13 @@ public class GlusterUtil { public GlusterServer getGlusterServer(GlusterServer onlineServer, String serverName) { List<GlusterServer> servers = getGlusterServers(onlineServer); - for(GlusterServer server : servers) { - if(server.getName().equals(serverName)) { + for (GlusterServer server : servers) { + if (server.getName().equals(serverName)) { return server; } } return null; } - public List<GlusterServer> getGlusterServers(GlusterServer knownServer) { String output = getPeerStatus(knownServer.getName()); @@ -110,7 +118,7 @@ public class GlusterUtil { List<GlusterServer> glusterServers = new ArrayList<GlusterServer>(); // TODO: Append the known server. But where? Order matters in replication/striping - glusterServers.add(knownServer); + glusterServers.add(knownServer); GlusterServer server = null; boolean foundHost = false; boolean foundUuid = false; @@ -223,18 +231,18 @@ public class GlusterUtil { if (!status.isSuccess()) { // Return partial success if set volume option failed. status.setCode(Status.STATUS_CODE_PART_SUCCESS); status.setMessage("Error while setting volume options: " + status); - } - return status; + } + return status; } private String prepareVolumeCreateCommand(Volume volume, List<String> brickDirectories, int count, String volumeType, String transportTypeStr) { StringBuilder command = new StringBuilder("gluster volume create " + volume.getName() + " "); - if(volumeType != null) { + if (volumeType != null) { command.append(volumeType + " " + count + " "); } command.append("transport " + transportTypeStr); - for(String brickDir : brickDirectories) { + for (String brickDir : brickDirectories) { command.append(" " + brickDir); } return command.toString(); @@ -276,7 +284,8 @@ public class GlusterUtil { private String getVolumeInfo(String knownServer) { ProcessResult result = sshUtil.executeRemote(knownServer, "gluster volume info "); if (!result.isSuccess()) { - throw new GlusterRuntimeException("Command [gluster volume info] failed on [" + knownServer + "] with error: " + result); + throw new GlusterRuntimeException("Command [gluster volume info] failed on [" + knownServer + + "] with error: " + result); } return result.getOutput(); } @@ -345,9 +354,9 @@ public class GlusterUtil { private void addBrickToVolume(Volume volume, String serverName, String brickDir) { // TODO: Brick status should be same as the server status (online/offline) -System.out.println(brickDir); + System.out.println(brickDir); volume.addBrick(new Brick(serverName, BRICK_STATUS.ONLINE, brickDir.split("/")[2].trim(), brickDir)); - + // volume.getBricks().get(0).getName(); // // try { @@ -454,13 +463,13 @@ System.out.println(brickDir); if (volume != null) {// Adding the last volume parsed volumes.add(volume); } - + return volumes; } public Status addBricks(String volumeName, List<String> bricks, String knownServer) { StringBuilder command = new StringBuilder("gluster volume add-brick " + volumeName); - for(String brickDir : bricks) { + for (String brickDir : bricks) { command.append(" " + brickDir); } return new Status(sshUtil.executeRemote(knownServer, command.toString())); @@ -491,14 +500,25 @@ System.out.println(brickDir); return logFileName; } - public Status migrateDisk(String volumeName, String fromBrick, String toBrick, String operation, String knownServer) { - return new Status(sshUtil.executeRemote(knownServer, "gluster volume replace-brick " + volumeName + " " - + fromBrick + " " + toBrick + " " + operation)); + + public TaskResponse migrateBrick(String volumeName, String fromBrick, String toBrick, String operation, + Boolean autoCommit, String knownServer) { + TaskResponse taskResponse = new TaskResponse(); + MigrateDiskTask migrateDiskTask = new MigrateDiskTask(TASK_TYPE.BRICK_MIGRATE, volumeName, fromBrick, toBrick); + migrateDiskTask.setOnlineServer(knownServer); + migrateDiskTask.setAutoCommit(autoCommit); + TaskInfo taskInfo = migrateDiskTask.start(); + if (taskInfo.isSuccess()) { + taskResource.addTask(migrateDiskTask); + } + taskResponse.setData(taskInfo); + taskResponse.setStatus(new Status(Status.STATUS_CODE_SUCCESS, "")); + return taskResponse; } 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) { + for (String brickDir : bricks) { command.append(" " + brickDir); } return new Status(sshUtil.executeRemote(knownServer, command.toString())); |
