diff options
| author | Selvam <selvam@gluster.com> | 2011-04-15 16:10:10 +0530 |
|---|---|---|
| committer | Selvam <selvam@gluster.com> | 2011-04-15 16:35:19 +0530 |
| commit | 7e6efca549922972ab18074af8337b5105f0cfcd (patch) | |
| tree | 107570fb0213d379e1703bcad912644b99729725 | |
| parent | 0260cedde3b852047b7b6bf2fd1843a7a4e3f934 (diff) | |
[Bug 2693] New: Volumes are not listed in the Volumes node
Alert section implemented in the volume summary page
9 files changed, 69 insertions, 37 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 8d6d5002..815ba853 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 @@ -118,13 +118,10 @@ public class GlusterDataModelManager { setSecurityToken(securityToken); Cluster cluster = new Cluster("Home", model); - VolumesClient volumeClient = new VolumesClient(securityToken); initializeGlusterServers(cluster); - - // initializeVolumes(cluster); - VolumeListResponse response = volumeClient.getAllVolumes(); - cluster.setVolumes(response.getVolumes()); + initializeVolumes(cluster); + initializeAutoDiscoveredServers(cluster); initializeDisks(); @@ -167,26 +164,12 @@ public class GlusterDataModelManager { } private void initializeVolumes(Cluster cluster) { - List<Volume> volumes = new ArrayList<Volume>(); - - volume1 = addVolume(volumes, "Volume1", cluster, VOLUME_TYPE.PLAIN_DISTRIBUTE, TRANSPORT_TYPE.ETHERNET, - VOLUME_STATUS.ONLINE); - - volume2 = addVolume(volumes, "Volume2", cluster, VOLUME_TYPE.PLAIN_DISTRIBUTE, TRANSPORT_TYPE.ETHERNET, - VOLUME_STATUS.ONLINE); - - volume3 = addVolume(volumes, "Volume3", cluster, VOLUME_TYPE.DISTRIBUTED_MIRROR, TRANSPORT_TYPE.ETHERNET, - VOLUME_STATUS.OFFLINE); - volume3.setReplicaCount(2); - - volume4 = addVolume(volumes, "Volume4", cluster, VOLUME_TYPE.PLAIN_DISTRIBUTE, TRANSPORT_TYPE.ETHERNET, - VOLUME_STATUS.ONLINE); - - volume5 = addVolume(volumes, "Volume5", cluster, VOLUME_TYPE.DISTRIBUTED_STRIPE, TRANSPORT_TYPE.INFINIBAND, - VOLUME_STATUS.OFFLINE); - volume5.setStripeCount(3); - - cluster.setVolumes(volumes); + VolumesClient volumeClient = new VolumesClient(securityToken); + VolumeListResponse response = volumeClient.getAllVolumes(); + if(!response.getStatus().isSuccess()) { + throw new GlusterRuntimeException("Error fetching volume list: [" + response.getStatus() + "]"); + } + cluster.setVolumes(response.getVolumes()); } private void initializeDisks() { 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 daa96cd4..054df413 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,9 +71,10 @@ public class Volume extends Entity { public Volume() { } - // GlusterFS export is always enabled + // GlusterFS and NFS export is always enabled + // Note: logic needs to make NFS optional private Set<NAS_PROTOCOL> nasProtocols = new LinkedHashSet<NAS_PROTOCOL>( - Arrays.asList(new NAS_PROTOCOL[] { NAS_PROTOCOL.GLUSTERFS })); + Arrays.asList(new NAS_PROTOCOL[] { NAS_PROTOCOL.GLUSTERFS, NAS_PROTOCOL.NFS })); private String accessControlList = "*"; 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 fe583a67..d837c8a4 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 @@ -1,5 +1,6 @@ package com.gluster.storage.management.gui.views; +import java.util.List; import java.util.Map; import org.eclipse.jface.dialogs.ErrorDialog; @@ -22,6 +23,8 @@ import org.eclipse.ui.part.ViewPart; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; +import com.gluster.storage.management.core.model.Alert; +import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.DefaultClusterListener; import com.gluster.storage.management.core.model.Event; import com.gluster.storage.management.core.model.Event.EVENT_TYPE; @@ -38,13 +41,13 @@ import com.gluster.storage.management.gui.utils.GUIHelper; public class VolumeSummaryView extends ViewPart { public static final String ID = VolumeSummaryView.class.getName(); private static final GUIHelper guiHelper = GUIHelper.getInstance(); + private static final String VOLUME_OPTION_AUTH_ALLOW = "auth.allow"; + private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); private ScrolledForm form; private Volume volume; private CLabel lblStatusValue; private DefaultClusterListener volumeChangedListener; - - private static final String VOLUME_OPTION_AUTH_ALLOW = "auth.allow"; @Override public void createPartControl(Composite parent) { @@ -89,8 +92,22 @@ public class VolumeSummaryView extends ViewPart { } private void createVolumeAlertsSection() { - Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 3, false); - toolkit.createLabel(section, "Volume related alerts will be displayed here"); + Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 1, false); + List<Alert> alerts = GlusterDataModelManager.getInstance().getModel().getCluster().getAlerts(); + + for (int i = 0; i < alerts.size(); i++) { + if (alerts.get(i).getType() == Alert.ALERT_TYPES.OFFLINE_VOLUME_DISKS_ALERT + && alerts.get(i).getReference().split(":")[0].trim().equals(volume.getName())) { + addAlertLabel(section, alerts.get(i)); + } + } + } + + private void addAlertLabel(Composite section, Alert alert) { + CLabel lblAlert = new CLabel(section, SWT.NONE); + lblAlert.setImage(guiHelper.getImage(IImageKeys.DISK_OFFLINE)); + lblAlert.setText(alert.getMessage()); + lblAlert.redraw(); } private void createVolumeMountingInfoSection() { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java index 8c39fbeb..0d8f114a 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java @@ -99,9 +99,9 @@ public class VolumesSummaryView extends ViewPart { if (alert.getType() == Alert.ALERT_TYPES.DISK_USAGE_ALERT || alert.getType() == Alert.ALERT_TYPES.OFFLINE_VOLUME_DISKS_ALERT) { CLabel lblAlert = new CLabel(section, SWT.NONE); - lblAlert.setText(alert.getMessage()); lblAlert.setImage((alert.getType() == Alert.ALERT_TYPES.DISK_USAGE_ALERT) ? guiHelper .getImage(IImageKeys.LOW_DISK_SPACE) : guiHelper.getImage(IImageKeys.DISK_OFFLINE)); + lblAlert.setText(alert.getMessage()); lblAlert.redraw(); } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java index c4948596..e33e06c9 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java @@ -53,7 +53,7 @@ public class AlertsResource { // Alert #4 alert = new Alert(); alert.setId("0004"); - alert.setReference("Volume2:server2:sda1"); // volume:[Disk name] + alert.setReference("Volume3:server2:sda1"); // volume:[Disk name] alert.setType(Alert.ALERT_TYPES.OFFLINE_VOLUME_DISKS_ALERT); alert.setMessage(alert.getAlertType(alert.getType()) + " in volume [" + alert.getReference().split(":")[0] + "] disk [" + alert.getReference().split(":")[1] + ":" + alert.getReference().split(":")[2] + "]"); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java index 42f7760e..c1f0435c 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java @@ -37,8 +37,8 @@ import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.response.GlusterServerListResponse; import com.gluster.storage.management.core.response.GlusterServerResponse; -import com.gluster.storage.management.core.utils.GlusterUtil; import com.gluster.storage.management.core.utils.ProcessResult; +import com.gluster.storage.management.server.utils.GlusterUtil; import com.sun.jersey.spi.resource.Singleton; @Component 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 73aa60d8..a4ecfcc6 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 @@ -50,8 +50,8 @@ 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.VolumeListResponse; import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse; -import com.gluster.storage.management.core.utils.GlusterUtil; 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.spi.resource.Singleton; @@ -76,6 +76,7 @@ public class VolumesResource { return new VolumeListResponse(Status.STATUS_SUCCESS, glusterUtil.getAllVolumes()); } catch (Exception e) { // TODO: log the error + e.printStackTrace(); return new VolumeListResponse(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()), null); } } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java index 5bfe01c8..dd72ab86 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java @@ -18,7 +18,7 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. */ -package com.gluster.storage.management.core.utils; +package com.gluster.storage.management.server.utils; import java.util.ArrayList; import java.util.List; @@ -34,6 +34,8 @@ import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; +import com.gluster.storage.management.core.utils.ProcessResult; +import com.gluster.storage.management.core.utils.ProcessUtil; public class GlusterUtil { private static final String glusterFSminVersion = "3.1"; @@ -280,7 +282,24 @@ public class GlusterUtil { private boolean readBrick(Volume volume, String line) { if (line.matches("Brick[0-9]+:.*")) { // line: "Brick1: server1:/export/md0/volume-name" - volume.addDisk(line.split(":")[2].trim().split("/")[2].trim()); + String[] brickParts = line.split(":"); + String serverName = brickParts[1].trim(); + String brickDir = brickParts[2].trim(); + // 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"); + } + } return true; } return false; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java index 645b7991..4f99172d 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java @@ -39,6 +39,7 @@ import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.core.utils.ProcessUtil; @@ -49,6 +50,7 @@ public class ServerUtil { private static final String SCRIPT_DIR = "scripts"; private static final String SCRIPT_COMMAND = "python"; + private static final String REMOTE_SCRIPT_GET_DISK_FOR_DIR = "get_disk_for_dir.py"; public ProcessResult executeGlusterScript(boolean runInForeground, String scriptName, List<String> arguments) { List<String> command = new ArrayList<String>(); @@ -133,4 +135,13 @@ public class ServerUtil { // CreateVolumeExportDirectory.py md0 testvol System.out.println(new ServerUtil().executeOnServer(true, "localhost", "python CreateVolumeExportDirectory.py md0 testvol", Status.class)); } + + /** + * @param serverName Server on which the directory is present + * @param brickDir Directory whose disk is to be fetched + * @return Status object containing the disk name, or error message in case the remote script fails. + */ + public Status getDiskForDir(String serverName, String brickDir) { + return (Status) executeOnServer(true, serverName, REMOTE_SCRIPT_GET_DISK_FOR_DIR + " " + brickDir, Status.class); + } }
\ No newline at end of file |
