From f30c67deb0b525911d1f3d891574e808ef3068b1 Mon Sep 17 00:00:00 2001 From: Selvam Date: Wed, 30 Mar 2011 18:02:08 +0530 Subject: Alerts section in volumes summary page --- .../storage/management/client/AlertsClient.java | 35 +++++++++++ .../management/client/GlusterDataModelManager.java | 7 +++ .../management/core/constants/RESTConstants.java | 1 + .../storage/management/core/model/Alert.java | 51 ++++++++++++++++ .../management/core/model/AlertListResponse.java | 36 +++++++++++ .../storage/management/core/model/AlertStatus.java | 13 ++++ .../storage/management/core/model/Cluster.java | 13 ++++ .../storage/management/core/model/RunningTask.java | 20 ++++--- .../storage/management/core/model/Status.java | 2 + .../management/gui/views/VolumesSummaryView.java | 53 ++++++++++------- .../server/resources/AlertsResource.java | 69 ++++++++++++++++++++++ .../server/resources/RunningTaskResource.java | 32 +++++----- 12 files changed, 289 insertions(+), 43 deletions(-) create mode 100644 src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Alert.java create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java create mode 100644 src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java (limited to 'src') diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java new file mode 100644 index 00000000..007ca3c1 --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java @@ -0,0 +1,35 @@ +package com.gluster.storage.management.client; + +import java.util.List; + +import com.gluster.storage.management.core.constants.RESTConstants; +import com.gluster.storage.management.core.model.Alert; +import com.gluster.storage.management.core.model.AlertListResponse; + +public class AlertsClient extends AbstractClient { + + private static final String RESOURCE_NAME = RESTConstants.RESOURCE_PATH_ALERTS; + + public AlertsClient(String securityToken) { + super(securityToken); + } + + @Override + public String getResourceName() { + return RESOURCE_NAME; + } + + @SuppressWarnings("rawtypes") + private Object fetchAlerts(Class responseClass) { + return fetchResource( responseClass ); + } + + public List getAlerts() { + AlertListResponse response = (AlertListResponse) fetchAlerts(AlertListResponse.class); + return response.getAlerts(); + } +} + + + + 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 de0112db..bd1d93ac 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 @@ -121,6 +121,8 @@ public class GlusterDataModelManager { createDummyLogMessages(); initializeRunningTasks(cluster); + + initializeAlerts(cluster); model.addCluster(cluster); } @@ -247,6 +249,11 @@ public class GlusterDataModelManager { public void initializeRunningTasks(Cluster cluster) { cluster.setRunningTasks(new RunningTaskClient(securityToken).getRunningTasks()); } + + public void initializeAlerts(Cluster cluster) { + cluster.setAlerts(new AlertsClient(securityToken).getAlerts()); + System.out.println(cluster.getAlerts().toString()); + } public List createDummyLogMessages() { addMessagesForDisk(logMessages, s1da); 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 fb40be8a..47697eb9 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 @@ -34,4 +34,5 @@ public class RESTConstants { // Running tasks resource public static final String RESOURCE_PATH_RUNNING_TASKS = "/cluster/runningtasks"; + public static final String RESOURCE_PATH_ALERTS = "/cluster/alerts"; } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Alert.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Alert.java new file mode 100644 index 00000000..b2882102 --- /dev/null +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Alert.java @@ -0,0 +1,51 @@ +package com.gluster.storage.management.core.model; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "alert") +public class Alert { + public enum ALERT_TYPES { CPU_ALERT, MEMORY_ALERT, DISK_ALERT }; + + public String[] ALERT_TYPE_STR = {"High CPU Usage", "High Memory Usage", "Low Disk Space"}; + + protected String id; + protected ALERT_TYPES type; + protected String reference; + protected String message; + + public String getAlertType( ALERT_TYPES alertType) { + return ALERT_TYPE_STR[alertType.ordinal()]; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public ALERT_TYPES getType() { + return type; + } + + public void setType(ALERT_TYPES type) { + this.type = type; + } + + public String getReference() { + return reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java new file mode 100644 index 00000000..bb3c754e --- /dev/null +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java @@ -0,0 +1,36 @@ +package com.gluster.storage.management.core.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "response") +public class AlertListResponse extends AbstractResponse { + private List alerts = new ArrayList(); + + public AlertListResponse() { + + } + + public AlertListResponse(List alerts) { + setAlerts(alerts); + } + + public void setAlerts(List alerts) { + this.alerts = alerts; + } + + @XmlElementWrapper(name = "alerts") + @XmlElement(name = "alert", type=Alert.class) + public List getAlerts() { + return this.alerts; + } + + @Override + public Object getData() { + return getAlerts(); + } +} diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java new file mode 100644 index 00000000..8c563f49 --- /dev/null +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java @@ -0,0 +1,13 @@ +package com.gluster.storage.management.core.model; + +public class AlertStatus { + protected String description; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} 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 65d5ebea..1af57266 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 @@ -29,6 +29,7 @@ public class Cluster extends Entity { List discoveredServers = new ArrayList(); List volumes = new ArrayList(); List runningTasks = new ArrayList(); + List alerts = new ArrayList(); public Cluster() { } @@ -97,4 +98,16 @@ public class Cluster extends Entity { public void setRunningTasks(List runningTasks) { this.runningTasks = runningTasks; } + + public List getAlerts() { + return alerts; + } + + public void setAlerts(List alerts) { + this.alerts = alerts; + } + + public void addAlert(Alert alert) { + this.alerts.add(alert); + } } \ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java index 1a9d63f6..32bd662e 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java @@ -22,10 +22,12 @@ import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class RunningTask { - + public enum TASK_TYPES { FORMAT_DISK, MIGRATE_DISK, VOLUME_REBALANCE }; + public String[] TASK_TYPE_STR = {"Format Disk", "Migrate Disk", "Volume Rebalance"}; + protected String id; - protected String type; // FormatDisk, MigrateDisk, VolumeRebalance - protected Object reference; + protected TASK_TYPES type; // FormatDisk, MigrateDisk, VolumeRebalance + protected String reference; protected String description; protected RunningTaskStatus status; // TODO redefine @@ -33,6 +35,10 @@ public class RunningTask { } + public String getTaskType(TASK_TYPES type) { + return TASK_TYPE_STR[type.ordinal()]; + } + public String getId() { return id; } @@ -41,19 +47,19 @@ public class RunningTask { this.id = id; } - public String getType() { + public TASK_TYPES getType() { return type; } - public void setType(String type) { + public void setType(TASK_TYPES type) { this.type = type; } - public Object getReference() { + public String getReference() { return reference; } - public void setReference(Object reference) { + public void setReference(String reference) { this.reference = reference; } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java index 06d6efe1..c5fdb246 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java @@ -27,6 +27,8 @@ public class Status { public static final int STATUS_CODE_SUCCESS = 0; public static final int STATUS_CODE_FAILURE = 1; public static final int STATUS_CODE_RUNNING = 2; + public static final int STATUS_CODE_PAUSE = 3; + public static final int STATUS_CODE_WARNING = 4; public static final Status STATUS_SUCCESS = new Status(STATUS_CODE_SUCCESS, "Success"); public static final Status STATUS_FAILURE = new Status(STATUS_CODE_FAILURE, "Failure"); 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 9477e170..e770cb73 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 @@ -31,9 +31,11 @@ import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.ViewPart; import com.gluster.storage.management.core.constants.CoreConstants; +import com.gluster.storage.management.core.model.Alert; import com.gluster.storage.management.core.model.EntityGroup; import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.GlusterDataModel; +import com.gluster.storage.management.core.model.RunningTaskStatus; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.RunningTask; import com.gluster.storage.management.core.model.Volume; @@ -61,10 +63,10 @@ public class VolumesSummaryView extends ViewPart { if (volumes == null) { Object selectedObj = guiHelper.getSelectedEntity(getSite(), EntityGroup.class); if (selectedObj != null && ((EntityGroup) selectedObj).getEntityType() == Volume.class) { - volumes = (EntityGroup)selectedObj; + volumes = (EntityGroup) selectedObj; } } - + createSections(parent); } @@ -73,43 +75,52 @@ public class VolumesSummaryView extends ViewPart { createSummarySection(); createRunningTasksSection(); createAlertsSection(); - + parent.layout(); // IMP: lays out the form properly } - + private void createAlertsSection() { - Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 2, false); + Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 1, false); + // toolkit.createLabel(section, "Any alerts related to volumes\nwill be displayed here."); + + Cluster cluster = (Cluster) GlusterDataModelManager.getInstance().getModel().getChildren().get(0); + List alerts = cluster.getAlerts(); + for (Alert alert : alerts) { + if (alert.getType() == Alert.ALERT_TYPES.DISK_ALERT) { + toolkit.createLabel(section, alert.getMessage()); + } + } - toolkit.createLabel(section, "Any alerts related to volumes\nwill be displayed here."); } private void createRunningTasksSection() { - Composite section = guiHelper.createSection(form, toolkit, "Running Tasks", null, 2, false); - - GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); - GlusterDataModel model = modelManager.getModel(); - Cluster cluster = (Cluster) model.getChildren().get(0); // Assume the first/root node of the model is cluster (invisible) - + Composite section = guiHelper.createSection(form, toolkit, "Running Tasks", null, 1, false); + + Cluster cluster = (Cluster) GlusterDataModelManager.getInstance().getModel().getChildren().get(0); List runningTasks = cluster.getRunningTasks(); - String taskMessage = ""; - for(RunningTask task : runningTasks) { - if (task.getStatus().isPercentageSupported()) { - //TODO Progress bar + + for (RunningTask task : runningTasks) { + if (task.getType() == RunningTask.TASK_TYPES.MIGRATE_DISK + || task.getType() == RunningTask.TASK_TYPES.VOLUME_REBALANCE) { + if (task.getStatus().isPercentageSupported()) { + // TODO Progress bar + } + toolkit.createLabel(section, task.getDescription()); } - //TODO show different labels for each task - taskMessage = taskMessage + CoreConstants.NEWLINE + task.getDescription(); } - toolkit.createLabel(section, taskMessage); } private void createSummarySection() { Composite section = guiHelper.createSection(form, toolkit, "Availability", null, 2, false); + GlusterDataModel model = GlusterDataModelManager.getInstance().getModel(); + Cluster cluster = (Cluster) model.getChildren().get(0); + Double[] values = new Double[] { Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.ONLINE)), Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.OFFLINE)) }; createStatusChart(toolkit, section, values); } - + private int getVolumeCountByStatus(EntityGroup volumes, VOLUME_STATUS status) { int count = 0; for (Volume volume : (List) volumes.getEntities()) { @@ -130,7 +141,7 @@ public class VolumesSummaryView extends ViewPart { data.heightHint = 250; chartViewerComposite.setLayoutData(data); } - + /* * (non-Javadoc) * 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 new file mode 100644 index 00000000..e9fbe253 --- /dev/null +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java @@ -0,0 +1,69 @@ +package com.gluster.storage.management.server.resources; + +import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_ALERTS; + +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.stereotype.Component; + +import com.gluster.storage.management.core.model.AlertListResponse; +import com.gluster.storage.management.core.model.Alert; + +@Component +@Path(RESOURCE_PATH_ALERTS) +public class AlertsResource { + + @GET + @Produces(MediaType.TEXT_XML) + public AlertListResponse getAlerts() { + + List alerts = new ArrayList(); + + // TODO To implement the following dummy alerts + // Alert #1 + Alert alert = new Alert(); + alert.setId("0001"); + alert.setReference("Server1"); // Server + alert.setType(Alert.ALERT_TYPES.CPU_ALERT); + alert.setMessage(alert.getAlertType(alert.getType()) + " in server: " + alert.getReference()); + alerts.add(alert); + + // Alert #2 + alert = new Alert(); + alert.setId("0002"); + alert.setReference("Server2"); // server:Disk - brick + alert.setType(Alert.ALERT_TYPES.MEMORY_ALERT); + alert.setMessage(alert.getAlertType(alert.getType()) + " in server: " + alert.getReference()); + alerts.add(alert); + + // Alert #3 + alert = new Alert(); + alert.setId("0003"); + alert.setReference("Volume1"); // Volume name + alert.setType(Alert.ALERT_TYPES.DISK_ALERT); + alert.setMessage(alert.getAlertType(alert.getType()) + " in volume: " + alert.getReference()); + alerts.add(alert); + + return new AlertListResponse(alerts); + + } + + public static void main(String[] args) { + /* + // Unit test code + AlertsResource alertResource = new AlertsResource(); + AlertsListResponse alertResponse = alertResource.getAlerts(); + List alerts = alertResponse.getAlerts(); + for (Alert alert: alerts) { + System.out.println(alert.getMessage()); + } + */ + } + +} diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java index 2cec4c36..35bbaa95 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java @@ -55,36 +55,35 @@ public class RunningTaskResource { // Volume rebalance RunningTask task = new RunningTask(); task.setId("0001"); - task.setType("VolumeRebalance"); - task.setReference(""); - task.setDescription("Volume [Volume1] rebalance is running"); + task.setType(RunningTask.TASK_TYPES.VOLUME_REBALANCE); + task.setReference("Volume1"); + task.setDescription("Volume [" + task.getReference() + "] rebalance is running"); task.setStatus(status); runningTasks.add(task); task = new RunningTask(); task.setId("0002"); - task.setType("VolumeRebalance"); - task.setReference(""); - task.setDescription("Volume [Volume2] rebalance is running"); - //task.setDescription("Error: volume rebalance operation failed at fd 0000 [/export/test-song-volume/mydirectory/test-video.avi"); + task.setType(RunningTask.TASK_TYPES.VOLUME_REBALANCE); + task.setReference("Volume2"); + task.setDescription("Volume [" + task.getReference() + "] rebalance is running"); task.setStatus(status); runningTasks.add(task); // MigrateDisk task = new RunningTask(); task.setId("0003"); - task.setType("MigrateDisk"); - task.setReference(""); - task.setDescription("Disk migration [Volume3/sda] is running"); + task.setType(RunningTask.TASK_TYPES.MIGRATE_DISK); + task.setReference("Volume3/sda"); + task.setDescription("Disk migration [" + task.getReference() + "] is running"); task.setStatus(status); runningTasks.add(task); // FormatDisk task = new RunningTask(); task.setId("0004"); - task.setType("FormatDisk"); - task.setReference(""); - task.setDescription("Volume [vol1] rebalance is running"); + task.setType(RunningTask.TASK_TYPES.FORMAT_DISK); + task.setReference("vol1"); + task.setDescription("Volume [" + task.getReference() + "] rebalance is running"); status.setPercentageSupported(true); status.getPercentCompleted(45); task.setStatus(status); @@ -93,8 +92,11 @@ public class RunningTaskResource { } @SuppressWarnings("rawtypes") - public Response startTask(@FormParam("taskType") String taskType) { - String managerClassName = "com.gluster.storage.management.server.runningtasks.managers." + taskType + "Manager"; + public Response startTask(@FormParam("taskType") RunningTask.TASK_TYPES taskType) { + + String taskTypeStr = new RunningTask().getTaskType(taskType).replaceAll("\\s+", ""); + String managerClassName = "com.gluster.storage.management.server.runningtasks.managers." + taskTypeStr + "Manager"; + Class managerClass; RunningTaskManager manager = null; try { -- cgit