summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShireesh Anjal <anjalshireesh@gmail.com>2011-05-03 09:25:40 -0700
committerShireesh Anjal <anjalshireesh@gmail.com>2011-05-03 09:25:40 -0700
commit5589f8924c3167b046cae892d1bbcaf776663edf (patch)
tree83e00176f30ea5b95ef661737013b491076dd36d
parent52a5b56223f1ba86ecc5af3d26ebf78037358c26 (diff)
parentdf48da74b8775e59fdb9d59c9a9562a2449a2956 (diff)
Merge pull request #27 from Selvasundaram/master.
Story #22 Disk migration (for a Volume)
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java38
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java4
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java91
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java16
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java85
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java10
6 files changed, 177 insertions, 67 deletions
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 33791a50..33a93690 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 com.gluster.storage.management.core.model.Disk;
import com.gluster.storage.management.core.model.Disk.DISK_STATUS;
import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
+import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE;
import com.gluster.storage.management.core.response.LogMessageListResponse;
import com.gluster.storage.management.core.response.VolumeListResponse;
import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse;
@@ -162,6 +163,43 @@ public class VolumesClient extends AbstractClient {
return queryParams;
}
+ public Status startMigration( String volumeName, String diskFrom, String diskTo) {
+ Form form = new Form();
+ form.add(RESTConstants.FORM_PARAM_VALUE_SOURCE, diskFrom);
+ form.add(RESTConstants.FORM_PARAM_VALUE_TARGET, diskTo);
+ form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_START);
+
+ return (Status) putRequest( volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+ }
+
+ public Status stopMigration(String volumeName, String diskFrom, String diskTo) {
+ Form form = new Form();
+ form.add(RESTConstants.FORM_PARAM_VALUE_SOURCE, diskFrom);
+ form.add(RESTConstants.FORM_PARAM_VALUE_TARGET, diskTo);
+ form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_STOP);
+
+ return (Status) putRequest( volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+ }
+
+ public Status pauseMigration(String volumeName, String diskFrom, String diskTo) {
+ Form form = new Form();
+ form.add(RESTConstants.FORM_PARAM_VALUE_SOURCE, diskFrom);
+ form.add(RESTConstants.FORM_PARAM_VALUE_TARGET, diskTo);
+ form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_PAUSE);
+
+ return (Status) putRequest( volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+ }
+
+ public Status statusMigration(String volumeName, String diskFrom, String diskTo) {
+ Form form = new Form();
+ form.add(RESTConstants.FORM_PARAM_VALUE_SOURCE, diskFrom);
+ form.add(RESTConstants.FORM_PARAM_VALUE_TARGET, diskTo);
+ form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_STATUS);
+
+ return (Status) putRequest( volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+ }
+
+
public static void main(String[] args) {
UsersClient usersClient = new UsersClient();
if (usersClient.authenticate("gluster", "gluster").isSuccess()) {
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 159c408e..5da9e6b1 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
@@ -35,8 +35,12 @@ public class RESTConstants {
public static final String FORM_PARAM_OPERATION = "operation";
public static final String FORM_PARAM_VALUE_START = "start";
public static final String FORM_PARAM_VALUE_STOP = "stop";
+ public static final String FORM_PARAM_VALUE_PAUSE = "pause";
+ public static final String FORM_PARAM_VALUE_STATUS = "status";
public static final String FORM_PARAM_OPTION_KEY = "key";
public static final String FORM_PARAM_OPTION_VALUE = "value";
+ public static final String FORM_PARAM_VALUE_SOURCE = "source";
+ public static final String FORM_PARAM_VALUE_TARGET = "target";
public static final String PATH_PARAM_VOLUME_NAME = "volumeName";
public static final String FORM_PARAM_DELETE_OPTION = "value";
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java
index f484a346..24f0fe5b 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java
@@ -36,9 +36,8 @@ import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
-
+import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.core.model.Disk;
-import com.gluster.storage.management.core.model.GlusterDummyModel;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.utils.NumberUtil;
import com.gluster.storage.management.gui.TableLabelProviderAdapter;
@@ -46,15 +45,21 @@ import com.gluster.storage.management.gui.utils.GUIHelper;
public class MigrateDiskPage1 extends WizardPage {
private static final String PAGE_NAME = "migrate.disk.page.1";
+
private enum DISK_TABLE_COLUMN_INDICES {
SERVER, DISK, SPACE, SPACE_IN_USE
}
+
private static final String[] DISK_TABLE_COLUMN_NAMES = { "Server", "Disk", "Space (GB)", "Used Space (GB)" };
private Volume volume;
private Disk fromDisk;
private static final GUIHelper guiHelper = GUIHelper.getInstance();
+ private TableViewer tableViewerTo;
+
+ private TableViewer tableViewerFrom;
+
private ITableLabelProvider getDiskLabelProvider() {
return new TableLabelProviderAdapter() {
@@ -67,13 +72,14 @@ public class MigrateDiskPage1 extends WizardPage {
Disk disk = (Disk) element;
return (columnIndex == DISK_TABLE_COLUMN_INDICES.SERVER.ordinal() ? disk.getServerName()
: columnIndex == DISK_TABLE_COLUMN_INDICES.DISK.ordinal() ? disk.getName()
- : columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE.ordinal() ? NumberUtil.formatNumber(disk.getSpace())
- : columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE_IN_USE.ordinal() ? NumberUtil.formatNumber(disk.getSpaceInUse())
- : "Invalid");
+ : columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE.ordinal() ? NumberUtil
+ .formatNumber(disk.getSpace())
+ : columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE_IN_USE.ordinal() ? NumberUtil
+ .formatNumber(disk.getSpaceInUse()) : "Invalid");
}
};
}
-
+
private void setupDiskTable(Composite parent, Table table) {
table.setHeaderVisible(true);
table.setLinesVisible(false);
@@ -103,7 +109,6 @@ public class MigrateDiskPage1 extends WizardPage {
tableColumnLayout.setColumnData(column, new ColumnWeightData(weight));
}
-
/**
* Create the wizard.
*/
@@ -112,11 +117,31 @@ public class MigrateDiskPage1 extends WizardPage {
this.volume = volume;
this.fromDisk = disk;
setTitle("Migrate Disk [" + volume.getName() + "]");
-// setDescription("Migrate data from one disk to another for the chosen Volume. " +
-// "This will copy all data present in the \"from disk\" of the volume " +
-// "to \"to disk\", remove \"from disk\" from the volume, and " +
-// "add \"to disk\" to the volume");
- setDescription("Migrate volume data from \"From Disk\" to \"To Disk\"");
+ // setDescription("Migrate data from one disk to another for the chosen Volume. " +
+ // "This will copy all data present in the \"from disk\" of the volume " +
+ // "to \"to disk\", remove \"from disk\" from the volume, and " +
+ // "add \"to disk\" to the volume");
+ setPageDescription(null, null);
+ setPageComplete(false);
+ }
+
+ private void setPageDescription(String source, String target) {
+ if (source == null || source == "") {
+ source = "From Disk";
+ }
+ if (target == null || target == "") {
+ target = "To Disk";
+ }
+ setDescription("Migrate volume data from \"" + source + "\" to \"" + target + "\"");
+ }
+
+ private Disk getSelectedDisk(TableViewer tableViewer) {
+ TableItem[] selectedItems = tableViewer.getTable().getSelection();
+ Disk selectedDisk = null;
+ for (TableItem item : selectedItems) {
+ selectedDisk = (Disk) item.getData();
+ }
+ return selectedDisk;
}
private void setupPageLayout(Composite container) {
@@ -128,7 +153,7 @@ public class MigrateDiskPage1 extends WizardPage {
layout.marginRight = 10;
container.setLayout(layout);
}
-
+
private Composite createTableViewerComposite(Composite parent) {
Composite tableViewerComposite = new Composite(parent, SWT.NONE);
tableViewerComposite.setLayout(new FillLayout(SWT.HORIZONTAL));
@@ -136,6 +161,14 @@ public class MigrateDiskPage1 extends WizardPage {
return tableViewerComposite;
}
+ public Disk getSourceDisk() {
+ return getSelectedDisk(tableViewerFrom);
+ }
+
+ public Disk getTargetDisk() {
+ return getSelectedDisk(tableViewerTo);
+ }
+
/**
* Create contents of the wizard.
*
@@ -164,40 +197,42 @@ public class MigrateDiskPage1 extends WizardPage {
ITableLabelProvider diskLabelProvider = getDiskLabelProvider();
- GlusterDummyModel glusterDummyModel = GlusterDummyModel.getInstance();
- List<Disk> fromDisks = glusterDummyModel.getReadyDisksOfVolume(volume);
- List<Disk> toDisks = glusterDummyModel.getReadyDisksOfAllServersExcluding( glusterDummyModel.getReadyDisksOfVolume(volume));
+ GlusterDataModelManager glusterDataModelManager = GlusterDataModelManager.getInstance();
+ List<Disk> fromDisks = glusterDataModelManager.getReadyDisksOfVolume(volume);
+ List<Disk> toDisks = glusterDataModelManager.getReadyDisksOfAllServersExcluding( glusterDataModelManager.getReadyDisksOfVolume(volume));
+
+ tableViewerFrom = createTableViewer(container, diskLabelProvider, fromDisks, txtFilterFrom);
- TableViewer tableViewerFrom = createTableViewer(container, diskLabelProvider, fromDisks, txtFilterFrom);
if(fromDisk != null) {
setFromDisk(tableViewerFrom, fromDisk);
}
-
- createTableViewer(container, diskLabelProvider, toDisks, txtFilterTo);
+ tableViewerTo = createTableViewer(container, diskLabelProvider, toDisks, txtFilterTo);
}
-
+
private void setFromDisk(TableViewer tableViewer, Disk diskToSelect) {
Table table = tableViewer.getTable();
- for(int i = 0 ; i < table.getItemCount(); i++) {
+ for (int i = 0; i < table.getItemCount(); i++) {
TableItem item = table.getItem(i);
- if(item.getData() == diskToSelect) {
+ if (item.getData() == diskToSelect) {
table.select(i);
return;
}
}
}
-
- private TableViewer createTableViewer(Composite container, ITableLabelProvider diskLabelProvider, List<Disk> fromDisks, Text txtFilterText) {
+
+ private TableViewer createTableViewer(Composite container, ITableLabelProvider diskLabelProvider,
+ List<Disk> fromDisks, Text txtFilterText) {
Composite tableViewerComposite = createTableViewerComposite(container);
-
+
TableViewer tableViewer = new TableViewer(tableViewerComposite, SWT.SINGLE);
tableViewer.setContentProvider(new ArrayContentProvider());
tableViewer.setLabelProvider(diskLabelProvider);
-
+
setupDiskTable(tableViewerComposite, tableViewer.getTable());
guiHelper.createFilter(tableViewer, txtFilterText, false);
-
+
tableViewer.setInput(fromDisks.toArray());
return tableViewer;
- }
+ }
+
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java
index 464abefa..70b4bbf6 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java
@@ -20,12 +20,15 @@ package com.gluster.storage.management.gui.dialogs;
import org.eclipse.jface.wizard.Wizard;
+import com.gluster.storage.management.client.GlusterDataModelManager;
+import com.gluster.storage.management.client.VolumesClient;
import com.gluster.storage.management.core.model.Disk;
import com.gluster.storage.management.core.model.Volume;
public class MigrateDiskWizard extends Wizard {
private Volume volume;
private Disk disk;
+ private MigrateDiskPage1 page;
public MigrateDiskWizard(Volume volume, Disk disk) {
setWindowTitle("Gluster Management Console - Migrate Disk [" + volume.getName() + "]");
@@ -36,13 +39,20 @@ public class MigrateDiskWizard extends Wizard {
@Override
public void addPages() {
- addPage(new MigrateDiskPage1(volume, disk));
+ page = new MigrateDiskPage1(volume, disk);
+ addPage(page);
}
@Override
public boolean performFinish() {
- System.out.println("Triggered Disk Migration!");
- // TODO: Add code to migrate disk
+
+ Disk sourceDisk = page.getSourceDisk();
+ Disk targetDisk = page.getTargetDisk();
+ // TODO add custom confirm dialog
+
+ VolumesClient volumesClient = new VolumesClient(GlusterDataModelManager.getInstance().getSecurityToken());
+ volumesClient.startMigration(volume.getName(), sourceDisk.getQualifiedName(), targetDisk.getQualifiedName());
+
return true;
}
}
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 586bf5a3..fd4643a6 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
@@ -21,8 +21,12 @@
package com.gluster.storage.management.server.resources;
import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_OPERATION;
+import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_PAUSE;
+import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_SOURCE;
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_STATUS;
import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_STOP;
+import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_TARGET;
import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_VOLUME_NAME;
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_DELETE_OPTION;
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_DISKS;
@@ -119,7 +123,8 @@ public class VolumesResource {
status.setMessage("Error while setting volume options: " + optionsStatus);
}
} else {
- Status cleanupStatus = cleanupDirectories(disks, volume.getName(), disks.size(), "-d"); // delete permanently
+ Status cleanupStatus = cleanupDirectories(disks, volume.getName(), disks.size(), "-d"); // delete
+ // permanently
if (!cleanupStatus.isSuccess()) {
status.setMessage(status.getMessage() + CoreConstants.NEWLINE + "Cleanup errors: "
+ CoreConstants.NEWLINE + cleanupStatus);
@@ -249,7 +254,7 @@ public class VolumesResource {
return status;
}
- //TODO Can be removed and use StringUtil.ListToString(List<String> list, String delimiter)
+ // TODO Can be removed and use StringUtil.ListToString(List<String> list, String delimiter)
private String bricksAsString(List<String> bricks) {
String bricksStr = "";
for (String brickInfo : bricks) {
@@ -266,8 +271,8 @@ public class VolumesResource {
diskInfo = disks.get(i).split(":");
serverName = diskInfo[0];
diskName = diskInfo[1];
- result = ((GenericResponse) serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT + " "
- + diskName + " " + volumeName + " " + deleteFlag, GenericResponse.class)).getStatus();
+ result = ((GenericResponse) serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT
+ + " " + diskName + " " + volumeName + " " + deleteFlag, GenericResponse.class)).getStatus();
if (!result.isSuccess()) {
return result;
}
@@ -281,30 +286,30 @@ public class VolumesResource {
String[] brickParts = brickName.split(":");
String serverName = brickParts[0];
String brickDir = brickParts[1];
-
+
String logDir = glusterUtil.getLogLocation(volume.getName(), brickName);
String logFileName = glusterUtil.getLogFileNameForBrickDir(brickDir);
String logFilePath = logDir + CoreConstants.FILE_SEPARATOR + logFileName;
// Usage: get_volume_disk_log.py <volumeName> <diskName> <lineCount>
- Object responseObj = serverUtil.executeOnServer(true, serverName, VOLUME_BRICK_LOG_SCRIPT
- + " " + logFilePath + " " + lineCount, LogMessageListResponse.class);
+ Object responseObj = serverUtil.executeOnServer(true, serverName, VOLUME_BRICK_LOG_SCRIPT + " " + logFilePath
+ + " " + lineCount, LogMessageListResponse.class);
Status status = null;
LogMessageListResponse response = null;
- if(responseObj instanceof LogMessageListResponse) {
- response = (LogMessageListResponse)responseObj;
+ if (responseObj instanceof LogMessageListResponse) {
+ response = (LogMessageListResponse) responseObj;
status = response.getStatus();
} else {
- status = (Status)responseObj;
+ status = (Status) responseObj;
}
-
+
if (!status.isSuccess()) {
throw new GlusterRuntimeException(status.toString());
}
// populate disk and trim other fields
List<LogMessage> logMessages = response.getLogMessages();
- for(LogMessage logMessage : logMessages) {
+ for (LogMessage logMessage : logMessages) {
logMessage.setDisk(getDiskForBrick(volume, brickName));
logMessage.setMessage(logMessage.getMessage().trim());
logMessage.setSeverity(logMessage.getSeverity().trim());
@@ -332,32 +337,32 @@ public class VolumesResource {
} catch (Exception e) {
return new LogMessageListResponse(new Status(e), null);
}
-
+
filterLogsBySeverity(logMessages, severity);
- filterLogsByTime(logMessages, fromTimestamp, toTimestamp);
+ filterLogsByTime(logMessages, fromTimestamp, toTimestamp);
return new LogMessageListResponse(Status.STATUS_SUCCESS, logMessages);
}
private void filterLogsByTime(List<LogMessage> logMessages, String fromTimestamp, String toTimestamp) {
Date fromTime = null, toTime = null;
-
- if(fromTimestamp != null && !fromTimestamp.isEmpty()) {
+
+ if (fromTimestamp != null && !fromTimestamp.isEmpty()) {
fromTime = DateUtil.stringToDate(fromTimestamp);
}
-
- if(toTimestamp != null && !toTimestamp.isEmpty()) {
+
+ if (toTimestamp != null && !toTimestamp.isEmpty()) {
toTime = DateUtil.stringToDate(toTimestamp);
}
List<LogMessage> messagesToRemove = new ArrayList<LogMessage>();
- for(LogMessage logMessage : logMessages) {
+ for (LogMessage logMessage : logMessages) {
Date logTimestamp = logMessage.getTimestamp();
- if(fromTime != null && logTimestamp.before(fromTime)) {
+ if (fromTime != null && logTimestamp.before(fromTime)) {
messagesToRemove.add(logMessage);
continue;
}
-
- if(toTime != null && logTimestamp.after(toTime)) {
+
+ if (toTime != null && logTimestamp.after(toTime)) {
messagesToRemove.add(logMessage);
}
}
@@ -365,13 +370,13 @@ public class VolumesResource {
}
private void filterLogsBySeverity(List<LogMessage> logMessages, String severity) {
- if(severity == null || severity.isEmpty()) {
+ if (severity == null || severity.isEmpty()) {
return;
}
-
+
List<LogMessage> messagesToRemove = new ArrayList<LogMessage>();
- for(LogMessage logMessage : logMessages) {
- if(!logMessage.getSeverity().equals(severity)) {
+ for (LogMessage logMessage : logMessages) {
+ if (!logMessage.getSeverity().equals(severity)) {
messagesToRemove.add(logMessage);
}
}
@@ -385,7 +390,7 @@ public class VolumesResource {
for (String brick : volume.getBricks()) {
logMessages.addAll(getBrickLogs(volume, brick, lineCount));
}
-
+
// Sort the log messages based on log timestamp
Collections.sort(logMessages, new Comparator<LogMessage>() {
@Override
@@ -393,31 +398,43 @@ public class VolumesResource {
return message1.getTimestamp().compareTo(message2.getTimestamp());
}
});
-
+
return logMessages;
}
-
+
@POST
@Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_DISKS)
- public Status addDisks(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @FormParam(QUERY_PARAM_DISKS) String disks) {
-
- List<String> diskList = Arrays.asList( disks.split(",") ); // Convert from comma separated sting (query parameter) to list
+ public Status addDisks(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
+ @FormParam(QUERY_PARAM_DISKS) String disks) {
+
+ List<String> diskList = Arrays.asList(disks.split(",")); // Convert from comma separated sting (query parameter)
+ // to list
Status status = createDirectories(diskList, volumeName);
if (status.isSuccess()) {
List<String> bricks = Arrays.asList(status.getMessage().split(" "));
status = glusterUtil.addBricks(volumeName, bricks);
if (!status.isSuccess()) {
- Status cleanupStatus = cleanupDirectories(diskList, volumeName, diskList.size(), "-d"); // Remove the directories if created
+ Status cleanupStatus = cleanupDirectories(diskList, volumeName, diskList.size(), "-d"); // Remove the
+ // directories
+ // if created
if (!cleanupStatus.isSuccess()) {
// append cleanup error to prepare brick error
status.setMessage(status.getMessage() + CoreConstants.NEWLINE + cleanupStatus.getMessage());
}
}
- }
+ }
return status;
}
+ @PUT
+ @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_DISKS)
+ public Status replaceDisk(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
+ @FormParam(FORM_PARAM_VALUE_SOURCE) String diskFrom, @FormParam(FORM_PARAM_VALUE_TARGET) String diskTo,
+ @FormParam(FORM_PARAM_OPERATION) String operation) {
+ return glusterUtil.migrateDisk(volumeName, diskFrom, diskTo, operation);
+ }
+
private String getBrickForDisk(Volume volume, String diskName) {
int index = volume.getDisks().indexOf(diskName);
return volume.getBricks().get(index);
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 30f73595..3ca11069 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
@@ -26,6 +26,7 @@ import java.util.Map;
import java.util.Map.Entry;
import com.gluster.storage.management.core.constants.CoreConstants;
+import com.gluster.storage.management.core.constants.RESTConstants;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.GlusterServer;
import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS;
@@ -468,8 +469,11 @@ public class GlusterUtil {
logFileName = logFileName.replaceAll(CoreConstants.FILE_SEPARATOR, "-") + ".log";
return logFileName;
}
-
-
+
+ public Status migrateDisk( String volumeName, String diskFrom, String diskTo, String operation ) {
+ return new Status(processUtil.executeCommand("gluster", "volume", "replace-brick", volumeName, diskFrom, diskTo, operation));
+ }
+
public static void main(String args[]) {
// List<String> names = new GlusterUtil().getGlusterServerNames();
// System.out.println(names);
@@ -479,4 +483,6 @@ public class GlusterUtil {
Status status = new GlusterUtil().addBricks("Volume3", disks);
System.out.println(status);
}
+
+
}