diff options
| author | Selvasundaram <selvam@gluster.com> | 2011-07-21 18:08:52 +0530 |
|---|---|---|
| committer | Selvasundaram <selvam@gluster.com> | 2011-07-21 18:18:06 +0530 |
| commit | d490f00daba667bb3d52eaf4eaef7d6575f2ed36 (patch) | |
| tree | a13d817a221113650b0c64c6dd8d1a32b84271c2 /src/com.gluster.storage.management.gui | |
| parent | eaed5f0a006789b2d4da723ab0da94d59e7e2225 (diff) | |
Alerts section enhanced
Diffstat (limited to 'src/com.gluster.storage.management.gui')
8 files changed, 188 insertions, 46 deletions
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/AlertsManager.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/AlertsManager.java index 9f9fdd5d..ed700d53 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/AlertsManager.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/AlertsManager.java @@ -35,9 +35,9 @@ 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.Partition; import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.core.utils.StringUtil; import com.gluster.storage.management.gui.preferences.PreferenceConstants; - public class AlertsManager { private List<Alert> alerts = new ArrayList<Alert>(); private Cluster cluster; @@ -48,13 +48,13 @@ public class AlertsManager { public AlertsManager(Cluster cluster) { this.cluster = cluster; - + IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); CPU_USAGE_THRESHOLD = preferenceStore.getDouble(PreferenceConstants.P_SERVER_CPU_CRITICAL_THRESHOLD); MEMORY_USAGE_THRESHOLD = preferenceStore.getDouble(PreferenceConstants.P_SERVER_MEMORY_USAGE_THRESHOLD); DISK_SPACE_USAGE_THRESHOLD = preferenceStore.getDouble(PreferenceConstants.P_DISK_SPACE_USAGE_THRESHOLD); } - + public List<Alert> getAlerts() { return alerts; } @@ -101,27 +101,29 @@ public class AlertsManager { private List<Alert> getServerAlerts() { List<Alert> serverAlerts = new ArrayList<Alert>(); + serverAlerts.add(getOfflineServerAlerts()); // Single alert for offline servers + for (GlusterServer server : cluster.getServers()) { // To check off line servers - if (server.getStatus() == SERVER_STATUS.OFFLINE) { - serverAlerts.add(new Alert(ALERT_TYPES.OFFLINE_SERVERS_ALERT, server.getName(), "Server [" - + server.getName() + "] is Offline")); - continue; // If the server is Offline skip other Alert builds - } + // if (server.getStatus() == SERVER_STATUS.OFFLINE) { + // serverAlerts.add(new Alert(ALERT_TYPES.OFFLINE_SERVERS_ALERT, server.getName(), "Server [" + // + server.getName() + "] is Offline")); + // continue; // If the server is Offline skip other Alert builds + // } // To check High CPU usage if (server.getCpuUsage() >= CPU_USAGE_THRESHOLD) { - serverAlerts - .add(new Alert(ALERT_TYPES.CPU_USAGE_ALERT, server.getName(), - Alert.ALERT_TYPE_STR[ALERT_TYPES.CPU_USAGE_ALERT.ordinal()] + "[" - + server.getCpuUsage() + "]")); + serverAlerts.add(new Alert(ALERT_TYPES.CPU_USAGE_ALERT, server.getName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.CPU_USAGE_ALERT.ordinal()] + "[" + server.getCpuUsage() + + "] in server [" + server.getName() + "]")); } // To check High Memory usage - Double memoryUtilized = server.getMemoryInUse() / server.getTotalMemory() * 100; + Double memoryUtilized = server.getMemoryInUse() / server.getTotalMemory() * 100d; if (memoryUtilized >= MEMORY_USAGE_THRESHOLD) { serverAlerts.add(new Alert(ALERT_TYPES.MEMORY_USAGE_ALERT, server.getName(), - Alert.ALERT_TYPE_STR[ALERT_TYPES.MEMORY_USAGE_ALERT.ordinal()] + "[" + server.getCpuUsage() + Alert.ALERT_TYPE_STR[ALERT_TYPES.MEMORY_USAGE_ALERT.ordinal()] + "[" + + StringUtil.formatNumber(memoryUtilized, 2) + "%] in server [" + server.getName() + "]")); } @@ -131,6 +133,17 @@ public class AlertsManager { return serverAlerts; } + private Alert getOfflineServerAlerts() { + List<String> offlineServers = new ArrayList<String>(); + for (GlusterServer server : cluster.getServers()) { + if (server.getStatus() == SERVER_STATUS.OFFLINE) { + offlineServers.add(server.getName()); + } + } + return new Alert(ALERT_TYPES.OFFLINE_SERVERS_ALERT, "Server", + Alert.ALERT_TYPE_STR[ALERT_TYPES.OFFLINE_SERVERS_ALERT.ordinal()] + "(s) " + offlineServers.toString()); + } + private List<Alert> getLowDiskAlerts(GlusterServer server) { List<Alert> diskAlerts = new ArrayList<Alert>(); boolean hasPartition; @@ -139,11 +152,12 @@ public class AlertsManager { hasPartition = false; for (Partition partition : disk.getPartitions()) { hasPartition = true; - deviceSpaceUsed = partition.getSpaceInUse() / partition.getSpace() * 100; + deviceSpaceUsed = partition.getSpaceInUse() / partition.getSpace() * 100d; if (deviceSpaceUsed >= DISK_SPACE_USAGE_THRESHOLD) { diskAlerts.add(new Alert(ALERT_TYPES.DISK_USAGE_ALERT, partition.getQualifiedName(), - Alert.ALERT_TYPE_STR[ALERT_TYPES.DISK_USAGE_ALERT.ordinal()] + " [" + deviceSpaceUsed - + "% used]")); + Alert.ALERT_TYPE_STR[ALERT_TYPES.DISK_USAGE_ALERT.ordinal()] + " [" + + StringUtil.formatNumber(deviceSpaceUsed, 2) + "% used] in disk [" + + partition.getQualifiedName() + "]")); } } if (hasPartition) { @@ -151,27 +165,35 @@ public class AlertsManager { } // If it is disk - deviceSpaceUsed = disk.getSpaceInUse() / disk.getSpace() * 100; + deviceSpaceUsed = disk.getSpaceInUse() / disk.getSpace() * 100d; if (deviceSpaceUsed >= DISK_SPACE_USAGE_THRESHOLD) { diskAlerts.add(new Alert(ALERT_TYPES.DISK_USAGE_ALERT, disk.getQualifiedName(), - Alert.ALERT_TYPE_STR[ALERT_TYPES.DISK_USAGE_ALERT.ordinal()] + " [" + deviceSpaceUsed - + "% used]")); + Alert.ALERT_TYPE_STR[ALERT_TYPES.DISK_USAGE_ALERT.ordinal()] + " [" + + StringUtil.formatNumber(deviceSpaceUsed, 2) + "% used] in [" + + disk.getQualifiedName() + "]")); } - } return diskAlerts; } private List<Alert> getVolumeAlerts() { List<Alert> volumeAlerts = new ArrayList<Alert>(); + List<String> offlineBricks = new ArrayList<String>(); + for (Volume volume : cluster.getVolumes()) { // To check off line bricks + offlineBricks = new ArrayList<String>(); for (Brick brick : volume.getBricks()) { if (brick.getStatus() == BRICK_STATUS.OFFLINE) { - volumeAlerts.add(new Alert(ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT, brick.getQualifiedName(), - Alert.ALERT_TYPE_STR[ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT.ordinal()])); + offlineBricks.add(brick.getQualifiedName()); } } + // One offline brick alert per volume + if (offlineBricks.size() > 0) { + volumeAlerts.add(new Alert(ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT, volume.getName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT.ordinal()] + + offlineBricks.toString() + " in volume " + volume.getName())); + } } return volumeAlerts; } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java index 61008a00..56681a40 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java @@ -37,6 +37,7 @@ import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.ClusterListener; import com.gluster.storage.management.core.model.Device; +import com.gluster.storage.management.core.model.Alert.ALERT_TYPES; import com.gluster.storage.management.core.model.Device.DEVICE_STATUS; import com.gluster.storage.management.core.model.Disk; import com.gluster.storage.management.core.model.Event; @@ -171,6 +172,29 @@ public class GlusterDataModelManager { updateGlusterServers(model); updateDiscoveredServers(model); updateTasks(model); + updateAlerts(model); + } + + private void updateAlerts(GlusterDataModel newModel) { + List<Alert> oldAlerts = model.getCluster().getAlerts(); + List<Alert> newAlerts = newModel.getCluster().getAlerts(); + + Set<Alert> addedAlerts = GlusterCoreUtil.getAddedEntities(oldAlerts, newAlerts, true); + for(Alert alert : addedAlerts) { + addAlert(alert); + } + + Set<Alert> removedAlerts = GlusterCoreUtil.getAddedEntities(newAlerts, oldAlerts, true); + for(Alert alert : removedAlerts) { + removeAlert(alert); + } + + Map<Alert, Alert> modifiedAlerts = GlusterCoreUtil.getModifiedEntities(oldAlerts, newAlerts); + for(Entry<Alert, Alert> entry : modifiedAlerts.entrySet()) { + Alert modifiedAlert = entry.getKey(); + modifiedAlert.copyFrom(entry.getValue()); + updateAlert(modifiedAlert); + } } private void updateTasks(GlusterDataModel newModel) { @@ -410,11 +434,33 @@ public class GlusterDataModelManager { return taskInfoList; } + + private List<Alert> getDummyAlerts() { + List<Alert> alerts = new ArrayList<Alert>(); + for (Server server : model.getCluster().getServers()) { + if (alerts.size() == 0) { + alerts.add(new Alert(ALERT_TYPES.CPU_USAGE_ALERT, server.getName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.CPU_USAGE_ALERT.ordinal()] + "[" + server.getCpuUsage() + + "] in " + server.getName())); + continue; + } + + if (alerts.size() == 1) { + Double memoryUtilized = server.getMemoryInUse() / server.getTotalMemory() * 100d; + alerts.add(new Alert(ALERT_TYPES.MEMORY_USAGE_ALERT, server.getName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.MEMORY_USAGE_ALERT.ordinal()] + "[" + memoryUtilized + "%] in " + + server.getName())); + continue; + } + } + return alerts; + } public void initializeAlerts(Cluster cluster) { AlertsManager alertsManager = new AlertsManager(cluster); alertsManager.buildAlerts(); cluster.setAlerts( alertsManager.getAlerts() ); + // cluster.addAlerts( getDummyAlerts() ); } @@ -654,6 +700,26 @@ public class GlusterDataModelManager { } } + public void addAlert(Alert alert) { + model.getCluster().addAlert(alert); + for (ClusterListener listener : listeners) { + listener.alertAdded(alert); + } + } + + public void removeAlert(Alert alert) { + model.getCluster().removeAlert(alert); + for (ClusterListener listener : listeners) { + listener.alertRemoved(alert); + } + } + + public void updateAlert(Alert alert) { + for (ClusterListener listener : listeners) { + listener.alertUpdated(alert); + } + } + public List<VolumeOptionInfo> getVolumeOptionsDefaults() { return volumeOptionsDefaults; } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java index 764401a1..eea8d7f2 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java @@ -63,6 +63,8 @@ public interface IImageKeys { public static final String REMOVE_BRICK = "icons/tango/32x32/remove-brick.svg"; public static final String LOW_DISK_SPACE = "icons/tango/16x16/low-diskspace.svg"; public static final String DISK_OFFLINE = "icons/status-offline.png"; + public static final String BRICK_OFFLINE = "icons/status-offline.png"; + public static final String bricks = "icons/tango/16x16/bricks.png"; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ServerAdditionDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ServerAdditionDialog.java index dd8e0fd1..671b983c 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ServerAdditionDialog.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ServerAdditionDialog.java @@ -20,17 +20,9 @@ */ package com.gluster.storage.management.gui.dialogs; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import org.eclipse.core.databinding.DataBindingContext; -import org.eclipse.core.databinding.UpdateValueStrategy; -import org.eclipse.core.databinding.beans.PojoProperties; -import org.eclipse.jface.databinding.swt.SWTObservables; -import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.fieldassist.ControlDecoration; @@ -44,25 +36,21 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.Server; -import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.validators.StringRequiredValidator; public class ServerAdditionDialog extends Dialog { public static final int RETURN_CODE_ERROR = 2; private Text serverName; private Button addButton; - private final GUIHelper guiHelper = GUIHelper.getInstance(); + private GUIHelper guiHelper = GUIHelper.getInstance(); private ControlDecoration errDecoration; private Composite composite; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java index 5709807a..bff21548 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java @@ -145,10 +145,10 @@ public class ClusterSummaryView extends ViewPart { private void createAlertsSection() { Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 1, false); - List<Alert> alerts = GlusterDataModelManager.getInstance().getModel().getCluster().getAlerts(); + List<Alert> alerts = cluster.getAlerts(); for (Alert alert : alerts) { - addAlertLabel(section, alert); + addAlertLabel(section, alert); } } @@ -157,7 +157,7 @@ public class ClusterSummaryView extends ViewPart { Image alertImage = null; switch (alert.getType()) { case OFFLINE_VOLUME_BRICKS_ALERT: - alertImage = guiHelper.getImage(IImageKeys.DISK_OFFLINE); + alertImage = guiHelper.getImage(IImageKeys.BRICK_OFFLINE); break; case DISK_USAGE_ALERT: alertImage = guiHelper.getImage(IImageKeys.LOW_DISK_SPACE); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java index d703c9a7..b064d997 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java @@ -23,6 +23,8 @@ package com.gluster.storage.management.gui.views; import java.util.List; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CLabel; +import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; @@ -30,9 +32,15 @@ import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.ViewPart; +import com.gluster.storage.management.core.model.Alert; +import com.gluster.storage.management.core.model.Alert.ALERT_TYPES; import com.gluster.storage.management.core.model.EntityGroup; import com.gluster.storage.management.core.model.GlusterServer; +import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; +import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; +import com.gluster.storage.management.gui.GlusterDataModelManager; +import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.ChartViewerComposite.CHART_TYPE; import com.gluster.storage.management.gui.utils.GUIHelper; import com.gluster.storage.management.gui.utils.ChartViewerComposite; @@ -105,15 +113,71 @@ public class GlusterServersSummaryView extends ViewPart { } private void createAlertsSection() { - Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 2, false); + Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 1, false); + List<Alert> alerts = GlusterDataModelManager.getInstance().getModel().getCluster().getAlerts(); - toolkit.createLabel(section, "Any alerts related to servers\nwill be displayed here."); + for (Alert alert : alerts) { + if (alert.getType() != ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT) { + addAlertLabel(section, alert); + } + } } + + private void addAlertLabel(Composite section, Alert alert) { + CLabel lblAlert = new CLabel(section, SWT.FLAT); + Image alertImage = null; + switch (alert.getType()) { + case OFFLINE_VOLUME_BRICKS_ALERT: + alertImage = guiHelper.getImage(IImageKeys.BRICK_OFFLINE); + break; + case DISK_USAGE_ALERT: + alertImage = guiHelper.getImage(IImageKeys.LOW_DISK_SPACE); + break; + case OFFLINE_SERVERS_ALERT: + alertImage = guiHelper.getImage(IImageKeys.SERVER_OFFLINE); + break; + case MEMORY_USAGE_ALERT: + alertImage = guiHelper.getImage(IImageKeys.MEMORY_USAGE_ALERT); + break; + case CPU_USAGE_ALERT: + alertImage = guiHelper.getImage(IImageKeys.SERVER_WARNING); + break; + } + lblAlert.setImage(alertImage); + lblAlert.setText(alert.getMessage()); + lblAlert.redraw(); + } + + private void createRunningTasksSection() { - Composite section = guiHelper.createSection(form, toolkit, "Running Tasks", null, 2, false); + Composite section = guiHelper.createSection(form, toolkit, "Running Tasks", null, 1, false); - toolkit.createLabel(section, "List of running tasks related to\nservers will be displayed here."); + for (TaskInfo taskInfo : GlusterDataModelManager.getInstance().getModel().getCluster().getTaskInfoList()) { + if (taskInfo.getType() != TASK_TYPE.VOLUME_REBALANCE) { // Exclude volume related tasks + addTaskLabel(section, taskInfo); + } + } + } + + private void addTaskLabel(Composite section, TaskInfo taskInfo) { + CLabel lblAlert = new CLabel(section, SWT.NONE); + lblAlert.setText(taskInfo.getDescription()); + + Image taskImage = null; + switch(taskInfo.getType()) { + case DISK_FORMAT: + taskImage = guiHelper.getImage(IImageKeys.DISK); + break; + case BRICK_MIGRATE: + taskImage = guiHelper.getImage(IImageKeys.BRICK_MIGRATE); + break; + case VOLUME_REBALANCE: + taskImage = guiHelper.getImage(IImageKeys.VOLUME_REBALANCE); + break; + } + lblAlert.setImage(taskImage); + lblAlert.redraw(); } /* (non-Javadoc) 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 d55088b0..d9e82f64 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 @@ -121,7 +121,7 @@ public class VolumeSummaryView extends ViewPart { private void addAlertLabel(Composite section, Alert alert) { CLabel lblAlert = new CLabel(section, SWT.NONE); - lblAlert.setImage(guiHelper.getImage(IImageKeys.DISK_OFFLINE)); + lblAlert.setImage(guiHelper.getImage(IImageKeys.BRICK_OFFLINE)); lblAlert.setText(alert.getMessage()); lblAlert.redraw(); } 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 72d4e944..e71682c6 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 @@ -102,7 +102,7 @@ public class VolumesSummaryView extends ViewPart { if (alert.getType() == Alert.ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT) { CLabel lblAlert = new CLabel(section, SWT.NONE); lblAlert.setImage((alert.getType() == Alert.ALERT_TYPES.DISK_USAGE_ALERT) ? guiHelper - .getImage(IImageKeys.LOW_DISK_SPACE) : guiHelper.getImage(IImageKeys.DISK_OFFLINE)); + .getImage(IImageKeys.LOW_DISK_SPACE) : guiHelper.getImage(IImageKeys.BRICK_OFFLINE)); lblAlert.setText(alert.getMessage()); lblAlert.redraw(); } |
