diff options
| author | Dhandapani <dhandapani@gluster.com> | 2011-05-25 18:16:49 +0530 |
|---|---|---|
| committer | Dhandapani <dhandapani@gluster.com> | 2011-05-25 18:16:49 +0530 |
| commit | 9130557ab0d8f0910cedc6eac17b5879ebb57be8 (patch) | |
| tree | 4ada3d7cecaf309802fde9f18a6d1a2114e0e355 /src | |
| parent | 4d229fb2c145a9ed6905760d1481cef965c5b44d (diff) | |
| parent | 5b70e0e1270ba91fef2fe28f50b1fb87cc1e9b27 (diff) | |
Merge branch 'disk-to-brick'
Conflicts:
src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java
Diffstat (limited to 'src')
30 files changed, 635 insertions, 233 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 75b6affc..4085d62b 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 @@ -253,11 +253,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; } } @@ -274,7 +292,7 @@ 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); } @@ -418,6 +436,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 b407296e..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); } @@ -101,10 +98,10 @@ public class VolumesClient extends AbstractClient { VolumeOptionInfoListResponse.class)); } - public Status addDisks(String volumeName, List<String> brickList) { + public Status addBricks(String volumeName, List<String> brickList) { String bricks = StringUtil.ListToString(brickList, ","); Form form = new Form(); - form.add(RESTConstants.QUERY_PARAM_DISKS, bricks); + form.add(RESTConstants.FORM_PARAM_BRICKS, bricks); return (Status) postRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form); } @@ -141,22 +138,22 @@ public class VolumesClient extends AbstractClient { + RESTConstants.SUBRESOURCE_DOWNLOAD, filePath); } - public Status removeBricks(String volumeName, List<Disk> diskList, boolean deleteOption) { - String disks = StringUtil.ListToString(GlusterCoreUtil.getQualifiedBrickNames(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, + 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); @@ -187,37 +184,37 @@ 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); } - 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); } - 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); } - 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); 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 index 144eefb2..83acb9a3 100644 --- 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 @@ -20,20 +20,38 @@ package com.gluster.storage.management.core.model; import javax.xml.bind.annotation.XmlRootElement; -@XmlRootElement(name = "Bricks") -public class Brick { +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 Brick(String serverName, String diskName, String brickDirectory) { - this.serverName = serverName; - this.diskName = diskName; - this.brickDirectory = brickDirectory; + 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) { @@ -60,7 +78,13 @@ public class Brick { return diskName; } - public String getQualifiedBrickName() { + 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 7b6ee0fd..e54d2335 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,6 +18,8 @@ *******************************************************************************/ package com.gluster.storage.management.core.model; +import java.io.File; + import javax.xml.bind.annotation.XmlRootElement; import com.gluster.storage.management.core.utils.StringUtil; @@ -114,7 +116,7 @@ public class Disk extends Entity { return getServerName() + ":" + getName(); } - public String getQualifiedBrickName() { - return getServerName() + ":" + getMountPoint(); + 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/Volume.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java index 1326e14c..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 @@ -235,8 +235,7 @@ public class Volume extends Entity { public void setBricks(List<Brick> bricks) { - this.bricks.clear(); - this.bricks.addAll(bricks); + this.bricks = bricks; } public void removeBrick(Brick brick) { 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 c18c53c0..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 @@ -37,19 +37,10 @@ public class GlusterCoreUtil { return qualifiedDiskNames; } - // Convert from Disk list to Qualified bricks list - public static final List<String> getQualifiedBrickNames(List<Disk> diskList) { - List<String> qualifiedBrickNames = new ArrayList<String>(); - for (Disk disk : diskList) { - qualifiedBrickNames.add(disk.getQualifiedBrickName()); - } - return qualifiedBrickNames; - } - - public List<String> getQualifiedBrickList(List<Brick> bricks) { + public static final List<String> getQualifiedBrickList(List<Brick> bricks) { List<String> qualifiedBricks = new ArrayList<String>(); for (Brick brick : bricks) { - qualifiedBricks.add(brick.getQualifiedBrickName()); + 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 7a8c07e0..82b7f3e0 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -106,9 +106,9 @@ <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" + id="com.gluster.storage.management.gui.views.VolumeBricksView" name="Bricks" restorable="true"> </view> 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 3f7ac4f1..8362c477 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.getMountPoint() + 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 71175615..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(); + 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 bricks from volume [" + volume.getName() - + "] ?", MessageDialog.QUESTION, new String[] { "Cancel", "Remove bricks, delete data", + 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() + "] bricks(s) removed successfully!"); - modelManager.deleteVolume(volume); - } else { - showErrorDialog(actionDesc, "Volume [" + volume.getName() + "] bricks(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 6e123d55..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 @@ -43,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"; @@ -56,24 +56,24 @@ public class AddDiskPage extends WizardPage { this.volume = volume; setTitle("Add Brick"); - String description = "Add bricks to the Volume by choosing bricks from the cluster servers.\n"; + String description = "Add bricks to [" + volume.getName() + "] "; if ( volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_MIRROR) { - description += "(Brick selection should be multiples of " + volume.getReplicaCount() + ")"; + description += "(in multiples of " + volume.getReplicaCount() + ")"; } else if (volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_STRIPE) { - description += "(Brick selection should be multiples of " + volume.getStripeCount() + ")"; + description += "(in multiples of " + volume.getStripeCount() + ")"; } setDescription(description); availableDisks = getAvailableDisks(volume); setPageComplete(false); - setErrorMessage("Please select bricks to be added to the volume. [" + volume.getName() +"]"); + 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; } } @@ -120,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) { @@ -159,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 0be31598..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 @@ -64,7 +64,7 @@ public class AddDiskWizard extends Wizard { VolumesClient volumeClient = new VolumesClient(GlusterDataModelManager.getInstance().getSecurityToken()); try { List<String> brickList = getBrickList(bricks); - Status status = volumeClient.addDisks(volume.getName(), brickList); + Status status = volumeClient.addBricks(volume.getName(), brickList); if (!status.isSuccess()) { MessageDialog.openError(getShell(), "Add brick(s) to Volume", status.getMessage()); return status.isSuccess(); 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 f86ad8f0..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 @@ -36,6 +36,7 @@ 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; @@ -48,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", "Mount Point", "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; @@ -61,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(); } @@ -79,7 +80,7 @@ public class DisksSelectionPage extends Composite { dualTableViewer.addChosenListChangedSelectionListener(listener); } - private TableLabelProviderAdapter getDiskLabelProvider() { + private TableLabelProviderAdapter getDiskLabelProvider(final String volumeName) { return new TableLabelProviderAdapter() { @Override @@ -90,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.getMountPoint() + : 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 @@ -108,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); @@ -135,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(); } @@ -159,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(); @@ -213,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); @@ -230,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() { @@ -279,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; @@ -298,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) { @@ -310,15 +311,17 @@ public class DisksSelectionPage extends Composite { } public List<Brick> getChosenBricks(String volumeName) { - Object[] bricksArr = (Object[]) chosenDisksContentProvider.getElements(dualTableViewer); + 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(), ((Disk) disk).getName(), ((Disk) disk).getMountPoint() + "/" + volumeName)); // Assume mount point is not having trailing "/" + 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 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 b0645990..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. @@ -75,7 +79,7 @@ public class CreateVolumePage1 extends WizardPage { // 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 Brick(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.setBricks(dialog.getSelectedBricks(volume.getName())); - linkCustomize.setText("" + volume.getDisks().size() + " Brick(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 63223eb4..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,10 +113,10 @@ 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; + 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 " + @@ -195,25 +196,25 @@ public class MigrateDiskPage1 extends WizardPage { 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 20d7d4aa..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 @@ -37,33 +37,22 @@ 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; } /** @@ -81,7 +70,7 @@ public class SelectDisksDialog extends Dialog { 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; } @@ -106,7 +95,7 @@ public class SelectDisksDialog extends Dialog { } @Override - protected void cancelPressed() { System.out.println("Test"); + protected void cancelPressed() { super.cancelPressed(); } 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 40b45044..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", "Bricks Directory", "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 867a7a62..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 @@ -322,11 +322,9 @@ public class VolumeLogsPage extends Composite { } private void createDisksCombo(Composite composite) { - GlusterCoreUtil glusterCoreUtil = new GlusterCoreUtil(); - disksCombo = new Combo(composite, SWT.READ_ONLY); disksCombo.setBounds(365, 15, 100, 20); - disksCombo.setItems(glusterCoreUtil.getQualifiedBrickList(volume.getBricks()).toArray(new String[0])); + disksCombo.setItems(volume.getBricks().toArray(new String[0])); disksCombo.add(CoreConstants.ALL, 0); toolkit.adapt(disksCombo); toolkit.paintBordersFor(disksCombo); 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.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 4af22814..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,13 +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_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_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; @@ -186,10 +187,10 @@ 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) + @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, bricks); + Status status = glusterUtil.removeBricks(volumeName, brickList); String deleteOption = ""; if (deleteFlag) { @@ -197,7 +198,7 @@ public class VolumesResource { } 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()); @@ -385,17 +386,12 @@ public class VolumesResource { File tempDir = fileUtil.createTempDir(); String tempDirPath = tempDir.getPath(); - for (String brickName : glusterCoreUtil.getQualifiedBrickList(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); } @@ -478,8 +474,8 @@ public class VolumesResource { List<LogMessage> logMessages; logMessages = new ArrayList<LogMessage>(); // fetch logs for every brick of the volume - for (String brick : glusterCoreUtil.getQualifiedBrickList(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 @@ -495,15 +491,15 @@ 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) { - return glusterUtil.addBricks(volumeName, Arrays.asList(disks)); + 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); } 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 a7ce9bc5..b7cfd2ea 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 @@ -32,6 +32,7 @@ import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; 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; @@ -183,7 +184,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; @@ -354,30 +355,30 @@ public class GlusterUtil { String[] brickParts = line.split(":"); String serverName = brickParts[1].trim(); String brickDir = brickParts[2].trim(); - Brick brick = new Brick(serverName, brickDir.split("/")[2].trim(), brickDir); - volume.addBrick(brick); - 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) { @@ -506,9 +507,9 @@ public class GlusterUtil { 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) { |
