summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSelvasundaram <selvam@gluster.com>2011-06-28 21:10:24 +0530
committerSelvasundaram <selvam@gluster.com>2011-06-28 21:10:24 +0530
commitc02444b7b53936c88013c0767080a1c3246bc16d (patch)
tree5b9c4e663c3ccc7c38229cc1e0fc18b0bcb36e9e /src
parent5c9b6a12aab8e4ea95d404c4312a89ca2b07ddc6 (diff)
parentd827bdefc79906894a1a9cafdbc7ce77c46b6468 (diff)
Merge branch 'master' of github.com:gluster/console
Diffstat (limited to 'src')
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java13
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java3
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java24
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java6
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java3
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java37
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java23
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java30
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DiscoveredServerView.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServerLogsPage.java23
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeLogsPage.java22
-rwxr-xr-xsrc/com.gluster.storage.management.server.scripts/src/get_volume_brick_log.py14
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java1
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java186
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ClusterService.java4
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java127
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java45
17 files changed, 461 insertions, 102 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java
index 9e0e0339..14539b87 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java
@@ -141,13 +141,14 @@ public abstract class AbstractClient {
}
InputStream inputStream = response.getEntityInputStream();
- byte[] data = new byte[inputStream.available()];
- inputStream.read(data);
+ FileOutputStream outputStream = new FileOutputStream(filePath);
+
+ int c;
+ while((c = inputStream.read()) != -1) {
+ outputStream.write(c);
+ }
inputStream.close();
-
- FileOutputStream os = new FileOutputStream(filePath);
- os.write(data);
- os.close();
+ outputStream.close();
} catch (IOException e) {
throw new GlusterRuntimeException("Error while downloading resource [" + res.getURI().getPath() + "]", e);
}
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 88d5fdd0..87fbed31 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
@@ -21,6 +21,7 @@ package com.gluster.storage.management.client;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
+import java.util.Set;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.Brick;
@@ -339,7 +340,7 @@ public class GlusterDataModelManager {
}
}
- public void removeBricks(Volume volume, List<Brick> bricks) {
+ public void removeBricks(Volume volume, Set<Brick> bricks) {
for (ClusterListener listener : listeners) {
listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_REMOVED, bricks));
}
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
index 07aea5a1..6be67e65 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
@@ -32,6 +32,7 @@ import static com.gluster.storage.management.core.constants.RESTConstants.FORM_P
import java.net.URI;
import java.util.Date;
import java.util.List;
+import java.util.Set;
import javax.ws.rs.core.MultivaluedMap;
@@ -176,7 +177,7 @@ public class VolumesClient extends AbstractClient {
downloadSubResource(volumeName + "/" + RESTConstants.RESOURCE_LOGS + "/" + RESTConstants.RESOURCE_DOWNLOAD, filePath);
}
- public void removeBricks(String volumeName, List<Brick> BrickList, boolean deleteOption) {
+ public void removeBricks(String volumeName, Set<Brick> BrickList, boolean deleteOption) {
String bricks = StringUtil.collectionToString(GlusterCoreUtil.getQualifiedBrickList(BrickList), ",");
MultivaluedMap<String, String> queryParams = prepareRemoveBrickQueryParams(volumeName, bricks, deleteOption);
deleteSubResource(volumeName + "/" + RESTConstants.RESOURCE_BRICKS, queryParams);
@@ -232,6 +233,27 @@ public class VolumesClient extends AbstractClient {
URI uri = putRequestURI(volumeName + "/" + RESTConstants.RESOURCE_BRICKS, form);
System.out.println(uri.getRawPath());
}
+
+ public void rebalanceStart(String volumeName, Boolean fixLayout, Boolean migrateData, Boolean forcedDataMigrate) {
+ Form form = new Form();
+ form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_REBALANCE_START);
+ form.add(RESTConstants.FORM_PARAM_FIX_LAYOUT, fixLayout);
+ form.add(RESTConstants.FORM_PARAM_MIGRATE_DATA, migrateData);
+ form.add(RESTConstants.FORM_PARAM_FORCED_DATA_MIGRATE, forcedDataMigrate);
+ putRequest(volumeName, form);
+ }
+
+ public void rebalanceStatus(String volumeName) {
+ Form form = new Form();
+ form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_REBALANCE_STATUS);
+ putRequest(volumeName, form);
+ }
+
+ public void rebalanceStop(String volumeName) {
+ Form form = new Form();
+ form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_REBALANCE_STOP);
+ putRequest(volumeName, form);
+ }
public static void main(String[] args) {
UsersClient usersClient = new UsersClient();
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 c37869dc..527ae2a1 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
@@ -48,6 +48,9 @@ public class RESTConstants {
public static final String TASK_COMMIT = "commit";
public static final String TASK_STATUS = "status";
public static final String TASK_DELETE = "delete";
+ public static final String TASK_REBALANCE_START = "rebalanceStart";
+ public static final String TASK_REBALANCE_STATUS = "rebalanceStatus";
+ public static final String TASK_REBALANCE_STOP = "rebalanceStop";
public static final String FORM_PARAM_VOLUME_NAME = "name";
public static final String FORM_PARAM_VOLUME_TYPE = "volumeType";
@@ -68,6 +71,9 @@ 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_AUTO_COMMIT = "autoCommit";
+ public static final String FORM_PARAM_FIX_LAYOUT = "fix-layout";
+ public static final String FORM_PARAM_MIGRATE_DATA = "migrate-data";
+ public static final String FORM_PARAM_FORCED_DATA_MIGRATE = "forced-data-migrate";
public static final String PATH_PARAM_FORMAT = "format";
public static final String PATH_PARAM_VOLUME_NAME = "volumeName";
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java
index c238cad7..4194a642 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java
@@ -22,6 +22,7 @@ package com.gluster.storage.management.core.utils;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import com.gluster.storage.management.core.model.Brick;
import com.gluster.storage.management.core.model.Disk;
@@ -37,7 +38,7 @@ public class GlusterCoreUtil {
return qualifiedDiskNames;
}
- public static final List<String> getQualifiedBrickList(List<Brick> bricks) {
+ public static final List<String> getQualifiedBrickList(Set<Brick> bricks) {
List<String> qualifiedBricks = new ArrayList<String>();
for (Brick brick : bricks) {
qualifiedBricks.add(brick.getQualifiedName());
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java
index 5339beb0..33ca0e5b 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java
@@ -19,11 +19,44 @@
package com.gluster.storage.management.gui.actions;
import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Display;
+
+import com.gluster.storage.management.client.VolumesClient;
+import com.gluster.storage.management.core.model.Volume;
public class RebalanceVolumeAction extends AbstractActionDelegate {
+ private Volume volume;
+
+ @Override
+ protected void performAction(final IAction action) {
+
+ Display.getDefault().asyncExec(new Runnable() {
+
+ @Override
+ public void run() {
+ final String actionDesc = action.getDescription();
+ try {
+ new VolumesClient().rebalanceStart(volume.getName(), false, false, false);
+ showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] rebalance started successfully!");
+ } catch (Exception e) {
+ showErrorDialog(actionDesc,
+ "Volume rebalance could not be started on [" + volume.getName() + "]! Error: [" + e.getMessage() + "]");
+ }
+
+ }
+ });
+ }
+
@Override
- protected void performAction(IAction action) {
- System.out.println("Running [" + this.getClass().getSimpleName() + "]");
+ public void selectionChanged(IAction action, ISelection selection) {
+ super.selectionChanged(action, selection);
+
+ action.setEnabled(false);
+ if (selectedEntity instanceof Volume) {
+ volume = (Volume) selectedEntity;
+ action.setEnabled(true);
+ }
}
@Override
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java
index 9df40457..b79a4ee4 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java
@@ -3,6 +3,7 @@ package com.gluster.storage.management.gui.actions;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
@@ -15,6 +16,7 @@ import org.eclipse.ui.IWorkbenchPart;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.client.VolumesClient;
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.Volume;
import com.gluster.storage.management.core.utils.StringUtil;
@@ -25,7 +27,7 @@ import com.gluster.storage.management.gui.views.VolumeBricksView;
public class RemoveDiskAction extends AbstractActionDelegate {
private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
private GUIHelper guiHelper = GUIHelper.getInstance();
- private List<Brick> bricks;
+ private Set<Brick> bricks;
private Volume volume;
boolean confirmDelete = false;
@@ -90,28 +92,13 @@ public class RemoveDiskAction extends AbstractActionDelegate {
IWorkbenchPart view = guiHelper.getActiveView();
if (view instanceof VolumeBricksView) {
// volume disks view is open. check if any brick is selected
- bricks = getSelectedBricks(selection);
+ bricks = GUIHelper.getInstance().getSelectedEntities(getWindow(), Brick.class);
action.setEnabled(bricks.size() > 0);
}
}
}
- private List<Brick> getSelectedBricks(ISelection selection) {
- List<Brick> selectedBricks = new ArrayList<Brick>();
-
- if (selection instanceof IStructuredSelection) {
- Iterator<Object> iter = ((IStructuredSelection) selection).iterator();
- while (iter.hasNext()) {
- Object selectedObj = iter.next();
- if (selectedObj instanceof Brick) {
- selectedBricks.add((Brick) selectedObj);
- }
- }
- }
- return selectedBricks;
- }
-
- private List<String> getBrickList(List<Brick> bricks) {
+ private List<String> getBrickList(Set<Brick> bricks) {
List<String> brickList = new ArrayList<String>();
for (Brick brick : bricks) {
brickList.add(brick.getServerName() + ":" + brick.getBrickDirectory());
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java
index c23a96c5..487a03c4 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java
@@ -254,31 +254,21 @@ public class LoginDialog extends Dialog {
super.okPressed();
} catch (Exception e) {
setReturnCode(RETURN_CODE_ERROR);
- MessageDialog.openError(getShell(), "Initialization Error", e.getMessage());
- close();
+ MessageDialog.openError(getShell(), "Gluster Management Console", e.getMessage());
}
}
public void createOrRegisterCluster(ClustersClient clustersClient, String clusterName, String serverName,
CLUSTER_MODE mode) {
- String errTitle = null;
-
- try {
- switch (mode) {
- case SELECT:
- return;
- case CREATE:
- errTitle = "Cluster Creation Failed!";
- clustersClient.createCluster(clusterName);
- break;
- case REGISTER:
- errTitle = "Cluster Registration Failed!";
- clustersClient.registerCluster(clusterName, serverName);
- break;
- }
- } catch (Exception e) {
- MessageDialog.openError(getShell(), errTitle, e.getMessage());
- setReturnCode(RETURN_CODE_ERROR);
+ switch (mode) {
+ case SELECT:
+ return;
+ case CREATE:
+ clustersClient.createCluster(clusterName);
+ break;
+ case REGISTER:
+ clustersClient.registerCluster(clusterName, serverName);
+ break;
}
}
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DiscoveredServerView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DiscoveredServerView.java
index fdb4c53c..8516d1db 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DiscoveredServerView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DiscoveredServerView.java
@@ -62,7 +62,7 @@ public class DiscoveredServerView extends ViewPart {
toolkit.createLabel(section, "" + server.getNumOfCPUs(), SWT.NONE);
toolkit.createLabel(section, "Total Memory (GB): ", SWT.NONE);
- toolkit.createLabel(section, "" + (server.getTotalMemory() / 1024), SWT.NONE);
+ toolkit.createLabel(section, "" + NumberUtil.formatNumber((server.getTotalMemory() / 1024)), SWT.NONE);
toolkit.createLabel(section, "Total Disk Space (GB): ", SWT.NONE);
toolkit.createLabel(section, "" + NumberUtil.formatNumber((server.getTotalDiskSpace() / 1024)), SWT.NONE);
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServerLogsPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServerLogsPage.java
index 7cde38bb..0ff22e31 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServerLogsPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServerLogsPage.java
@@ -26,6 +26,8 @@ import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
@@ -84,6 +86,27 @@ public class ServerLogsPage extends Composite {
text = toolkit.createText(composite, "100", SWT.NONE);
text.setBounds(85, 15, 60, 20);
+ text.setTextLimit(4);
+ text.addVerifyListener(new VerifyListener() {
+
+ @Override
+ public void verifyText(VerifyEvent event) {
+ // Assume we allow it
+ event.doit = true;
+
+ String text = event.text;
+ char[] chars = text.toCharArray();
+
+ // Don't allow if text contains non-digit characters
+ for (int i = 0; i < chars.length; i++) {
+ if (!Character.isDigit(chars[i])) {
+ event.doit = false;
+ break;
+ }
+ }
+
+ }
+ });
Label lblMessagesAndFilter = toolkit.createLabel(composite, " messages from ", SWT.CENTER);
lblMessagesAndFilter.setBounds(160, 15, 110, 20);
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeLogsPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeLogsPage.java
index 6ba9c0d1..82836621 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeLogsPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeLogsPage.java
@@ -32,6 +32,8 @@ import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
@@ -334,6 +336,26 @@ public class VolumeLogsPage extends Composite {
private void createLineCountText(Composite composite) {
lineCountText = toolkit.createText(composite, "100", SWT.NONE);
lineCountText.setBounds(85, 15, 60, 20);
+ lineCountText.setTextLimit(4);
+ lineCountText.addVerifyListener(new VerifyListener() {
+
+ @Override
+ public void verifyText(VerifyEvent event) {
+ // Assume we allow it
+ event.doit = true;
+
+ String text = event.text;
+ char[] chars = text.toCharArray();
+
+ // Don't allow if text contains non-digit characters
+ for (int i = 0; i < chars.length; i++) {
+ if (!Character.isDigit(chars[i])) {
+ event.doit = false;
+ break;
+ }
+ }
+ }
+ });
}
private void createLineCountLabel(Composite composite) {
diff --git a/src/com.gluster.storage.management.server.scripts/src/get_volume_brick_log.py b/src/com.gluster.storage.management.server.scripts/src/get_volume_brick_log.py
index 64a40df3..fd7361da 100755
--- a/src/com.gluster.storage.management.server.scripts/src/get_volume_brick_log.py
+++ b/src/com.gluster.storage.management.server.scripts/src/get_volume_brick_log.py
@@ -44,10 +44,12 @@ def enumLogType(logCode):
return "UNKNOWN"
##--end of enumLogType()
-def addLog(responseDom, loginfo):
- responseDom.appendTagRoute("logMessages.logMessage.timestamp", loginfo[0] + " " + loginfo[1])
- responseDom.appendTagRoute("logMessages.logMessage.severity", enumLogType(loginfo[2]))
- responseDom.appendTagRoute("logMessages.logMessage.message", loginfo[3])
+def addLog(responseDom, logMessagesTag, loginfo):
+ logMessageTag = responseDom.createTag("logMessage")
+ logMessageTag.appendChild(responseDom.createTag("timestamp", loginfo[0] + " " + loginfo[1]))
+ logMessageTag.appendChild(responseDom.createTag("severity", enumLogType(loginfo[2])))
+ logMessageTag.appendChild(responseDom.createTag("message", loginfo[3]))
+ logMessagesTag.appendChild(logMessageTag);
return True
##--end of addLog()
@@ -79,9 +81,11 @@ def getVolumeLog(logFilePath, tailCount):
i = len(lines) - int(tailCount)
if i < 0:
i = 0
+ logMessagesTag = rs.createTag("logMessages")
+ rs.addTag(logMessagesTag)
for log in lines[i:]:
loginfo = logSplit(log)
- addLog(rs, loginfo)
+ addLog(rs, logMessagesTag, loginfo)
return rs.toxml()
##--end of getVolumeLog()
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java
index 2ce23a4e..4c834973 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java
@@ -106,7 +106,6 @@ public class ClustersResource extends AbstractResource {
return badRequestResponse("Server [" + knownServer + "] is already present in cluster ["
+ mappedCluster.getName() + "]!");
}
-
try {
clusterService.registerCluster(clusterName, knownServer);
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 7b506e67..0bb61245 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
@@ -54,6 +54,9 @@ import static com.gluster.storage.management.core.constants.RESTConstants.RESOUR
import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_VOLUMES;
import static com.gluster.storage.management.core.constants.RESTConstants.TASK_START;
import static com.gluster.storage.management.core.constants.RESTConstants.TASK_STOP;
+import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FIX_LAYOUT;
+import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_MIGRATE_DATA;
+import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FORCED_DATA_MIGRATE;
import java.io.File;
import java.io.IOException;
@@ -139,11 +142,11 @@ public class VolumesResource extends AbstractResource {
public Response getVolumes(String clusterName, String mediaType) {
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
return okResponse(getVolumes(clusterName), mediaType);
@@ -176,24 +179,24 @@ public class VolumesResource extends AbstractResource {
@FormParam(FORM_PARAM_BRICKS) String bricks, @FormParam(FORM_PARAM_ACCESS_PROTOCOLS) String accessProtocols,
@FormParam(FORM_PARAM_VOLUME_OPTIONS) String options) {
if(clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
String missingParam = checkMissingParamsForCreateVolume(volumeName, volumeType, transportType, replicaCount, stripeCount, bricks, accessProtocols, options);
if(missingParam != null) {
- return badRequestResponse("Parameter [" + missingParam + "] is missing in request!");
+ return notFoundResponse("Parameter [" + missingParam + "] is missing in request!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
if (volumeType.equals(VOLUME_TYPE.DISTRIBUTED_MIRROR) && replicaCount <= 0) {
- return badRequestResponse("Replica count must be a positive integer");
+ return notFoundResponse("Replica count must be a positive integer");
}
if (volumeType.equals(VOLUME_TYPE.DISTRIBUTED_STRIPE) && stripeCount <= 0) {
- return badRequestResponse("Stripe count must be a positive integer");
+ return notFoundResponse("Stripe count must be a positive integer");
}
GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName);
@@ -267,11 +270,11 @@ public class VolumesResource extends AbstractResource {
Volume volume = null;
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
try {
@@ -306,23 +309,34 @@ public class VolumesResource extends AbstractResource {
@PUT
@Path("{" + PATH_PARAM_VOLUME_NAME + "}")
public Response performOperation(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
- @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_OPERATION) String operation) {
+ @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_OPERATION) String operation,
+ @FormParam(FORM_PARAM_FIX_LAYOUT) Boolean isFixLayout,
+ @FormParam(FORM_PARAM_MIGRATE_DATA) Boolean isMigrateData,
+ @FormParam(FORM_PARAM_FORCED_DATA_MIGRATE) Boolean isForcedDataMigrate) {
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if (volumeName == null || volumeName.isEmpty()) {
- return badRequestResponse("Volume name must not be empty!");
+ return notFoundResponse("Volume name must not be empty!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName);
if (onlineServer == null) {
return errorResponse("No online servers found in cluster [" + clusterName + "]");
}
+
+ if (operation.equals(RESTConstants.TASK_REBALANCE_START)) {
+ return rebalanceStart(clusterName, volumeName, isFixLayout, isMigrateData, isForcedDataMigrate);
+ } else if (operation.equals(RESTConstants.TASK_REBALANCE_STATUS)) {
+ return rebalanceStatus(clusterName, volumeName);
+ } else if (operation.equals(RESTConstants.TASK_REBALANCE_STOP)) {
+ return rebalanceStop(clusterName, volumeName);
+ }
try {
performOperation(volumeName, operation, onlineServer);
@@ -359,15 +373,15 @@ public class VolumesResource extends AbstractResource {
@PathParam(PATH_PARAM_VOLUME_NAME) String volumeName,
@QueryParam(QUERY_PARAM_DELETE_OPTION) Boolean deleteFlag) {
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty");
+ return notFoundResponse("Cluster name must not be empty");
}
if (volumeName == null || volumeName.isEmpty()) {
- return badRequestResponse("Volume name must not be empty");
+ return notFoundResponse("Volume name must not be empty");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
if (deleteFlag == null) {
@@ -408,19 +422,19 @@ public class VolumesResource extends AbstractResource {
List<String> brickList = Arrays.asList(bricks.split(",")); // Convert from comma separated string (query
// parameter)
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if (volumeName == null || volumeName.isEmpty()) {
- return badRequestResponse("Volume name must not be empty!");
+ return notFoundResponse("Volume name must not be empty!");
}
if (bricks == null || bricks.isEmpty()) {
- return badRequestResponse("Parameter [" + QUERY_PARAM_BRICKS + "] is missing in request!");
+ return notFoundResponse("Parameter [" + QUERY_PARAM_BRICKS + "] is missing in request!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
if(deleteFlag == null) {
@@ -511,23 +525,23 @@ public class VolumesResource extends AbstractResource {
@FormParam(RESTConstants.FORM_PARAM_OPTION_KEY) String key,
@FormParam(RESTConstants.FORM_PARAM_OPTION_VALUE) String value) {
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if(volumeName == null || volumeName.isEmpty()) {
- return badRequestResponse("Volume name must not be empty!");
+ return notFoundResponse("Volume name must not be empty!");
}
if(key == null || key.isEmpty()) {
- return badRequestResponse("Parameter [" + FORM_PARAM_OPTION_KEY + "] is missing in request!");
+ return notFoundResponse("Parameter [" + FORM_PARAM_OPTION_KEY + "] is missing in request!");
}
if(value == null || value.isEmpty()) {
- return badRequestResponse("Parameter [" + FORM_PARAM_OPTION_VALUE + "] is missing in request!");
+ return notFoundResponse("Parameter [" + FORM_PARAM_OPTION_VALUE + "] is missing in request!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName);
@@ -561,15 +575,15 @@ public class VolumesResource extends AbstractResource {
public Response resetOptions(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
@PathParam(PATH_PARAM_VOLUME_NAME) String volumeName) {
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if(volumeName == null || volumeName.isEmpty()) {
- return badRequestResponse("Volume name must not be empty!");
+ return notFoundResponse("Volume name must not be empty!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName);
@@ -647,15 +661,15 @@ public class VolumesResource extends AbstractResource {
public Response downloadLogs(@PathParam(PATH_PARAM_CLUSTER_NAME) final String clusterName,
@PathParam(PATH_PARAM_VOLUME_NAME) final String volumeName) {
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if (volumeName == null || volumeName.isEmpty()) {
- return badRequestResponse("Volume name must not be empty!");
+ return notFoundResponse("Volume name must not be empty!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
try {
@@ -739,15 +753,15 @@ public class VolumesResource extends AbstractResource {
public Response getLogs(String clusterName, String volumeName, String brickName, String severity,
String fromTimestamp, String toTimestamp, Integer lineCount, String mediaType) {
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if (volumeName == null || volumeName.isEmpty()) {
- return badRequestResponse("Volume name must not be empty!");
+ return notFoundResponse("Volume name must not be empty!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
List<VolumeLogMessage> logMessages = null;
@@ -840,19 +854,19 @@ public class VolumesResource extends AbstractResource {
public Response addBricks(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
@PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_BRICKS) String bricks) {
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if (volumeName == null || volumeName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if (bricks == null || bricks.isEmpty()) {
- return badRequestResponse("Parameter [" + FORM_PARAM_BRICKS + "] is missing in request!");
+ return notFoundResponse("Parameter [" + FORM_PARAM_BRICKS + "] is missing in request!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName);
@@ -889,23 +903,23 @@ public class VolumesResource extends AbstractResource {
@FormParam(FORM_PARAM_TARGET) String toBrick, @FormParam(FORM_PARAM_AUTO_COMMIT) Boolean autoCommit) {
if (clusterName == null || clusterName.isEmpty()) {
- return badRequestResponse("Cluster name must not be empty!");
+ return notFoundResponse("Cluster name must not be empty!");
}
if (volumeName == null || volumeName.isEmpty()) {
- return badRequestResponse("Volume name must not be empty!");
+ return notFoundResponse("Volume name must not be empty!");
}
if (fromBrick == null || fromBrick.isEmpty()) {
- return badRequestResponse("Parameter [" + FORM_PARAM_SOURCE + "] is missing in request!");
+ return notFoundResponse("Parameter [" + FORM_PARAM_SOURCE + "] is missing in request!");
}
if (toBrick == null || toBrick.isEmpty()) {
- return badRequestResponse("Parameter [" + FORM_PARAM_TARGET + "] is missing in request!");
+ return notFoundResponse("Parameter [" + FORM_PARAM_TARGET + "] is missing in request!");
}
if (clusterService.getCluster(clusterName) == null) {
- return badRequestResponse("Cluster [" + clusterName + "] not found!");
+ return notFoundResponse("Cluster [" + clusterName + "] not found!");
}
GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName);
@@ -935,6 +949,92 @@ public class VolumesResource extends AbstractResource {
return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId);
}
+
+ private Response rebalanceStart(String clusterName, String volumeName, Boolean isFixLayout, Boolean isMigrateData,
+ Boolean isForcedDataMigrate) {
+
+ GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName);
+ if (onlineServer == null) {
+ return notFoundResponse("No online servers found in cluster [" + clusterName + "]");
+ }
+
+ String layout = "";
+ String taskId = null;
+ if (isForcedDataMigrate) {
+ layout = "forced-data-migrate = true";
+ } else if (isMigrateData) {
+ layout = "migrate-data = true";
+ } else if (isFixLayout) {
+ layout = "fix-layout = true";
+ }
+
+ try {
+ taskId = glusterUtil.rebalanceStart(volumeName, layout, onlineServer.getName());
+ } catch (ConnectionException e) {
+ // online server has gone offline! try with a different one.
+ onlineServer = glusterServersResource.getNewOnlineServer(clusterName);
+
+ try {
+ taskId = glusterUtil.rebalanceStart(volumeName, layout, onlineServer.getName());
+ } catch(Exception e1) {
+ return errorResponse(e1.getMessage());
+ }
+ } catch(Exception e1) {
+ return errorResponse(e1.getMessage());
+ }
+
+ return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId);
+ }
+
+ private Response rebalanceStatus(String clusterName, String volumeName) {
+ GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName);
+ if (onlineServer == null) {
+ return notFoundResponse("No online servers found in cluster [" + clusterName + "]");
+ }
+
+ String taskId = null;
+ try {
+ taskId = glusterUtil.rebalanceStatus(volumeName, onlineServer.getName());
+ } catch (ConnectionException e) {
+ // online server has gone offline! try with a different one.
+ onlineServer = glusterServersResource.getNewOnlineServer(clusterName);
+
+ try {
+ taskId = glusterUtil.rebalanceStatus(volumeName, onlineServer.getName());
+ } catch (Exception e1) {
+ return errorResponse(e1.getMessage());
+ }
+ } catch(Exception e1) {
+ return errorResponse(e1.getMessage());
+ }
+
+ return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId);
+ }
+
+ private Response rebalanceStop(String clusterName, String volumeName) {
+ GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName);
+ if (onlineServer == null) {
+ return notFoundResponse("No online servers found in cluster [" + clusterName + "]");
+ }
+
+ String taskId = null;
+ try {
+ taskId = glusterUtil.rebalanceStop(volumeName, onlineServer.getName());
+ } catch (ConnectionException e) {
+ // online server has gone offline! try with a different one.
+ onlineServer = glusterServersResource.getNewOnlineServer(clusterName);
+
+ try {
+ taskId = glusterUtil.rebalanceStop(volumeName, onlineServer.getName());
+ } catch (Exception e1) {
+ return errorResponse(e1.getMessage());
+ }
+ } catch(Exception e1) {
+ return errorResponse(e1.getMessage());
+ }
+
+ return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId);
+ }
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/services/ClusterService.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ClusterService.java
index 0aabb714..bb379de6 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ClusterService.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ClusterService.java
@@ -65,7 +65,7 @@ public class ClusterService {
}
public ClusterInfo getCluster(String clusterName) {
- List<ClusterInfo> clusters = clusterDao.findBy("name = ?1", clusterName);
+ List<ClusterInfo> clusters = clusterDao.findBy("UPPER(name) = ?1", clusterName.toUpperCase());
if(clusters.size() == 0) {
return null;
}
@@ -74,7 +74,7 @@ public class ClusterService {
}
public ClusterInfo getClusterForServer(String serverName) {
- List<ServerInfo> servers = serverDao.findBy("name = ?1", serverName);
+ List<ServerInfo> servers = serverDao.findBy("UPPER(name) = ?1", serverName.toUpperCase());
if(servers.size() == 0) {
return null;
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java
new file mode 100644
index 00000000..5b70d7a8
--- /dev/null
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java
@@ -0,0 +1,127 @@
+/**
+ * RebalanceVolumeTask.java
+ *
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+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.core.utils.ProcessResult;
+import com.gluster.storage.management.server.utils.SshUtil;
+
+public class RebalanceVolumeTask extends Task {
+
+ private String layout;
+ private SshUtil sshUtil = new SshUtil();
+
+ public RebalanceVolumeTask(TaskInfo taskInfo) {
+ super(taskInfo);
+ }
+
+ public RebalanceVolumeTask(String volumeName) {
+ super(TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume rebalance running on " + volumeName, false, true, false);
+ }
+
+ @Override
+ public String getId() {
+ return taskInfo.getType() + "-" + taskInfo.getReference();
+ }
+
+ @Override
+ public void start() {
+ String command = "gluster volume rebalance " + getTaskInfo().getReference() + " " + getLayout() + " start";
+ ProcessResult processResult = sshUtil.executeRemote(serverName, command);
+ TaskStatus taskStatus = new TaskStatus();
+ if (processResult.isSuccess()) {
+ if (processResult.getOutput().trim().matches(".*has been successful$")) {
+ 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 void resume() {
+ getTaskInfo().setStatus(
+ new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Pause/Resume is not supported in Volume Rebalance")));
+ }
+
+ @Override
+ public void stop() {
+ String command = "gluster volume rebalance " + getTaskInfo().getReference() + " stop";
+ ProcessResult processResult = sshUtil.executeRemote(serverName, command);
+ TaskStatus taskStatus = new TaskStatus();
+ if (processResult.isSuccess()) {
+ if (processResult.getOutput().trim().matches(".*has been successful$")) {
+ 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 void pause() {
+ getTaskInfo().setStatus(
+ new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Pause/Resume is not supported in Volume Rebalance")));
+ }
+
+ @Override
+ public TaskStatus checkStatus() {
+ String command = "gluster volume rebalance " + getTaskInfo().getReference() + " status";
+ ProcessResult processResult = sshUtil.executeRemote(serverName, command);
+ TaskStatus taskStatus = new TaskStatus();
+ if (processResult.isSuccess()) {
+ if (processResult.getOutput().trim().matches("Rebalance completed!")) {
+ 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;
+ }
+
+ public void setLayout(String layout) {
+ this.layout = layout;
+ }
+
+ public String getLayout() {
+ return layout;
+ }
+
+ @Override
+ public void commit() {
+ // TODO Auto-generated method stub
+ }
+}
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 dc95f50a..aa44b016 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,7 +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.TaskInfo.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.Volume.TRANSPORT_TYPE;
import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS;
@@ -46,6 +46,7 @@ import com.gluster.storage.management.core.utils.ProcessResult;
import com.gluster.storage.management.core.utils.StringUtil;
import com.gluster.storage.management.server.resources.TasksResource;
import com.gluster.storage.management.server.tasks.MigrateDiskTask;
+import com.gluster.storage.management.server.tasks.RebalanceVolumeTask;
import com.sun.jersey.api.core.InjectParam;
@Component
@@ -552,6 +553,48 @@ public class GlusterUtil {
return migrateDiskTask.getId();
}
+ public String rebalanceStart(String volumeName, String layout, String knownServer) {
+
+ RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(volumeName);
+ rebalanceTask.setOnlineServer(knownServer);
+ rebalanceTask.setLayout(layout);
+ rebalanceTask.start();
+ int status = rebalanceTask.getTaskInfo().getStatus().getCode();
+
+ if(status != Status.STATUS_CODE_FAILURE) {
+ TasksResource taskResource = new TasksResource();
+ taskResource.addTask(rebalanceTask);
+ } else {
+ throw new GlusterRuntimeException( rebalanceTask.getTaskInfo().getStatus().getMessage());
+ }
+ return rebalanceTask.getId();
+ }
+
+ public String rebalanceStatus(String volumeName, String knownServer) {
+ RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(volumeName);
+ rebalanceTask.setOnlineServer(knownServer);
+
+ rebalanceTask.checkStatus();
+ int status = rebalanceTask.getTaskInfo().getStatus().getCode();
+
+ if (status == Status.STATUS_CODE_FAILURE) {
+ throw new GlusterRuntimeException(rebalanceTask.getTaskInfo().getStatus().getMessage());
+ }
+ return rebalanceTask.getId();
+ }
+
+ public String rebalanceStop(String volumeName, String knownServer) {
+ RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(volumeName);
+ rebalanceTask.setOnlineServer(knownServer);
+
+ rebalanceTask.stop();
+ int status = rebalanceTask.getTaskInfo().getStatus().getCode();
+
+ if (status == Status.STATUS_CODE_FAILURE) {
+ throw new GlusterRuntimeException(rebalanceTask.getTaskInfo().getStatus().getMessage());
+ }
+ return rebalanceTask.getId();
+ }
public Status removeBricks(String volumeName, List<String> bricks, String knownServer) {
StringBuilder command = new StringBuilder("gluster --mode=script volume remove-brick " + volumeName);