summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java80
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java101
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java7
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java90
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java9
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java19
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java23
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java17
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java9
-rw-r--r--src/com.gluster.storage.management.gui/plugin.xml28
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/BrickTableLabelProvider.java92
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DiskTableLabelProvider.java19
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java10
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java71
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java33
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java32
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/BricksSelectionPage.java (renamed from src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/DisksSelectionPage.java)63
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java33
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java45
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java11
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java34
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterViewsManager.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeBricksView.java (renamed from src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java)11
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/AbstractBricksPage.java153
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java76
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/DisksPage.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/VolumeLogsPage.java77
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java4
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java2
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java6
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java153
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java71
33 files changed, 946 insertions, 439 deletions
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 e639f615..36da2631 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
@@ -25,6 +25,7 @@ import java.util.List;
import java.util.Map.Entry;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
+import com.gluster.storage.management.core.model.Brick;
import com.gluster.storage.management.core.model.Cluster;
import com.gluster.storage.management.core.model.ClusterListener;
import com.gluster.storage.management.core.model.Disk;
@@ -106,7 +107,7 @@ public class GlusterDataModelManager {
private void addDiscoveredServer(List<Server> servers, Entity parent, String name, int numOfCPUs, double cpuUsage,
double totalMemory, double memoryInUse, double totalDiskSpace, double diskSpaceInUse) {
Server server = new Server(name, parent, numOfCPUs, cpuUsage, totalMemory, memoryInUse);
- server.addDisk(new Disk(server, "sda", totalDiskSpace, diskSpaceInUse, DISK_STATUS.READY));
+ server.addDisk(new Disk(server, "sda", "/export/md1", totalDiskSpace, diskSpaceInUse, DISK_STATUS.READY));
addNetworkInterface(server, "eth0");
servers.add(server);
@@ -172,21 +173,21 @@ public class GlusterDataModelManager {
}
private void initializeDisks() {
- s1da = new Disk(server1, "sda", 100d, 80d, DISK_STATUS.READY);
- s1db = new Disk(server1, "sdb", 100d, 67.83, DISK_STATUS.READY);
+ s1da = new Disk(server1, "sda", "/export/md0", 100d, 80d, DISK_STATUS.READY);
+ s1db = new Disk(server1, "sdb", "/export/md1", 100d, 67.83, DISK_STATUS.READY);
- s2da = new Disk(server2, "sda", 200d, 157.12, DISK_STATUS.READY);
- s2db = new Disk(server2, "sdb", 200d, 182.27, DISK_STATUS.READY);
- s2dc = new Disk(server2, "sdc", 200d, -1d, DISK_STATUS.UNINITIALIZED);
- s2dd = new Disk(server2, "sdd", 200d, 124.89, DISK_STATUS.READY);
+ s2da = new Disk(server2, "sda", "/export/md0", 200d, 157.12, DISK_STATUS.READY);
+ s2db = new Disk(server2, "sdb", "/export/md1", 200d, 182.27, DISK_STATUS.READY);
+ s2dc = new Disk(server2, "sdc", "/export/md0", 200d, -1d, DISK_STATUS.UNINITIALIZED);
+ s2dd = new Disk(server2, "sdd", "/export/md1", 200d, 124.89, DISK_STATUS.READY);
// disk name unavailable since server is offline
- s3da = new Disk(server3, "NA", -1d, -1d, DISK_STATUS.OFFLINE);
+ s3da = new Disk(server3, "NA", "NA", -1d, -1d, DISK_STATUS.OFFLINE);
- s4da = new Disk(server4, "sda", 100d, 85.39, DISK_STATUS.READY);
+ s4da = new Disk(server4, "sda", "/export/md0", 100d, 85.39, DISK_STATUS.READY);
- s5da = new Disk(server5, "sda", 100d, 92.83, DISK_STATUS.READY);
- s5db = new Disk(server5, "sdb", 200d, 185.69, DISK_STATUS.READY);
+ s5da = new Disk(server5, "sda", "/export/md1", 100d, 92.83, DISK_STATUS.READY);
+ s5db = new Disk(server5, "sdb", "/export/md1", 200d, 185.69, DISK_STATUS.READY);
}
private void addDisksToServers() {
@@ -279,11 +280,29 @@ public class GlusterDataModelManager {
return logMessages;
}
- public Disk getVolumeDisk(String volumeDisk) {
+ /**
+ * @param serverPartition Qualified name of the disk to be returned (serverName:diskName)
+ * @return The disk object for given qualified name
+ */
+ public Disk getDisk(String serverPartition) {
List<Disk> allDisks = getReadyDisksOfAllServers();
- String brickInfo[] = volumeDisk.split(":");
+ String diskInfo[] = serverPartition.split(":");
for (Disk disk : allDisks) {
- if (disk.getServerName().equals(brickInfo[0]) && disk.getName().equals(brickInfo[1])) {
+ if (disk.getServerName().equals(diskInfo[0]) && disk.getName().equals(diskInfo[1])) {
+ return disk;
+ }
+ }
+ return null;
+ }
+
+ /*
+ * @param diskName (sda)
+ * @return The disk object for given disk name
+ */
+ public Disk getDiskDetails(String diskName) {
+ List<Disk> allDisks = getReadyDisksOfAllServers();
+ for (Disk disk : allDisks) {
+ if (disk.getName().equals(diskName)) {
return disk;
}
}
@@ -300,14 +319,34 @@ public class GlusterDataModelManager {
Disk disk = null;
List<Disk> volumeDisks = new ArrayList<Disk>();
for (String volumeDisk : volume.getDisks()) {
- disk = getVolumeDisk(volumeDisk);
+ disk = getDisk(volumeDisk);
if (disk != null && disk.isReady()) {
volumeDisks.add(disk);
}
}
return volumeDisks;
}
-
+
+
+ public List<Brick> getOnlineBricks(Volume volume) {
+ List<Brick> onlineBricks = new ArrayList<Brick>();
+ for(Brick brick : volume.getBricks()) {
+ if (isOnlineDisk(brick.getDiskName())) {
+ onlineBricks.add(brick);
+ }
+ }
+ return onlineBricks;
+ }
+
+ public boolean isOnlineDisk(String diskName) {
+ for( Disk disk : getReadyDisksOfAllServers() ) {
+ if (disk.getName().equals(diskName) && disk.isReady()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public List<Disk> getReadyDisksOfAllVolumes() {
List<Disk> disks = new ArrayList<Disk>();
for (Volume volume : model.getCluster().getVolumes()) {
@@ -424,6 +463,15 @@ public class GlusterDataModelManager {
volume.setAccessControlList(accessControlList);
setVolumeOption(volume, getOptionEntry(volume, Volume.OPTION_AUTH_ALLOW));
}
+
+ public Server getGlusterServer(String serverName) {
+ for(Server server : model.getCluster().getServers() ) {
+ if (server.getName().equals(serverName)) {
+ return server;
+ }
+ }
+ return null;
+ }
private Entry<String, String> getOptionEntry(Volume volume, String optionKey) {
for (Entry entry : volume.getOptions().entrySet()) {
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 c0ce8620..0555e322 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
@@ -20,7 +20,6 @@
*/
package com.gluster.storage.management.client;
-import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -29,11 +28,9 @@ import javax.ws.rs.core.MultivaluedMap;
import com.gluster.storage.management.core.constants.CoreConstants;
import com.gluster.storage.management.core.constants.GlusterConstants;
import com.gluster.storage.management.core.constants.RESTConstants;
-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.Brick;
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;
@@ -92,7 +89,7 @@ public class VolumesClient extends AbstractClient {
}
public Status deleteVolume(Volume volume, boolean deleteOption) {
- MultivaluedMap<String, String> queryParams = prepareGetDeleteVolumeQueryParams(volume.getName(), deleteOption);
+ MultivaluedMap<String, String> queryParams = prepareDeleteVolumeQueryParams(volume.getName(), deleteOption);
return (Status) deleteSubResource(volume.getName(), Status.class, queryParams);
}
@@ -100,17 +97,11 @@ public class VolumesClient extends AbstractClient {
return ((VolumeOptionInfoListResponse) fetchSubResource(RESTConstants.SUBRESOURCE_DEFAULT_OPTIONS,
VolumeOptionInfoListResponse.class));
}
-
- public Status addDisks(String volumeName, List<Disk> diskList) {
- String disks = StringUtil.ListToString( GlusterCoreUtil.getQualifiedDiskNames(diskList), ",");
- Form form = new Form();
- form.add(RESTConstants.QUERY_PARAM_DISKS, disks);
- return (Status) postRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
- }
- public Status addDisks(String volumeName, String disks) {
+ public Status addBricks(String volumeName, List<String> brickList) {
+ String bricks = StringUtil.ListToString(brickList, ",");
Form form = new Form();
- form.add(RESTConstants.QUERY_PARAM_DISKS, disks);
+ form.add(RESTConstants.FORM_PARAM_BRICKS, bricks);
return (Status) postRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
}
@@ -133,51 +124,54 @@ public class VolumesClient extends AbstractClient {
* Number of most recent log messages to be fetched (from each disk)
* @return Log Message List response received from the Gluster Management Server.
*/
- public LogMessageListResponse getLogs(String volumeName, String diskName, String severity, Date fromTimestamp, Date toTimestamp, int messageCount) {
+ public LogMessageListResponse getLogs(String volumeName, String diskName, String severity, Date fromTimestamp,
+ Date toTimestamp, int messageCount) {
MultivaluedMap<String, String> queryParams = prepareGetLogQueryParams(diskName, severity, fromTimestamp,
toTimestamp, messageCount);
return (LogMessageListResponse) fetchSubResource(volumeName + "/" + RESTConstants.SUBRESOURCE_LOGS,
queryParams, LogMessageListResponse.class);
}
-
+
public void downloadLogs(String volumeName, String filePath) {
- downloadSubResource((volumeName) + "/" + RESTConstants.SUBRESOURCE_LOGS + "/" + RESTConstants.SUBRESOURCE_DOWNLOAD, filePath);
+ downloadSubResource((volumeName) + "/" + RESTConstants.SUBRESOURCE_LOGS + "/"
+ + RESTConstants.SUBRESOURCE_DOWNLOAD, filePath);
}
-
- public Status removeBricks(String volumeName, List<Disk> diskList, boolean deleteOption) {
- String disks = StringUtil.ListToString( GlusterCoreUtil.getQualifiedDiskNames(diskList), ",");
- MultivaluedMap<String, String> queryParams = prepareGetRemoveBrickQueryParams(volumeName, disks, deleteOption);
+
+ public Status removeBricks(String volumeName, List<Brick> BrickList, boolean deleteOption) {
+ String bricks = StringUtil.ListToString(GlusterCoreUtil.getQualifiedBrickList(BrickList), ",");
+ MultivaluedMap<String, String> queryParams = prepareRemoveBrickQueryParams(volumeName, bricks, deleteOption);
return (Status) deleteSubResource(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, queryParams);
}
-
- private MultivaluedMap<String, String> prepareGetRemoveBrickQueryParams(String volumeName, String disks, boolean deleteOption) {
+
+ private MultivaluedMap<String, String> prepareRemoveBrickQueryParams(String volumeName, String bricks,
+ boolean deleteOption) {
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
queryParams.add(RESTConstants.QUERY_PARAM_VOLUME_NAME, volumeName);
- queryParams.add(RESTConstants.QUERY_PARAM_DISKS, disks);
+ queryParams.add(RESTConstants.QUERY_PARAM_BRICKS, bricks);
queryParams.add(RESTConstants.QUERY_PARAM_DELETE_OPTION, "" + deleteOption);
return queryParams;
}
- private MultivaluedMap<String, String> prepareGetDeleteVolumeQueryParams(String volumeName, boolean deleteOption) {
+ private MultivaluedMap<String, String> prepareDeleteVolumeQueryParams(String volumeName, boolean deleteOption) {
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
queryParams.add(RESTConstants.QUERY_PARAM_VOLUME_NAME, volumeName);
queryParams.add(RESTConstants.QUERY_PARAM_DELETE_OPTION, "" + deleteOption);
return queryParams;
}
-
+
private MultivaluedMap<String, String> prepareGetLogQueryParams(String diskName, String severity,
Date fromTimestamp, Date toTimestamp, int messageCount) {
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
queryParams.add(RESTConstants.QUERY_PARAM_LINE_COUNT, "" + messageCount);
- if(!diskName.equals(CoreConstants.ALL)) {
+ if (!diskName.equals(CoreConstants.ALL)) {
queryParams.add(RESTConstants.QUERY_PARAM_DISK_NAME, diskName);
}
-
+
if (!severity.equals(CoreConstants.ALL)) {
queryParams.add(RESTConstants.QUERY_PARAM_LOG_SEVERITY, severity);
}
-
+
if (fromTimestamp != null) {
queryParams.add(RESTConstants.QUERY_PARAM_FROM_TIMESTAMP,
DateUtil.dateToString(fromTimestamp, CoreConstants.DATE_WITH_TIME_FORMAT));
@@ -190,43 +184,42 @@ public class VolumesClient extends AbstractClient {
return queryParams;
}
- public Status startMigration( String volumeName, String diskFrom, String diskTo) {
+ public Status startMigration(String volumeName, String brickFrom, String brickTo) {
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_SOURCE, brickFrom);
+ form.add(RESTConstants.FORM_PARAM_TARGET, brickTo);
form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_START);
-
- return (Status) putRequest( volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+
+ return (Status) putRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
}
-
- public Status stopMigration(String volumeName, String diskFrom, String diskTo) {
+
+ public Status stopMigration(String volumeName, String brickFrom, String brickkTo) {
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_SOURCE, brickFrom);
+ form.add(RESTConstants.FORM_PARAM_TARGET, brickkTo);
form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_STOP);
-
- return (Status) putRequest( volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+
+ return (Status) putRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
}
-
- public Status pauseMigration(String volumeName, String diskFrom, String diskTo) {
+
+ public Status pauseMigration(String volumeName, String brickFrom, String brickTo) {
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_SOURCE, brickFrom);
+ form.add(RESTConstants.FORM_PARAM_TARGET, brickTo);
form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_PAUSE);
-
- return (Status) putRequest( volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+
+ return (Status) putRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
}
-
- public Status statusMigration(String volumeName, String diskFrom, String diskTo) {
+
+ public Status statusMigration(String volumeName, String brickFrom, String brickTo) {
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_SOURCE, brickFrom);
+ form.add(RESTConstants.FORM_PARAM_TARGET, brickTo);
form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_STATUS);
-
- return (Status) putRequest( volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+
+ 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 c25d186a..1b70b84d 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
@@ -33,6 +33,7 @@ public class RESTConstants {
public static final String SUBRESOURCE_DISKS = "disks";
+ public static final String FORM_PARAM_DISKS = "disks";
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";
@@ -40,14 +41,16 @@ public class RESTConstants {
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 FORM_PARAM_SOURCE = "source";
+ public static final String FORM_PARAM_TARGET = "target";
+ public static final String FORM_PARAM_BRICKS = "bricks";
public static final String PATH_PARAM_VOLUME_NAME = "volumeName";
public static final String FORM_PARAM_DELETE_OPTION = "value";
public static final String QUERY_PARAM_DISK_NAME = "diskName";
public static final String QUERY_PARAM_DISKS = "disks";
+ public static final String QUERY_PARAM_BRICKS = "bricks";
public static final String QUERY_PARAM_LINE_COUNT = "lineCount";
public static final String QUERY_PARAM_VOLUME_NAME = "volumeName";
public static final String QUERY_PARAM_DELETE_OPTION = "deleteOption";
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java
new file mode 100644
index 00000000..83acb9a3
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+import com.gluster.storage.management.core.utils.StringUtil;
+
+@XmlRootElement
+public class Brick extends Entity {
+ public enum BRICK_STATUS {ONLINE, OFFLINE};
+ private String[] BRICK_STATUS_STR = {"Online", "Offline"};
+
+ private String serverName;
+ private String diskName;
+ private String brickDirectory;
+ private BRICK_STATUS status;
+
+ public Brick() {
+ }
+
+ public BRICK_STATUS getStatus() {
+ return status;
+ }
+
+ public String getStatusStr() {
+ return BRICK_STATUS_STR[getStatus().ordinal()];
+ }
+
+ public void setStatus(BRICK_STATUS status) {
+ this.status = status;
+ }
+
+ public Brick(String serverName, BRICK_STATUS brickStatus, String diskName, String brickDirectory) {
+ setServerName(serverName);
+ setStatus(brickStatus);
+ setDiskName(diskName);
+ setBrickDirectory(brickDirectory);
+ }
+
+ public void setServerName(String serverName) {
+ this.serverName = serverName;
+ }
+
+ public String getServerName() {
+ return serverName;
+ }
+
+ public void setBrickDirectory(String brickDirectory) {
+ this.brickDirectory = brickDirectory;
+ }
+
+ public String getBrickDirectory() {
+ return brickDirectory;
+ }
+
+ public void setDiskName(String diskName) {
+ this.diskName = diskName;
+ }
+
+ public String getDiskName() {
+ return diskName;
+ }
+
+ public String getQualifiedName() {
+ return serverName + ":" + brickDirectory;
+ }
+
+ public boolean filter(String filterString, boolean caseSensitive) {
+ return StringUtil.filterString(getServerName() + getBrickDirectory() + getDiskName(), filterString,
+ caseSensitive);
+ }
+
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java
index 1a62b293..adeb72dc 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java
@@ -139,4 +139,13 @@ public class Cluster extends Entity {
}
return diskSpaceInUse;
}
+
+ public GlusterServer getServer(String serverName) {
+ for(GlusterServer server : servers) {
+ if (server.getName().equals(serverName)) {
+ return server;
+ }
+ }
+ return null;
+ }
} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java
index 9924d596..3bf74426 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java
@@ -18,8 +18,9 @@
*******************************************************************************/
package com.gluster.storage.management.core.model;
+import java.io.File;
+
import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
import com.gluster.storage.management.core.utils.StringUtil;
@@ -32,6 +33,7 @@ public class Disk extends Entity {
private String[] DISK_STATUS_STR = { "Ready", "Uninitialized", "Initializing", "Offline" };
private String serverName;
+ private String mountPoint;
private Double space;
private Double spaceInUse;
private DISK_STATUS status;
@@ -88,9 +90,18 @@ public class Disk extends Entity {
this.serverName = serverName;
}
- public Disk(Server server, String name, Double space, Double spaceInUse, DISK_STATUS status) {
+ public void setMountPoint(String mountPoint) {
+ this.mountPoint = mountPoint;
+ }
+
+ public String getMountPoint() {
+ return mountPoint;
+ }
+
+ public Disk(Server server, String name, String mountPoint, Double space, Double spaceInUse, DISK_STATUS status) {
super(name, server);
setServerName(server != null ? server.getName() : "");
+ setMountPoint(mountPoint);
setSpace(space);
setSpaceInUse(spaceInUse);
setStatus(status);
@@ -104,4 +115,8 @@ public class Disk extends Entity {
public String getQualifiedName() {
return getServerName() + ":" + getName();
}
+
+ public String getQualifiedBrickName(String volumeName) {
+ return getServerName() + ":" + getMountPoint() + File.separator + volumeName;
+ }
}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java
index 09137014..979fe260 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java
@@ -73,7 +73,7 @@ public class GlusterDummyModel {
private void addDiscoveredServer(List<Server> servers, Entity parent, String name, int numOfCPUs, double cpuUsage,
double totalMemory, double memoryInUse, double totalDiskSpace, double diskSpaceInUse) {
Server server = new Server(name, parent, numOfCPUs, cpuUsage, totalMemory, memoryInUse);
- server.addDisk(new Disk(server, "sda", totalDiskSpace, diskSpaceInUse, DISK_STATUS.READY));
+ server.addDisk(new Disk(server, "sda", "/export/md0", totalDiskSpace, diskSpaceInUse, DISK_STATUS.READY));
addNetworkInterface(server, "eth0");
servers.add(server);
@@ -140,20 +140,21 @@ public class GlusterDummyModel {
}
private void initializeDisks() {
- s1da = new Disk(server1, "sda", 100d, 80d, DISK_STATUS.READY);
- s1db = new Disk(server1, "sdb", 100d, 67.83, DISK_STATUS.READY);
+ s1da = new Disk(server1, "sda", "/export/md0", 100d, 80d, DISK_STATUS.READY);
+ s1db = new Disk(server1, "sdb", "/export/md1", 100d, 67.83, DISK_STATUS.READY);
- s2da = new Disk(server2, "sda", 200d, 157.12, DISK_STATUS.READY);
- s2db = new Disk(server2, "sdb", 200d, 182.27, DISK_STATUS.READY);
- s2dc = new Disk(server2, "sdc", 200d, -1d, DISK_STATUS.UNINITIALIZED);
- s2dd = new Disk(server2, "sdd", 200d, 124.89, DISK_STATUS.READY);
+ s2da = new Disk(server2, "sda", "/export/md0", 200d, 157.12, DISK_STATUS.READY);
+ s2db = new Disk(server2, "sdb", "/export/md1", 200d, 182.27, DISK_STATUS.READY);
+ s2dc = new Disk(server2, "sdc", "/export/md0", 200d, -1d, DISK_STATUS.UNINITIALIZED);
+ s2dd = new Disk(server2, "sdd", "/export/md1", 200d, 124.89, DISK_STATUS.READY);
- s3da = new Disk(server3, "NA", -1d, -1d, DISK_STATUS.OFFLINE); // disk name unavailable since server is offline
+ // disk name unavailable since server is offline
+ s3da = new Disk(server3, "NA", "NA", -1d, -1d, DISK_STATUS.OFFLINE); // disk name unavailable since server is offline
- s4da = new Disk(server4, "sda", 100d, 85.39, DISK_STATUS.READY);
+ s4da = new Disk(server4, "sda", "/export/md0", 100d, 85.39, DISK_STATUS.READY);
- s5da = new Disk(server5, "sda", 100d, 92.83, DISK_STATUS.READY);
- s5db = new Disk(server5, "sdb", 200d, 185.69, DISK_STATUS.READY);
+ s5da = new Disk(server5, "sda", "/export/md1", 100d, 92.83, DISK_STATUS.READY);
+ s5db = new Disk(server5, "sdb", "/export/md1", 200d, 185.69, DISK_STATUS.READY);
}
private void addDisksToServers() {
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
index 41ed5a25..cf12b0d7 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
@@ -71,7 +71,7 @@ public class Volume extends Entity {
private double totalDiskSpace = 0;
private List<String> disks = new ArrayList<String>();
- private List<String> bricks = new ArrayList<String>();
+ private List<Brick> bricks = new ArrayList<Brick>();
public Volume() {
}
@@ -225,15 +225,24 @@ public class Volume extends Entity {
totalDiskSpace = 0;
}
- public void addBrick(String brick) {
+ public void addBrick(Brick brick) {
bricks.add(brick);
}
- public void removeBrick(String brick) {
+ public void addBricks(List<Brick> bricks) {
+ bricks.addAll(bricks);
+ }
+
+
+ public void setBricks(List<Brick> bricks) {
+ this.bricks = bricks;
+ }
+
+ public void removeBrick(Brick brick) {
bricks.remove(brick);
}
- public List<String> getBricks() {
+ public List<Brick> getBricks() {
return bricks;
}
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 9e3084fb..c238cad7 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
@@ -23,6 +23,7 @@ package com.gluster.storage.management.core.utils;
import java.util.ArrayList;
import java.util.List;
+import com.gluster.storage.management.core.model.Brick;
import com.gluster.storage.management.core.model.Disk;
@@ -35,4 +36,12 @@ public class GlusterCoreUtil {
}
return qualifiedDiskNames;
}
+
+ public static final List<String> getQualifiedBrickList(List<Brick> bricks) {
+ List<String> qualifiedBricks = new ArrayList<String>();
+ for (Brick brick : bricks) {
+ qualifiedBricks.add(brick.getQualifiedName());
+ }
+ return qualifiedBricks;
+ }
}
diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml
index 4b0de509..82b7f3e0 100644
--- a/src/com.gluster.storage.management.gui/plugin.xml
+++ b/src/com.gluster.storage.management.gui/plugin.xml
@@ -106,10 +106,10 @@
<view
allowMultiple="false"
category="com.gluster.storage.management.gui.category"
- class="com.gluster.storage.management.gui.views.VolumeDisksView"
+ class="com.gluster.storage.management.gui.views.VolumeBricksView"
icon="icons/disks.png"
- id="com.gluster.storage.management.gui.views.VolumeDisksView"
- name="Disks (Volume)"
+ id="com.gluster.storage.management.gui.views.VolumeBricksView"
+ name="Bricks"
restorable="true">
</view>
<view
@@ -247,20 +247,20 @@
</command>
<command
categoryId="com.gluster.storage.management.gui.category"
- description="Migrate Disk"
+ description="Migrate Brick"
id="com.gluster.storage.management.gui.commands.MigrateDisk"
- name="Migrate Disk">
+ name="Migrate Brick">
</command>
<command
categoryId="com.gluster.storage.management.gui.category"
- description="Remove Disk"
+ description="Remove Brick"
id="com.gluster.storage.management.gui.commands.RemoveDisk"
- name="Remove Disk">
+ name="Remove Brick">
</command>
<command
- description="Add Disk"
+ description="Add Brick"
id="com.gluster.storage.management.gui.commands.AddDisk"
- name="Add Disk">
+ name="Add Brick">
</command>
</extension>
<extension
@@ -493,7 +493,7 @@
definitionId="com.gluster.storage.management.gui.commands.MigrateDisk"
icon="icons/disk-migrate.png"
id="com.gluster.storage.management.gui.actions.MigrateDiskAction"
- label="&amp;Migrate Disk"
+ label="&amp;Migrate Brick"
menubarPath="com.gluster.storage.management.gui.menu.glusterserver/glusterserver"
mode="FORCE_TEXT"
pulldown="false"
@@ -610,7 +610,7 @@
definitionId="com.gluster.storage.management.gui.commands.RemoveDisk"
icon="icons/disk.png"
id="com.gluster.storage.management.gui.actions.RemoveDiskAction"
- label="Remove Disk"
+ label="Remove Brick"
menubarPath="com.gluster.storage.management.gui.menu.volume/volume"
mode="FORCE_TEXT"
pulldown="false"
@@ -618,7 +618,7 @@
state="false"
style="push"
toolbarPath="Normal"
- tooltip="Remove Disk from Volume">
+ tooltip="Remove Brick from Volume">
</action>
<action
allowLabelUpdate="false"
@@ -626,7 +626,7 @@
definitionId="com.gluster.storage.management.gui.commands.AddDisk"
icon="icons/disk.png"
id="com.gluster.storage.management.gui.actions.AddDiskAction"
- label="&amp;Add Disk"
+ label="&amp;Add Brick"
menubarPath="com.gluster.storage.management.gui.menu.volume/volume"
mode="FORCE_TEXT"
pulldown="false"
@@ -634,7 +634,7 @@
state="false"
style="push"
toolbarPath="Normal"
- tooltip="Add Disk to Volume">
+ tooltip="Add Brick to Volume">
</action>
<menu
id="com.gluster.storage.management.gui.menu.volume"
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/BrickTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/BrickTableLabelProvider.java
new file mode 100644
index 00000000..deaea17c
--- /dev/null
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/BrickTableLabelProvider.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * 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.gui;
+
+import org.eclipse.swt.graphics.Image;
+
+import com.gluster.storage.management.client.GlusterDataModelManager;
+import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
+import com.gluster.storage.management.core.model.Brick;
+import com.gluster.storage.management.core.model.Disk;
+import com.gluster.storage.management.core.model.Disk.DISK_STATUS;
+import com.gluster.storage.management.core.utils.NumberUtil;
+import com.gluster.storage.management.gui.utils.GUIHelper;
+import com.gluster.storage.management.gui.views.details.BricksPage.BRICK_TABLE_COLUMN_INDICES;
+import com.gluster.storage.management.gui.views.details.DisksPage.DISK_TABLE_COLUMN_INDICES;
+
+public class BrickTableLabelProvider extends TableLabelProviderAdapter {
+ private GUIHelper guiHelper = GUIHelper.getInstance();
+
+ @Override
+ public Image getColumnImage(Object element, int columnIndex) {
+
+ if (!(element instanceof Brick)) {
+ return null;
+ }
+
+ Brick brick = (Brick) element;
+ Disk disk = GlusterDataModelManager.getInstance().getDiskDetails(brick.getDiskName());
+
+ if (columnIndex == DISK_TABLE_COLUMN_INDICES.STATUS.ordinal()) {
+ DISK_STATUS status = disk.getStatus();
+ switch (status) {
+ case READY:
+ return guiHelper.getImage(IImageKeys.STATUS_ONLINE);
+ case OFFLINE:
+ return guiHelper.getImage(IImageKeys.STATUS_OFFLINE);
+ default:
+ throw new GlusterRuntimeException("Invalid brick status [" + status + "]");
+ }
+ }
+
+ return null;
+ }
+
+ private String getDiskSpaceInUse(Disk disk) {
+ if (disk.isReady()) {
+ return NumberUtil.formatNumber(disk.getSpaceInUse());
+ } else {
+ return "NA";
+ }
+ }
+
+ private String getDiskSpace(Disk disk) {
+ if (disk.isOffline()) {
+ return "NA";
+ } else {
+ return NumberUtil.formatNumber(disk.getSpace());
+ }
+ }
+
+ @Override
+ public String getColumnText(Object element, int columnIndex) {
+ if (!(element instanceof Brick)) {
+ return null;
+ }
+
+ Brick brick = (Brick) element;
+ Disk disk = GlusterDataModelManager.getInstance().getDiskDetails(brick.getDiskName());
+
+ return (columnIndex == BRICK_TABLE_COLUMN_INDICES.SERVER.ordinal() ? brick.getServerName()
+ : columnIndex == BRICK_TABLE_COLUMN_INDICES.BRICK.ordinal() ? brick.getBrickDirectory()
+ : columnIndex == BRICK_TABLE_COLUMN_INDICES.SPACE.ordinal() ? getDiskSpace(disk)
+ : columnIndex == BRICK_TABLE_COLUMN_INDICES.SPACE_IN_USE.ordinal() ? getDiskSpaceInUse(disk)
+ : columnIndex == BRICK_TABLE_COLUMN_INDICES.STATUS.ordinal() ? brick.getStatusStr() : "Invalid");
+ }
+}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DiskTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DiskTableLabelProvider.java
index 92553797..51c1f707 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DiskTableLabelProvider.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DiskTableLabelProvider.java
@@ -20,7 +20,9 @@ package com.gluster.storage.management.gui;
import org.eclipse.swt.graphics.Image;
+import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
+import com.gluster.storage.management.core.model.Brick;
import com.gluster.storage.management.core.model.Disk;
import com.gluster.storage.management.core.model.Disk.DISK_STATUS;
import com.gluster.storage.management.core.utils.NumberUtil;
@@ -32,11 +34,14 @@ public class DiskTableLabelProvider extends TableLabelProviderAdapter {
@Override
public Image getColumnImage(Object element, int columnIndex) {
- if (!(element instanceof Disk)) {
+
+ if (!(element instanceof Brick)) {
return null;
}
- Disk disk = (Disk) element;
+ Brick brick = (Brick) element;
+ Disk disk = GlusterDataModelManager.getInstance().getDisk(brick.getDiskName());
+
if (columnIndex == DISK_TABLE_COLUMN_INDICES.STATUS.ordinal()) {
DISK_STATUS status = disk.getStatus();
switch (status) {
@@ -74,13 +79,15 @@ public class DiskTableLabelProvider extends TableLabelProviderAdapter {
@Override
public String getColumnText(Object element, int columnIndex) {
- if (!(element instanceof Disk)) {
+ if (!(element instanceof Brick)) {
return null;
}
- Disk disk = (Disk) element;
- return (columnIndex == DISK_TABLE_COLUMN_INDICES.SERVER.ordinal() ? disk.getServerName()
- : columnIndex == DISK_TABLE_COLUMN_INDICES.DISK.ordinal() ? disk.getName()
+ Brick brick = (Brick) element;
+ Disk disk = GlusterDataModelManager.getInstance().getDisk(brick.getDiskName());
+
+ return (columnIndex == DISK_TABLE_COLUMN_INDICES.SERVER.ordinal() ? brick.getServerName()
+ : columnIndex == DISK_TABLE_COLUMN_INDICES.DISK.ordinal() ? brick.getBrickDirectory()
: columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE.ordinal() ? getDiskSpace(disk)
: columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE_IN_USE.ordinal() ? getDiskSpaceInUse(disk)
: columnIndex == DISK_TABLE_COLUMN_INDICES.STATUS.ordinal() ? disk.getStatusStr() : "Invalid");
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java
index 04ee39fb..bbb29253 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java
@@ -23,20 +23,20 @@ import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
-import com.gluster.storage.management.core.model.Disk;
+import com.gluster.storage.management.core.model.Brick;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.gui.dialogs.MigrateDiskWizard;
public class MigrateDiskAction extends AbstractActionDelegate {
private Volume volume;
- private Disk disk;
+ private Brick brick;
@Override
protected void performAction(IAction action) {
// MigrateDiskDialog dialog = new MigrateDiskDialog(window.getShell(), volume, disk);
// dialog.create();
// dialog.open();
- MigrateDiskWizard wizard = new MigrateDiskWizard(volume, disk);
+ MigrateDiskWizard wizard = new MigrateDiskWizard(volume, brick);
WizardDialog dialog = new WizardDialog(window.getShell(), wizard);
dialog.create();
@@ -53,8 +53,8 @@ public class MigrateDiskAction extends AbstractActionDelegate {
}
action.setEnabled(false);
- if (selectedEntity instanceof Disk) {
- disk = (Disk) selectedEntity;
+ if (selectedEntity instanceof Brick) {
+ brick = (Brick) selectedEntity;
action.setEnabled(((StructuredSelection) selection).size() == 1);
}
}
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 47ef9e73..5372f986 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
@@ -8,49 +8,58 @@ import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
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.Disk;
+import com.gluster.storage.management.core.model.Brick;
import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
+import com.gluster.storage.management.core.utils.StringUtil;
import com.gluster.storage.management.gui.IImageKeys;
import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.VolumeDisksView;
+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<Disk> disks;
+ private List<Brick> bricks;
private Volume volume;
+ boolean confirmDelete = false;
@Override
protected void performAction(IAction action) {
final String actionDesc = action.getDescription();
- Integer deleteOption = new MessageDialog(getShell(), "Remove Disk(s)", GUIHelper.getInstance().getImage(
- IImageKeys.VOLUME), "Are you sure you want to remove disks from volume [" + volume.getName()
- + "] ?", MessageDialog.QUESTION, new String[] { "Cancel", "Remove disks, delete data",
- "Remove disks, keep data" }, 2).open();
+ List<String> brickList = getBrickList(bricks);
+ Integer deleteOption = new MessageDialog(getShell(), "Remove Bricks(s)", GUIHelper.getInstance().getImage(
+ IImageKeys.VOLUME), "Are you sure you want to remove following bricks from volume [" + volume.getName()
+ + "] ? \n" + StringUtil.ListToString(brickList, ", "), MessageDialog.QUESTION, new String[] { "Cancel", "Remove bricks, delete data",
+ "Remove bricks, keep data" }, 2).open();
if (deleteOption <= 0) { // By Cancel button(0) or Escape key(-1)
return;
}
- boolean confirmDelete = false;
if (deleteOption == 1) {
confirmDelete = true;
}
+ BusyIndicator.showWhile(Display.getDefault(), new Runnable() {
+ public void run() {
+ VolumesClient client = new VolumesClient(modelManager.getSecurityToken());
+ Status status = client.removeBricks(volume.getName(), bricks, confirmDelete);
- VolumesClient client = new VolumesClient(modelManager.getSecurityToken());
- Status status = client.removeBricks(volume.getName(), disks, confirmDelete);
-
- if (status.isSuccess()) {
- showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] disk(s) removed successfully!");
- modelManager.deleteVolume(volume);
- } else {
- showErrorDialog(actionDesc, "Volume [" + volume.getName() + "] disk(s) could not be removed! Error: ["
- + status + "]");
- }
+ if (status.isSuccess()) {
+ showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] bricks(s) removed successfully!");
+ modelManager.deleteVolume(volume);
+ } else {
+ showErrorDialog(actionDesc, "Volume [" + volume.getName() + "] bricks(s) could not be removed! Error: ["
+ + status + "]");
+ }
+ }
+ });
+
}
@Override
@@ -66,26 +75,34 @@ public class RemoveDiskAction extends AbstractActionDelegate {
if (volume != null) {
// a volume is selected on navigation tree. Let's check if the currently open view is volume disks view
IWorkbenchPart view = guiHelper.getActiveView();
- if(view instanceof VolumeDisksView) {
- // volume disks view is open. check if any disk is selected
- disks = getSelectedDisks(selection);
- action.setEnabled(disks.size() > 0);
+ if(view instanceof VolumeBricksView) {
+ // volume disks view is open. check if any brick is selected
+ bricks = getSelectedBricks(selection);
+ action.setEnabled(bricks.size() > 0);
}
}
}
- private List<Disk> getSelectedDisks(ISelection selection) {
- List<Disk> selectedDisks = new ArrayList<Disk>();
+ 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 Disk) {
- selectedDisks.add((Disk)selectedObj);
+ if (selectedObj instanceof Brick) {
+ selectedBricks.add((Brick)selectedObj);
}
}
}
- return selectedDisks;
+ return selectedBricks;
+ }
+
+ private List<String> getBrickList(List<Brick> bricks) {
+ List<String> brickList = new ArrayList<String>();
+ for(Brick brick : bricks) {
+ brickList.add(brick.getServerName() + ":" + brick.getBrickDirectory());
+ }
+ return brickList;
}
} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java
index 7eb107c0..48a46c84 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java
@@ -28,6 +28,7 @@ import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import com.gluster.storage.management.client.GlusterDataModelManager;
+import com.gluster.storage.management.core.model.Brick;
import com.gluster.storage.management.core.model.Disk;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE;
@@ -42,7 +43,7 @@ public class AddDiskPage extends WizardPage {
private List<Disk> availableDisks = new ArrayList<Disk>();
private List<Disk> selectedDisks = new ArrayList<Disk>();
private Volume volume = null;
- private DisksSelectionPage page = null;
+ private BricksSelectionPage page = null;
public static final String PAGE_NAME = "add.disk.volume.page";
@@ -53,26 +54,26 @@ public class AddDiskPage extends WizardPage {
protected AddDiskPage(Volume volume) {
super(PAGE_NAME);
this.volume = volume;
- setTitle("Add Disk");
+ setTitle("Add Brick");
- String description = "Add disks to the Volume by choosing disks from the cluster servers.\n";
+ String description = "Add bricks to [" + volume.getName() + "] ";
if ( volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_MIRROR) {
- description += "(Disk selection should be multiples of " + volume.getReplicaCount() + ")";
+ description += "(in multiples of " + volume.getReplicaCount() + ")";
} else if (volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_STRIPE) {
- description += "(Disk selection should be multiples of " + volume.getStripeCount() + ")";
+ description += "(in multiples of " + volume.getStripeCount() + ")";
}
setDescription(description);
availableDisks = getAvailableDisks(volume);
setPageComplete(false);
- setErrorMessage("Please select disks to be added to the volume.");
+ setErrorMessage("Please select bricks to be added to the volume [" + volume.getName() +"]");
}
private boolean isDiskUsed(Volume volume, Disk disk){
- for (String volumeDisk : volume.getDisks()) { // expected form of volumeDisk is "server:diskName"
- if ( disk.getQualifiedName().equals(volumeDisk)) {
+ for (Brick volumeBrick : volume.getBricks()) { // expected form of volumeBrick is "server:/export/diskName/volumeName"
+ if ( disk.getQualifiedBrickName(volume.getName()).equals(volumeBrick.getQualifiedName())) {
return true;
}
}
@@ -94,6 +95,10 @@ public class AddDiskPage extends WizardPage {
return page.getChosenDisks();
}
+ public List<Brick> getChosenBricks( String volumeName ) {
+ return page.getChosenBricks(volumeName);
+ }
+
private boolean isValidDiskSelection(int diskCount) {
if ( diskCount == 0) {
return false;
@@ -115,10 +120,10 @@ public class AddDiskPage extends WizardPage {
*/
@Override
public void createControl(Composite parent) {
- getShell().setText("Add Disk");
+ getShell().setText("Add Brick");
List<Disk> chosenDisks = new ArrayList<Disk>(); // or volume.getDisks();
- page = new DisksSelectionPage(parent, SWT.NONE, availableDisks, chosenDisks);
+ page = new BricksSelectionPage(parent, SWT.NONE, availableDisks, chosenDisks, volume.getName());
page.addDiskSelectionListener(new ListContentChangedListener<Disk>() {
@Override
public void listContentChanged(IRemovableContentProvider<Disk> contentProvider) {
@@ -138,11 +143,11 @@ public class AddDiskPage extends WizardPage {
private void setError() {
String errorMessage = null;
if ( volume.getVolumeType() == VOLUME_TYPE.PLAIN_DISTRIBUTE) {
- errorMessage = "Please select at least one disk!";
+ errorMessage = "Please select at least one brick!";
} else if( volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_MIRROR) {
- errorMessage = "Please select disks in multiples of " + volume.getReplicaCount();
+ errorMessage = "Please select bricks in multiples of " + volume.getReplicaCount();
} else {
- errorMessage = "Please select disks in multiples of " + volume.getStripeCount();
+ errorMessage = "Please select bricks in multiples of " + volume.getStripeCount();
}
setPageComplete(false);
@@ -154,7 +159,7 @@ public class AddDiskPage extends WizardPage {
setPageComplete(true);
}
- public DisksSelectionPage getDialogPage() {
+ public BricksSelectionPage getDialogPage() {
return this.page;
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java
index e9608e38..069ed730 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java
@@ -20,7 +20,7 @@
*/
package com.gluster.storage.management.gui.dialogs;
-
+import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.MessageDialog;
@@ -28,11 +28,12 @@ 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.Brick;
import com.gluster.storage.management.core.model.Disk;
import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.utils.GlusterCoreUtil;
-
+import com.gluster.storage.management.core.utils.StringUtil;
/**
*
@@ -41,9 +42,8 @@ public class AddDiskWizard extends Wizard {
private AddDiskPage page;
private Volume volume;
-
public AddDiskWizard(Volume volume) {
- setWindowTitle("Gluster Management Console - Add disk");
+ setWindowTitle("Gluster Management Console - Add Brick");
setHelpAvailable(false); // TODO: Introduce wizard help
this.volume = volume;
}
@@ -53,7 +53,6 @@ public class AddDiskWizard extends Wizard {
addPage(page);
}
-
/*
* (non-Javadoc)
*
@@ -61,25 +60,36 @@ public class AddDiskWizard extends Wizard {
*/
@Override
public boolean performFinish() {
- List<Disk> disks = page.getChosenDisks();
+ List<Brick> bricks = page.getChosenBricks(volume.getName());
VolumesClient volumeClient = new VolumesClient(GlusterDataModelManager.getInstance().getSecurityToken());
try {
- Status status = volumeClient.addDisks(volume.getName(), disks);
+ List<String> brickList = getBrickList(bricks);
+ Status status = volumeClient.addBricks(volume.getName(), brickList);
if (!status.isSuccess()) {
- MessageDialog.openError(getShell(), "Add disk(s) to Volume", status.getMessage());
+ MessageDialog.openError(getShell(), "Add brick(s) to Volume", status.getMessage());
return status.isSuccess();
} else {
+ List<Disk> disks = page.getChosenDisks();
volume.addDisks(GlusterCoreUtil.getQualifiedDiskNames(disks));
- MessageDialog.openInformation(getShell(), "Add disk(s) to Volume", "Disk(s) are successfully added to "
- + volume.getName());
+ volume.addBricks(bricks);
+ MessageDialog.openInformation(getShell(), "Add brick(s) to Volume", "Volume [" + volume.getName()
+ + "] is expanded with bricks [" + StringUtil.ListToString(brickList, ", ") + "]");
return status.isSuccess();
}
} catch (Exception e) {
- MessageDialog.openError(getShell(), "Add disk(s) to Volume", e.getMessage());
+ MessageDialog.openError(getShell(), "Add brick(s) to Volume", e.getMessage());
return false;
}
}
+ private List<String> getBrickList(List<Brick> bricks) {
+ List<String> brickList = new ArrayList<String>();
+ for(Brick brick : bricks) {
+ brickList.add(brick.getServerName() + ":" + brick.getBrickDirectory());
+ }
+ return brickList;
+ }
+
/*
* (non-Javadoc)
*
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/DisksSelectionPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/BricksSelectionPage.java
index e50e81a7..b5a89939 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/DisksSelectionPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/BricksSelectionPage.java
@@ -35,6 +35,8 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
+import com.gluster.storage.management.core.model.Brick;
+import com.gluster.storage.management.core.model.Brick.BRICK_STATUS;
import com.gluster.storage.management.core.model.Disk;
import com.gluster.storage.management.core.utils.NumberUtil;
import com.gluster.storage.management.gui.IImageKeys;
@@ -47,12 +49,12 @@ import com.richclientgui.toolbox.duallists.IRemovableContentProvider;
import com.richclientgui.toolbox.duallists.RemovableContentProvider;
import com.richclientgui.toolbox.duallists.TableColumnData;
-public class DisksSelectionPage extends Composite {
+public class BricksSelectionPage extends Composite {
private enum DISK_TABLE_COLUMN_INDICES {
- SERVER, DISK, SPACE, SPACE_USED
+ SERVER, BRICK_DIRECTORY, SPACE, SPACE_USED
}
- private static final String[] DISK_TABLE_COLUMNS_NAMES = { "Server", "Disk", "Space (GB)", "Used Space (GB)" };
+ private static final String[] DISK_TABLE_COLUMNS_NAMES = { "Server", "Brick Directory", "Space (GB)", "Used Space (GB)" };
private GUIHelper guiHelper = GUIHelper.getInstance();
private CustomTableDualListComposite<Disk> dualTableViewer;
@@ -60,16 +62,16 @@ public class DisksSelectionPage extends Composite {
// This list keeps track of the order of the disks as user changes the same by clicking on up/down arrow buttons
private List<Disk> chosenDisks = new ArrayList<Disk>();
- private IRemovableContentProvider<Disk> chosenDisksContentProvider;
+ private IRemovableContentProvider<Disk> chosenBricksContentProvider;
private Button btnUp;
private Button btnDown;
- public DisksSelectionPage(final Composite parent, int style, List<Disk> allDisks, List<Disk> selectedDisks) {
+ public BricksSelectionPage(final Composite parent, int style, List<Disk> allDisks, List<Disk> selectedDisks, String volumeName) {
super(parent, style);
- createPage(allDisks, selectedDisks);
+ createPage(allDisks, selectedDisks, volumeName);
parent.layout();
}
@@ -78,7 +80,7 @@ public class DisksSelectionPage extends Composite {
dualTableViewer.addChosenListChangedSelectionListener(listener);
}
- private TableLabelProviderAdapter getDiskLabelProvider() {
+ private TableLabelProviderAdapter getDiskLabelProvider(final String volumeName) {
return new TableLabelProviderAdapter() {
@Override
@@ -89,7 +91,7 @@ public class DisksSelectionPage extends Composite {
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.BRICK_DIRECTORY.ordinal() ? disk.getMountPoint() + "/" + volumeName
: columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE.ordinal() ? NumberUtil
.formatNumber(disk.getSpace())
: columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE_USED.ordinal() ? NumberUtil
@@ -107,13 +109,13 @@ public class DisksSelectionPage extends Composite {
return -1;
}
- private void createPage(List<Disk> allDisks, List<Disk> selectedDisks) {
+ private void createPage(List<Disk> allDisks, List<Disk> selectedDisks, String volumeName) {
setupPageLayout();
filterText = guiHelper.createFilterText(this);
new Label(this, SWT.NONE);
- createDualTableViewer(allDisks, selectedDisks);
+ createDualTableViewer(allDisks, selectedDisks, volumeName);
createFilter(filterText, false); // attach filter text to the dual table viewer for auto-filtering
Composite buttonContainer = new Composite(this, SWT.NONE);
@@ -134,14 +136,14 @@ public class DisksSelectionPage extends Composite {
chosenDisks = getChosenDisks();
List<Disk> selectedDisks = getSelectedChosenDisks();
- chosenDisksContentProvider.removeElements(chosenDisks);
+ chosenBricksContentProvider.removeElements(chosenDisks);
for(Disk disk : selectedDisks) {
int index = chosenDisks.indexOf(disk);
Disk diskAbove = chosenDisks.get(index - 1);
chosenDisks.set(index - 1, disk);
chosenDisks.set(index, diskAbove);
}
- chosenDisksContentProvider.addElements(chosenDisks);
+ chosenBricksContentProvider.addElements(chosenDisks);
dualTableViewer.refreshChosenViewer();
updateButtons();
}
@@ -158,14 +160,14 @@ public class DisksSelectionPage extends Composite {
chosenDisks = getChosenDisks();
List<Disk> selectedDisks = getSelectedChosenDisks();
- chosenDisksContentProvider.removeElements(chosenDisks);
+ chosenBricksContentProvider.removeElements(chosenDisks);
for(Disk disk : selectedDisks) {
int index = chosenDisks.indexOf(disk);
Disk diskBelow = chosenDisks.get(index + 1);
chosenDisks.set(index + 1, disk);
chosenDisks.set(index, diskBelow);
}
- chosenDisksContentProvider.addElements(chosenDisks);
+ chosenBricksContentProvider.addElements(chosenDisks);
dualTableViewer.refreshChosenViewer();
updateButtons();
@@ -212,13 +214,13 @@ public class DisksSelectionPage extends Composite {
dualTableViewer.setChosenViewerFilter(filter);
}
- private void createDualTableViewer(List<Disk> allDisks, List<Disk> selectedDisks) {
+ private void createDualTableViewer(List<Disk> allDisks, List<Disk> selectedDisks, String volumeName) {
TableColumnData[] columnData = createColumnData();
- ITableLabelProvider diskLabelProvider = getDiskLabelProvider();
+ ITableLabelProvider diskLabelProvider = getDiskLabelProvider(volumeName);
dualTableViewer = new CustomTableDualListComposite<Disk>(this, SWT.NONE, columnData, columnData);
- dualTableViewer.setViewerLabels("Available:", "Chosen:");
+ dualTableViewer.setViewerLabels("Available:", "Selected:");
dualTableViewer.setAvailableTableLinesVisible(false);
dualTableViewer.setAvailableTableHeaderVisible(true);
@@ -229,8 +231,8 @@ public class DisksSelectionPage extends Composite {
dualTableViewer.setChosenTableLinesVisible(true);
dualTableViewer.setChosenTableHeaderVisible(true);
- chosenDisksContentProvider = new RemovableContentProvider<Disk>(selectedDisks);
- dualTableViewer.setChosenContentProvider(chosenDisksContentProvider);
+ chosenBricksContentProvider = new RemovableContentProvider<Disk>(selectedDisks);
+ dualTableViewer.setChosenContentProvider(chosenBricksContentProvider);
dualTableViewer.setChosenLabelProvider(diskLabelProvider);
dualTableViewer.getChosenTable().addSelectionListener(new SelectionAdapter() {
@@ -278,9 +280,9 @@ public class DisksSelectionPage extends Composite {
private TableColumnData[] createColumnData() {
DISK_TABLE_COLUMN_INDICES[] columns = DISK_TABLE_COLUMN_INDICES.values();
TableColumnData[] columnData = new TableColumnData[columns.length];
-
+ int columnNum;
for (DISK_TABLE_COLUMN_INDICES column : columns) {
- int columnNum = column.ordinal();
+ columnNum = column.ordinal();
columnData[columnNum] = new TableColumnData(columnNum, DISK_TABLE_COLUMNS_NAMES[columnNum], 100);
}
return columnData;
@@ -297,7 +299,7 @@ public class DisksSelectionPage extends Composite {
public List<Disk> getChosenDisks() {
- Object[] disksArr = (Object[]) chosenDisksContentProvider.getElements(dualTableViewer);
+ Object[] disksArr = (Object[]) chosenBricksContentProvider.getElements(dualTableViewer);
if (disksArr != null) {
List<Disk> disks = new ArrayList<Disk>();
for (Object disk : disksArr) {
@@ -308,15 +310,18 @@ public class DisksSelectionPage extends Composite {
return null;
}
- public List<String> getChosenBricks() {
- Object[] disksArr = (Object[]) chosenDisksContentProvider.getElements(dualTableViewer);
- if (disksArr != null) {
- List<String> disks = new ArrayList<String>();
- for (Object disk : disksArr) {
- disks.add( ((Disk)disk).getServerName() + ":" + ((Disk)disk).getName() ); // Format: Server:disk
+ public List<Brick> getChosenBricks(String volumeName) {
+ Object[] bricksArr = (Object[]) chosenBricksContentProvider.getElements(dualTableViewer);
+
+ if (bricksArr != null) {
+ List<Brick> bricks = new ArrayList<Brick>();
+ for (Object disk : bricksArr) {
+ bricks.add( new Brick( ((Disk) disk).getServerName(), BRICK_STATUS.ONLINE, ((Disk) disk).getName(), ((Disk) disk).getMountPoint() + "/" + volumeName)); // Assumption mount point is not having trailing "/"
}
- return disks;
+ return bricks;
}
return null;
}
+
+
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java
index fec00b7d..d46c71d8 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java
@@ -18,6 +18,7 @@
*******************************************************************************/
package com.gluster.storage.management.gui.dialogs;
+import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -47,8 +48,10 @@ import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import com.gluster.storage.management.client.GlusterDataModelManager;
+import com.gluster.storage.management.core.model.Brick;
import com.gluster.storage.management.core.model.Disk;
import com.gluster.storage.management.core.model.Volume;
+import com.gluster.storage.management.core.model.Brick.BRICK_STATUS;
import com.gluster.storage.management.core.model.Volume.NAS_PROTOCOL;
import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE;
import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE;
@@ -64,6 +67,7 @@ public class CreateVolumePage1 extends WizardPage {
private Button btnNfs;
private Button btnStartVolume;
private Link linkCustomize;
+ private List<Disk> selectedDisks;
/**
* Create the wizard.
@@ -71,11 +75,11 @@ public class CreateVolumePage1 extends WizardPage {
public CreateVolumePage1() {
super(PAGE_NAME);
setTitle("Create Volume");
- setDescription("Create a new Volume by choosing disks from the cluster servers and configuring the volume properties.");
+ setDescription("Create a new Volume by choosing bricks from the cluster servers and configuring the volume properties.");
// by default, we create volume with all available disks
allDisks = GlusterDataModelManager.getInstance().getReadyDisksOfAllServers();
- volume.setDisks(getBricks(allDisks)); // volume.setDisks(allDisks);
+ selectedDisks = allDisks; // volume.setDisks(allDisks);
}
private List<String> getBricks(List<Disk> allDisks) {
@@ -183,20 +187,21 @@ public class CreateVolumePage1 extends WizardPage {
private void createDisksCustomizeLink(Composite container) {
linkCustomize = new Link(container, SWT.UNDERLINE_LINK);
- linkCustomize.setText("All Disk(s) (<a>customize</a>)");
+ linkCustomize.setText("All Brick(s) (<a>customize</a>)" );
+ linkCustomize.setEnabled(false);
linkCustomize.addListener (SWT.Selection, new Listener () {
public void handleEvent(Event event) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
- SelectDisksDialog dialog = new SelectDisksDialog(getShell(), allDisks, volume.getDisks());
+ SelectDisksDialog dialog = new SelectDisksDialog(getShell(), allDisks, selectedDisks, txtName.getText().trim());
dialog.create();
if(dialog.open() == Window.OK) {
// user has customized disks. get them from the dialog box.
- volume.setDisks(dialog.getSelectedBricks());
- linkCustomize.setText("" + volume.getDisks().size() + " Disk(s) (<a>customize</a>)");
+ selectedDisks = dialog.getSelectedDisks();
+ linkCustomize.setText("" + selectedDisks.size() + " Brick(s) (<a>customize</a>)");
validateForm();
}
}
@@ -254,7 +259,8 @@ public class CreateVolumePage1 extends WizardPage {
txtName = new Text(container, SWT.BORDER);
GridData txtNameData = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
txtNameData.widthHint = 300;
- txtName.setLayoutData(txtNameData);
+ txtName.setTextLimit(32);
+ txtName.setLayoutData(txtNameData);
txtName.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
@@ -300,6 +306,11 @@ public class CreateVolumePage1 extends WizardPage {
volume.setAccessControlList(txtAccessControl.getText());
+ for(Disk disk : selectedDisks) {
+ Brick brick = new Brick(disk.getServerName(), BRICK_STATUS.ONLINE, disk.getName(), disk.getMountPoint() + File.separator + volume.getName());
+ volume.addBrick(brick);
+ }
+
return volume;
}
@@ -326,7 +337,7 @@ public class CreateVolumePage1 extends WizardPage {
}
private void validateDisks() {
- int diskCount = volume.getDisks().size();
+ int diskCount = selectedDisks.size();
if(diskCount < 1) {
setError("At least one disk must be selected!");
@@ -356,8 +367,14 @@ public class CreateVolumePage1 extends WizardPage {
private void validateVolumeName() {
String volumeName = txtName.getText().trim();
String volumeNameToken = "^[a-zA-Z][a-zA-Z0-9\\-]*";
+
+ if (volumeName.length() > 0) {
+ linkCustomize.setEnabled(true);
+ }
+
if(volumeName.length() == 0) {
setError("Please enter Volume Name");
+ linkCustomize.setEnabled(false);
}
if (!volumeName.matches(volumeNameToken)) {
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 24f0fe5b..ba2d748f 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,7 +36,9 @@ 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.Brick;
import com.gluster.storage.management.core.model.Disk;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.utils.NumberUtil;
@@ -47,31 +49,30 @@ 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
+ SERVER, BRICK_DIRECTORY, SPACE, SPACE_IN_USE
}
- private static final String[] DISK_TABLE_COLUMN_NAMES = { "Server", "Disk", "Space (GB)", "Used Space (GB)" };
+ private static final String[] DISK_TABLE_COLUMN_NAMES = { "Server", "Brick Directory", "Space (GB)", "Used Space (GB)" };
private Volume volume;
- private Disk fromDisk;
+ private Brick fromBrick;
private static final GUIHelper guiHelper = GUIHelper.getInstance();
private TableViewer tableViewerTo;
private TableViewer tableViewerFrom;
- private ITableLabelProvider getDiskLabelProvider() {
+ private ITableLabelProvider getDiskLabelProvider(final String volumeName) {
return new TableLabelProviderAdapter() {
-
+
@Override
public String getColumnText(Object element, int columnIndex) {
if (!(element instanceof Disk)) {
return null;
}
-
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.BRICK_DIRECTORY.ordinal() ? disk.getMountPoint() + "/" + volumeName
: columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE.ordinal() ? NumberUtil
.formatNumber(disk.getSpace())
: columnIndex == DISK_TABLE_COLUMN_INDICES.SPACE_IN_USE.ordinal() ? NumberUtil
@@ -88,7 +89,7 @@ public class MigrateDiskPage1 extends WizardPage {
parent.setLayout(tableColumnLayout);
setColumnProperties(table, DISK_TABLE_COLUMN_INDICES.SERVER, SWT.CENTER, 100);
- setColumnProperties(table, DISK_TABLE_COLUMN_INDICES.DISK, SWT.CENTER, 100);
+ setColumnProperties(table, DISK_TABLE_COLUMN_INDICES.BRICK_DIRECTORY, SWT.CENTER, 100);
setColumnProperties(table, DISK_TABLE_COLUMN_INDICES.SPACE, SWT.CENTER, 90);
setColumnProperties(table, DISK_TABLE_COLUMN_INDICES.SPACE_IN_USE, SWT.CENTER, 90);
}
@@ -112,11 +113,11 @@ public class MigrateDiskPage1 extends WizardPage {
/**
* Create the wizard.
*/
- public MigrateDiskPage1(Volume volume, Disk disk) {
+ public MigrateDiskPage1(Volume volume, Brick brick) {
super(PAGE_NAME);
this.volume = volume;
- this.fromDisk = disk;
- setTitle("Migrate Disk [" + volume.getName() + "]");
+ this.fromBrick = brick;
+ setTitle("Migrate Brick [" + 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 " +
@@ -127,10 +128,10 @@ public class MigrateDiskPage1 extends WizardPage {
private void setPageDescription(String source, String target) {
if (source == null || source == "") {
- source = "From Disk";
+ source = "From Brick";
}
if (target == null || target == "") {
- target = "To Disk";
+ target = "To Brick";
}
setDescription("Migrate volume data from \"" + source + "\" to \"" + target + "\"");
}
@@ -186,34 +187,34 @@ public class MigrateDiskPage1 extends WizardPage {
//labelLayoutData.verticalIndent = 10;
Label lblFromDisk = new Label(container, SWT.NONE);
- lblFromDisk.setText("From Disk:");
+ lblFromDisk.setText("From Brick:");
lblFromDisk.setLayoutData(labelLayoutData);
Label lblToDisk = new Label(container, SWT.NONE);
- lblToDisk.setText("To Disk:");
+ lblToDisk.setText("To Brick:");
lblToDisk.setLayoutData(labelLayoutData);
Text txtFilterFrom = guiHelper.createFilterText(container);
Text txtFilterTo = guiHelper.createFilterText(container);
- ITableLabelProvider diskLabelProvider = getDiskLabelProvider();
+ ITableLabelProvider diskLabelProvider = getDiskLabelProvider(volume.getName());
GlusterDataModelManager glusterDataModelManager = GlusterDataModelManager.getInstance();
- List<Disk> fromDisks = glusterDataModelManager.getReadyDisksOfVolume(volume);
+ List<Disk> fromBricks = glusterDataModelManager.getReadyDisksOfVolume(volume);
List<Disk> toDisks = glusterDataModelManager.getReadyDisksOfAllServersExcluding( glusterDataModelManager.getReadyDisksOfVolume(volume));
- tableViewerFrom = createTableViewer(container, diskLabelProvider, fromDisks, txtFilterFrom);
+ tableViewerFrom = createTableViewer(container, diskLabelProvider, fromBricks, txtFilterFrom);
- if(fromDisk != null) {
- setFromDisk(tableViewerFrom, fromDisk);
+ if(fromBrick != null) {
+ setFromDisk(tableViewerFrom, fromBrick);
}
tableViewerTo = createTableViewer(container, diskLabelProvider, toDisks, txtFilterTo);
}
- private void setFromDisk(TableViewer tableViewer, Disk diskToSelect) {
+ private void setFromDisk(TableViewer tableViewer, Brick brickToSelect) {
Table table = tableViewer.getTable();
for (int i = 0; i < table.getItemCount(); i++) {
TableItem item = table.getItem(i);
- if (item.getData() == diskToSelect) {
+ if (item.getData() == brickToSelect) {
table.select(i);
return;
}
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 70b4bbf6..61142c5f 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
@@ -22,24 +22,25 @@ 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.Brick;
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 Brick brick;
private MigrateDiskPage1 page;
- public MigrateDiskWizard(Volume volume, Disk disk) {
- setWindowTitle("Gluster Management Console - Migrate Disk [" + volume.getName() + "]");
+ public MigrateDiskWizard(Volume volume, Brick brick) {
+ setWindowTitle("Gluster Management Console - Migrate Brick [" + volume.getName() + "]");
this.volume = volume;
- this.disk = disk;
+ this.brick = brick;
setHelpAvailable(false); // TODO: Introduce wizard help
}
@Override
public void addPages() {
- page = new MigrateDiskPage1(volume, disk);
+ page = new MigrateDiskPage1(volume, brick);
addPage(page);
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java
index 08a35357..a4152899 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java
@@ -32,37 +32,27 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
+import com.gluster.storage.management.core.model.Brick;
import com.gluster.storage.management.core.model.Disk;
public class SelectDisksDialog extends Dialog {
- private DisksSelectionPage disksPage;
+ private BricksSelectionPage disksPage;
private List<Disk> allDisks;
private List<Disk> selectedDisks;
+ private String volumeName;
/**
* Create the dialog.
*
* @param parentShell
*/
- public SelectDisksDialog(Shell parentShell, List<Disk> allDisks, List<String> selectedDisks) {
+ public SelectDisksDialog(Shell parentShell, List<Disk> allDisks, List<Disk> selectedDisks, String volumeName) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
this.allDisks = allDisks;
- this.selectedDisks = getSelectedDisks(allDisks, selectedDisks);
- }
-
- private List<Disk> getSelectedDisks(List<Disk> allDisks, List<String> selectedDisks) {
- List<Disk> disks = new ArrayList<Disk>();
- for (String selectedDisk : selectedDisks) {
- for (Disk disk : allDisks) {
- String brick[] = selectedDisk.split(":");
- if (disk.getServerName().equals(brick[0]) && disk.getName().equals(brick[1])) {
- disks.add(disk);
- }
- }
- }
- return disks;
+ this.selectedDisks = selectedDisks;
+ this.volumeName = volumeName;
}
/**
@@ -78,9 +68,9 @@ public class SelectDisksDialog extends Dialog {
GridData containerLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
container.setLayoutData(containerLayoutData);
- getShell().setText("Create Volume - Select Disks");
+ getShell().setText("Create Volume - Select Bricks");
- disksPage = new DisksSelectionPage(container, SWT.NONE, allDisks, selectedDisks);
+ disksPage = new BricksSelectionPage(container, SWT.NONE, allDisks, selectedDisks, volumeName);
return container;
}
@@ -105,14 +95,14 @@ public class SelectDisksDialog extends Dialog {
}
@Override
- protected void cancelPressed() { System.out.println("Test");
+ protected void cancelPressed() {
super.cancelPressed();
}
@Override
protected void okPressed() {
if (this.getSelectedDisks().size() == 0) {
- MessageDialog.openError(getShell(), "Select Disk(s)", "Please select atlease one disk");
+ MessageDialog.openError(getShell(), "Select Brick(s)", "Please select atlease one brick");
} else {
super.okPressed();
}
@@ -122,7 +112,7 @@ public class SelectDisksDialog extends Dialog {
return disksPage.getChosenDisks();
}
- public List<String> getSelectedBricks() {
- return disksPage.getChosenBricks();
+ public List<Brick> getSelectedBricks(String volumeName) {
+ return disksPage.getChosenBricks(volumeName);
}
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterViewsManager.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterViewsManager.java
index 2b2645fc..b4b31a0a 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterViewsManager.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterViewsManager.java
@@ -84,7 +84,7 @@ public class GlusterViewsManager implements ViewsManager {
private void showViewsForVolume(Volume volume) throws PartInitException {
page.showView(VolumeSummaryView.ID);
- page.showView(VolumeDisksView.ID, null, IWorkbenchPage.VIEW_CREATE);
+ page.showView(VolumeBricksView.ID, null, IWorkbenchPage.VIEW_CREATE);
page.showView(VolumeOptionsView.ID, null, IWorkbenchPage.VIEW_CREATE);
page.showView(VolumeLogsView.ID, null, IWorkbenchPage.VIEW_CREATE);
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeBricksView.java
index 57065928..cc699a94 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeBricksView.java
@@ -5,15 +5,14 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import com.gluster.storage.management.client.GlusterDataModelManager;
-import com.gluster.storage.management.core.model.GlusterDataModel;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.details.DisksPage;
+import com.gluster.storage.management.gui.views.details.BricksPage;
-public class VolumeDisksView extends ViewPart {
- public static final String ID = VolumeDisksView.class.getName();
+public class VolumeBricksView extends ViewPart {
+ public static final String ID = VolumeBricksView.class.getName();
private static final GUIHelper guiHelper = GUIHelper.getInstance();
- private DisksPage page;
+ private BricksPage page;
private Volume volume;
@Override
@@ -29,7 +28,7 @@ public class VolumeDisksView extends ViewPart {
* @param parent
*/
private void createPage(Composite parent) {
- page = new DisksPage(parent, SWT.NONE, getSite(), GlusterDataModelManager.getInstance().getReadyDisksOfVolume(volume));
+ page = new BricksPage(parent, SWT.NONE, getSite(), GlusterDataModelManager.getInstance().getOnlineBricks(volume));
parent.layout(); // IMP: lays out the form properly
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java
index b8356ed0..c1597bae 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java
@@ -410,7 +410,7 @@ public class VolumeSummaryView extends ViewPart {
}
private void createNumOfDisksField(Composite section) {
- toolkit.createLabel(section, "Number of Disks: ", SWT.NONE);
+ toolkit.createLabel(section, "Number of Bricks: ", SWT.NONE);
toolkit.createLabel(section, "" + volume.getNumOfDisks(), SWT.NONE);
toolkit.createLabel(section, "", SWT.NONE); // dummy
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/AbstractBricksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/AbstractBricksPage.java
new file mode 100644
index 00000000..c752a488
--- /dev/null
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/AbstractBricksPage.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * 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.gui.views.details;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+import com.gluster.storage.management.core.model.Brick;
+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.Entity;
+import com.gluster.storage.management.gui.Application;
+import com.gluster.storage.management.gui.IEntityListener;
+import com.gluster.storage.management.gui.jobs.InitializeDiskJob;
+import com.gluster.storage.management.gui.utils.GUIHelper;
+
+public abstract class AbstractBricksPage extends Composite implements IEntityListener {
+ protected final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
+ protected TableViewer tableViewer;
+ private IWorkbenchSite site;
+ protected static final GUIHelper guiHelper = GUIHelper.getInstance();
+
+ /**
+ * Setup properties of the table e.g. column headers, widths, etc.
+ *
+ * @param parent
+ * The parent composite. (TableColumnLayout has to be set on this)
+ * @param table
+ * The table to be set up
+ */
+ protected abstract void setupDiskTable(Composite parent, Table table);
+
+ /**
+ * @return The label provider to be used with the disk table viewer
+ */
+ protected abstract ITableLabelProvider getTableLabelProvider();
+
+ /**
+ * @return Index of the "status" column in the table. Return -1 if status column is not displayed
+ */
+ protected abstract int getStatusColumnIndex();
+
+ private void init(final Composite parent, IWorkbenchSite site, List<Brick> bricks) {
+ addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ toolkit.dispose();
+ }
+ });
+
+ this.site = site;
+
+ setupPageLayout();
+ Text filterText = guiHelper.createFilterText(toolkit, this);
+ setupBrickTableViewer(createTableViewerComposite(), filterText);
+ site.setSelectionProvider(tableViewer);
+
+ tableViewer.setInput(bricks);
+
+ site.setSelectionProvider(tableViewer);
+ Application.getApplication().addEntityListener(this);
+
+ parent.layout(); // Important - this actually paints the table
+
+ toolkit.adapt(this);
+ toolkit.paintBordersFor(this);
+
+ /**
+ * Ideally not required. However the table viewer is not getting laid out properly on performing
+ * "maximize + restore" So this is a hack to make sure that the table is laid out again on re-size of the window
+ */
+ addPaintListener(new PaintListener() {
+ @Override
+ public void paintControl(PaintEvent e) {
+ parent.layout();
+ }
+ });
+ }
+
+ public AbstractBricksPage(final Composite parent, int style, IWorkbenchSite site, List<Brick> bricks) {
+ super(parent, style);
+ init(parent, site, bricks);
+ }
+
+ private void setupPageLayout() {
+ final GridLayout layout = new GridLayout(1, false);
+ layout.verticalSpacing = 10;
+ layout.marginTop = 10;
+ setLayout(layout);
+ }
+
+ private Composite createTableViewerComposite() {
+ Composite tableViewerComposite = new Composite(this, SWT.NO);
+ tableViewerComposite.setLayout(new FillLayout(SWT.HORIZONTAL));
+ tableViewerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ return tableViewerComposite;
+ }
+
+ private TableViewer createBrickTableViewer(Composite parent) {
+ tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI );
+
+ tableViewer.setLabelProvider(getTableLabelProvider());
+ tableViewer.setContentProvider(new ArrayContentProvider());
+
+ setupDiskTable(parent, tableViewer.getTable());
+
+ return tableViewer;
+ }
+
+ private void setupBrickTableViewer(Composite parent, final Text filterText) {
+ tableViewer = createBrickTableViewer(parent);
+ // Create a case insensitive filter for the table viewer using the filter text field
+ guiHelper.createFilter(tableViewer, filterText, false);
+ }
+}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java
new file mode 100644
index 00000000..7587d0b8
--- /dev/null
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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.gui.views.details;
+
+import java.util.List;
+
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.IWorkbenchSite;
+
+import com.gluster.storage.management.core.model.Brick;
+import com.gluster.storage.management.core.model.Entity;
+import com.gluster.storage.management.gui.BrickTableLabelProvider;
+
+public class BricksPage extends AbstractBricksPage {
+
+ public enum BRICK_TABLE_COLUMN_INDICES {
+ SERVER, BRICK, SPACE, SPACE_IN_USE, STATUS
+ };
+
+ private static final String[] DISK_TABLE_COLUMN_NAMES = new String[] { "Server", "Brick Directory", "Space (GB)",
+ "Space in Use (GB)", "Status" };
+
+ public BricksPage(final Composite parent, int style, IWorkbenchSite site, List<Brick> bricks) {
+ super(parent, style, site, bricks);
+ }
+
+ @Override
+ protected void setupDiskTable(Composite parent, Table table) {
+ table.setHeaderVisible(true);
+ table.setLinesVisible(false);
+
+ TableColumnLayout tableColumnLayout = guiHelper.createTableColumnLayout(table, DISK_TABLE_COLUMN_NAMES);
+ parent.setLayout(tableColumnLayout);
+
+ guiHelper.setColumnProperties(table, BRICK_TABLE_COLUMN_INDICES.SERVER.ordinal(), SWT.CENTER, 100);
+ guiHelper.setColumnProperties(table, BRICK_TABLE_COLUMN_INDICES.BRICK.ordinal(), SWT.CENTER, 100);
+ guiHelper.setColumnProperties(table, BRICK_TABLE_COLUMN_INDICES.SPACE.ordinal(), SWT.CENTER, 90);
+ guiHelper.setColumnProperties(table, BRICK_TABLE_COLUMN_INDICES.SPACE_IN_USE.ordinal(), SWT.CENTER, 90);
+ }
+
+ @Override
+ protected ITableLabelProvider getTableLabelProvider() {
+ return new BrickTableLabelProvider();
+ }
+
+ @Override
+ protected int getStatusColumnIndex() {
+ return BRICK_TABLE_COLUMN_INDICES.STATUS.ordinal();
+ }
+
+ @Override
+ public void entityChanged(Entity entity, String[] paremeters) {
+ // TODO Auto-generated method stub
+
+ }
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/DisksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/DisksPage.java
index 9ea962de..a8d6f125 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/DisksPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/DisksPage.java
@@ -36,7 +36,7 @@ public class DisksPage extends AbstractDisksPage {
SERVER, DISK, SPACE, SPACE_IN_USE, STATUS
};
- private static final String[] DISK_TABLE_COLUMN_NAMES = new String[] { "Server", "Disk", "Space (GB)",
+ private static final String[] DISK_TABLE_COLUMN_NAMES = new String[] { "Server", "Brick Directory", "Space (GB)",
"Space in Use (GB)", "Status" };
public DisksPage(final Composite parent, int style, IWorkbenchSite site, List<Disk> disks) {
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/VolumeLogsPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/VolumeLogsPage.java
index df9f8533..ffbea8c1 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/VolumeLogsPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/VolumeLogsPage.java
@@ -55,6 +55,7 @@ import com.gluster.storage.management.core.model.LogMessage;
import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.response.LogMessageListResponse;
+import com.gluster.storage.management.core.utils.GlusterCoreUtil;
import com.gluster.storage.management.gui.VolumeLogTableLabelProvider;
import com.gluster.storage.management.gui.utils.GUIHelper;
@@ -65,7 +66,7 @@ public class VolumeLogsPage extends Composite {
private Text filterText;
private Text lineCountText;
private Volume volume;
-
+
public enum LOG_TABLE_COLUMN_INDICES {
DATE, TIME, DISK, SEVERITY, MESSAGE
};
@@ -83,14 +84,16 @@ public class VolumeLogsPage extends Composite {
/**
* Create the volume logs page
+ *
* @param parent
* @param style
- * @param volume Volume for which the logs page is to be created
+ * @param volume
+ * Volume for which the logs page is to be created
*/
public VolumeLogsPage(Composite parent, int style, Volume volume) {
super(parent, style);
this.volume = volume;
-
+
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
toolkit.dispose();
@@ -98,35 +101,35 @@ public class VolumeLogsPage extends Composite {
});
toolkit.adapt(this);
toolkit.paintBordersFor(this);
-
+
configureLayout();
-
+
Composite composite = toolkit.createComposite(this, SWT.NONE);
toolkit.paintBordersFor(composite);
-
+
createLineCountLabel(composite);
createLineCountText(composite);
-
+
createDiskLabel(composite);
createDisksCombo(composite);
-
+
createSeverityLabel(composite);
createSeverityCombo(composite);
-
+
createFromDateLabel(composite);
createFromDateField(composite);
createFromTimeField(composite);
createFromCheckbox(composite);
-
+
createToDateLabel(composite);
createToDateField(composite);
createToTimeField(composite);
createToCheckbox(composite);
-
+
createSearchButton(composite);
-
+
createSeparator(composite);
-
+
createFilterLabel(composite);
createFilterText(composite);
@@ -135,7 +138,7 @@ public class VolumeLogsPage extends Composite {
private void createLogTableViewer() {
Composite tableViewerComposite = createTableViewerComposite();
-
+
tableViewer = new TableViewer(tableViewerComposite, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
tableViewer.setLabelProvider(new VolumeLogTableLabelProvider());
tableViewer.setContentProvider(new ArrayContentProvider());
@@ -169,23 +172,23 @@ public class VolumeLogsPage extends Composite {
Date fromTimestamp = null;
Date toTimestamp = null;
-
- if(fromCheckbox.getSelection()) {
+
+ if (fromCheckbox.getSelection()) {
fromTimestamp = extractTimestamp(fromDate, fromTime);
}
-
- if(toCheckbox.getSelection()) {
+
+ if (toCheckbox.getSelection()) {
toTimestamp = extractTimestamp(toDate, toTime);
}
-
+
if (!validateTimeRange(fromTimestamp, toTimestamp)) {
return;
}
-
+
LogMessageListResponse response = client.getLogs(volume.getName(), disksCombo.getText(),
severityCombo.getText(), fromTimestamp, toTimestamp, Integer.parseInt(lineCountText.getText()));
Status status = response.getStatus();
- if(status.isSuccess()) {
+ if (status.isSuccess()) {
List<LogMessage> logMessages = response.getLogMessages();
tableViewer.setInput(logMessages.toArray(new LogMessage[0]));
tableViewer.refresh();
@@ -198,30 +201,30 @@ public class VolumeLogsPage extends Composite {
}
protected boolean validateTimeRange(Date fromTimestamp, Date toTimestamp) {
- if(fromTimestamp == null && toTimestamp == null) {
+ if (fromTimestamp == null && toTimestamp == null) {
// no time range selected. nothing to validate.
return true;
}
-
+
Calendar calendar = Calendar.getInstance();
Date now = calendar.getTime();
- if(fromTimestamp != null && fromTimestamp.after(now)) {
+ if (fromTimestamp != null && fromTimestamp.after(now)) {
MessageDialog.openError(getShell(), "Volume Logs", "From time can't be greater than current time!");
return false;
}
-
- if(toTimestamp != null) {
+
+ if (toTimestamp != null) {
if (toTimestamp.after(now)) {
MessageDialog.openError(getShell(), "Volume Logs", "To time can't be greater than current time!");
return false;
}
-
- if(fromTimestamp.after(toTimestamp)) {
+
+ if (fromTimestamp.after(toTimestamp)) {
MessageDialog.openError(getShell(), "Volume Logs", "From time can't be greater than To time!");
return false;
}
}
-
+
return true;
}
@@ -304,11 +307,11 @@ public class VolumeLogsPage extends Composite {
private void createSeverityCombo(Composite composite) {
severityCombo = new Combo(composite, SWT.READ_ONLY);
severityCombo.setBounds(555, 15, 110, 20);
-
+
severityCombo.setItems(GlusterConstants.VOLUME_LOG_LEVELS_ARR.toArray(new String[0]));
severityCombo.select(VOLUME_LOG_LEVELS.ERROR.ordinal());
severityCombo.add(CoreConstants.ALL, 0);
-
+
toolkit.adapt(severityCombo);
toolkit.paintBordersFor(severityCombo);
}
@@ -321,7 +324,7 @@ public class VolumeLogsPage extends Composite {
private void createDisksCombo(Composite composite) {
disksCombo = new Combo(composite, SWT.READ_ONLY);
disksCombo.setBounds(365, 15, 100, 20);
- disksCombo.setItems(volume.getDisks().toArray(new String[0]));
+ disksCombo.setItems(volume.getBricks().toArray(new String[0]));
disksCombo.add(CoreConstants.ALL, 0);
toolkit.adapt(disksCombo);
toolkit.paintBordersFor(disksCombo);
@@ -329,7 +332,7 @@ public class VolumeLogsPage extends Composite {
}
private void createDiskLabel(Composite composite) {
- Label lblMessagesAndFilter = toolkit.createLabel(composite, "messages, and filter on disk", SWT.NONE);
+ Label lblMessagesAndFilter = toolkit.createLabel(composite, "messages, and filter on bricks", SWT.NONE);
lblMessagesAndFilter.setBounds(160, 15, 200, 20);
}
@@ -348,10 +351,10 @@ public class VolumeLogsPage extends Composite {
GridData layoutData = new GridData();
layoutData.grabExcessHorizontalSpace = true;
layoutData.grabExcessVerticalSpace = true;
- //layoutData.verticalIndent = 10;
+ // layoutData.verticalIndent = 10;
setLayoutData(layoutData);
}
-
+
private Composite createTableViewerComposite() {
Composite tableViewerComposite = new Composite(this, SWT.NO);
tableViewerComposite.setLayout(new FillLayout(SWT.HORIZONTAL));
@@ -360,7 +363,7 @@ public class VolumeLogsPage extends Composite {
tableViewerComposite.setLayoutData(layoutData);
return tableViewerComposite;
}
-
+
private void setupLogsTable(Composite parent, Table table) {
table.setHeaderVisible(true);
table.setLinesVisible(false);
@@ -374,7 +377,7 @@ public class VolumeLogsPage extends Composite {
setColumnProperties(table, LOG_TABLE_COLUMN_INDICES.SEVERITY, SWT.CENTER, 50);
setColumnProperties(table, LOG_TABLE_COLUMN_INDICES.MESSAGE, SWT.LEFT, 100);
}
-
+
/**
* Sets properties for alignment and weight of given column of given table
*
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java
index 6913e211..dc3186e1 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java
@@ -42,6 +42,7 @@ import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE;
import com.gluster.storage.management.core.utils.NumberUtil;
import com.gluster.storage.management.gui.IImageKeys;
import com.gluster.storage.management.gui.utils.GUIHelper;
+import com.gluster.storage.management.gui.views.details.BricksPage;
import com.gluster.storage.management.gui.views.details.DisksPage;
import com.gluster.storage.management.gui.views.details.TabCreator;
import com.gluster.storage.management.gui.views.details.VolumeLogsPage;
@@ -248,8 +249,7 @@ public class VolumeTabCreator implements TabCreator {
private void createVolumeDisksTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
Composite volumeDisksTab = guiHelper.createTab(tabFolder, "Disks", IImageKeys.VOLUME);
- DisksPage page = new DisksPage(volumeDisksTab, SWT.NONE, site, GlusterDataModelManager.getInstance().getReadyDisksOfVolume(volume));
-
+ BricksPage page = new BricksPage(volumeDisksTab, SWT.NONE, site, GlusterDataModelManager.getInstance().getOnlineBricks(volume));
volumeDisksTab.layout(); // IMP: lays out the form properly
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java
index 9e25a018..680dc391 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java
@@ -56,7 +56,7 @@ public class VolumesPage extends Composite {
};
private static final String[] VOLUME_TABLE_COLUMN_NAMES = new String[] { "Name",
- "Volume Type", "Number of\nDisks", "Transport Type", "Status" };
+ "Volume Type", "Number of\nBricks", "Transport Type", "Status" };
public VolumesPage(final Composite parent, IWorkbenchSite site, EntityGroup<Volume> volumes) {
super(parent, SWT.NONE);
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java
index 004160a7..d1e9388d 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java
@@ -70,10 +70,10 @@ public class AbstractServersResource {
*/
private void addDummyDisks(Server server) {
double dummyDiskSpace = Math.random() * 500;
- server.addDisk(new Disk(server, "sda", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY));
+ server.addDisk(new Disk(server, "sda", "/export/sda", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY));
dummyDiskSpace = Math.random() * 500;
- server.addDisk(new Disk(server, "sdb", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY));
+ server.addDisk(new Disk(server, "sdb", "/export/sdb", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY));
dummyDiskSpace = Math.random() * 500;
- server.addDisk(new Disk(server, "sdc", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY));
+ server.addDisk(new Disk(server, "sdc", "/export/sdc", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY));
}
}
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 5db84994..f84f3ef6 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,15 +21,14 @@
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_SOURCE;
+import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_BRICKS;
+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_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_BRICKS;
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;
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_DISK_NAME;
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_DOWNLOAD;
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_FROM_TIMESTAMP;
@@ -45,8 +44,6 @@ import static com.gluster.storage.management.core.constants.RESTConstants.SUBRES
import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_OPTIONS;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
@@ -55,7 +52,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
-import java.util.zip.GZIPOutputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
@@ -69,28 +65,27 @@ import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
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.Brick;
import com.gluster.storage.management.core.model.LogMessage;
import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
-import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE;
import com.gluster.storage.management.core.response.GenericResponse;
import com.gluster.storage.management.core.response.LogMessageListResponse;
import com.gluster.storage.management.core.response.VolumeListResponse;
import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse;
import com.gluster.storage.management.core.utils.DateUtil;
import com.gluster.storage.management.core.utils.FileUtil;
+import com.gluster.storage.management.core.utils.GlusterCoreUtil;
import com.gluster.storage.management.core.utils.ProcessUtil;
import com.gluster.storage.management.server.constants.VolumeOptionsDefaults;
import com.gluster.storage.management.server.utils.GlusterUtil;
import com.gluster.storage.management.server.utils.ServerUtil;
import com.sun.jersey.api.core.InjectParam;
-import com.sun.jersey.api.representation.Form;
import com.sun.jersey.spi.resource.Singleton;
@Singleton
@@ -102,11 +97,13 @@ public class VolumesResource {
@InjectParam
private static ServerUtil serverUtil;
-
+
@InjectParam
private static GlusterUtil glusterUtil;
-
+
private static final FileUtil fileUtil = new FileUtil();
+
+ private static GlusterCoreUtil glusterCoreUtil = new GlusterCoreUtil();
@InjectParam
private VolumeOptionsDefaults volumeOptionsDefaults;
@@ -127,25 +124,13 @@ public class VolumesResource {
@Consumes(MediaType.TEXT_XML)
@Produces(MediaType.TEXT_XML)
public Status createVolume(Volume volume) {
- // Create the directories for the volume
- List<String> disks = volume.getDisks();
- Status status = createDirectories(disks, volume.getName());
+ List<String> brickDirectories = glusterCoreUtil.getQualifiedBrickList(volume.getBricks());
+ Status status = glusterUtil.createVolume(volume, brickDirectories);
if (status.isSuccess()) {
- List<String> bricks = Arrays.asList(status.getMessage().split(" "));
- status = glusterUtil.createVolume(volume, bricks);
- if (status.isSuccess()) {
- Status optionsStatus = glusterUtil.createOptions(volume);
- if (!optionsStatus.isSuccess()) {
- status.setCode(Status.STATUS_CODE_PART_SUCCESS);
- status.setMessage("Error while setting volume options: " + optionsStatus);
- }
- } else {
- 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);
- }
+ Status optionsStatus = glusterUtil.createOptions(volume);
+ if (!optionsStatus.isSuccess()) {
+ status.setCode(Status.STATUS_CODE_PART_SUCCESS);
+ status.setMessage("Error while setting volume options: " + optionsStatus);
}
}
return status;
@@ -180,12 +165,12 @@ public class VolumesResource {
@QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) {
Volume volume = glusterUtil.getVolume(volumeName);
Status status = glusterUtil.deleteVolume(volumeName);
-
+
String deleteOption = "";
- if(deleteFlag) {
+ if (deleteFlag) {
deleteOption = "-d";
}
-
+
if (status.isSuccess()) {
List<String> disks = volume.getDisks();
Status postDeleteStatus = postDelete(volumeName, disks, deleteOption);
@@ -202,22 +187,18 @@ public class VolumesResource {
@Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_DISKS)
@Produces(MediaType.TEXT_XML)
public Status removeBricks(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
- @QueryParam(QUERY_PARAM_DISKS) String disks, @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) {
- List<String> bricks = Arrays.asList(disks.split(",")); // Convert from comma separated string (query parameter)
- List<String> volumeBricks = new ArrayList<String>();
- for (String brickInfo : bricks) {
- volumeBricks.add(getBrickForDisk(getVolume(volumeName), brickInfo));
- }
+ @QueryParam(QUERY_PARAM_BRICKS) String bricks, @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) {
+ List<String> brickList = Arrays.asList(bricks.split(",")); // Convert from comma separated string (query parameter)
- Status status = glusterUtil.removeBricks(volumeName, volumeBricks);
+ Status status = glusterUtil.removeBricks(volumeName, brickList);
String deleteOption = "";
- if(deleteFlag) {
+ if (deleteFlag) {
deleteOption = "-d";
}
-
+
if (status.isSuccess()) {
- Status cleanupStatus = cleanupDirectories(bricks, volumeName, bricks.size(), deleteOption);
+ Status cleanupStatus = cleanupDirectories(brickList, volumeName, brickList.size(), deleteOption);
if (!cleanupStatus.isSuccess()) {
// append cleanup error to prepare brick error
status.setMessage(status.getMessage() + CoreConstants.NEWLINE + cleanupStatus.getMessage());
@@ -269,14 +250,14 @@ public class VolumesResource {
@SuppressWarnings("rawtypes")
private Status prepareBrick(String serverName, String diskName, String volumeName) {
- Object response = serverUtil.executeOnServer(true, serverName, PREPARE_BRICK_SCRIPT + " "
- + diskName + " " + volumeName, GenericResponse.class);
- if(response instanceof GenericResponse) {
- return ((GenericResponse)response).getStatus();
+ Object response = serverUtil.executeOnServer(true, serverName, PREPARE_BRICK_SCRIPT + " " + diskName + " "
+ + volumeName, GenericResponse.class);
+ if (response instanceof GenericResponse) {
+ return ((GenericResponse) response).getStatus();
} else {
// in case of script failure on server, a Status object will be returned
return (Status) response;
- }
+ }
}
private Status createDirectories(List<String> disks, String volumeName) {
@@ -324,11 +305,11 @@ public class VolumesResource {
diskInfo = disks.get(i).split(":");
serverName = diskInfo[0];
diskName = diskInfo[1];
-
- Object response = serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT
- + " " + diskName + " " + volumeName + " " + deleteFlag, GenericResponse.class);
- if(response instanceof GenericResponse) {
- result = ((GenericResponse)response).getStatus();
+
+ Object response = serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT + " "
+ + diskName + " " + volumeName + " " + deleteFlag, GenericResponse.class);
+ if (response instanceof GenericResponse) {
+ result = ((GenericResponse) response).getStatus();
if (!result.isSuccess()) {
// TODO: append error and continue with cleaning up of other directories
return result;
@@ -336,12 +317,12 @@ public class VolumesResource {
} else {
// TODO: append error and continue with cleaning up of other directories
// In case of script execution failure, a Status object will be returned.
- return (Status)response;
+ return (Status) response;
}
}
return new Status(Status.STATUS_CODE_SUCCESS, "Directories cleaned up successfully!");
}
-
+
private List<LogMessage> getBrickLogs(Volume volume, String brickName, Integer lineCount)
throws GlusterRuntimeException {
// brick name format is <serverName>:<brickDirectory>
@@ -378,13 +359,13 @@ public class VolumesResource {
}
return logMessages;
}
-
+
@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_LOGS + "/" + SUBRESOURCE_DOWNLOAD)
public StreamingOutput getLogs(@PathParam(PATH_PARAM_VOLUME_NAME) final String volumeName) {
return new StreamingOutput() {
-
+
@Override
public void write(OutputStream output) throws IOException, WebApplicationException {
Volume volume = getVolume(volumeName);
@@ -404,27 +385,22 @@ public class VolumesResource {
// create temporary directory
File tempDir = fileUtil.createTempDir();
String tempDirPath = tempDir.getPath();
-
- for(String brickName : volume.getBricks()) {
- // brick name format is <serverName>:<brickDirectory>
- String[] brickParts = brickName.split(":");
- String serverName = brickParts[0];
- String brickDir = brickParts[1];
-
- String logDir = glusterUtil.getLogLocation(volume.getName(), brickName);
- String logFileName = glusterUtil.getLogFileNameForBrickDir(brickDir);
+
+ for (Brick brick : volume.getBricks()) {
+ String logDir = glusterUtil.getLogLocation(volume.getName(), brick.getBrickDirectory());
+ String logFileName = glusterUtil.getLogFileNameForBrickDir(brick.getBrickDirectory());
String logFilePath = logDir + CoreConstants.FILE_SEPARATOR + logFileName;
- String logContents = serverUtil.getFileFromServer(serverName, logFilePath);
+ String logContents = serverUtil.getFileFromServer(brick.getServerName(), logFilePath);
fileUtil.createTextFile(tempDirPath + CoreConstants.FILE_SEPARATOR + logFileName, logContents);
}
-
+
String gzipPath = fileUtil.getTempDirName() + CoreConstants.FILE_SEPARATOR + volume.getName() + "-logs.tar.gz";
new ProcessUtil().executeCommand("tar", "czvf", gzipPath, "-C", tempDir.getParent(), tempDir.getName());
-
+
// delete the temp directory
fileUtil.recursiveDelete(tempDir);
-
+
return gzipPath;
}
@@ -434,8 +410,7 @@ public class VolumesResource {
@QueryParam(QUERY_PARAM_DISK_NAME) String diskName, @QueryParam(QUERY_PARAM_LOG_SEVERITY) String severity,
@QueryParam(QUERY_PARAM_FROM_TIMESTAMP) String fromTimestamp,
@QueryParam(QUERY_PARAM_TO_TIMESTAMP) String toTimestamp,
- @QueryParam(QUERY_PARAM_LINE_COUNT) Integer lineCount,
- @QueryParam(QUERY_PARAM_DOWNLOAD) Boolean download) {
+ @QueryParam(QUERY_PARAM_LINE_COUNT) Integer lineCount, @QueryParam(QUERY_PARAM_DOWNLOAD) Boolean download) {
List<LogMessage> logMessages = null;
try {
@@ -499,8 +474,8 @@ public class VolumesResource {
List<LogMessage> logMessages;
logMessages = new ArrayList<LogMessage>();
// fetch logs for every brick of the volume
- for (String brick : volume.getBricks()) {
- logMessages.addAll(getBrickLogs(volume, brick, lineCount));
+ for (Brick brick : volume.getBricks()) {
+ logMessages.addAll(getBrickLogs(volume, brick.getBrickDirectory(), lineCount));
}
// Sort the log messages based on log timestamp
@@ -516,40 +491,22 @@ public class VolumesResource {
@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
- 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
- if (!cleanupStatus.isSuccess()) {
- // append cleanup error to prepare brick error
- status.setMessage(status.getMessage() + CoreConstants.NEWLINE + cleanupStatus.getMessage());
- }
- }
- }
- return status;
+ public Status addBricks(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
+ @FormParam(FORM_PARAM_BRICKS) String bricks) {
+ return glusterUtil.addBricks(volumeName, Arrays.asList(bricks.split(",")));
}
@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_SOURCE) String diskFrom, @FormParam(FORM_PARAM_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);
+ return volume.getBricks().get(index).getBrickDirectory();
}
private String getDiskForBrick(Volume volume, String brickName) {
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 13b8ef28..4816aba3 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
@@ -30,8 +30,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
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.Brick;
+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;
@@ -63,7 +64,7 @@ public class GlusterUtil {
private static final String VOLUME_TYPE_DISTRIBUTE = "Distribute";
private static final String VOLUME_TYPE_REPLICATE = "Replicate";
private static final ProcessUtil processUtil = new ProcessUtil();
-
+
@Autowired
private SshUtil sshUtil;
@@ -163,7 +164,7 @@ public class GlusterUtil {
*/
private String getPeerStatus(String knownServer) {
String output;
- //ProcessResult result = processUtil.executeCommand("gluster", "peer", "status");
+ // ProcessResult result = processUtil.executeCommand("gluster", "peer", "status");
ProcessResult result = getSshUtil().executeRemote(knownServer, "gluster peer status");
if (!result.isSuccess()) {
output = null;
@@ -188,7 +189,7 @@ public class GlusterUtil {
return new Status(processUtil.executeCommand("gluster", "volume", "reset", volumeName));
}
- public Status createVolume(Volume volume, List<String> bricks) {
+ public Status createVolume(Volume volume, List<String> brickDirectories) {
int count = 1; // replica or stripe count
String volumeType = null;
VOLUME_TYPE volType = volume.getVolumeType();
@@ -203,7 +204,7 @@ public class GlusterUtil {
String transportTypeStr = null;
TRANSPORT_TYPE transportType = volume.getTransportType();
transportTypeStr = (transportType == TRANSPORT_TYPE.ETHERNET) ? "tcp" : "rdma";
- List<String> command = prepareVolumeCreateCommand(volume, bricks, count, volumeType, transportTypeStr);
+ List<String> command = prepareVolumeCreateCommand(volume, brickDirectories, count, volumeType, transportTypeStr);
ProcessResult result = processUtil.executeCommand(command);
if (!result.isSuccess()) {
return new Status(result);
@@ -212,8 +213,8 @@ public class GlusterUtil {
return createOptions(volume);
}
- private List<String> prepareVolumeCreateCommand(Volume volume, List<String> bricks, int count, String volumeType,
- String transportTypeStr) {
+ private List<String> prepareVolumeCreateCommand(Volume volume, List<String> brickDirectories, int count,
+ String volumeType, String transportTypeStr) {
List<String> command = new ArrayList<String>();
command.add("gluster");
command.add("volume");
@@ -225,7 +226,7 @@ public class GlusterUtil {
}
command.add("transport");
command.add(transportTypeStr);
- command.addAll(bricks);
+ command.addAll(brickDirectories);
return command;
}
@@ -295,7 +296,6 @@ public class GlusterUtil {
return false;
}
-
private void readReplicaOrStripeCount(Volume volume, String line) {
if (extractToken(line, "x") != null) {
// expected formated of line is "Number of Bricks: 3 x 2 = 6"
@@ -305,7 +305,7 @@ public class GlusterUtil {
} else if (volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_MIRROR) {
volume.setReplicaCount(count);
volume.setStripeCount(0);
- }
+ }
}
return;
@@ -335,34 +335,32 @@ public class GlusterUtil {
String[] brickParts = line.split(":");
String serverName = brickParts[1].trim();
String brickDir = brickParts[2].trim();
-
- volume.addBrick(serverName + ":" + brickDir);
- detectAndAddDiskToVolume(volume, serverName, brickDir);
+ addBrickToVolume(volume, serverName, brickDir);
return true;
}
return false;
}
-
- private void detectAndAddDiskToVolume(Volume volume, String serverName, String brickDir) {
- // brick directory should be of the form /export/<diskname>/volume-name
- try {
- volume.addDisk(serverName + ":" + brickDir.split("/")[2].trim());
- } catch (ArrayIndexOutOfBoundsException e) {
- // brick directory of a different form, most probably created manually
- // connect to the server and get disk for the brick directory
- Status status = new ServerUtil().getDiskForDir(serverName, brickDir);
- if (status.isSuccess()) {
- volume.addDisk(serverName + ":" + status.getMessage());
- } else {
- // Couldn't fetch disk for the brick directory. Log error and add "unknown" as disk name.
- System.out.println("Couldn't fetch disk name for brick [" + serverName + ":" + brickDir + "]");
- volume.addDisk(serverName + ":unknown");
- }
- }
+ private void addBrickToVolume(Volume volume, String serverName, String brickDir) {
+ // TODO: Brick status should be same as the server status (online/offline)
+ volume.addBrick(new Brick(serverName, BRICK_STATUS.ONLINE, brickDir.split("/")[2].trim(), brickDir));
+ //
+ // try {
+ // volume.addDisk(serverName + ":" + brickDir.split("/")[2].trim());
+ // } catch (ArrayIndexOutOfBoundsException e) {
+ // // brick directory of a different form, most probably created manually
+ // // connect to the server and get disk for the brick directory
+ // Status status = new ServerUtil().getDiskForDir(serverName, brickDir);
+ // if (status.isSuccess()) {
+ // volume.addDisk(serverName + ":" + status.getMessage());
+ // } else {
+ // // Couldn't fetch disk for the brick directory. Log error and add "unknown" as disk name.
+ // System.out.println("Couldn't fetch disk name for brick [" + serverName + ":" + brickDir + "]");
+ // volume.addDisk(serverName + ":unknown");
+ // }
+ // }
}
-
private boolean readBrickGroup(String line) {
return extractToken(line, VOLUME_BRICKS_GROUP_PFX) != null;
}
@@ -454,7 +452,6 @@ public class GlusterUtil {
return volumes;
}
-
public Status addBricks(String volumeName, List<String> bricks) {
List<String> command = new ArrayList<String>();
command.add("gluster");
@@ -465,7 +462,6 @@ public class GlusterUtil {
return new Status(processUtil.executeCommand(command));
}
-
public String getLogLocation(String volumeName, String brickName) {
ProcessResult result = new ProcessUtil().executeCommand("gluster", "volume", "log", "locate", volumeName,
brickName);
@@ -490,11 +486,12 @@ public class GlusterUtil {
logFileName = logFileName.replaceAll(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 Status migrateDisk(String volumeName, String fromBrick, String toBrick, String operation) {
+ return new Status(processUtil.executeCommand("gluster", "volume", "replace-brick", volumeName, fromBrick,
+ toBrick, operation));
}
-
+
public Status removeBricks(String volumeName, List<String> bricks) {
List<String> command = new ArrayList<String>();
command.add("gluster");