summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.server
diff options
context:
space:
mode:
authorSelvasundaram <selvam@gluster.com>2011-06-16 18:48:19 +0530
committerSelvasundaram <selvam@gluster.com>2011-06-17 14:26:19 +0530
commit4ef2a99d79ca8c5ce94cc6c2e7cb70a0aea44e8f (patch)
treed4fe872d367a3db52e7c170db3362fae5989a2f7 /src/com.gluster.storage.management.server
parent2fff45c027063d1fe9a5151c19744728c320a36d (diff)
parent4c584cb025311cdb7b4b3fd1cbd0d0247e32fa4a (diff)
Merge branch 'tasks'
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/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.java55
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java92
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java54
4 files changed, 160 insertions, 64 deletions
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()));